diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-10-21 11:20:18 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-21 15:20:18 +0000 |
commit | bcfe279fba865763c87f9cd8d5a2d0b2cbf451be (patch) | |
tree | 68e4d1bc52e261df50279f9ecea14795d1c46f6c /cli/npm/resolvers/mod.rs | |
parent | 0e1a71fec6fff5fe62d7e6b2bfffb7ab877d7b71 (diff) |
feat(unstable/npm): initial type checking of npm specifiers (#16332)
Diffstat (limited to 'cli/npm/resolvers/mod.rs')
-rw-r--r-- | cli/npm/resolvers/mod.rs | 83 |
1 files changed, 72 insertions, 11 deletions
diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs index d290a5569..5498bbf75 100644 --- a/cli/npm/resolvers/mod.rs +++ b/cli/npm/resolvers/mod.rs @@ -15,6 +15,7 @@ use global::GlobalNpmPackageResolver; use once_cell::sync::Lazy; use serde::Deserialize; use serde::Serialize; +use std::collections::HashSet; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; @@ -23,10 +24,10 @@ use crate::fs_util; use self::common::InnerNpmPackageResolver; use self::local::LocalNpmPackageResolver; -use super::resolution::NpmResolutionSnapshot; use super::NpmCache; use super::NpmPackageReq; use super::NpmRegistryApi; +use super::NpmResolutionSnapshot; const RESOLUTION_STATE_ENV_VAR_NAME: &str = "DENO_DONT_USE_INTERNAL_NODE_COMPAT_STATE"; @@ -67,6 +68,19 @@ pub struct NpmPackageResolver { no_npm: bool, inner: Arc<dyn InnerNpmPackageResolver>, local_node_modules_path: Option<PathBuf>, + api: NpmRegistryApi, + cache: NpmCache, +} + +impl std::fmt::Debug for NpmPackageResolver { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NpmPackageResolver") + .field("unstable", &self.unstable) + .field("no_npm", &self.no_npm) + .field("inner", &"<omitted>") + .field("local_node_modules_path", &self.local_node_modules_path) + .finish() + } } impl NpmPackageResolver { @@ -77,30 +91,53 @@ impl NpmPackageResolver { no_npm: bool, local_node_modules_path: Option<PathBuf>, ) -> Self { + Self::new_with_maybe_snapshot( + cache, + api, + unstable, + no_npm, + local_node_modules_path, + None, + ) + } + + fn new_with_maybe_snapshot( + cache: NpmCache, + api: NpmRegistryApi, + unstable: bool, + no_npm: bool, + local_node_modules_path: Option<PathBuf>, + initial_snapshot: Option<NpmResolutionSnapshot>, + ) -> Self { let process_npm_state = NpmProcessState::take(); let local_node_modules_path = local_node_modules_path.or_else(|| { process_npm_state .as_ref() .and_then(|s| s.local_node_modules_path.as_ref().map(PathBuf::from)) }); - let maybe_snapshot = process_npm_state.map(|s| s.snapshot); + let maybe_snapshot = + initial_snapshot.or_else(|| process_npm_state.map(|s| s.snapshot)); let inner: Arc<dyn InnerNpmPackageResolver> = match &local_node_modules_path { Some(node_modules_folder) => Arc::new(LocalNpmPackageResolver::new( - cache, - api, + cache.clone(), + api.clone(), node_modules_folder.clone(), maybe_snapshot, )), - None => { - Arc::new(GlobalNpmPackageResolver::new(cache, api, maybe_snapshot)) - } + None => Arc::new(GlobalNpmPackageResolver::new( + cache.clone(), + api.clone(), + maybe_snapshot, + )), }; Self { unstable, no_npm, inner, local_node_modules_path, + api, + cache, } } @@ -122,10 +159,11 @@ impl NpmPackageResolver { &self, name: &str, referrer: &ModuleSpecifier, + conditions: &[&str], ) -> Result<PathBuf, AnyError> { let path = self .inner - .resolve_package_folder_from_package(name, referrer)?; + .resolve_package_folder_from_package(name, referrer, conditions)?; log::debug!("Resolved {} from {} to {}", name, referrer, path.display()); Ok(path) } @@ -156,12 +194,14 @@ impl NpmPackageResolver { self.inner.has_packages() } - /// Adds a package requirement to the resolver and ensures everything is setup. + /// Adds package requirements to the resolver and ensures everything is setup. pub async fn add_package_reqs( &self, packages: Vec<NpmPackageReq>, ) -> Result<(), AnyError> { - assert!(!packages.is_empty()); + if packages.is_empty() { + return Ok(()); + } if !self.unstable { bail!( @@ -187,6 +227,14 @@ impl NpmPackageResolver { self.inner.add_package_reqs(packages).await } + /// Sets package requirements to the resolver, removing old requirements and adding new ones. + pub async fn set_package_reqs( + &self, + packages: HashSet<NpmPackageReq>, + ) -> Result<(), AnyError> { + self.inner.set_package_reqs(packages).await + } + // If the main module should be treated as being in an npm package. // This is triggered via a secret environment variable which is used // for functionality like child_process.fork. Users should NOT depend @@ -206,6 +254,18 @@ impl NpmPackageResolver { }) .unwrap() } + + /// Gets a new resolver with a new snapshotted state. + pub fn snapshotted(&self) -> Self { + Self::new_with_maybe_snapshot( + self.cache.clone(), + self.api.clone(), + self.unstable, + self.no_npm, + self.local_node_modules_path.clone(), + Some(self.inner.snapshot()), + ) + } } impl RequireNpmResolver for NpmPackageResolver { @@ -213,9 +273,10 @@ impl RequireNpmResolver for NpmPackageResolver { &self, specifier: &str, referrer: &std::path::Path, + conditions: &[&str], ) -> Result<PathBuf, AnyError> { let referrer = path_to_specifier(referrer)?; - self.resolve_package_folder_from_package(specifier, &referrer) + self.resolve_package_folder_from_package(specifier, &referrer, conditions) } fn resolve_package_folder_from_path( |