summaryrefslogtreecommitdiff
path: root/cli/npm/resolvers
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/resolvers')
-rw-r--r--cli/npm/resolvers/common.rs3
-rw-r--r--cli/npm/resolvers/global.rs4
-rw-r--r--cli/npm/resolvers/local.rs15
-rw-r--r--cli/npm/resolvers/mod.rs23
4 files changed, 33 insertions, 12 deletions
diff --git a/cli/npm/resolvers/common.rs b/cli/npm/resolvers/common.rs
index 8c1ecd892..3f1c2a704 100644
--- a/cli/npm/resolvers/common.rs
+++ b/cli/npm/resolvers/common.rs
@@ -20,6 +20,9 @@ use crate::npm::NpmResolutionPackage;
/// Part of the resolution that interacts with the file system.
#[async_trait]
pub trait NpmPackageFsResolver: Send + Sync {
+ /// Specifier for the root directory.
+ fn root_dir_url(&self) -> &Url;
+
fn resolve_package_folder_from_deno_module(
&self,
id: &NpmPackageId,
diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs
index 1d4d14ac8..87ad92675 100644
--- a/cli/npm/resolvers/global.rs
+++ b/cli/npm/resolvers/global.rs
@@ -68,6 +68,10 @@ impl GlobalNpmPackageResolver {
#[async_trait]
impl NpmPackageFsResolver for GlobalNpmPackageResolver {
+ fn root_dir_url(&self) -> &Url {
+ self.cache.root_dir_url()
+ }
+
fn resolve_package_folder_from_deno_module(
&self,
id: &NpmPackageId,
diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs
index ba395d1b6..bf5b8529c 100644
--- a/cli/npm/resolvers/local.rs
+++ b/cli/npm/resolvers/local.rs
@@ -44,7 +44,7 @@ pub struct LocalNpmPackageResolver {
resolution: NpmResolution,
registry_url: Url,
root_node_modules_path: PathBuf,
- root_node_modules_specifier: ModuleSpecifier,
+ root_node_modules_url: Url,
}
impl LocalNpmPackageResolver {
@@ -58,10 +58,8 @@ impl LocalNpmPackageResolver {
cache,
resolution,
registry_url,
- root_node_modules_specifier: ModuleSpecifier::from_directory_path(
- &node_modules_folder,
- )
- .unwrap(),
+ root_node_modules_url: Url::from_directory_path(&node_modules_folder)
+ .unwrap(),
root_node_modules_path: node_modules_folder,
}
}
@@ -92,8 +90,7 @@ impl LocalNpmPackageResolver {
&self,
specifier: &ModuleSpecifier,
) -> Option<PathBuf> {
- let relative_url =
- self.root_node_modules_specifier.make_relative(specifier)?;
+ let relative_url = self.root_node_modules_url.make_relative(specifier)?;
if relative_url.starts_with("../") {
return None;
}
@@ -126,6 +123,10 @@ impl LocalNpmPackageResolver {
#[async_trait]
impl NpmPackageFsResolver for LocalNpmPackageResolver {
+ fn root_dir_url(&self) -> &Url {
+ &self.root_node_modules_url
+ }
+
fn resolve_package_folder_from_deno_module(
&self,
node_id: &NpmPackageId,
diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs
index 039864c5f..583a1c955 100644
--- a/cli/npm/resolvers/mod.rs
+++ b/cli/npm/resolvers/mod.rs
@@ -19,7 +19,7 @@ use deno_runtime::deno_node::RequireNpmResolver;
use global::GlobalNpmPackageResolver;
use serde::Deserialize;
use serde::Serialize;
-use std::collections::HashSet;
+use std::collections::HashMap;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -214,9 +214,9 @@ impl NpmPackageResolver {
/// Gets if the provided specifier is in an npm package.
pub fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool {
- self
- .resolve_package_folder_from_specifier(specifier)
- .is_ok()
+ let root_dir_url = self.fs_resolver.root_dir_url();
+ debug_assert!(root_dir_url.as_str().ends_with('/'));
+ specifier.as_ref().starts_with(root_dir_url.as_str())
}
/// If the resolver has resolved any npm packages.
@@ -224,6 +224,19 @@ impl NpmPackageResolver {
self.resolution.has_packages()
}
+ /// Adds the package reqs from a package.json if they exist.
+ pub async fn add_package_json_deps(
+ &self,
+ maybe_package_json_deps: Option<&HashMap<String, NpmPackageReq>>,
+ ) -> Result<(), AnyError> {
+ if let Some(deps) = maybe_package_json_deps {
+ let mut package_reqs = deps.values().cloned().collect::<Vec<_>>();
+ package_reqs.sort(); // deterministic resolution
+ self.add_package_reqs(package_reqs).await?;
+ }
+ Ok(())
+ }
+
/// Adds package requirements to the resolver and ensures everything is setup.
pub async fn add_package_reqs(
&self,
@@ -250,7 +263,7 @@ impl NpmPackageResolver {
/// This will retrieve and resolve package information, but not cache any package files.
pub async fn set_package_reqs(
&self,
- packages: HashSet<NpmPackageReq>,
+ packages: Vec<NpmPackageReq>,
) -> Result<(), AnyError> {
self.resolution.set_package_reqs(packages).await
}