-
Notifications
You must be signed in to change notification settings - Fork 182
Expand file tree
/
Copy pathdefault.rs
More file actions
108 lines (93 loc) · 3.83 KB
/
default.rs
File metadata and controls
108 lines (93 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//! Default version management command.
//!
//! Handles `vp env default [VERSION]` to set or show the global default Node.js version.
use std::process::ExitStatus;
use vite_path::AbsolutePathBuf;
use super::config::{get_config_path, load_config, save_config};
use crate::error::Error;
/// Execute the default command.
pub async fn execute(_cwd: AbsolutePathBuf, version: Option<String>) -> Result<ExitStatus, Error> {
match version {
Some(v) => set_default(&v).await,
None => show_default().await,
}
}
/// Show the current default version.
async fn show_default() -> Result<ExitStatus, Error> {
let config = load_config().await?;
match config.default_node_version {
Some(version) => {
println!("Default Node.js version: {version}");
let config_path = get_config_path()?;
println!(" Set via: {}", config_path.as_path().display());
// If it's an alias, also show the resolved version
if version == "lts" || version == "latest" {
let provider = vite_js_runtime::NodeProvider::new();
match resolve_alias(&version, &provider).await {
Ok(resolved) => println!(" Currently resolves to: {resolved}"),
Err(_) => {}
}
}
}
None => {
// No default configured - show what would be used
let provider = vite_js_runtime::NodeProvider::new();
match provider.resolve_latest_version().await {
Ok(lts_version) => {
println!("No default version configured. Using latest LTS ({lts_version}).");
println!(" Run 'vp env default <version>' to set a default.");
}
Err(_) => {
println!("No default version configured.");
println!(" Run 'vp env default <version>' to set a default.");
}
}
}
}
Ok(ExitStatus::default())
}
/// Set the default version.
async fn set_default(version: &str) -> Result<ExitStatus, Error> {
let provider = vite_js_runtime::NodeProvider::new();
// Validate the version
let (display_version, store_version) = match version.to_lowercase().as_str() {
"lts" => {
// Resolve to show current value, but store "lts" as alias
let current_lts = provider.resolve_latest_version().await?;
(format!("lts (currently {})", current_lts), "lts".to_string())
}
"latest" => {
// Resolve to show current value, but store "latest" as alias
let current_latest = provider.resolve_absolute_latest_version().await?;
(format!("latest (currently {})", current_latest), "latest".to_string())
}
_ => {
// Validate version exists
let resolved = if vite_js_runtime::NodeProvider::is_exact_version(version) {
version.to_string()
} else {
provider.resolve_version(version).await?.to_string()
};
(resolved.clone(), resolved)
}
};
// Save to config
let mut config = load_config().await?;
config.default_node_version = Some(store_version);
save_config(&config).await?;
// Invalidate resolve cache so the new default takes effect immediately
crate::shim::invalidate_cache();
println!("\u{2713} Default Node.js version set to {display_version}");
Ok(ExitStatus::default())
}
/// Resolve version alias to actual version.
async fn resolve_alias(
alias: &str,
provider: &vite_js_runtime::NodeProvider,
) -> Result<String, Error> {
match alias {
"lts" => Ok(provider.resolve_latest_version().await?.to_string()),
"latest" => Ok(provider.resolve_absolute_latest_version().await?.to_string()),
_ => Ok(alias.to_string()),
}
}