From 6e953fdfd88901b3316c664fc2629288facda646 Mon Sep 17 00:00:00 2001 From: nekomoyi Date: Mon, 16 Mar 2026 00:52:41 +0800 Subject: [PATCH 1/3] feat(cli): show package manager and Node.js version in --version --- .../vite_global_cli/src/commands/version.rs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/crates/vite_global_cli/src/commands/version.rs b/crates/vite_global_cli/src/commands/version.rs index 362022e3b5..8acdc37b71 100644 --- a/crates/vite_global_cli/src/commands/version.rs +++ b/crates/vite_global_cli/src/commands/version.rs @@ -9,7 +9,10 @@ use std::{ use owo_colors::OwoColorize; use serde::Deserialize; +use vite_install::get_package_manager_type_and_version; +use vite_js_runtime::{VersionSource, resolve_node_version}; use vite_path::AbsolutePathBuf; +use vite_workspace::find_workspace_root; use crate::{error::Error, help}; @@ -127,6 +130,17 @@ fn format_version(version: Option) -> String { } } +async fn get_node_version_info(cwd: &AbsolutePathBuf) -> Option<(String, String)> { + let resolution_opt = resolve_node_version(cwd, true).await.ok()?; + let resolution = resolution_opt?; + let source_label = match resolution.source { + VersionSource::NodeVersionFile => ".node-version", + VersionSource::EnginesNode => "engines.node", + VersionSource::DevEnginesRuntime => "devEngines.runtime", + }; + Some((resolution.version.to_string(), source_label.to_string())) +} + /// Execute the `--version` command. pub async fn execute(cwd: AbsolutePathBuf) -> Result { println!("{}", vite_shared::header::vite_plus_header()); @@ -135,6 +149,7 @@ pub async fn execute(cwd: AbsolutePathBuf) -> Result { println!("vp v{}", env!("CARGO_PKG_VERSION")); println!(); + // Local vite-plus and tools let local = find_local_vite_plus(cwd.as_path()); print_rows( "Local vite-plus", @@ -151,6 +166,24 @@ pub async fn execute(cwd: AbsolutePathBuf) -> Result { }) .collect::>(); print_rows("Tools", &tool_rows); + println!(); + + // Environment info + let env_rows = [ + find_workspace_root(&cwd).ok().and_then(|(root, _)| { + get_package_manager_type_and_version(&root, None) + .ok() + .map(|(pm, v, _)| ("Package manager", format!("{pm} v{v}"))) + }), + get_node_version_info(&cwd).await.map(|(v, s)| ("Node.js", format!("v{v} ({s})"))), + ] + .into_iter() + .filter_map(|row| row) + .collect::>(); + + if !env_rows.is_empty() { + print_rows("Environment", &env_rows); + } Ok(ExitStatus::default()) } From 3cb8d13598dce9f11127561bfc8e8237a58185bf Mon Sep 17 00:00:00 2001 From: nekomoyi Date: Mon, 16 Mar 2026 14:57:40 +0800 Subject: [PATCH 2/3] feat(cli): always show env rows --- .../vite_global_cli/src/commands/version.rs | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/crates/vite_global_cli/src/commands/version.rs b/crates/vite_global_cli/src/commands/version.rs index 8acdc37b71..91c06a0bd1 100644 --- a/crates/vite_global_cli/src/commands/version.rs +++ b/crates/vite_global_cli/src/commands/version.rs @@ -67,6 +67,8 @@ const TOOL_SPECS: [ToolSpec; 7] = [ }, ]; +const NOT_FOUND: &str = "Not found"; + fn read_package_json(package_json_path: &Path) -> Option { let content = fs::read_to_string(package_json_path).ok()?; serde_json::from_str(&content).ok() @@ -126,7 +128,7 @@ fn print_rows(title: &str, rows: &[(&str, String)]) { fn format_version(version: Option) -> String { match version { Some(v) => format!("v{v}"), - None => "Not found".to_string(), + None => NOT_FOUND.to_string(), } } @@ -169,21 +171,23 @@ pub async fn execute(cwd: AbsolutePathBuf) -> Result { println!(); // Environment info - let env_rows = [ - find_workspace_root(&cwd).ok().and_then(|(root, _)| { + let package_manager_info = find_workspace_root(&cwd) + .ok() + .and_then(|(root, _)| { get_package_manager_type_and_version(&root, None) .ok() - .map(|(pm, v, _)| ("Package manager", format!("{pm} v{v}"))) - }), - get_node_version_info(&cwd).await.map(|(v, s)| ("Node.js", format!("v{v} ({s})"))), - ] - .into_iter() - .filter_map(|row| row) - .collect::>(); - - if !env_rows.is_empty() { - print_rows("Environment", &env_rows); - } + .map(|(pm, v, _)| format!("{pm} v{v}")) + }) + .unwrap_or(NOT_FOUND.to_string()); + + let node_info = get_node_version_info(&cwd) + .await + .map(|(v, s)| format!("v{v} ({s})")) + .unwrap_or(NOT_FOUND.to_string()); + + let env_rows = [("Package manager", package_manager_info), ("Node.js", node_info)]; + + print_rows("Environment", &env_rows); Ok(ExitStatus::default()) } From 4be8d43085d8124513826fe75cbbf498628cf91f Mon Sep 17 00:00:00 2001 From: nekomoyi Date: Mon, 16 Mar 2026 15:15:18 +0800 Subject: [PATCH 3/3] test(cli): add snap tests for vp version env output --- .../cli-helper-message/snap.txt | 4 ++++ .../command-version-no-side-effects/snap.txt | 4 ++++ .../command-version-with-env/package.json | 9 +++++++++ .../command-version-with-env/snap.txt | 20 +++++++++++++++++++ .../command-version-with-env/steps.json | 4 ++++ 5 files changed, 41 insertions(+) create mode 100644 packages/cli/snap-tests-global/command-version-with-env/package.json create mode 100644 packages/cli/snap-tests-global/command-version-with-env/snap.txt create mode 100644 packages/cli/snap-tests-global/command-version-with-env/steps.json diff --git a/packages/cli/snap-tests-global/cli-helper-message/snap.txt b/packages/cli/snap-tests-global/cli-helper-message/snap.txt index da560c81fe..11590d389f 100644 --- a/packages/cli/snap-tests-global/cli-helper-message/snap.txt +++ b/packages/cli/snap-tests-global/cli-helper-message/snap.txt @@ -69,6 +69,10 @@ Tools: oxlint-tsgolint v tsdown v +Environment: + Package manager Not found + Node.js Not found + > vp install -h # show install help message VITE+ - The Unified Toolchain for the Web diff --git a/packages/cli/snap-tests-global/command-version-no-side-effects/snap.txt b/packages/cli/snap-tests-global/command-version-no-side-effects/snap.txt index 20c1f0fd4d..daedb7f41f 100644 --- a/packages/cli/snap-tests-global/command-version-no-side-effects/snap.txt +++ b/packages/cli/snap-tests-global/command-version-no-side-effects/snap.txt @@ -15,5 +15,9 @@ Tools: oxlint-tsgolint v tsdown v +Environment: + Package manager Not found + Node.js Not found + > test -f .node-version && echo 'FAIL: .node-version was created' || echo 'OK: no .node-version created' OK: no .node-version created diff --git a/packages/cli/snap-tests-global/command-version-with-env/package.json b/packages/cli/snap-tests-global/command-version-with-env/package.json new file mode 100644 index 0000000000..40d921c8f1 --- /dev/null +++ b/packages/cli/snap-tests-global/command-version-with-env/package.json @@ -0,0 +1,9 @@ +{ + "name": "command-version-with-env", + "version": "1.0.0", + "private": true, + "engines": { + "node": "22.18.0" + }, + "packageManager": "pnpm@10.20.0" +} diff --git a/packages/cli/snap-tests-global/command-version-with-env/snap.txt b/packages/cli/snap-tests-global/command-version-with-env/snap.txt new file mode 100644 index 0000000000..5330d722d0 --- /dev/null +++ b/packages/cli/snap-tests-global/command-version-with-env/snap.txt @@ -0,0 +1,20 @@ +> vp --version +VITE+ - The Unified Toolchain for the Web + +vp v + +Local vite-plus: + vite-plus v + +Tools: + vite v + rolldown v + vitest v + oxfmt v + oxlint v + oxlint-tsgolint v + tsdown v + +Environment: + Package manager pnpm v + Node.js v (engines.node) diff --git a/packages/cli/snap-tests-global/command-version-with-env/steps.json b/packages/cli/snap-tests-global/command-version-with-env/steps.json new file mode 100644 index 0000000000..338609964b --- /dev/null +++ b/packages/cli/snap-tests-global/command-version-with-env/steps.json @@ -0,0 +1,4 @@ +{ + "ignoredPlatforms": ["win32"], + "commands": ["vp --version"] +}