diff --git a/crates/vite_global_cli/src/commands/version.rs b/crates/vite_global_cli/src/commands/version.rs index 362022e3b5..91c06a0bd1 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}; @@ -64,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() @@ -123,10 +128,21 @@ 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(), } } +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 +151,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 +168,26 @@ pub async fn execute(cwd: AbsolutePathBuf) -> Result { }) .collect::>(); print_rows("Tools", &tool_rows); + println!(); + + // Environment info + let package_manager_info = find_workspace_root(&cwd) + .ok() + .and_then(|(root, _)| { + get_package_manager_type_and_version(&root, None) + .ok() + .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()) } 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"] +}