summaryrefslogtreecommitdiff
path: root/cli/npm/resolvers/global.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/resolvers/global.rs')
-rw-r--r--cli/npm/resolvers/global.rs48
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(