diff options
Diffstat (limited to 'cli/npm/resolvers/global.rs')
-rw-r--r-- | cli/npm/resolvers/global.rs | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs index 07df80d30..093e15ded 100644 --- a/cli/npm/resolvers/global.rs +++ b/cli/npm/resolvers/global.rs @@ -13,15 +13,16 @@ use deno_core::futures::future::BoxFuture; use deno_core::futures::FutureExt; use deno_core::url::Url; use deno_runtime::deno_node::NodeResolutionMode; -use deno_runtime::deno_node::PackageJson; use crate::args::Lockfile; +use crate::npm::cache::NpmPackageCacheFolderId; use crate::npm::resolution::NpmResolution; use crate::npm::resolution::NpmResolutionSnapshot; use crate::npm::resolvers::common::cache_packages; use crate::npm::NpmCache; use crate::npm::NpmPackageId; use crate::npm::NpmPackageReq; +use crate::npm::NpmResolutionPackage; use crate::npm::RealNpmRegistryApi; use super::common::ensure_registry_read_permission; @@ -61,6 +62,17 @@ impl GlobalNpmPackageResolver { .cache .package_folder_for_id(&folder_id, &self.registry_url) } + + fn resolve_types_package( + &self, + package_name: &str, + referrer_pkg_id: &NpmPackageCacheFolderId, + ) -> Result<NpmResolutionPackage, AnyError> { + let types_name = types_package_name(package_name); + self + .resolution + .resolve_package_from_package(&types_name, referrer_pkg_id) + } } impl InnerNpmPackageResolver for GlobalNpmPackageResolver { @@ -81,30 +93,20 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver { let referrer_pkg_id = self .cache .resolve_package_folder_id_from_specifier(referrer, &self.registry_url)?; - let pkg_result = self - .resolution - .resolve_package_from_package(name, &referrer_pkg_id); - if mode.is_types() && !name.starts_with("@types/") { - // When doing types resolution, the package must contain a "types" - // entry, or else it will then search for a @types package - if let Ok(pkg) = pkg_result { - let package_folder = self.package_folder(&pkg.id); - let package_json = PackageJson::load_skip_read_permission( - package_folder.join("package.json"), - )?; - if package_json.types.is_some() { - return Ok(package_folder); - } + let pkg = if mode.is_types() && !name.starts_with("@types/") { + // attempt to resolve the types package first, then fallback to the regular package + match self.resolve_types_package(name, &referrer_pkg_id) { + Ok(pkg) => pkg, + Err(_) => self + .resolution + .resolve_package_from_package(name, &referrer_pkg_id)?, } - - let name = types_package_name(name); - let pkg = self - .resolution - .resolve_package_from_package(&name, &referrer_pkg_id)?; - Ok(self.package_folder(&pkg.id)) } else { - Ok(self.package_folder(&pkg_result?.id)) - } + self + .resolution + .resolve_package_from_package(name, &referrer_pkg_id)? + }; + Ok(self.package_folder(&pkg.id)) } fn resolve_package_folder_from_specifier( |