summaryrefslogtreecommitdiff
path: root/ext/node/resolution.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/resolution.rs')
-rw-r--r--ext/node/resolution.rs57
1 files changed, 55 insertions, 2 deletions
diff --git a/ext/node/resolution.rs b/ext/node/resolution.rs
index 834b465cd..8047ac4ec 100644
--- a/ext/node/resolution.rs
+++ b/ext/node/resolution.rs
@@ -1037,9 +1037,45 @@ impl NodeResolver {
}
}
+ let result = self.resolve_package_subpath_for_package(
+ &package_name,
+ &package_subpath,
+ referrer,
+ referrer_kind,
+ conditions,
+ mode,
+ );
+ if mode.is_types() && !matches!(result, Ok(Some(_))) {
+ // try to resolve with the @types/node package
+ let package_name = types_package_name(&package_name);
+ if let Ok(Some(result)) = self.resolve_package_subpath_for_package(
+ &package_name,
+ &package_subpath,
+ referrer,
+ referrer_kind,
+ conditions,
+ mode,
+ ) {
+ return Ok(Some(result));
+ }
+ }
+
+ result
+ }
+
+ #[allow(clippy::too_many_arguments)]
+ fn resolve_package_subpath_for_package(
+ &self,
+ package_name: &str,
+ package_subpath: &str,
+ referrer: &ModuleSpecifier,
+ referrer_kind: NodeModuleKind,
+ conditions: &[&str],
+ mode: NodeResolutionMode,
+ ) -> Result<Option<ModuleSpecifier>, AnyError> {
let package_dir_path = self
.npm_resolver
- .resolve_package_folder_from_package(&package_name, referrer, mode)?;
+ .resolve_package_folder_from_package(package_name, referrer)?;
let package_json_path = package_dir_path.join("package.json");
// todo: error with this instead when can't find package
@@ -1060,7 +1096,7 @@ impl NodeResolver {
.load_package_json(&mut AllowAllNodePermissions, package_json_path)?;
self.resolve_package_subpath(
&package_json,
- &package_subpath,
+ package_subpath,
referrer,
referrer_kind,
conditions,
@@ -1600,6 +1636,14 @@ fn pattern_key_compare(a: &str, b: &str) -> i32 {
0
}
+/// Gets the corresponding @types package for the provided package name.
+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 tests {
use deno_core::serde_json::json;
@@ -1780,4 +1824,13 @@ mod tests {
assert_eq!(actual.to_string_lossy(), *expected);
}
}
+
+ #[test]
+ fn test_types_package_name() {
+ assert_eq!(types_package_name("name"), "@types/name");
+ assert_eq!(
+ types_package_name("@scoped/package"),
+ "@types/@scoped__package"
+ );
+ }
}