diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-06-08 20:05:28 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-08 20:05:28 -0400 |
commit | 31154ff95899166a2535fc859c1fca2cbf19d422 (patch) | |
tree | 1497c08b1c88e271c48d19539b6d619b4db82cb9 /ext/node | |
parent | 32f5b4808ef7591401b46ea5bb3d680c18dedf20 (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.rs | 1 | ||||
-rw-r--r-- | ext/node/lib.rs | 1 | ||||
-rw-r--r-- | ext/node/ops/require.rs | 1 | ||||
-rw-r--r-- | ext/node/resolution.rs | 57 |
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" + ); + } } |