diff --git a/libs/npm/resolution/graph.rs b/libs/npm/resolution/graph.rs index 2cf3f836b5c6b6..95aaef6d33cf32 100644 --- a/libs/npm/resolution/graph.rs +++ b/libs/npm/resolution/graph.rs @@ -1050,17 +1050,19 @@ struct DepEntryCache(HashMap, Rc>>); impl DepEntryCache { pub fn store( &mut self, - nv: Rc, + nv: &Rc, version_info: &NpmPackageVersionInfo, ) -> Result>, Box> { debug_assert_eq!(nv.version, version_info.version); - debug_assert!(!self.0.contains_key(&nv)); // we should not be re-inserting + if let Some(deps) = self.0.get(nv) { + return Ok(deps.clone()); + } let mut deps = version_info.dependencies_as_entries(&nv.name)?; // Ensure name alphabetical and then version descending // so these are resolved in that order deps.sort(); let deps = Rc::new(deps); - self.0.insert(nv, deps.clone()); + self.0.insert(nv.clone(), deps.clone()); Ok(deps) } @@ -1383,7 +1385,7 @@ impl<'a, TNpmRegistryApi: NpmRegistryApi> let has_deps = if let Some(deps) = self.dep_entry_cache.get(&pkg_nv) { !deps.is_empty() } else { - let deps = self.dep_entry_cache.store(pkg_nv.clone(), info)?; + let deps = self.dep_entry_cache.store(&pkg_nv, info)?; !deps.is_empty() }; @@ -2585,8 +2587,7 @@ impl<'a, TNpmRegistryApi: NpmRegistryApi> let version_info = package_info .version_info(&nv, &self.version_resolver.link_packages) .map_err(NpmPackageVersionResolutionError::VersionNotFound)?; - let child_deps = - self.dep_entry_cache.store(nv.clone(), version_info)?; + let child_deps = self.dep_entry_cache.store(&nv, version_info)?; if child_deps.is_empty() { self.graph.borrow_node_mut(path.node_id()).no_peers = true; @@ -3041,7 +3042,7 @@ impl<'a, TNpmRegistryApi: NpmRegistryApi> let version_info = package_info .version_info(&nv, &self.version_resolver.link_packages) .map_err(NpmPackageVersionResolutionError::VersionNotFound)?; - let deps = self.dep_entry_cache.store(nv.clone(), version_info)?; + let deps = self.dep_entry_cache.store(&nv, version_info)?; pending_dep_entries.push_back((node_id, deps)); }