diff --git a/crates/vite_error/src/lib.rs b/crates/vite_error/src/lib.rs index 0f6ed18b21..260cf60ac6 100644 --- a/crates/vite_error/src/lib.rs +++ b/crates/vite_error/src/lib.rs @@ -93,9 +93,6 @@ pub enum Error { #[error("Unrecognized any package manager, please specify the package manager")] UnrecognizedPackageManager, - #[error("No packages specified. Usage: vite add ...")] - NoPackagesSpecified, - #[error( "Package manager {name}@{version} in {package_json_path:?} is invalid, expected format: 'package-manager-name@major.minor.patch'" )] diff --git a/packages/cli/binding/src/cli.rs b/packages/cli/binding/src/cli.rs index 869ceba35a..868b6823fa 100644 --- a/packages/cli/binding/src/cli.rs +++ b/packages/cli/binding/src/cli.rs @@ -180,6 +180,7 @@ pub enum Commands { global: bool, /// Packages to add + #[arg(required = true)] packages: Vec, /// Additional arguments to pass through to the package manager @@ -218,6 +219,7 @@ pub enum Commands { global: bool, /// Packages to remove + #[arg(required = true)] packages: Vec, /// Additional arguments to pass through to the package manager @@ -2009,17 +2011,6 @@ mod tests { assert!(args.is_err()); } - #[test] - fn test_args_remove_command_no_packages() { - // Remove command should accept empty packages list (package manager will handle this) - let args = Args::try_parse_from(&["vite-plus", "remove"]).unwrap(); - if let Commands::Remove { packages, .. } = &args.commands { - assert!(packages.is_empty()); - } else { - panic!("Expected Remove command"); - } - } - #[test] fn test_args_remove_command_complex_scenario() { let args = Args::try_parse_from(&[ diff --git a/packages/cli/binding/src/commands/add.rs b/packages/cli/binding/src/commands/add.rs index 69bc3a1b66..568d31f58d 100644 --- a/packages/cli/binding/src/commands/add.rs +++ b/packages/cli/binding/src/commands/add.rs @@ -34,10 +34,6 @@ impl AddCommand { allow_build: Option<&str>, pass_through_args: Option<&[String]>, ) -> Result { - if packages.is_empty() { - return Err(Error::NoPackagesSpecified); - } - let add_command_options = AddCommandOptions { packages, save_dependency_type, @@ -73,20 +69,4 @@ mod tests { let cmd = AddCommand::new(workspace_root.clone()); assert_eq!(cmd.cwd, workspace_root); } - - #[tokio::test] - async fn test_add_command_no_packages() { - let workspace_root = if cfg!(windows) { - AbsolutePathBuf::new("C:\\test".into()).unwrap() - } else { - AbsolutePathBuf::new("/test".into()).unwrap() - }; - - let cmd = AddCommand::new(workspace_root); - let result = - cmd.execute(&vec![], None, false, None, None, false, false, false, None, None).await; - - assert!(result.is_err()); - assert!(matches!(result.unwrap_err(), Error::NoPackagesSpecified)); - } } diff --git a/packages/cli/binding/src/commands/remove.rs b/packages/cli/binding/src/commands/remove.rs index 32cc189c69..2ba079866c 100644 --- a/packages/cli/binding/src/commands/remove.rs +++ b/packages/cli/binding/src/commands/remove.rs @@ -30,10 +30,6 @@ impl RemoveCommand { global: bool, pass_through_args: Option<&[String]>, ) -> Result { - if packages.is_empty() { - return Err(Error::NoPackagesSpecified); - } - // Detect package manager let package_manager = PackageManager::builder(&self.cwd).build().await?; @@ -67,20 +63,4 @@ mod tests { let cmd = RemoveCommand::new(workspace_root.clone()); assert_eq!(cmd.cwd, workspace_root); } - - #[tokio::test] - async fn test_remove_command_no_packages() { - let workspace_root = if cfg!(windows) { - AbsolutePathBuf::new("C:\\test".into()).unwrap() - } else { - AbsolutePathBuf::new("/test".into()).unwrap() - }; - - let cmd = RemoveCommand::new(workspace_root); - let result = - cmd.execute(&vec![], false, false, false, None, false, false, false, None).await; - - assert!(result.is_err()); - assert!(matches!(result.unwrap_err(), Error::NoPackagesSpecified)); - } } diff --git a/packages/global/snap-tests/command-add-npm10/snap.txt b/packages/global/snap-tests/command-add-npm10/snap.txt index 07ecc12041..5c873fc41b 100644 --- a/packages/global/snap-tests/command-add-npm10/snap.txt +++ b/packages/global/snap-tests/command-add-npm10/snap.txt @@ -1,10 +1,10 @@ > vp add --help # should show help Add packages to dependencies -Usage: vp add [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp add [OPTIONS] ... [-- ...] Arguments: - [PACKAGES]... Packages to add + ... Packages to add [PASS_THROUGH_ARGS]... Additional arguments to pass through to the package manager Options: diff --git a/packages/global/snap-tests/command-add-npm11/snap.txt b/packages/global/snap-tests/command-add-npm11/snap.txt index 25091fd899..d48d23d0f7 100644 --- a/packages/global/snap-tests/command-add-npm11/snap.txt +++ b/packages/global/snap-tests/command-add-npm11/snap.txt @@ -1,10 +1,10 @@ > vp add --help # should show help Add packages to dependencies -Usage: vp add [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp add [OPTIONS] ... [-- ...] Arguments: - [PACKAGES]... Packages to add + ... Packages to add [PASS_THROUGH_ARGS]... Additional arguments to pass through to the package manager Options: diff --git a/packages/global/snap-tests/command-add-pnpm10/snap.txt b/packages/global/snap-tests/command-add-pnpm10/snap.txt index 0a65f5b36e..27d02c9526 100644 --- a/packages/global/snap-tests/command-add-pnpm10/snap.txt +++ b/packages/global/snap-tests/command-add-pnpm10/snap.txt @@ -1,10 +1,10 @@ > vp add --help # should show help Add packages to dependencies -Usage: vp add [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp add [OPTIONS] ... [-- ...] Arguments: - [PACKAGES]... Packages to add + ... Packages to add [PASS_THROUGH_ARGS]... Additional arguments to pass through to the package manager Options: @@ -35,6 +35,14 @@ Options: -h, --help Print help +[2]> vp add # should error because no packages specified +error: the following required arguments were not provided: + ... + +Usage: vp add ... [-- ...] + +For more information, try '--help'. + > vp add testnpm2 urllib -D -- --loglevel=verbose --verbose && cat package.json # should add package as dev dependencies Running: pnpm add --save-dev --loglevel=verbose --verbose testnpm2 urllib Packages: + @@ -56,8 +64,107 @@ Done in ms using pnpm v } } -> #vp add testnpm2 test-vite-plus-install --allow-build=test-vite-plus-install && cat package.json # should add packages to dependencies -> #vp install test-vite-plus-package@1.0.0 --save-peer && cat package.json # should install package alias for add -> #vp add test-vite-plus-package-optional -O && cat package.json # should add package as optional dependencies -> #vp add test-vite-plus-package-optional -- --loglevel=warn && cat package.json # support pass through arguments -> #vp add -g testnpm2 -- --dry-run && cat package.json # support add global package with dry-run \ No newline at end of file +> vp add testnpm2 test-vite-plus-install --allow-build=test-vite-plus-install && cat package.json # should add packages to dependencies +Running: pnpm add --allow-build=test-vite-plus-install testnpm2 test-vite-plus-install +Packages: + ++ +Progress: resolved , reused , downloaded , added , done + +dependencies: ++ test-vite-plus-install + +Done in ms using pnpm v +{ + "name": "command-add-pnpm10", + "version": "1.0.0", + "packageManager": "pnpm@", + "devDependencies": { + "testnpm2": "^1.0.1", + "urllib": "^4.8.2" + }, + "dependencies": { + "test-vite-plus-install": "^1.0.0" + } +} + +> vp install test-vite-plus-package@1.0.0 --save-peer && cat package.json # should install package alias for add +Running: pnpm add --save-peer test-vite-plus-package@ +Packages: + ++ +Progress: resolved , reused , downloaded , added , done + +peerDependencies: ++ test-vite-plus-package + +devDependencies: ++ test-vite-plus-package already in devDependencies, was not moved to dependencies. + +Done in ms using pnpm v +{ + "name": "command-add-pnpm10", + "version": "1.0.0", + "packageManager": "pnpm@", + "devDependencies": { + "test-vite-plus-package": "1.0.0", + "testnpm2": "^1.0.1", + "urllib": "^4.8.2" + }, + "dependencies": { + "test-vite-plus-install": "^1.0.0" + }, + "peerDependencies": { + "test-vite-plus-package": "1.0.0" + } +} + +> vp add test-vite-plus-package-optional -O && cat package.json # should add package as optional dependencies +Running: pnpm add --save-optional test-vite-plus-package-optional +Packages: + ++ +Progress: resolved , reused , downloaded , added , done + +optionalDependencies: ++ test-vite-plus-package-optional + +Done in ms using pnpm v +{ + "name": "command-add-pnpm10", + "version": "1.0.0", + "packageManager": "pnpm@", + "devDependencies": { + "test-vite-plus-package": "1.0.0", + "testnpm2": "^1.0.1", + "urllib": "^4.8.2" + }, + "dependencies": { + "test-vite-plus-install": "^1.0.0" + }, + "peerDependencies": { + "test-vite-plus-package": "1.0.0" + }, + "optionalDependencies": { + "test-vite-plus-package-optional": "^1.0.0" + } +} + +> vp add test-vite-plus-package-optional -- --loglevel=warn && cat package.json # support pass through arguments +Running: pnpm add --loglevel=warn test-vite-plus-package-optional +{ + "name": "command-add-pnpm10", + "version": "1.0.0", + "packageManager": "pnpm@", + "devDependencies": { + "test-vite-plus-package": "1.0.0", + "testnpm2": "^1.0.1", + "urllib": "^4.8.2" + }, + "dependencies": { + "test-vite-plus-install": "^1.0.0" + }, + "peerDependencies": { + "test-vite-plus-package": "1.0.0" + }, + "optionalDependencies": { + "test-vite-plus-package-optional": "^1.0.0" + } +} diff --git a/packages/global/snap-tests/command-add-pnpm10/steps.json b/packages/global/snap-tests/command-add-pnpm10/steps.json index 44bb6ebd68..7e2a6308c9 100644 --- a/packages/global/snap-tests/command-add-pnpm10/steps.json +++ b/packages/global/snap-tests/command-add-pnpm10/steps.json @@ -4,11 +4,11 @@ }, "commands": [ "vp add --help # should show help", + "vp add # should error because no packages specified", "vp add testnpm2 urllib -D -- --loglevel=verbose --verbose && cat package.json # should add package as dev dependencies", - "#vp add testnpm2 test-vite-plus-install --allow-build=test-vite-plus-install && cat package.json # should add packages to dependencies", - "#vp install test-vite-plus-package@1.0.0 --save-peer && cat package.json # should install package alias for add", - "#vp add test-vite-plus-package-optional -O && cat package.json # should add package as optional dependencies", - "#vp add test-vite-plus-package-optional -- --loglevel=warn && cat package.json # support pass through arguments", - "#vp add -g testnpm2 -- --dry-run && cat package.json # support add global package with dry-run" + "vp add testnpm2 test-vite-plus-install --allow-build=test-vite-plus-install && cat package.json # should add packages to dependencies", + "vp install test-vite-plus-package@1.0.0 --save-peer && cat package.json # should install package alias for add", + "vp add test-vite-plus-package-optional -O && cat package.json # should add package as optional dependencies", + "vp add test-vite-plus-package-optional -- --loglevel=warn && cat package.json # support pass through arguments" ] } diff --git a/packages/global/snap-tests/command-add-pnpm9/snap.txt b/packages/global/snap-tests/command-add-pnpm9/snap.txt index eb5c087e49..65460b6c3b 100644 --- a/packages/global/snap-tests/command-add-pnpm9/snap.txt +++ b/packages/global/snap-tests/command-add-pnpm9/snap.txt @@ -1,10 +1,10 @@ > vp add --help # should show help Add packages to dependencies -Usage: vp add [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp add [OPTIONS] ... [-- ...] Arguments: - [PACKAGES]... Packages to add + ... Packages to add [PASS_THROUGH_ARGS]... Additional arguments to pass through to the package manager Options: diff --git a/packages/global/snap-tests/command-add-yarn4/snap.txt b/packages/global/snap-tests/command-add-yarn4/snap.txt index 64ab93e8c7..a940838b37 100644 --- a/packages/global/snap-tests/command-add-yarn4/snap.txt +++ b/packages/global/snap-tests/command-add-yarn4/snap.txt @@ -1,10 +1,10 @@ > vp add --help # should show help Add packages to dependencies -Usage: vp add [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp add [OPTIONS] ... [-- ...] Arguments: - [PACKAGES]... Packages to add + ... Packages to add [PASS_THROUGH_ARGS]... Additional arguments to pass through to the package manager Options: diff --git a/packages/global/snap-tests/command-remove-pnpm10/snap.txt b/packages/global/snap-tests/command-remove-pnpm10/snap.txt index 93475751e2..6742774e4c 100644 --- a/packages/global/snap-tests/command-remove-pnpm10/snap.txt +++ b/packages/global/snap-tests/command-remove-pnpm10/snap.txt @@ -1,10 +1,10 @@ > vp remove --help # should show help Remove packages from dependencies -Usage: vp remove [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp remove [OPTIONS] ... [-- ...] Arguments: - [PACKAGES]... Packages to remove + ... Packages to remove [PASS_THROUGH_ARGS]... Additional arguments to pass through to the package manager Options: @@ -17,6 +17,14 @@ Options: -g, --global Remove global packages -h, --help Print help +[2]> vp remove # should error because no packages specified +error: the following required arguments were not provided: + ... + +Usage: vp remove ... [-- ...] + +For more information, try '--help'. + [1]> vp remove testnpm2 -D && cat package.json # should error when remove not exists package from dev dependencies Running: pnpm remove --save-dev testnpm2  ERR_PNPM_CANNOT_REMOVE_MISSING_DEPS  Cannot remove 'testnpm2': project has no 'devDependencies' @@ -109,6 +117,6 @@ error: unexpected argument '--stream' found tip: to pass '--stream' as a value, use '-- --stream' -Usage: vp remove [OPTIONS] [PACKAGES]... [-- ...] +Usage: vp remove [OPTIONS] ... [-- ...] For more information, try '--help'. diff --git a/packages/global/snap-tests/command-remove-pnpm10/steps.json b/packages/global/snap-tests/command-remove-pnpm10/steps.json index d6feeb9897..fbc11b3489 100644 --- a/packages/global/snap-tests/command-remove-pnpm10/steps.json +++ b/packages/global/snap-tests/command-remove-pnpm10/steps.json @@ -4,6 +4,7 @@ }, "commands": [ "vp remove --help # should show help", + "vp remove # should error because no packages specified", "vp remove testnpm2 -D && cat package.json # should error when remove not exists package from dev dependencies", "vp add testnpm2 && vp add -D test-vite-plus-install && vp add -O test-vite-plus-package-optional && cat package.json # should add packages to dependencies", "vp remove testnpm2 test-vite-plus-install && cat package.json # should remove packages from dependencies", diff --git a/rfcs/add-remove-package-commands.md b/rfcs/add-remove-package-commands.md index c485c02136..629f292632 100644 --- a/rfcs/add-remove-package-commands.md +++ b/rfcs/add-remove-package-commands.md @@ -444,10 +444,6 @@ impl AddCommand { workspace_only: bool, extra_args: Vec, ) -> Result { - if packages.is_empty() { - return Err(Error::NoPackagesSpecified); - } - let package_manager = PackageManager::builder(&self.workspace_root).build().await?; let workspace = Workspace::partial_load(self.workspace_root)?; @@ -504,10 +500,6 @@ impl RemoveCommand { workspace_root: bool, extra_args: Vec, ) -> Result { - if packages.is_empty() { - return Err(Error::NoPackagesSpecified); - } - let package_manager = PackageManager::builder(&self.workspace_root).build().await?; let workspace = Workspace::partial_load(self.workspace_root)?;