summaryrefslogtreecommitdiff
path: root/cli/npm/resolvers/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/resolvers/mod.rs')
-rw-r--r--cli/npm/resolvers/mod.rs83
1 files changed, 72 insertions, 11 deletions
diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs
index d290a5569..5498bbf75 100644
--- a/cli/npm/resolvers/mod.rs
+++ b/cli/npm/resolvers/mod.rs
@@ -15,6 +15,7 @@ use global::GlobalNpmPackageResolver;
use once_cell::sync::Lazy;
use serde::Deserialize;
use serde::Serialize;
+use std::collections::HashSet;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -23,10 +24,10 @@ use crate::fs_util;
use self::common::InnerNpmPackageResolver;
use self::local::LocalNpmPackageResolver;
-use super::resolution::NpmResolutionSnapshot;
use super::NpmCache;
use super::NpmPackageReq;
use super::NpmRegistryApi;
+use super::NpmResolutionSnapshot;
const RESOLUTION_STATE_ENV_VAR_NAME: &str =
"DENO_DONT_USE_INTERNAL_NODE_COMPAT_STATE";
@@ -67,6 +68,19 @@ pub struct NpmPackageResolver {
no_npm: bool,
inner: Arc<dyn InnerNpmPackageResolver>,
local_node_modules_path: Option<PathBuf>,
+ api: NpmRegistryApi,
+ cache: NpmCache,
+}
+
+impl std::fmt::Debug for NpmPackageResolver {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("NpmPackageResolver")
+ .field("unstable", &self.unstable)
+ .field("no_npm", &self.no_npm)
+ .field("inner", &"<omitted>")
+ .field("local_node_modules_path", &self.local_node_modules_path)
+ .finish()
+ }
}
impl NpmPackageResolver {
@@ -77,30 +91,53 @@ impl NpmPackageResolver {
no_npm: bool,
local_node_modules_path: Option<PathBuf>,
) -> Self {
+ Self::new_with_maybe_snapshot(
+ cache,
+ api,
+ unstable,
+ no_npm,
+ local_node_modules_path,
+ None,
+ )
+ }
+
+ fn new_with_maybe_snapshot(
+ cache: NpmCache,
+ api: NpmRegistryApi,
+ unstable: bool,
+ no_npm: bool,
+ local_node_modules_path: Option<PathBuf>,
+ initial_snapshot: Option<NpmResolutionSnapshot>,
+ ) -> Self {
let process_npm_state = NpmProcessState::take();
let local_node_modules_path = local_node_modules_path.or_else(|| {
process_npm_state
.as_ref()
.and_then(|s| s.local_node_modules_path.as_ref().map(PathBuf::from))
});
- let maybe_snapshot = process_npm_state.map(|s| s.snapshot);
+ let maybe_snapshot =
+ initial_snapshot.or_else(|| process_npm_state.map(|s| s.snapshot));
let inner: Arc<dyn InnerNpmPackageResolver> = match &local_node_modules_path
{
Some(node_modules_folder) => Arc::new(LocalNpmPackageResolver::new(
- cache,
- api,
+ cache.clone(),
+ api.clone(),
node_modules_folder.clone(),
maybe_snapshot,
)),
- None => {
- Arc::new(GlobalNpmPackageResolver::new(cache, api, maybe_snapshot))
- }
+ None => Arc::new(GlobalNpmPackageResolver::new(
+ cache.clone(),
+ api.clone(),
+ maybe_snapshot,
+ )),
};
Self {
unstable,
no_npm,
inner,
local_node_modules_path,
+ api,
+ cache,
}
}
@@ -122,10 +159,11 @@ impl NpmPackageResolver {
&self,
name: &str,
referrer: &ModuleSpecifier,
+ conditions: &[&str],
) -> Result<PathBuf, AnyError> {
let path = self
.inner
- .resolve_package_folder_from_package(name, referrer)?;
+ .resolve_package_folder_from_package(name, referrer, conditions)?;
log::debug!("Resolved {} from {} to {}", name, referrer, path.display());
Ok(path)
}
@@ -156,12 +194,14 @@ impl NpmPackageResolver {
self.inner.has_packages()
}
- /// Adds a package requirement to the resolver and ensures everything is setup.
+ /// Adds package requirements to the resolver and ensures everything is setup.
pub async fn add_package_reqs(
&self,
packages: Vec<NpmPackageReq>,
) -> Result<(), AnyError> {
- assert!(!packages.is_empty());
+ if packages.is_empty() {
+ return Ok(());
+ }
if !self.unstable {
bail!(
@@ -187,6 +227,14 @@ impl NpmPackageResolver {
self.inner.add_package_reqs(packages).await
}
+ /// Sets package requirements to the resolver, removing old requirements and adding new ones.
+ pub async fn set_package_reqs(
+ &self,
+ packages: HashSet<NpmPackageReq>,
+ ) -> Result<(), AnyError> {
+ self.inner.set_package_reqs(packages).await
+ }
+
// If the main module should be treated as being in an npm package.
// This is triggered via a secret environment variable which is used
// for functionality like child_process.fork. Users should NOT depend
@@ -206,6 +254,18 @@ impl NpmPackageResolver {
})
.unwrap()
}
+
+ /// Gets a new resolver with a new snapshotted state.
+ pub fn snapshotted(&self) -> Self {
+ Self::new_with_maybe_snapshot(
+ self.cache.clone(),
+ self.api.clone(),
+ self.unstable,
+ self.no_npm,
+ self.local_node_modules_path.clone(),
+ Some(self.inner.snapshot()),
+ )
+ }
}
impl RequireNpmResolver for NpmPackageResolver {
@@ -213,9 +273,10 @@ impl RequireNpmResolver for NpmPackageResolver {
&self,
specifier: &str,
referrer: &std::path::Path,
+ conditions: &[&str],
) -> Result<PathBuf, AnyError> {
let referrer = path_to_specifier(referrer)?;
- self.resolve_package_folder_from_package(specifier, &referrer)
+ self.resolve_package_folder_from_package(specifier, &referrer, conditions)
}
fn resolve_package_folder_from_path(