From 238c6973bdc4b3bcd8e24de65c63d4c5254ad503 Mon Sep 17 00:00:00 2001 From: MK Date: Wed, 22 Oct 2025 13:26:00 +0800 Subject: [PATCH] refactor(pm): directly run add command --- crates/vite_package_manager/src/add.rs | 20 ++- .../src/package_manager.rs | 28 +++- crates/vite_task/src/add.rs | 42 ++--- crates/vite_task/src/lib.rs | 46 +++++- package.json | 2 +- packages/cli/binding/src/lib.rs | 2 + .../command-add-npm10-with-workspace/snap.txt | 7 - .../snap-tests/command-add-npm10/snap.txt | 5 - .../command-add-npm11-with-workspace/snap.txt | 14 +- .../snap-tests/command-add-npm11/snap.txt | 10 +- .../package.json | 2 +- .../snap.txt | 69 ++++----- .../command-add-pnpm10/package.json | 2 +- .../snap-tests/command-add-pnpm10/snap.txt | 143 ++---------------- .../snap-tests/command-add-pnpm10/steps.json | 12 +- .../command-add-pnpm9-with-workspace/snap.txt | 8 - .../snap-tests/command-add-pnpm9/snap.txt | 6 - .../command-add-yarn4-with-workspace/snap.txt | 6 - .../snap-tests/command-add-yarn4/snap.txt | 5 - packages/tools/src/utils.ts | 3 + 20 files changed, 161 insertions(+), 271 deletions(-) diff --git a/crates/vite_package_manager/src/add.rs b/crates/vite_package_manager/src/add.rs index 016edbdd7c..5cbf0016a0 100644 --- a/crates/vite_package_manager/src/add.rs +++ b/crates/vite_package_manager/src/add.rs @@ -1,7 +1,10 @@ -use std::collections::HashMap; +use std::{collections::HashMap, process::ExitStatus}; + +use vite_error::Error; +use vite_path::AbsolutePath; use crate::package_manager::{ - PackageManager, PackageManagerType, ResolveCommandResult, format_path_env, + PackageManager, PackageManagerType, ResolveCommandResult, format_path_env, run_command, }; /// The type of dependency to save. @@ -33,6 +36,19 @@ pub struct AddCommandOptions<'a> { } impl PackageManager { + /// Run the add command with the package manager. + /// Return the exit status of the command. + #[must_use] + pub async fn run_add_command( + &self, + options: &AddCommandOptions<'_>, + cwd: impl AsRef, + ) -> Result { + let resolve_command = self.resolve_add_command(options); + run_command(&resolve_command.bin_path, &resolve_command.args, &resolve_command.envs, cwd) + .await + } + /// Resolve the add command. #[must_use] pub fn resolve_add_command(&self, options: &AddCommandOptions) -> ResolveCommandResult { diff --git a/crates/vite_package_manager/src/package_manager.rs b/crates/vite_package_manager/src/package_manager.rs index 7840e2dae3..1d4229da30 100644 --- a/crates/vite_package_manager/src/package_manager.rs +++ b/crates/vite_package_manager/src/package_manager.rs @@ -4,11 +4,12 @@ use std::{ fs::{self, File}, io::{BufReader, Seek, SeekFrom}, path::Path, + process::{ExitStatus, Stdio}, }; use semver::{Version, VersionReq}; use serde::{Deserialize, Serialize}; -use tokio::fs::remove_dir_all; +use tokio::{fs::remove_dir_all, process::Command}; use vite_error::Error; use vite_path::{AbsolutePath, AbsolutePathBuf, RelativePathBuf}; use vite_str::Str; @@ -138,8 +139,8 @@ impl PackageManagerBuilder { } impl PackageManager { - pub fn builder(workspace_root: impl AsRef) -> PackageManagerBuilder { - PackageManagerBuilder::new(workspace_root) + pub fn builder(cwd: impl AsRef) -> PackageManagerBuilder { + PackageManagerBuilder::new(cwd) } #[must_use] @@ -600,6 +601,27 @@ pub(crate) fn format_path_env(bin_prefix: impl AsRef) -> String { env::join_paths(paths).unwrap().to_string_lossy().to_string() } +pub(crate) async fn run_command( + bin_name: &str, + args: &Vec, + envs: &HashMap, + cwd: impl AsRef, +) -> Result { + println!("Running: {} {}", bin_name, args.join(" ")); + + // TODO: color support for stdout/stderr + let status = Command::new(bin_name) + .args(args) + .envs(envs) + .current_dir(cwd.as_ref()) + .stdin(Stdio::inherit()) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .status() + .await?; + Ok(status) +} + #[cfg(test)] mod tests { use std::fs; diff --git a/crates/vite_task/src/add.rs b/crates/vite_task/src/add.rs index 9c91bc26f7..10c9354075 100644 --- a/crates/vite_task/src/add.rs +++ b/crates/vite_task/src/add.rs @@ -1,27 +1,24 @@ -use petgraph::stable_graph::StableGraph; +use std::process::ExitStatus; + use vite_package_manager::{ add::{AddCommandOptions, SaveDependencyType}, package_manager::PackageManager, }; use vite_path::AbsolutePathBuf; -use crate::{ - Error, ResolveCommandResult, Workspace, - config::ResolvedTask, - schedule::{ExecutionPlan, ExecutionSummary}, -}; +use crate::Error; /// Add command for adding packages to dependencies. /// /// This command automatically detects the package manager and translates /// the add command to the appropriate package manager-specific syntax. pub struct AddCommand { - workspace_root: AbsolutePathBuf, + cwd: AbsolutePathBuf, } impl AddCommand { - pub fn new(workspace_root: AbsolutePathBuf) -> Self { - Self { workspace_root } + pub fn new(cwd: AbsolutePathBuf) -> Self { + Self { cwd } } pub async fn execute( @@ -36,15 +33,11 @@ impl AddCommand { global: bool, allow_build: Option<&str>, pass_through_args: Option<&[String]>, - ) -> Result { + ) -> Result { if packages.is_empty() { return Err(Error::NoPackagesSpecified); } - // Detect package manager - let package_manager = PackageManager::builder(&self.workspace_root).build().await?; - let workspace = Workspace::partial_load(self.workspace_root)?; - let add_command_options = AddCommandOptions { packages, save_dependency_type, @@ -57,26 +50,11 @@ impl AddCommand { allow_build, pass_through_args, }; - let resolve_command = package_manager.resolve_add_command(&add_command_options); - println!("Running: {} {}", resolve_command.bin_path, resolve_command.args.join(" ")); - - // TODO: set cacheable to false - let resolved_task = ResolvedTask::resolve_from_builtin_with_command_result( - &workspace, - "add", - resolve_command.args.iter(), - ResolveCommandResult { bin_path: resolve_command.bin_path, envs: resolve_command.envs }, - false, - None, - )?; - - let mut task_graph: StableGraph = Default::default(); - task_graph.add_node(resolved_task); - let summary = ExecutionPlan::plan(task_graph, false)?.execute(&workspace).await?; - workspace.unload().await?; + // Detect package manager + let package_manager = PackageManager::builder(&self.cwd).build().await?; - Ok(summary) + package_manager.run_add_command(&add_command_options, &self.cwd).await } } diff --git a/crates/vite_task/src/lib.rs b/crates/vite_task/src/lib.rs index 6a8d00b805..45f08a69cf 100644 --- a/crates/vite_task/src/lib.rs +++ b/crates/vite_task/src/lib.rs @@ -241,7 +241,7 @@ async fn execute_add_command( global: bool, allow_build: Option<&str>, pass_through_args: Option<&[String]>, -) -> Result { +) -> Result { let save_dependency_type = if save_dev { Some(SaveDependencyType::Dev) } else if save_peer { @@ -342,6 +342,37 @@ pub struct ResolvedUniversalViteConfig { pub fmt: Option, } +#[cfg(unix)] +fn fix_stdio_streams() { + // libuv may mark stdin/stdout/stderr as close-on-exec. + // As a workaround, we clear the FD_CLOEXEC flag on these file descriptors to prevent them from being closed when spawning child processes. + // + // For details see https://github.com/libuv/libuv/issues/2062 + // Fixed by reference from https://github.com/electron/electron/pull/15555 + + use std::os::unix::io::RawFd; + + use nix::libc; + + unsafe { + // Helper function to clear FD_CLOEXEC flag on a file descriptor + let clear_cloexec = |fd: RawFd| { + // Get current file descriptor flags + let flags = libc::fcntl(fd, libc::F_GETFD); + if flags >= 0 { + // Clear the FD_CLOEXEC flag + let new_flags = flags & !libc::FD_CLOEXEC; + libc::fcntl(fd, libc::F_SETFD, new_flags); + } + }; + + // Clear FD_CLOEXEC on stdin, stdout, stderr + clear_cloexec(libc::STDIN_FILENO); + clear_cloexec(libc::STDOUT_FILENO); + clear_cloexec(libc::STDERR_FILENO); + } +} + /// Main entry point for vite-plus task execution. /// /// # Execution Flow @@ -409,6 +440,9 @@ pub async fn main< >, >, ) -> Result { + #[cfg(unix)] + fix_stdio_streams(); + // Auto-install dependencies if needed, but skip for install command itself, or if `VITE_DISABLE_AUTO_INSTALL=1` is set. if !matches!(args.commands, Commands::Install { .. }) && std::env::var_os("VITE_DISABLE_AUTO_INSTALL") != Some("1".into()) @@ -534,7 +568,7 @@ pub async fn main< allow_build, pass_through_args, } => { - execute_add_command( + let exit_status = execute_add_command( cwd, packages, *save_prod, @@ -551,7 +585,8 @@ pub async fn main< allow_build.as_deref(), pass_through_args.as_deref(), ) - .await? + .await?; + return Ok(exit_status); } Commands::Install { args } => { // Check if args contain packages - if yes, redirect to Add command @@ -573,7 +608,7 @@ pub async fn main< pass_through_args, }) = parse_install_as_add(args) { - execute_add_command( + let exit_status = execute_add_command( cwd, &packages, save_prod, @@ -590,7 +625,8 @@ pub async fn main< allow_build.as_deref(), pass_through_args.as_deref(), ) - .await? + .await?; + return Ok(exit_status); } else { install::InstallCommand::builder(cwd).build().execute(args).await? } diff --git a/package.json b/package.json index ffb720aca8..ff52906fe0 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "install-global-cli": "npm install -g ./packages/global", "typecheck": "tsc -b tsconfig.json", "lint": "vite lint && vite run typecheck", - "test": "vite test && pnpm -r snap-test", + "test": "vite test run && pnpm -r snap-test", "prepare": "husky" }, "devDependencies": { diff --git a/packages/cli/binding/src/lib.rs b/packages/cli/binding/src/lib.rs index 9d0e065acd..d3ff7cc464 100644 --- a/packages/cli/binding/src/lib.rs +++ b/packages/cli/binding/src/lib.rs @@ -197,6 +197,8 @@ pub async fn run(options: CliOptions) -> Result { ) .await; + tracing::debug!("Result: {result:?}"); + match result { Ok(exit_status) => Ok(exit_status.code().unwrap_or(1)), Err(e) => { diff --git a/packages/global/snap-tests/command-add-npm10-with-workspace/snap.txt b/packages/global/snap-tests/command-add-npm10-with-workspace/snap.txt index 5983765be0..287fa04ff4 100644 --- a/packages/global/snap-tests/command-add-npm10-with-workspace/snap.txt +++ b/packages/global/snap-tests/command-add-npm10-with-workspace/snap.txt @@ -2,7 +2,6 @@ Running: npm install --include-workspace-root --save-dev --no-audit testnpm2 added 3 packages in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", @@ -27,7 +26,6 @@ added 3 packages in ms Running: npm install --no-audit @vite-plus-test/utils up to date in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", @@ -55,7 +53,6 @@ up to date in ms Running: npm install --workspace app --no-audit testnpm2 test-vite-plus-install@ added 1 package in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", @@ -87,7 +84,6 @@ added 1 package in ms Running: npm install --workspace app --no-audit @vite-plus-test/utils up to date in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", @@ -120,7 +116,6 @@ up to date in ms Running: npm install --workspace * --no-audit testnpm2 test-vite-plus-install@ up to date in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", @@ -157,7 +152,6 @@ up to date in ms Running: npm install --workspace * --include-workspace-root --save-exact --no-audit testnpm2 test-vite-plus-install@ up to date in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", @@ -195,7 +189,6 @@ up to date in ms Running: npm install --workspace * --include-workspace-root --no-audit test-vite-plus-package@ added 1 package in ms - { "name": "command-add-npm10-with-workspace", "version": "1.0.0", diff --git a/packages/global/snap-tests/command-add-npm10/snap.txt b/packages/global/snap-tests/command-add-npm10/snap.txt index 077914b454..07ecc12041 100644 --- a/packages/global/snap-tests/command-add-npm10/snap.txt +++ b/packages/global/snap-tests/command-add-npm10/snap.txt @@ -39,7 +39,6 @@ Options: Running: npm install --save-dev --no-audit testnpm2 added 1 package in ms - { "name": "command-add-npm10", "version": "1.0.0", @@ -53,7 +52,6 @@ added 1 package in ms Running: npm install --no-audit testnpm2 test-vite-plus-install added 1 package in ms - { "name": "command-add-npm10", "version": "1.0.0", @@ -70,7 +68,6 @@ added 1 package in ms Running: npm install --save-peer --no-audit test-vite-plus-package@ added 1 package in ms - { "name": "command-add-npm10", "version": "1.0.0", @@ -90,7 +87,6 @@ added 1 package in ms Running: npm install --save-optional --no-audit test-vite-plus-package-optional added 1 package in ms - { "name": "command-add-npm10", "version": "1.0.0", @@ -113,7 +109,6 @@ added 1 package in ms Running: npm install --loglevel=warn --no-audit test-vite-plus-package-optional up to date in ms - { "name": "command-add-npm10", "version": "1.0.0", diff --git a/packages/global/snap-tests/command-add-npm11-with-workspace/snap.txt b/packages/global/snap-tests/command-add-npm11-with-workspace/snap.txt index 3572a0c010..7e95a608b4 100644 --- a/packages/global/snap-tests/command-add-npm11-with-workspace/snap.txt +++ b/packages/global/snap-tests/command-add-npm11-with-workspace/snap.txt @@ -2,7 +2,6 @@ Running: npm install --include-workspace-root --save-dev --no-audit testnpm2 added 3 packages in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -23,11 +22,11 @@ added 3 packages in ms "private": true } + > vp add @vite-plus-test/utils --workspace -- --no-audit && cat package.json packages/app/package.json packages/utils/package.json # should add @vite-plus-test/utils to workspace root Running: npm install --no-audit @vite-plus-test/utils up to date in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -51,11 +50,11 @@ up to date in ms "private": true } + > vp add testnpm2 test-vite-plus-install@1.0.0 --filter app -- --no-audit && cat package.json packages/app/package.json packages/utils/package.json # should add packages to packages/app Running: npm install --workspace app --no-audit testnpm2 test-vite-plus-install@ added 1 package in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -83,11 +82,11 @@ added 1 package in ms "private": true } + > vp add @vite-plus-test/utils --workspace --filter app -- --no-audit && cat package.json packages/app/package.json packages/utils/package.json # should add @vite-plus-test/utils to packages/app Running: npm install --workspace app --no-audit @vite-plus-test/utils up to date in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -116,11 +115,11 @@ up to date in ms "private": true } + > vp add testnpm2 test-vite-plus-install@1.0.0 --filter "*" -- --no-audit && cat package.json packages/app/package.json packages/utils/package.json # should add testnpm2 test-vite-plus-install to all packages except workspace root Running: npm install --workspace * --no-audit testnpm2 test-vite-plus-install@ up to date in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -153,11 +152,11 @@ up to date in ms } } + > vp add -E testnpm2 test-vite-plus-install@1.0.0 --filter "*" --workspace-root -- --no-audit && cat package.json packages/app/package.json packages/utils/package.json # should add testnpm2 test-vite-plus-install to all packages include workspace root Running: npm install --workspace * --include-workspace-root --save-exact --no-audit testnpm2 test-vite-plus-install@ up to date in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -191,11 +190,11 @@ up to date in ms } } + > vp install test-vite-plus-package@1.0.0 --filter "*" --workspace-root -- --no-audit && cat package.json packages/app/package.json packages/utils/package.json # should install packages alias for add command Running: npm install --workspace * --include-workspace-root --no-audit test-vite-plus-package@ added 1 package in ms - { "name": "command-add-npm11-with-workspace", "version": "1.0.0", @@ -231,3 +230,4 @@ added 1 package in ms "testnpm2": "1.0.1" } } + diff --git a/packages/global/snap-tests/command-add-npm11/snap.txt b/packages/global/snap-tests/command-add-npm11/snap.txt index a3646d88ff..29caa1cab6 100644 --- a/packages/global/snap-tests/command-add-npm11/snap.txt +++ b/packages/global/snap-tests/command-add-npm11/snap.txt @@ -39,7 +39,6 @@ Options: Running: npm install --save-dev --no-audit testnpm2 added 1 package in ms - { "name": "command-add-npm11", "version": "1.0.0", @@ -49,11 +48,11 @@ added 1 package in ms } } + > vp add testnpm2 test-vite-plus-install --allow-build=test-vite-plus-install -- --no-audit && cat package.json # should add packages to dependencies Running: npm install --no-audit testnpm2 test-vite-plus-install added 1 package in ms - { "name": "command-add-npm11", "version": "1.0.0", @@ -66,11 +65,11 @@ added 1 package in ms } } + > vp install test-vite-plus-package@1.0.0 --save-peer -- --no-audit && cat package.json # should install package alias for add Running: npm install --save-peer --no-audit test-vite-plus-package@ added 1 package in ms - { "name": "command-add-npm11", "version": "1.0.0", @@ -86,11 +85,11 @@ added 1 package in ms } } + > vp add test-vite-plus-package-optional -O -- --no-audit && cat package.json # should add package as optional dependencies Running: npm install --save-optional --no-audit test-vite-plus-package-optional added 1 package in ms - { "name": "command-add-npm11", "version": "1.0.0", @@ -109,11 +108,11 @@ added 1 package in ms } } + > vp add test-vite-plus-package-optional -- --loglevel=warn --no-audit && cat package.json # support pass through arguments Running: npm install --loglevel=warn --no-audit test-vite-plus-package-optional up to date in ms - { "name": "command-add-npm11", "version": "1.0.0", @@ -131,3 +130,4 @@ up to date in ms "test-vite-plus-package-optional": "^1.0.0" } } + diff --git a/packages/global/snap-tests/command-add-pnpm10-with-workspace/package.json b/packages/global/snap-tests/command-add-pnpm10-with-workspace/package.json index c3e1ee2516..85219debb0 100644 --- a/packages/global/snap-tests/command-add-pnpm10-with-workspace/package.json +++ b/packages/global/snap-tests/command-add-pnpm10-with-workspace/package.json @@ -1,5 +1,5 @@ { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", - "packageManager": "pnpm@10.18.0" + "packageManager": "pnpm@10.19.0" } diff --git a/packages/global/snap-tests/command-add-pnpm10-with-workspace/snap.txt b/packages/global/snap-tests/command-add-pnpm10-with-workspace/snap.txt index a5df29155a..ee4a70c8fe 100644 --- a/packages/global/snap-tests/command-add-pnpm10-with-workspace/snap.txt +++ b/packages/global/snap-tests/command-add-pnpm10-with-workspace/snap.txt @@ -3,24 +3,22 @@ Running: pnpm add --workspace-root --save-dev testnpm2 Progress: resolved , reused , downloaded , added , done devDependencies: -+ testnpm2 ^1.0.1 ++ testnpm2 catalog: Packages: + + Done in ms using pnpm v - { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", "packageManager": "pnpm@", "devDependencies": { - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" } } > vp add @vite-plus-test/utils --workspace && cat package.json # should add @vite-plus-test/utils to workspace root Running: pnpm add --workspace @vite-plus-test/utils - WARN  `node_modules` is present. Lockfile only installation will make it out-of-date Progress: resolved , reused , downloaded , added , done dependencies: @@ -28,13 +26,12 @@ dependencies: Already up to date Done in ms using pnpm v - { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", "packageManager": "pnpm@", "devDependencies": { - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" }, "dependencies": { "@vite-plus-test/utils": "workspace:*" @@ -43,17 +40,15 @@ Done in ms using pnpm v > vp add testnpm2 test-vite-plus-install@1.0.0 --filter app && cat package.json packages/app/package.json packages/utils/package.json # should add packages to packages/app Running: pnpm --filter app add testnpm2 test-vite-plus-install@ -. |  WARN  `node_modules` is present. Lockfile only installation will make it out-of-date -Progress: resolved , reused , downloaded , added , done + Progress: resolved , reused , downloaded , added , done . | +1 + Done in ms using pnpm v - { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", "packageManager": "pnpm@", "devDependencies": { - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" }, "dependencies": { "@vite-plus-test/utils": "workspace:*" @@ -62,8 +57,8 @@ Done in ms using pnpm v { "name": "app", "dependencies": { - "test-vite-plus-install": "1.0.0", - "testnpm2": "^1.0.1" + "test-vite-plus-install": "catalog:", + "testnpm2": "catalog:" } } { @@ -74,16 +69,14 @@ Done in ms using pnpm v > vp add @vite-plus-test/utils --workspace --filter app && cat package.json packages/app/package.json packages/utils/package.json # should add @vite-plus-test/utils to packages/app Running: pnpm --filter app add --workspace @vite-plus-test/utils -. |  WARN  `node_modules` is present. Lockfile only installation will make it out-of-date Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", "packageManager": "pnpm@", "devDependencies": { - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" }, "dependencies": { "@vite-plus-test/utils": "workspace:*" @@ -93,8 +86,8 @@ Done in ms using pnpm v "name": "app", "dependencies": { "@vite-plus-test/utils": "workspace:*", - "test-vite-plus-install": "1.0.0", - "testnpm2": "^1.0.1" + "test-vite-plus-install": "catalog:", + "testnpm2": "catalog:" } } { @@ -105,15 +98,14 @@ Done in ms using pnpm v > vp add -E testnpm2 test-vite-plus-install --filter "*" && cat package.json packages/app/package.json packages/utils/package.json # should add testnpm2 test-vite-plus-install to all packages except workspace root Running: pnpm --filter * add --save-exact testnpm2 test-vite-plus-install -Progress: resolved , reused , downloaded , added , done +  Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", "packageManager": "pnpm@", "devDependencies": { - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" }, "dependencies": { "@vite-plus-test/utils": "workspace:*" @@ -123,8 +115,8 @@ Done in ms using pnpm v "name": "app", "dependencies": { "@vite-plus-test/utils": "workspace:*", - "test-vite-plus-install": "1.0.0", - "testnpm2": "^1.0.1" + "test-vite-plus-install": "catalog:", + "testnpm2": "catalog:" } } { @@ -132,8 +124,8 @@ Done in ms using pnpm v "version": "1.0.0", "private": true, "dependencies": { - "test-vite-plus-install": "1.0.0", - "testnpm2": "^1.0.1" + "test-vite-plus-install": "catalog:", + "testnpm2": "catalog:" } } @@ -142,13 +134,12 @@ Running: pnpm --filter * add --workspace-root --save-catalog test-vite-plus-pack . | +1 + Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "command-add-pnpm10-with-workspace", "version": "1.0.0", "packageManager": "pnpm@", "devDependencies": { - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" }, "dependencies": { "@vite-plus-test/utils": "workspace:*", @@ -159,9 +150,9 @@ Done in ms using pnpm v "name": "app", "dependencies": { "@vite-plus-test/utils": "workspace:*", - "test-vite-plus-install": "1.0.0", + "test-vite-plus-install": "catalog:", "test-vite-plus-package": "catalog:", - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" } } { @@ -169,39 +160,41 @@ Done in ms using pnpm v "version": "1.0.0", "private": true, "dependencies": { - "test-vite-plus-install": "1.0.0", + "test-vite-plus-install": "catalog:", "test-vite-plus-package": "catalog:", - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" } } packages: - packages/* catalog: + test-vite-plus-install: test-vite-plus-package: + testnpm2: > vp add --filter app test-vite-plus-package-optional --save-catalog-name v1 && cat packages/app/package.json pnpm-workspace.yaml # should add with save-catalog-name Running: pnpm --filter app add --save-catalog-name=v1 test-vite-plus-package-optional -. |  WARN  `node_modules` is present. Lockfile only installation will make it out-of-date Progress: resolved , reused , downloaded , added , done . | +1 + Done in ms using pnpm v - { "name": "app", "dependencies": { "@vite-plus-test/utils": "workspace:*", - "test-vite-plus-install": "1.0.0", + "test-vite-plus-install": "catalog:", "test-vite-plus-package": "catalog:", "test-vite-plus-package-optional": "catalog:v1", - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" } } packages: - packages/* catalog: + test-vite-plus-install: test-vite-plus-package: + testnpm2: catalogs: v1: @@ -209,18 +202,16 @@ catalogs: > vp add --filter=./packages/utils test-vite-plus-package-optional -O --save-catalog-name v2 && cat packages/utils/package.json pnpm-workspace.yaml # should add other with save-catalog-name Running: pnpm --filter ./packages/utils add --save-optional --save-catalog-name=v2 test-vite-plus-package-optional -. |  WARN  `node_modules` is present. Lockfile only installation will make it out-of-date Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "@vite-plus-test/utils", "version": "1.0.0", "private": true, "dependencies": { - "test-vite-plus-install": "1.0.0", + "test-vite-plus-install": "catalog:", "test-vite-plus-package": "catalog:", - "testnpm2": "^1.0.1" + "testnpm2": "catalog:" }, "optionalDependencies": { "test-vite-plus-package-optional": "catalog:v2" @@ -230,7 +221,9 @@ packages: - packages/* catalog: + test-vite-plus-install: test-vite-plus-package: + testnpm2: catalogs: v1: diff --git a/packages/global/snap-tests/command-add-pnpm10/package.json b/packages/global/snap-tests/command-add-pnpm10/package.json index e1fbd39a99..4981001600 100644 --- a/packages/global/snap-tests/command-add-pnpm10/package.json +++ b/packages/global/snap-tests/command-add-pnpm10/package.json @@ -1,5 +1,5 @@ { "name": "command-add-pnpm10", "version": "1.0.0", - "packageManager": "pnpm@10.18.0" + "packageManager": "pnpm@10.19.0" } diff --git a/packages/global/snap-tests/command-add-pnpm10/snap.txt b/packages/global/snap-tests/command-add-pnpm10/snap.txt index c74aa310ff..0b32569b87 100644 --- a/packages/global/snap-tests/command-add-pnpm10/snap.txt +++ b/packages/global/snap-tests/command-add-pnpm10/snap.txt @@ -35,152 +35,29 @@ Options: -h, --help Print help -> vp add testnpm2 -D && cat package.json # should add package as dev dependencies -Running: pnpm add --save-dev testnpm2 +> 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: + + Progress: resolved , reused , downloaded , added , done devDependencies: + testnpm2 ++ urllib Done in ms using pnpm v - -{ - "name": "command-add-pnpm10", - "version": "1.0.0", - "packageManager": "pnpm@", - "devDependencies": { - "testnpm2": "^1.0.1" - } -} - -> 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" - }, - "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" - }, - "dependencies": { - "test-vite-plus-install": "^1.0.0" - }, - "peerDependencies": { - "test-vite-plus-package": "1.0.0" + "testnpm2": "catalog:", + "urllib": "catalog:" } } -> 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" - }, - "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" - }, - "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 -g testnpm2 -- --dry-run && cat package.json # support add global package with dry-run -Running: npm install --global --dry-run testnpm2 -add testnpm2 - -added 1 package in ms - -{ - "name": "command-add-pnpm10", - "version": "1.0.0", - "packageManager": "pnpm@", - "devDependencies": { - "test-vite-plus-package": "1.0.0", - "testnpm2": "^1.0.1" - }, - "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 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 diff --git a/packages/global/snap-tests/command-add-pnpm10/steps.json b/packages/global/snap-tests/command-add-pnpm10/steps.json index 5df89330e0..44bb6ebd68 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 testnpm2 -D && 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 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" ] } diff --git a/packages/global/snap-tests/command-add-pnpm9-with-workspace/snap.txt b/packages/global/snap-tests/command-add-pnpm9-with-workspace/snap.txt index 6178ace97b..78e39bd980 100644 --- a/packages/global/snap-tests/command-add-pnpm9-with-workspace/snap.txt +++ b/packages/global/snap-tests/command-add-pnpm9-with-workspace/snap.txt @@ -8,7 +8,6 @@ devDependencies: Packages: + + Done in ms using pnpm v - { "name": "command-add-pnpm9-with-workspace", "version": "1.0.0", @@ -22,14 +21,12 @@ Done in ms using pnpm v Running: pnpm add --workspace @vite-plus-test/utils  ERR_PNPM_ADDING_TO_ROOT  Running this command will add the dependency to the workspace root, which might not be what you want - if you really meant it, make it explicit by running this command again with the -w flag (or --workspace-root). If you don't want to see this warning anymore, you may set the ignore-workspace-root-check setting to true. - > vp add testnpm2 test-vite-plus-install@1.0.0 --filter app && cat package.json packages/app/package.json packages/utils/package.json # should add packages to packages/app Running: pnpm --filter app add testnpm2 test-vite-plus-install@ . |  WARN  `node_modules` is present. Lockfile only installation will make it out-of-date Progress: resolved , reused , downloaded , added , done . | +1 + Done in ms using pnpm v - { "name": "command-add-pnpm9-with-workspace", "version": "1.0.0", @@ -56,7 +53,6 @@ Running: pnpm --filter app add --workspace @vite-plus-test/utils . |  WARN  `node_modules` is present. Lockfile only installation will make it out-of-date Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "command-add-pnpm9-with-workspace", "version": "1.0.0", @@ -83,7 +79,6 @@ Done in ms using pnpm v Running: pnpm --filter * add --save-exact testnpm2 test-vite-plus-install Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "command-add-pnpm9-with-workspace", "version": "1.0.0", @@ -115,7 +110,6 @@ Running: pnpm --filter * add --workspace-root test-vite-plus-package@ . | +1 + Progress: resolved , reused , downloaded , added , done Done in ms using pnpm v - { "name": "command-add-pnpm9-with-workspace", "version": "1.0.0", @@ -152,7 +146,6 @@ packages: [1]> vp add --filter app test-vite-plus-package-optional --save-catalog-name v1 # should error because save-catalog-name is not supported at pnpm@9 Running: pnpm --filter app add --save-catalog-name=v1 test-vite-plus-package-optional -  ERROR  Unknown option: 'save-catalog-name' Did you mean 'save-optional'? Use "--config.unknown=value" to force an unknown option. For help, run: pnpm help add @@ -160,7 +153,6 @@ For help, run: pnpm help add [1]> vp add --filter=./packages/utils test-vite-plus-package-optional -O --save-catalog v2 # should error because save-catalog is not supported at pnpm@9 Running: pnpm --filter ./packages/utils add --save-optional --save-catalog test-vite-plus-package-optional v2 -  ERROR  Unknown option: 'save-catalog' Did you mean 'save-exact', or 'save-prod'? Use "--config.unknown=value" to force an unknown option. For help, run: pnpm help add diff --git a/packages/global/snap-tests/command-add-pnpm9/snap.txt b/packages/global/snap-tests/command-add-pnpm9/snap.txt index 7a5c4a1088..eb5c087e49 100644 --- a/packages/global/snap-tests/command-add-pnpm9/snap.txt +++ b/packages/global/snap-tests/command-add-pnpm9/snap.txt @@ -45,7 +45,6 @@ devDependencies: + testnpm2 Done in ms using pnpm v - { "name": "command-add-pnpm9", "version": "1.0.0", @@ -65,7 +64,6 @@ dependencies: + test-vite-plus-install Done in ms using pnpm v - { "name": "command-add-pnpm9", "version": "1.0.0", @@ -81,7 +79,6 @@ Done in ms using pnpm v [1]> vp add testnpm2 test-vite-plus-install --allow-build=test-vite-plus-install # should error because allow-build is not supported at pnpm@9 Running: pnpm add --allow-build=test-vite-plus-install testnpm2 test-vite-plus-install -  ERROR  Unknown option: 'allow-build' For help, run: pnpm help add @@ -98,7 +95,6 @@ devDependencies: + test-vite-plus-package already in devDependencies, was not moved to dependencies. Done in ms using pnpm v - { "name": "command-add-pnpm9", "version": "1.0.0", @@ -125,7 +121,6 @@ optionalDependencies: + test-vite-plus-package-optional Done in ms using pnpm v - { "name": "command-add-pnpm9", "version": "1.0.0", @@ -147,7 +142,6 @@ Done in ms using pnpm v > 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-pnpm9", "version": "1.0.0", diff --git a/packages/global/snap-tests/command-add-yarn4-with-workspace/snap.txt b/packages/global/snap-tests/command-add-yarn4-with-workspace/snap.txt index bb0a7df109..e8c12b28fc 100644 --- a/packages/global/snap-tests/command-add-yarn4-with-workspace/snap.txt +++ b/packages/global/snap-tests/command-add-yarn4-with-workspace/snap.txt @@ -9,7 +9,6 @@ Running: yarn add --dev testnpm2 ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4-with-workspace", "version": "1.0.0", @@ -40,7 +39,6 @@ Running: yarn add @vite-plus-test/utils ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4-with-workspace", "version": "1.0.0", @@ -76,7 +74,6 @@ Running: yarn workspaces foreach --all --include app add testnpm2 test-vite-plus ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms Done in ms ms - { "name": "command-add-yarn4-with-workspace", "version": "1.0.0", @@ -115,7 +112,6 @@ Running: yarn workspaces foreach --all --include app add @vite-plus-test/utils ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms Done in ms ms - { "name": "command-add-yarn4-with-workspace", "version": "1.0.0", @@ -179,7 +175,6 @@ Running: yarn workspaces foreach --all --include * --include @vite-plus-test/uti ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms Done in ms ms - { "name": "command-add-yarn4-with-workspace", "version": "1.0.0", @@ -248,7 +243,6 @@ Running: yarn workspaces foreach --all --include * add --optional test-vite-plus ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms Done in ms ms - { "name": "command-add-yarn4-with-workspace", "version": "1.0.0", diff --git a/packages/global/snap-tests/command-add-yarn4/snap.txt b/packages/global/snap-tests/command-add-yarn4/snap.txt index 0c6eb0b1cd..64ab93e8c7 100644 --- a/packages/global/snap-tests/command-add-yarn4/snap.txt +++ b/packages/global/snap-tests/command-add-yarn4/snap.txt @@ -46,7 +46,6 @@ Running: yarn add --dev testnpm2 ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4", "version": "1.0.0", @@ -67,7 +66,6 @@ Running: yarn add testnpm2 test-vite-plus-install ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4", "version": "1.0.0", @@ -90,7 +88,6 @@ Running: yarn add --peer test-vite-plus-package@ ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4", "version": "1.0.0", @@ -117,7 +114,6 @@ Running: yarn add --optional test-vite-plus-package-optional ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4", "version": "1.0.0", @@ -146,7 +142,6 @@ Running: yarn add --tilde test-vite-plus-package-optional ➤ YN0000: ┌ Link step ➤ YN0000: └ Completed ➤ YN0000: · Done in ms ms - { "name": "command-add-yarn4", "version": "1.0.0", diff --git a/packages/tools/src/utils.ts b/packages/tools/src/utils.ts index dcdc3809df..af41b286db 100644 --- a/packages/tools/src/utils.ts +++ b/packages/tools/src/utils.ts @@ -30,6 +30,9 @@ export function replaceUnstableOutput(output: string, cwd?: string) { // ignore yarn YN0013, because it's unstable output, only exists on CI environment // ➤ YN0013: │ A package was added to the project (+ 0.7 KiB). .replaceAll(/➤ YN0013:[^\n]+\n/g, '') + // ignore npm warn + // npm warn Unknown env config "recursive". This will stop working in the next major version of npm + .replaceAll(/npm warn Unknown env config .+?\n/g, '') // replace size for tsdown .replaceAll(/ \d+(\.\d+)? ([km]B)/g, ' $2'); }