diff --git a/registry/npm.toml b/registry/npm.toml index 8cb60720b8..417f5ea037 100644 --- a/registry/npm.toml +++ b/registry/npm.toml @@ -1,4 +1,4 @@ -backends = ["npm:npm"] +backends = ["aqua:npm/cli", "npm:npm"] description = "the package manager for JavaScript" idiomatic_files = ["package.json"] overrides = ["node"] diff --git a/src/backend/npm.rs b/src/backend/npm.rs index 0b17410436..1fdd527bfc 100644 --- a/src/backend/npm.rs +++ b/src/backend/npm.rs @@ -66,8 +66,10 @@ impl Backend for NPMBackend { let package_manager = settings.npm.package_manager; let tool_name = self.tool_name(); - // Avoid circular dependency when installing npm itself - // But we still need the configured package manager for installation + // Explicit `npm:npm` still bootstraps through node's bundled npm even + // when the registry shorthand prefers aqua. Keep node here so users of + // the npm backend, or the registry fallback, wait for that bootstrap + // npm before installation starts. if tool_name == "npm" { return match package_manager { NpmPackageManager::Auto => Ok(vec!["node"]), diff --git a/src/cli/args/backend_arg.rs b/src/cli/args/backend_arg.rs index 3a9be2ef43..400ade94dc 100644 --- a/src/cli/args/backend_arg.rs +++ b/src/cli/args/backend_arg.rs @@ -742,11 +742,20 @@ mod tests { let fa: BackendArg = "gem:bashly".into(); assert_eq!(BackendType::Gem, fa.backend_type()); - let fa: BackendArg = "npm".into(); + let fa: BackendArg = "npm:npm".into(); assert_str_eq!("npm:npm", fa.full()); assert_eq!(BackendType::Npm, fa.backend_type()); } + #[tokio::test] + async fn test_bare_npm_uses_registry_tool() { + let _config = Config::get().await.unwrap(); + + let fa: BackendArg = "npm".into(); + assert_str_eq!("aqua:npm/cli", fa.full()); + assert_eq!(BackendType::Aqua, fa.backend_type()); + } + #[tokio::test] async fn test_backend_arg_pathname() { let _config = Config::get().await.unwrap();