From 5f23c9dc2db08711550034dea0631d436e327f7d Mon Sep 17 00:00:00 2001 From: Liang Mi Date: Tue, 19 May 2026 06:29:18 +0800 Subject: [PATCH 1/6] fix global outdated and why without package json --- crates/vite_install/src/commands/why.rs | 17 +++++++++++++++++ crates/vite_pm_cli/src/handlers.rs | 12 ++++++++++-- .../command-pm-no-package-json/snap.txt | 13 +++++++++++++ .../command-pm-no-package-json/steps.json | 4 +++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/crates/vite_install/src/commands/why.rs b/crates/vite_install/src/commands/why.rs index 0a67e36f3d..af866dea65 100644 --- a/crates/vite_install/src/commands/why.rs +++ b/crates/vite_install/src/commands/why.rs @@ -180,6 +180,10 @@ impl PackageManager { args.push("--json".into()); } + if options.global { + args.push("--global".into()); + } + // Add packages (npm supports multiple packages) args.extend_from_slice(options.packages); @@ -354,6 +358,19 @@ mod tests { assert_eq!(result.args, vec!["explain", "--workspace", "app", "react"]); } + #[test] + fn test_npm_explain_global() { + let pm = create_mock_package_manager(PackageManagerType::Npm, "11.0.0"); + let packages = vec!["react".to_string()]; + let result = pm.resolve_why_command(&WhyCommandOptions { + packages: &packages, + global: true, + ..Default::default() + }); + assert_eq!(result.bin_path, "npm"); + assert_eq!(result.args, vec!["explain", "--global", "react"]); + } + #[test] fn test_yarn_why_basic() { let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.0.0"); diff --git a/crates/vite_pm_cli/src/handlers.rs b/crates/vite_pm_cli/src/handlers.rs index 0108e6aa51..b2e2d61dba 100644 --- a/crates/vite_pm_cli/src/handlers.rs +++ b/crates/vite_pm_cli/src/handlers.rs @@ -95,7 +95,11 @@ pub async fn run_outdated( cwd: &AbsolutePath, options: &OutdatedCommandOptions<'_>, ) -> Result { - let pm = build_package_manager(cwd).await?; + let pm = if options.global { + build_package_manager_or_npm_default(cwd).await? + } else { + build_package_manager(cwd).await? + }; Ok(pm.run_outdated_command(options, cwd).await?) } @@ -103,7 +107,11 @@ pub async fn run_why( cwd: &AbsolutePath, options: &WhyCommandOptions<'_>, ) -> Result { - let pm = build_package_manager(cwd).await?; + let pm = if options.global { + build_package_manager_or_npm_default(cwd).await? + } else { + build_package_manager(cwd).await? + }; Ok(pm.run_why_command(options, cwd).await?) } diff --git a/packages/cli/snap-tests/command-pm-no-package-json/snap.txt b/packages/cli/snap-tests/command-pm-no-package-json/snap.txt index 2707e25d5e..cca707ab25 100644 --- a/packages/cli/snap-tests/command-pm-no-package-json/snap.txt +++ b/packages/cli/snap-tests/command-pm-no-package-json/snap.txt @@ -9,3 +9,16 @@ error: No package.json found. [1]> vp why lodash # should show friendly error error: No package.json found. + +> vp outdated definitely-not-installed-vite-plus-snap-pkg -g --format json # should not require package.json for global outdated +{} + +[1]> vp why definitely-not-installed-vite-plus-snap-pkg -g --json # should not require package.json for global why +npm error No dependencies found matching definitely-not-installed-vite-plus-snap-pkg +{ + "error": { + "summary": "No dependencies found matching definitely-not-installed-vite-plus-snap-pkg", + "detail": "" + } +} +npm error A complete log of this run can be found in: /.npm/_logs/-debug.log diff --git a/packages/cli/snap-tests/command-pm-no-package-json/steps.json b/packages/cli/snap-tests/command-pm-no-package-json/steps.json index 4710180dbb..a02cc54a71 100644 --- a/packages/cli/snap-tests/command-pm-no-package-json/steps.json +++ b/packages/cli/snap-tests/command-pm-no-package-json/steps.json @@ -3,6 +3,8 @@ "vp pm ls # should show friendly error", "vp pm prune # should show friendly error", "vp outdated # should show friendly error", - "vp why lodash # should show friendly error" + "vp why lodash # should show friendly error", + "vp outdated definitely-not-installed-vite-plus-snap-pkg -g --format json # should not require package.json for global outdated", + "vp why definitely-not-installed-vite-plus-snap-pkg -g --json # should not require package.json for global why" ] } From 1cbdff685a87d44080773cc0a355c6e81723b69f Mon Sep 17 00:00:00 2001 From: Liang Mi Date: Tue, 19 May 2026 06:36:42 +0800 Subject: [PATCH 2/6] adjust --- crates/vite_pm_cli/src/handlers.rs | 9 ++++++--- crates/vite_pm_cli/src/helpers.rs | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/crates/vite_pm_cli/src/handlers.rs b/crates/vite_pm_cli/src/handlers.rs index b2e2d61dba..0febfe31d6 100644 --- a/crates/vite_pm_cli/src/handlers.rs +++ b/crates/vite_pm_cli/src/handlers.rs @@ -46,7 +46,10 @@ use crate::{ ConfigCommands, DistTagCommands, OwnerCommands, PluginCommands, PmCommands, TokenCommands, }, error::Error, - helpers::{build_package_manager, build_package_manager_or_npm_default, ensure_package_json}, + helpers::{ + build_package_manager, build_package_manager_or_npm_default, default_npm_package_manager, + ensure_package_json, + }, }; pub async fn run_add( @@ -96,7 +99,7 @@ pub async fn run_outdated( options: &OutdatedCommandOptions<'_>, ) -> Result { let pm = if options.global { - build_package_manager_or_npm_default(cwd).await? + default_npm_package_manager(cwd) } else { build_package_manager(cwd).await? }; @@ -108,7 +111,7 @@ pub async fn run_why( options: &WhyCommandOptions<'_>, ) -> Result { let pm = if options.global { - build_package_manager_or_npm_default(cwd).await? + default_npm_package_manager(cwd) } else { build_package_manager(cwd).await? }; diff --git a/crates/vite_pm_cli/src/helpers.rs b/crates/vite_pm_cli/src/helpers.rs index fdf35f39a9..755f117adb 100644 --- a/crates/vite_pm_cli/src/helpers.rs +++ b/crates/vite_pm_cli/src/helpers.rs @@ -37,7 +37,7 @@ pub async fn build_package_manager_or_npm_default( } } -fn default_npm_package_manager(cwd: &AbsolutePath) -> PackageManager { +pub fn default_npm_package_manager(cwd: &AbsolutePath) -> PackageManager { PackageManager { client: PackageManagerType::Npm, package_name: "npm".into(), From 10a4c01b3a42b5e598a42b7ff9051834d4593deb Mon Sep 17 00:00:00 2001 From: Liang Mi Date: Tue, 19 May 2026 06:37:06 +0800 Subject: [PATCH 3/6] adjust --- crates/vite_pm_cli/src/helpers.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/vite_pm_cli/src/helpers.rs b/crates/vite_pm_cli/src/helpers.rs index 755f117adb..2c87a7c365 100644 --- a/crates/vite_pm_cli/src/helpers.rs +++ b/crates/vite_pm_cli/src/helpers.rs @@ -37,7 +37,7 @@ pub async fn build_package_manager_or_npm_default( } } -pub fn default_npm_package_manager(cwd: &AbsolutePath) -> PackageManager { +pub(crate) fn default_npm_package_manager(cwd: &AbsolutePath) -> PackageManager { PackageManager { client: PackageManagerType::Npm, package_name: "npm".into(), From 09ee1b0daf2f117428b4fac9f3cec12943ccebcb Mon Sep 17 00:00:00 2001 From: Liang Mi Date: Tue, 19 May 2026 21:01:31 +0800 Subject: [PATCH 4/6] revert --- crates/vite_install/src/commands/why.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/crates/vite_install/src/commands/why.rs b/crates/vite_install/src/commands/why.rs index af866dea65..d4c85873ba 100644 --- a/crates/vite_install/src/commands/why.rs +++ b/crates/vite_install/src/commands/why.rs @@ -101,10 +101,6 @@ impl PackageManager { args.push("--no-optional".into()); } - if options.global { - args.push("--global".into()); - } - if options.exclude_peers { args.push("--exclude-peers".into()); } @@ -358,19 +354,6 @@ mod tests { assert_eq!(result.args, vec!["explain", "--workspace", "app", "react"]); } - #[test] - fn test_npm_explain_global() { - let pm = create_mock_package_manager(PackageManagerType::Npm, "11.0.0"); - let packages = vec!["react".to_string()]; - let result = pm.resolve_why_command(&WhyCommandOptions { - packages: &packages, - global: true, - ..Default::default() - }); - assert_eq!(result.bin_path, "npm"); - assert_eq!(result.args, vec!["explain", "--global", "react"]); - } - #[test] fn test_yarn_why_basic() { let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.0.0"); From 9d087077855e63a57250c01d52595deb100f1a61 Mon Sep 17 00:00:00 2001 From: Liang Mi Date: Tue, 19 May 2026 21:02:51 +0800 Subject: [PATCH 5/6] fix ci --- packages/cli/snap-tests/command-pm-no-package-json/steps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/snap-tests/command-pm-no-package-json/steps.json b/packages/cli/snap-tests/command-pm-no-package-json/steps.json index a02cc54a71..f1c5f05d3c 100644 --- a/packages/cli/snap-tests/command-pm-no-package-json/steps.json +++ b/packages/cli/snap-tests/command-pm-no-package-json/steps.json @@ -1,4 +1,5 @@ { + "ignoredPlatforms": ["win32"], "commands": [ "vp pm ls # should show friendly error", "vp pm prune # should show friendly error", From f3743e3e6baf066f155f5f21d83cddf5a502a548 Mon Sep 17 00:00:00 2001 From: Liang Mi Date: Tue, 19 May 2026 21:04:27 +0800 Subject: [PATCH 6/6] revert --- crates/vite_install/src/commands/why.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/vite_install/src/commands/why.rs b/crates/vite_install/src/commands/why.rs index d4c85873ba..0a67e36f3d 100644 --- a/crates/vite_install/src/commands/why.rs +++ b/crates/vite_install/src/commands/why.rs @@ -101,6 +101,10 @@ impl PackageManager { args.push("--no-optional".into()); } + if options.global { + args.push("--global".into()); + } + if options.exclude_peers { args.push("--exclude-peers".into()); } @@ -176,10 +180,6 @@ impl PackageManager { args.push("--json".into()); } - if options.global { - args.push("--global".into()); - } - // Add packages (npm supports multiple packages) args.extend_from_slice(options.packages);