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.rs60
1 files changed, 51 insertions, 9 deletions
diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs
index c1b6818fd..8eafc19f4 100644
--- a/cli/npm/resolvers/global.rs
+++ b/cli/npm/resolvers/global.rs
@@ -2,6 +2,7 @@
//! Code for global npm cache resolution.
+use std::collections::HashSet;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -11,6 +12,8 @@ use deno_core::error::AnyError;
use deno_core::futures::future::BoxFuture;
use deno_core::futures::FutureExt;
use deno_core::url::Url;
+use deno_runtime::deno_node::PackageJson;
+use deno_runtime::deno_node::TYPES_CONDITIONS;
use crate::npm::resolution::NpmResolution;
use crate::npm::resolution::NpmResolutionSnapshot;
@@ -65,14 +68,35 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver {
&self,
name: &str,
referrer: &ModuleSpecifier,
+ conditions: &[&str],
) -> Result<PathBuf, AnyError> {
let referrer_pkg_id = self
.cache
.resolve_package_id_from_specifier(referrer, &self.registry_url)?;
- let pkg = self
+ let pkg_result = self
.resolution
- .resolve_package_from_package(name, &referrer_pkg_id)?;
- Ok(self.package_folder(&pkg.id))
+ .resolve_package_from_package(name, &referrer_pkg_id);
+ if conditions == TYPES_CONDITIONS && !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 name = format!("@types/{}", 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))
+ }
}
fn resolve_package_folder_from_specifier(
@@ -96,12 +120,19 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver {
let resolver = self.clone();
async move {
resolver.resolution.add_package_reqs(packages).await?;
- cache_packages(
- resolver.resolution.all_packages(),
- &resolver.cache,
- &resolver.registry_url,
- )
- .await
+ cache_packages_in_resolver(&resolver).await
+ }
+ .boxed()
+ }
+
+ fn set_package_reqs(
+ &self,
+ packages: HashSet<NpmPackageReq>,
+ ) -> BoxFuture<'static, Result<(), AnyError>> {
+ let resolver = self.clone();
+ async move {
+ resolver.resolution.set_package_reqs(packages).await?;
+ cache_packages_in_resolver(&resolver).await
}
.boxed()
}
@@ -115,3 +146,14 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver {
self.resolution.snapshot()
}
}
+
+async fn cache_packages_in_resolver(
+ resolver: &GlobalNpmPackageResolver,
+) -> Result<(), AnyError> {
+ cache_packages(
+ resolver.resolution.all_packages(),
+ &resolver.cache,
+ &resolver.registry_url,
+ )
+ .await
+}