summaryrefslogtreecommitdiff
path: root/cli/args/lockfile.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/args/lockfile.rs')
-rw-r--r--cli/args/lockfile.rs109
1 files changed, 8 insertions, 101 deletions
diff --git a/cli/args/lockfile.rs b/cli/args/lockfile.rs
index 9903ba642..dd976862e 100644
--- a/cli/args/lockfile.rs
+++ b/cli/args/lockfile.rs
@@ -1,25 +1,14 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::Arc;
-use deno_core::anyhow::bail;
-use deno_core::anyhow::Context;
use deno_core::error::AnyError;
-use deno_core::futures::stream::FuturesOrdered;
-use deno_core::futures::StreamExt;
use deno_core::parking_lot::Mutex;
use deno_npm::registry::NpmRegistryApi;
-use deno_npm::resolution::SerializedNpmResolutionSnapshot;
-use deno_npm::resolution::SerializedNpmResolutionSnapshotPackage;
use deno_npm::resolution::ValidSerializedNpmResolutionSnapshot;
-use deno_npm::NpmPackageId;
-use deno_npm::NpmResolutionPackageSystemInfo;
-use deno_semver::npm::NpmPackageReq;
use crate::args::ConfigFile;
-use crate::npm::CliNpmRegistryApi;
use crate::Flags;
use super::DenoSubcommand;
@@ -63,96 +52,14 @@ pub fn discover(
pub async fn snapshot_from_lockfile(
lockfile: Arc<Mutex<Lockfile>>,
- api: &CliNpmRegistryApi,
+ api: &dyn NpmRegistryApi,
) -> Result<ValidSerializedNpmResolutionSnapshot, AnyError> {
- let (root_packages, mut packages) = {
- let lockfile = lockfile.lock();
-
- let mut root_packages =
- HashMap::<NpmPackageReq, NpmPackageId>::with_capacity(
- lockfile.content.npm.specifiers.len(),
- );
- // collect the specifiers to version mappings
- for (key, value) in &lockfile.content.npm.specifiers {
- let package_req = NpmPackageReq::from_str(key)
- .with_context(|| format!("Unable to parse npm specifier: {key}"))?;
- let package_id = NpmPackageId::from_serialized(value)?;
- root_packages.insert(package_req, package_id.clone());
- }
-
- // now fill the packages except for the dist information
- let mut packages = Vec::with_capacity(lockfile.content.npm.packages.len());
- for (key, package) in &lockfile.content.npm.packages {
- let id = NpmPackageId::from_serialized(key)?;
-
- // collect the dependencies
- let mut dependencies = HashMap::with_capacity(package.dependencies.len());
- for (name, specifier) in &package.dependencies {
- let dep_id = NpmPackageId::from_serialized(specifier)?;
- dependencies.insert(name.clone(), dep_id);
- }
-
- packages.push(SerializedNpmResolutionSnapshotPackage {
- id,
- dependencies,
- // temporarily empty
- system: Default::default(),
- dist: Default::default(),
- optional_dependencies: Default::default(),
- });
- }
- (root_packages, packages)
- };
-
- // now that the lockfile is dropped, fetch the package version information
- let pkg_nvs = packages.iter().map(|p| p.id.nv.clone()).collect::<Vec<_>>();
- let get_version_infos = || {
- FuturesOrdered::from_iter(pkg_nvs.iter().map(|nv| async move {
- let package_info = api.package_info(&nv.name).await?;
- match package_info.version_info(nv) {
- Ok(version_info) => Ok(version_info),
- Err(err) => {
- bail!("Could not find '{}' specified in the lockfile.", err.0);
- }
- }
- }))
+ let incomplete_snapshot = {
+ let lock = lockfile.lock();
+ deno_npm::resolution::incomplete_snapshot_from_lockfile(&lock)?
};
- let mut version_infos = get_version_infos();
- let mut i = 0;
- while let Some(result) = version_infos.next().await {
- match result {
- Ok(version_info) => {
- let package = &mut packages[i];
- package.dist = version_info.dist;
- package.system = NpmResolutionPackageSystemInfo {
- cpu: version_info.cpu,
- os: version_info.os,
- };
- package.optional_dependencies =
- version_info.optional_dependencies.into_keys().collect();
- }
- Err(err) => {
- if api.mark_force_reload() {
- // reset and try again
- version_infos = get_version_infos();
- i = 0;
- continue;
- } else {
- return Err(err);
- }
- }
- }
-
- i += 1;
- }
-
- // clear the memory cache to reduce memory usage
- api.clear_memory_cache();
-
- SerializedNpmResolutionSnapshot {
- packages,
- root_packages,
- }
- .into_valid()
- .context("The lockfile is corrupt. You can recreate it with --lock-write")
+ let snapshot =
+ deno_npm::resolution::snapshot_from_lockfile(incomplete_snapshot, api)
+ .await?;
+ Ok(snapshot)
}