summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/npm/resolvers/common.rs22
-rw-r--r--cli/npm/resolvers/global.rs3
-rw-r--r--cli/npm/resolvers/local.rs3
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);
}