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.rs44
1 files changed, 43 insertions, 1 deletions
diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs
index 5498bbf75..3d55170ac 100644
--- a/cli/npm/resolvers/mod.rs
+++ b/cli/npm/resolvers/mod.rs
@@ -8,6 +8,7 @@ use deno_ast::ModuleSpecifier;
use deno_core::anyhow::bail;
use deno_core::error::custom_error;
use deno_core::error::AnyError;
+use deno_core::parking_lot::Mutex;
use deno_core::serde_json;
use deno_runtime::deno_node::PathClean;
use deno_runtime::deno_node::RequireNpmResolver;
@@ -21,6 +22,7 @@ use std::path::PathBuf;
use std::sync::Arc;
use crate::fs_util;
+use crate::lockfile::Lockfile;
use self::common::InnerNpmPackageResolver;
use self::local::LocalNpmPackageResolver;
@@ -70,6 +72,7 @@ pub struct NpmPackageResolver {
local_node_modules_path: Option<PathBuf>,
api: NpmRegistryApi,
cache: NpmCache,
+ maybe_lockfile: Option<Arc<Mutex<Lockfile>>>,
}
impl std::fmt::Debug for NpmPackageResolver {
@@ -101,6 +104,32 @@ impl NpmPackageResolver {
)
}
+ /// This function will replace current resolver with a new one built from a
+ /// snapshot created out of the lockfile.
+ pub async fn add_lockfile(
+ &mut self,
+ lockfile: Arc<Mutex<Lockfile>>,
+ ) -> Result<(), AnyError> {
+ let snapshot =
+ NpmResolutionSnapshot::from_lockfile(lockfile.clone(), &self.api).await?;
+ self.maybe_lockfile = Some(lockfile);
+ if let Some(node_modules_folder) = &self.local_node_modules_path {
+ self.inner = Arc::new(LocalNpmPackageResolver::new(
+ self.cache.clone(),
+ self.api.clone(),
+ node_modules_folder.clone(),
+ Some(snapshot),
+ ));
+ } else {
+ self.inner = Arc::new(GlobalNpmPackageResolver::new(
+ self.cache.clone(),
+ self.api.clone(),
+ Some(snapshot),
+ ));
+ }
+ Ok(())
+ }
+
fn new_with_maybe_snapshot(
cache: NpmCache,
api: NpmRegistryApi,
@@ -138,6 +167,7 @@ impl NpmPackageResolver {
local_node_modules_path,
api,
cache,
+ maybe_lockfile: None,
}
}
@@ -224,7 +254,15 @@ impl NpmPackageResolver {
));
}
- self.inner.add_package_reqs(packages).await
+ self.inner.add_package_reqs(packages).await?;
+
+ // If there's a lock file, update it with all discovered npm packages
+ if let Some(lockfile_mutex) = &self.maybe_lockfile {
+ let mut lockfile = lockfile_mutex.lock();
+ self.lock(&mut lockfile)?;
+ }
+
+ Ok(())
}
/// Sets package requirements to the resolver, removing old requirements and adding new ones.
@@ -266,6 +304,10 @@ impl NpmPackageResolver {
Some(self.inner.snapshot()),
)
}
+
+ pub fn lock(&self, lockfile: &mut Lockfile) -> Result<(), AnyError> {
+ self.inner.lock(lockfile)
+ }
}
impl RequireNpmResolver for NpmPackageResolver {