From 5df035bcf60d90efd5eef182eb555494e6bc84d7 Mon Sep 17 00:00:00 2001 From: zerone0x Date: Sun, 15 Mar 2026 22:56:50 +0800 Subject: [PATCH] fix(cli): strip trailing slash from registry URL to prevent 404 When the npm registry URL has a trailing slash (e.g., `https://registry.npmmirror.com/`), URL concatenation produces a double slash (`https://registry.npmmirror.com//pnpm/latest`) which returns 404. Strip trailing slashes from the registry URL in EnvConfig::from_env() and in the upgrade registry resolver to prevent this. Fixes #904 Co-Authored-By: Claude Opus 4.6 --- crates/vite_global_cli/src/commands/upgrade/registry.rs | 3 ++- crates/vite_shared/src/env_config.rs | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/vite_global_cli/src/commands/upgrade/registry.rs b/crates/vite_global_cli/src/commands/upgrade/registry.rs index 021b0399f2..170ac257c3 100644 --- a/crates/vite_global_cli/src/commands/upgrade/registry.rs +++ b/crates/vite_global_cli/src/commands/upgrade/registry.rs @@ -45,7 +45,8 @@ pub async fn resolve_version( registry_override: Option<&str>, ) -> Result { let default_registry = npm_registry(); - let registry = registry_override.unwrap_or(&default_registry); + let registry_raw = registry_override.unwrap_or(&default_registry); + let registry = registry_raw.trim_end_matches('/'); let client = HttpClient::new(); // Step 1: Fetch main package metadata to resolve version diff --git a/crates/vite_shared/src/env_config.rs b/crates/vite_shared/src/env_config.rs index 7d0b4fdf85..a7fe0bfac5 100644 --- a/crates/vite_shared/src/env_config.rs +++ b/crates/vite_shared/src/env_config.rs @@ -133,7 +133,9 @@ impl EnvConfig { vite_plus_home: std::env::var(env_vars::VITE_PLUS_HOME).ok().map(PathBuf::from), npm_registry: std::env::var(env_vars::NPM_CONFIG_REGISTRY) .or_else(|_| std::env::var(env_vars::NPM_CONFIG_REGISTRY_UPPER)) - .unwrap_or_else(|_| "https://registry.npmjs.org".into()), + .unwrap_or_else(|_| "https://registry.npmjs.org".into()) + .trim_end_matches('/') + .to_string(), node_dist_mirror: std::env::var(env_vars::VITE_NODE_DIST_MIRROR).ok(), is_ci: std::env::var("CI").is_ok(), bypass_shim: std::env::var(env_vars::VITE_PLUS_BYPASS).is_ok(),