Skip to content

Commit a9835b5

Browse files
fix: show node version fallback in vp --version
1 parent fb7cc34 commit a9835b5

1 file changed

Lines changed: 35 additions & 9 deletions

File tree

crates/vite_global_cli/src/commands/version.rs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,31 @@ fn format_version(version: Option<String>) -> String {
133133
}
134134

135135
async fn get_node_version_info(cwd: &AbsolutePathBuf) -> Option<(String, String)> {
136-
let resolution_opt = resolve_node_version(cwd, true).await.ok()?;
137-
let resolution = resolution_opt?;
138-
let source_label = match resolution.source {
139-
VersionSource::NodeVersionFile => ".node-version",
140-
VersionSource::EnginesNode => "engines.node",
141-
VersionSource::DevEnginesRuntime => "devEngines.runtime",
142-
};
143-
Some((resolution.version.to_string(), source_label.to_string()))
136+
if let Ok(Some(resolution)) = resolve_node_version(cwd, true).await {
137+
let source_label = match resolution.source {
138+
VersionSource::NodeVersionFile => ".node-version",
139+
VersionSource::EnginesNode => "engines.node",
140+
VersionSource::DevEnginesRuntime => "devEngines.runtime",
141+
};
142+
return Some((resolution.version.to_string(), source_label.to_string()));
143+
}
144+
145+
// Fallback: detect system Node version
146+
let version = detect_system_node_version()?;
147+
Some((version, "system".to_string()))
148+
}
149+
150+
fn detect_system_node_version() -> Option<String> {
151+
let output = std::process::Command::new("node").arg("--version").output().ok()?;
152+
if !output.status.success() {
153+
return None;
154+
}
155+
let version = String::from_utf8(output.stdout).ok()?;
156+
let version = version.trim().strip_prefix('v').unwrap_or(version.trim());
157+
if version.is_empty() {
158+
return None;
159+
}
160+
Some(version.to_string())
144161
}
145162

146163
/// Execute the `--version` command.
@@ -197,7 +214,7 @@ mod tests {
197214
#[cfg(unix)]
198215
use std::{fs, path::Path};
199216

200-
use super::format_version;
217+
use super::{detect_system_node_version, format_version};
201218
#[cfg(unix)]
202219
use super::{ToolSpec, find_local_vite_plus, resolve_tool_version};
203220

@@ -212,6 +229,15 @@ mod tests {
212229
assert_eq!(format_version(None), "Not found");
213230
}
214231

232+
#[test]
233+
fn detect_system_node_version_returns_version() {
234+
let version = detect_system_node_version();
235+
assert!(version.is_some(), "expected node to be installed");
236+
let version = version.unwrap();
237+
assert!(!version.starts_with('v'), "version should not have v prefix");
238+
assert!(version.contains('.'), "expected semver-like version, got: {version}");
239+
}
240+
215241
#[cfg(unix)]
216242
#[test]
217243
fn resolves_tool_versions_from_pnpm_symlink_layout() {

0 commit comments

Comments
 (0)