summaryrefslogtreecommitdiff
path: root/ext/node
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-06-08 20:05:28 -0400
committerGitHub <noreply@github.com>2024-06-08 20:05:28 -0400
commit31154ff95899166a2535fc859c1fca2cbf19d422 (patch)
tree1497c08b1c88e271c48d19539b6d619b4db82cb9 /ext/node
parent32f5b4808ef7591401b46ea5bb3d680c18dedf20 (diff)
fix(check): attempt to resolve types from pkg before `@types` pkg (#24152)
I've been meaning to fix this for ages, but I finally ran into it here: https://github.com/dsherret/ts-ast-viewer/actions/runs/9432038675/job/25981325408 We need to resolve the `@types` package as a fallback instead of eagerly resolving it.
Diffstat (limited to 'ext/node')
-rw-r--r--ext/node/analyze.rs1
-rw-r--r--ext/node/lib.rs1
-rw-r--r--ext/node/ops/require.rs1
-rw-r--r--ext/node/resolution.rs57
4 files changed, 55 insertions, 5 deletions
diff --git a/ext/node/analyze.rs b/ext/node/analyze.rs
index df68cb0fc..3b06a90e0 100644
--- a/ext/node/analyze.rs
+++ b/ext/node/analyze.rs
@@ -307,7 +307,6 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer> NodeCodeTranslator<TCjsCodeAnalyzer> {
let module_dir = self.npm_resolver.resolve_package_folder_from_package(
package_specifier.as_str(),
referrer,
- mode,
)?;
let package_json_path = module_dir.join("package.json");
diff --git a/ext/node/lib.rs b/ext/node/lib.rs
index 36c13f8a5..094bea3ae 100644
--- a/ext/node/lib.rs
+++ b/ext/node/lib.rs
@@ -162,7 +162,6 @@ pub trait NpmResolver: std::fmt::Debug + MaybeSend + MaybeSync {
&self,
specifier: &str,
referrer: &ModuleSpecifier,
- mode: NodeResolutionMode,
) -> Result<PathBuf, AnyError>;
fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool;
diff --git a/ext/node/ops/require.rs b/ext/node/ops/require.rs
index 3e1f1c6ae..3fde6c31a 100644
--- a/ext/node/ops/require.rs
+++ b/ext/node/ops/require.rs
@@ -198,7 +198,6 @@ pub fn op_require_resolve_deno_dir(
&ModuleSpecifier::from_file_path(&parent_filename).unwrap_or_else(|_| {
panic!("Url::from_file_path: [{:?}]", parent_filename)
}),
- NodeResolutionMode::Execution,
)
.ok()
.map(|p| p.to_string_lossy().to_string())
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"
+ );
+ }
}