summaryrefslogtreecommitdiff
path: root/cli/npm
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm')
-rw-r--r--cli/npm/resolution.rs58
-rw-r--r--cli/npm/resolvers/mod.rs7
2 files changed, 37 insertions, 28 deletions
diff --git a/cli/npm/resolution.rs b/cli/npm/resolution.rs
index bfba1d67d..6992d875e 100644
--- a/cli/npm/resolution.rs
+++ b/cli/npm/resolution.rs
@@ -1,5 +1,6 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+use std::collections::HashMap;
use std::collections::HashSet;
use std::sync::Arc;
@@ -249,6 +250,10 @@ impl NpmResolution {
Ok(nv)
}
+ pub fn package_reqs(&self) -> HashMap<NpmPackageReq, NpmPackageNv> {
+ self.snapshot.read().package_reqs().clone()
+ }
+
pub fn all_system_packages(
&self,
system_info: &NpmSystemInfo,
@@ -303,45 +308,44 @@ async fn add_package_reqs_to_snapshot(
get_new_snapshot: impl Fn() -> NpmResolutionSnapshot,
) -> Result<NpmResolutionSnapshot, AnyError> {
let snapshot = get_new_snapshot();
- if !snapshot.has_pending()
+ let snapshot = if !snapshot.has_pending()
&& package_reqs
.iter()
.all(|req| snapshot.package_reqs().contains_key(req))
{
log::debug!("Snapshot already up to date. Skipping pending resolution.");
- return Ok(snapshot);
- }
-
- let pending_resolver = get_npm_pending_resolver(api);
- let result = pending_resolver
- .resolve_pending(snapshot, package_reqs)
- .await;
- api.clear_memory_cache();
- let snapshot = match result {
- Ok(snapshot) => snapshot,
- Err(NpmResolutionError::Resolution(err)) if api.mark_force_reload() => {
- log::debug!("{err:#}");
- log::debug!("npm resolution failed. Trying again...");
-
- // try again
- let snapshot = get_new_snapshot();
- let result = pending_resolver
- .resolve_pending(snapshot, package_reqs)
- .await;
- api.clear_memory_cache();
- // now surface the result after clearing the cache
- result?
+ snapshot
+ } else {
+ let pending_resolver = get_npm_pending_resolver(api);
+ let result = pending_resolver
+ .resolve_pending(snapshot, package_reqs)
+ .await;
+ api.clear_memory_cache();
+ match result {
+ Ok(snapshot) => snapshot,
+ Err(NpmResolutionError::Resolution(err)) if api.mark_force_reload() => {
+ log::debug!("{err:#}");
+ log::debug!("npm resolution failed. Trying again...");
+
+ // try again
+ let snapshot = get_new_snapshot();
+ let result = pending_resolver
+ .resolve_pending(snapshot, package_reqs)
+ .await;
+ api.clear_memory_cache();
+ // now surface the result after clearing the cache
+ result?
+ }
+ Err(err) => return Err(err.into()),
}
- Err(err) => return Err(err.into()),
};
if let Some(lockfile_mutex) = maybe_lockfile {
let mut lockfile = lockfile_mutex.lock();
populate_lockfile_from_snapshot(&mut lockfile, &snapshot)?;
- Ok(snapshot)
- } else {
- Ok(snapshot)
}
+
+ Ok(snapshot)
}
fn get_npm_pending_resolver(
diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs
index d46b6da6e..9ae84d7f9 100644
--- a/cli/npm/resolvers/mod.rs
+++ b/cli/npm/resolvers/mod.rs
@@ -4,6 +4,7 @@ mod common;
mod global;
mod local;
+use std::collections::HashMap;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -153,7 +154,7 @@ impl CliNpmResolver {
let Some(cache_folder_id) = self
.fs_resolver
.resolve_package_cache_folder_id_from_specifier(specifier)? else {
-return Ok(None);
+ return Ok(None);
};
Ok(Some(
self
@@ -229,6 +230,10 @@ return Ok(None);
.unwrap()
}
+ pub fn package_reqs(&self) -> HashMap<NpmPackageReq, NpmPackageNv> {
+ self.resolution.package_reqs()
+ }
+
pub fn snapshot(&self) -> NpmResolutionSnapshot {
self.resolution.snapshot()
}