@@ -133,14 +133,31 @@ fn format_version(version: Option<String>) -> String {
133133}
134134
135135async 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