Skip to content

Commit bb28909

Browse files
authored
fix(env): resolve partial versions to exact versions in vp env pin (#778)
When running `vp env pin 20`, the command was writing "20" to .node-version and passing it to download, which constructed an invalid URL like `nodejs.org/dist/v20/`. Now partial versions are resolved to their exact semver form (e.g., "20.18.3") before writing and downloading.
1 parent 5b78598 commit bb28909

1 file changed

Lines changed: 33 additions & 4 deletions

File tree

  • crates/vite_global_cli/src/commands/env

crates/vite_global_cli/src/commands/env/pin.rs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,9 @@ async fn resolve_version_for_pin(
188188
provider.resolve_version(version).await?;
189189
Ok((version.to_string(), false))
190190
} else {
191-
// For ranges/partial versions, keep as-is (resolved at runtime)
192-
// But validate the range is parseable
193-
provider.resolve_version(version).await?;
194-
Ok((version.to_string(), false))
191+
// For ranges/partial versions, resolve to exact version
192+
let resolved = provider.resolve_version(version).await?;
193+
Ok((resolved.to_string(), true))
195194
}
196195
}
197196
}
@@ -285,4 +284,34 @@ mod tests {
285284
let result = do_unpin(&temp_path).await;
286285
assert!(result.is_ok());
287286
}
287+
288+
#[tokio::test]
289+
async fn test_resolve_version_for_pin_partial_version() {
290+
let provider = NodeProvider::new();
291+
292+
// Partial version "20" should resolve to an exact version like "20.x.y"
293+
let (resolved, was_alias) = resolve_version_for_pin("20", &provider).await.unwrap();
294+
assert!(was_alias, "partial version should be treated as alias");
295+
296+
// The resolved version should be a full semver version starting with "20."
297+
assert!(
298+
resolved.starts_with("20."),
299+
"expected resolved version to start with '20.', got: {resolved}"
300+
);
301+
302+
// Should be a valid exact version (major.minor.patch)
303+
let parts: Vec<&str> = resolved.split('.').collect();
304+
assert_eq!(parts.len(), 3, "expected 3 version parts, got: {resolved}");
305+
assert!(parts.iter().all(|p| p.parse::<u64>().is_ok()), "all parts should be numeric");
306+
}
307+
308+
#[tokio::test]
309+
async fn test_resolve_version_for_pin_exact_version() {
310+
let provider = NodeProvider::new();
311+
312+
// Exact version should be returned as-is
313+
let (resolved, was_alias) = resolve_version_for_pin("20.18.0", &provider).await.unwrap();
314+
assert!(!was_alias, "exact version should not be treated as alias");
315+
assert_eq!(resolved, "20.18.0");
316+
}
288317
}

0 commit comments

Comments
 (0)