diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-10-03 19:05:06 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-03 19:05:06 -0400 |
commit | 8c1677ecbcbb474fc6a5ac9b5f73b562677bb829 (patch) | |
tree | 885a45a67e6aed7dc70307df718b176a729c8655 /cli/npm/managed/mod.rs | |
parent | 494822175fd69f8c20a2e21ddcedcb3287064cce (diff) |
refactor(npm): break up `NpmModuleLoader` and move more methods into the managed `CliNpmResolver` (#20777)
Part of https://github.com/denoland/deno/issues/18967
Diffstat (limited to 'cli/npm/managed/mod.rs')
-rw-r--r-- | cli/npm/managed/mod.rs | 119 |
1 files changed, 58 insertions, 61 deletions
diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index df9ad59ac..b85f1130f 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -1,6 +1,5 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; @@ -23,15 +22,13 @@ use deno_runtime::deno_fs::FileSystem; use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::NpmResolver; -use deno_semver::npm::NpmPackageNvReference; -use deno_semver::npm::NpmPackageReqReference; use deno_semver::package::PackageNv; -use deno_semver::package::PackageNvReference; use deno_semver::package::PackageReq; use crate::args::Lockfile; use crate::args::NpmProcessState; use crate::args::PackageJsonDepsProvider; +use crate::cache::FastInsecureHasher; use crate::util::fs::canonicalize_path_maybe_not_exists_with_fs; use crate::util::progress_bar::ProgressBar; @@ -345,6 +342,16 @@ impl ManagedCliNpmResolver { self.resolution.all_system_packages(system_info) } + /// Checks if the provided package req's folder is cached. + pub fn is_pkg_req_folder_cached(&self, req: &PackageReq) -> bool { + self + .resolve_pkg_id_from_pkg_req(req) + .ok() + .and_then(|id| self.fs_resolver.package_folder(&id).ok()) + .map(|folder| folder.exists()) + .unwrap_or(false) + } + /// Adds package requirements to the resolver and ensures everything is setup. pub async fn add_package_reqs( &self, @@ -413,6 +420,35 @@ impl ManagedCliNpmResolver { self.fs_resolver.cache_packages().await } + /// Resolves a package requirement for deno graph. This should only be + /// called by deno_graph's NpmResolver or for resolving packages in + /// a package.json + pub fn resolve_npm_for_deno_graph( + &self, + pkg_req: &PackageReq, + ) -> NpmPackageReqResolution { + let result = self.resolution.resolve_pkg_req_as_pending(pkg_req); + match result { + Ok(nv) => NpmPackageReqResolution::Ok(nv), + Err(err) => { + if self.api.mark_force_reload() { + log::debug!("Restarting npm specifier resolution to check for new registry information. Error: {:#}", err); + NpmPackageReqResolution::ReloadRegistryInfo(err.into()) + } else { + NpmPackageReqResolution::Err(err.into()) + } + } + } + } + + pub fn resolve_pkg_folder_from_deno_module( + &self, + nv: &PackageNv, + ) -> Result<PathBuf, AnyError> { + let pkg_id = self.resolution.resolve_pkg_id_from_deno_module(nv)?; + self.resolve_pkg_folder_from_pkg_id(&pkg_id) + } + fn resolve_pkg_id_from_pkg_req( &self, req: &PackageReq, @@ -513,7 +549,7 @@ impl CliNpmResolver for ManagedCliNpmResolver { &self.progress_bar, self.api.base_url().clone(), npm_resolution, - self.node_modules_path(), + self.root_node_modules_path(), self.npm_system_info.clone(), ), self.global_npm_cache.clone(), @@ -524,59 +560,14 @@ impl CliNpmResolver for ManagedCliNpmResolver { )) } - fn root_dir_url(&self) -> &Url { - self.fs_resolver.root_dir_url() - } - fn as_inner(&self) -> InnerCliNpmResolverRef { InnerCliNpmResolverRef::Managed(self) } - fn node_modules_path(&self) -> Option<PathBuf> { + fn root_node_modules_path(&self) -> Option<PathBuf> { self.fs_resolver.node_modules_path() } - /// Checks if the provided package req's folder is cached. - fn is_pkg_req_folder_cached(&self, req: &PackageReq) -> bool { - self - .resolve_pkg_id_from_pkg_req(req) - .ok() - .and_then(|id| self.fs_resolver.package_folder(&id).ok()) - .map(|folder| folder.exists()) - .unwrap_or(false) - } - - fn resolve_npm_for_deno_graph( - &self, - pkg_req: &PackageReq, - ) -> NpmPackageReqResolution { - let result = self.resolution.resolve_pkg_req_as_pending(pkg_req); - match result { - Ok(nv) => NpmPackageReqResolution::Ok(nv), - Err(err) => { - if self.api.mark_force_reload() { - log::debug!("Restarting npm specifier resolution to check for new registry information. Error: {:#}", err); - NpmPackageReqResolution::ReloadRegistryInfo(err.into()) - } else { - NpmPackageReqResolution::Err(err.into()) - } - } - } - } - - fn resolve_pkg_nv_ref_from_pkg_req_ref( - &self, - req_ref: &NpmPackageReqReference, - ) -> Result<NpmPackageNvReference, PackageReqNotFoundError> { - let pkg_nv = self - .resolve_pkg_id_from_pkg_req(req_ref.req()) - .map(|id| id.nv)?; - Ok(NpmPackageNvReference::new(PackageNvReference { - nv: pkg_nv, - sub_path: req_ref.sub_path().map(|s| s.to_string()), - })) - } - /// Resolve the root folder of the package the provided specifier is in. /// /// This will error when the provided specifier is not in an npm package. @@ -601,19 +592,12 @@ impl CliNpmResolver for ManagedCliNpmResolver { fn resolve_pkg_folder_from_deno_module_req( &self, req: &PackageReq, + _referrer: &ModuleSpecifier, ) -> Result<PathBuf, AnyError> { let pkg_id = self.resolve_pkg_id_from_pkg_req(req)?; self.resolve_pkg_folder_from_pkg_id(&pkg_id) } - fn resolve_pkg_folder_from_deno_module( - &self, - nv: &PackageNv, - ) -> Result<PathBuf, AnyError> { - let pkg_id = self.resolution.resolve_pkg_id_from_deno_module(nv)?; - self.resolve_pkg_folder_from_pkg_id(&pkg_id) - } - /// Gets the state of npm for the process. fn get_npm_process_state(&self) -> String { serde_json::to_string(&NpmProcessState { @@ -629,7 +613,20 @@ impl CliNpmResolver for ManagedCliNpmResolver { .unwrap() } - fn package_reqs(&self) -> HashMap<PackageReq, PackageNv> { - self.resolution.package_reqs() + fn check_state_hash(&self) -> Option<u64> { + // We could go further and check all the individual + // npm packages, but that's probably overkill. + let mut package_reqs = self + .resolution + .package_reqs() + .into_iter() + .collect::<Vec<_>>(); + package_reqs.sort_by(|a, b| a.0.cmp(&b.0)); // determinism + let mut hasher = FastInsecureHasher::new(); + for (pkg_req, pkg_nv) in package_reqs { + hasher.write_hashable(&pkg_req); + hasher.write_hashable(&pkg_nv); + } + Some(hasher.finish()) } } |