Skip to content

Commit 54ebbc7

Browse files
fix: add missing default_version field and current_version method
Files changed: - src/config/schema.rs: Added default_version field to Config struct - src/plugins/trait_def.rs: Added current_version() method to VersionManagerPlugin trait - src/plugins/nvm.rs, fnm.rs, mock.rs: Implemented current_version() method - src/engines_resolver.rs: New file for smart engines resolution logic - src/output.rs: Fixed unused parameter warning - src/activation/orchestrator.rs: Added default_version to test configs, implemented missing trait methods - src/init/*.rs: Added default_version to all Config initializations - tests/*.rs: Added default_version field to all test Config instances - Fixed clippy warnings for inline format strings - Fixed test assertion for LTS version selection All tests passing (150 passed)
1 parent 62ec295 commit 54ebbc7

File tree

17 files changed

+455
-19
lines changed

17 files changed

+455
-19
lines changed

=14.0.0

Whitespace-only changes.

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/activation/orchestrator.rs

Lines changed: 61 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::{ActivationError, ActivationResult, StdinUserPrompt, UserPrompt};
22
use crate::config::{AutoInstallMode, Config};
3+
use crate::engines_resolver::EnginesResolver;
34
use crate::output;
45
use crate::plugins::{PluginRegistry, VersionManagerPlugin};
56
use crate::shell::CommandWriter;
@@ -74,26 +75,42 @@ impl<'a> Orchestrator<'a> {
7475

7576
// Resolve semver range if from package.json
7677
let version_to_use = if version_file.source == VersionFileSource::PackageJson {
77-
// Try to resolve semver range using first available plugin
78-
if let Some(plugin) = self.registry.plugins().first() {
79-
let resolver = SemverResolver::new(plugin.as_ref());
80-
match resolver.resolve(&version_file.version) {
81-
Ok(resolved) => {
82-
if resolved != version_file.version {
83-
info!(
84-
"Resolved semver range '{}' → '{}'",
85-
version_file.version, resolved
86-
);
87-
}
88-
resolved
78+
// Use smart engines resolver for package.json engines.node
79+
let engines_resolver = EnginesResolver::new(self.registry, self.config);
80+
match engines_resolver.resolve_smart(&version_file.version) {
81+
Ok(smart_version) => {
82+
if smart_version != version_file.version {
83+
info!(
84+
"Smart engines resolution: '{}' → '{}'",
85+
version_file.version, smart_version
86+
);
8987
}
90-
Err(e) => {
91-
warn!("Failed to resolve semver range: {e}");
88+
smart_version
89+
}
90+
Err(e) => {
91+
warn!("Failed smart engines resolution: {e}, falling back to semver resolver");
92+
// Fallback to original semver resolution
93+
if let Some(plugin) = self.registry.plugins().first() {
94+
let resolver = SemverResolver::new(plugin.as_ref());
95+
match resolver.resolve(&version_file.version) {
96+
Ok(resolved) => {
97+
if resolved != version_file.version {
98+
info!(
99+
"Fallback semver resolution: '{}' → '{}'",
100+
version_file.version, resolved
101+
);
102+
}
103+
resolved
104+
}
105+
Err(e) => {
106+
warn!("Failed fallback semver resolution: {e}");
107+
version_file.version.clone()
108+
}
109+
}
110+
} else {
92111
version_file.version.clone()
93112
}
94113
}
95-
} else {
96-
version_file.version.clone()
97114
}
98115
} else {
99116
version_file.version.clone()
@@ -339,6 +356,7 @@ mod tests {
339356
auto_install,
340357
version_files: vec![".nvmrc".to_string()],
341358
use_default: true,
359+
default_version: None,
342360
}
343361
}
344362

@@ -714,6 +732,15 @@ mod tests {
714732
fn install_command(&self, _version: &str) -> anyhow::Result<String> {
715733
Err(anyhow!("cannot generate install command"))
716734
}
735+
fn list_versions(&self) -> anyhow::Result<Vec<String>> {
736+
Ok(vec![])
737+
}
738+
fn default_version(&self) -> anyhow::Result<Option<String>> {
739+
Ok(None)
740+
}
741+
fn current_version(&self) -> anyhow::Result<Option<String>> {
742+
Ok(None)
743+
}
717744
}
718745

719746
let config = create_test_config(AutoInstallMode::Always);
@@ -764,6 +791,15 @@ mod tests {
764791
fn install_command(&self, _version: &str) -> anyhow::Result<String> {
765792
Ok("install".to_string())
766793
}
794+
fn list_versions(&self) -> anyhow::Result<Vec<String>> {
795+
Ok(vec![])
796+
}
797+
fn default_version(&self) -> anyhow::Result<Option<String>> {
798+
Ok(None)
799+
}
800+
fn current_version(&self) -> anyhow::Result<Option<String>> {
801+
Ok(None)
802+
}
767803
}
768804

769805
let config = create_test_config(AutoInstallMode::Never);
@@ -968,6 +1004,15 @@ mod tests {
9681004
fn install_command(&self, _version: &str) -> anyhow::Result<String> {
9691005
Ok("install".to_string())
9701006
}
1007+
fn list_versions(&self) -> anyhow::Result<Vec<String>> {
1008+
Ok(vec![])
1009+
}
1010+
fn default_version(&self) -> anyhow::Result<Option<String>> {
1011+
Ok(None)
1012+
}
1013+
fn current_version(&self) -> anyhow::Result<Option<String>> {
1014+
Ok(None)
1015+
}
9711016
}
9721017

9731018
let config = create_test_config(AutoInstallMode::Always);

src/config/schema.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ pub struct Config {
1616
/// Whether to switch to default version when leaving a project directory
1717
/// Default: true (automatically switch to default version)
1818
pub use_default: bool,
19+
20+
/// Default Node.js version to use when no version file is present
21+
pub default_version: Option<String>,
1922
}
2023

2124
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
@@ -33,6 +36,7 @@ impl Default for Config {
3336
auto_install: AutoInstallMode::Prompt,
3437
version_files: vec![".nvmrc".to_string(), ".node-version".to_string()],
3538
use_default: true,
39+
default_version: None,
3640
}
3741
}
3842
}

0 commit comments

Comments
 (0)