diff options
-rw-r--r-- | cli/npm/resolvers/common.rs | 22 | ||||
-rw-r--r-- | cli/npm/resolvers/global.rs | 3 | ||||
-rw-r--r-- | cli/npm/resolvers/local.rs | 3 |
3 files changed, 26 insertions, 2 deletions
diff --git a/cli/npm/resolvers/common.rs b/cli/npm/resolvers/common.rs index 32b8293cd..11fa6512c 100644 --- a/cli/npm/resolvers/common.rs +++ b/cli/npm/resolvers/common.rs @@ -128,3 +128,25 @@ pub fn ensure_registry_read_permission( format!("Reading {} is not allowed", path.display()), )) } + +/// Gets the corresponding @types package for the provided package name. +pub fn types_package_name(package_name: &str) -> String { + debug_assert!(!package_name.starts_with("@types/")); + // Scoped packages will get two underscores for each slash + // https://github.com/DefinitelyTyped/DefinitelyTyped/tree/15f1ece08f7b498f4b9a2147c2a46e94416ca777#what-about-scoped-packages + format!("@types/{}", package_name.replace('/', "__")) +} + +#[cfg(test)] +mod test { + use super::types_package_name; + + #[test] + fn test_types_package_name() { + assert_eq!(types_package_name("name"), "@types/name"); + assert_eq!( + types_package_name("@scoped/package"), + "@types/@scoped__package" + ); + } +} diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs index 474cb55d6..3fad9f2d9 100644 --- a/cli/npm/resolvers/global.rs +++ b/cli/npm/resolvers/global.rs @@ -26,6 +26,7 @@ use crate::npm::NpmPackageReq; use crate::npm::RealNpmRegistryApi; use super::common::ensure_registry_read_permission; +use super::common::types_package_name; use super::common::InnerNpmPackageResolver; /// Resolves packages from the global npm cache. @@ -97,7 +98,7 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver { } } - let name = format!("@types/{}", name); + let name = types_package_name(name); let pkg = self .resolution .resolve_package_from_package(&name, &referrer_pkg_id)?; diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs index 678f776f3..367198965 100644 --- a/cli/npm/resolvers/local.rs +++ b/cli/npm/resolvers/local.rs @@ -34,6 +34,7 @@ use crate::npm::NpmResolutionPackage; use crate::npm::RealNpmRegistryApi; use super::common::ensure_registry_read_permission; +use super::common::types_package_name; use super::common::InnerNpmPackageResolver; /// Resolver that creates a local node_modules directory @@ -172,7 +173,7 @@ impl InnerNpmPackageResolver for LocalNpmPackageResolver { // if doing type resolution, check for the existance of a @types package if conditions == TYPES_CONDITIONS && !name.starts_with("@types/") { let sub_dir = - join_package_name(current_folder, &format!("@types/{}", name)); + join_package_name(current_folder, &types_package_name(name)); if sub_dir.is_dir() { return Ok(sub_dir); } |