diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-05-17 17:38:50 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-17 17:38:50 -0400 |
commit | 41f618a1df6bb8c66d7968ac64456139b9f4c197 (patch) | |
tree | dbcc67e009cf70099be82ea3774669e8aefc6023 /cli/npm/resolvers | |
parent | ad223362451688c13a4441563210f58bdb046a78 (diff) |
fix(npm): improved optional dependency support (#19135)
Note: If the package information has already been cached, then this
requires running with `--reload` or for the registry information to be
fetched some other way (ex. the cache busting).
Closes #15544
---------
Co-authored-by: Bartek IwaĆczuk <biwanczuk@gmail.com>
Diffstat (limited to 'cli/npm/resolvers')
-rw-r--r-- | cli/npm/resolvers/common.rs | 1 | ||||
-rw-r--r-- | cli/npm/resolvers/global.rs | 48 | ||||
-rw-r--r-- | cli/npm/resolvers/local.rs | 9 | ||||
-rw-r--r-- | cli/npm/resolvers/mod.rs | 4 |
4 files changed, 36 insertions, 26 deletions
diff --git a/cli/npm/resolvers/common.rs b/cli/npm/resolvers/common.rs index c91b206cf..abfdd6371 100644 --- a/cli/npm/resolvers/common.rs +++ b/cli/npm/resolvers/common.rs @@ -69,7 +69,6 @@ pub async fn cache_packages( let mut handles = Vec::with_capacity(packages.len()); for package in packages { - assert_eq!(package.copy_index, 0); // the caller should not provide any of these let cache = cache.clone(); let registry_url = registry_url.clone(); let handle = spawn(async move { diff --git a/cli/npm/resolvers/global.rs b/cli/npm/resolvers/global.rs index fe8764b0c..22211071a 100644 --- a/cli/npm/resolvers/global.rs +++ b/cli/npm/resolvers/global.rs @@ -14,6 +14,7 @@ use deno_npm::resolution::PackageNotFoundFromReferrerError; use deno_npm::NpmPackageCacheFolderId; use deno_npm::NpmPackageId; use deno_npm::NpmResolutionPackage; +use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs::FileSystem; use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NodeResolutionMode; @@ -33,6 +34,7 @@ pub struct GlobalNpmPackageResolver { cache: Arc<NpmCache>, resolution: Arc<NpmResolution>, registry_url: Url, + system_info: NpmSystemInfo, } impl GlobalNpmPackageResolver { @@ -41,12 +43,14 @@ impl GlobalNpmPackageResolver { cache: Arc<NpmCache>, registry_url: Url, resolution: Arc<NpmResolution>, + system_info: NpmSystemInfo, ) -> Self { Self { fs, cache, resolution, registry_url, + system_info, } } @@ -125,7 +129,26 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { } async fn cache_packages(&self) -> Result<(), AnyError> { - cache_packages_in_resolver(self).await + let package_partitions = self + .resolution + .all_system_packages_partitioned(&self.system_info); + + cache_packages( + package_partitions.packages, + &self.cache, + &self.registry_url, + ) + .await?; + + // create the copy package folders + for copy in package_partitions.copy_packages { + self.cache.ensure_copy_package( + ©.get_package_cache_folder_id(), + &self.registry_url, + )?; + } + + Ok(()) } fn ensure_read_permission( @@ -137,26 +160,3 @@ impl NpmPackageFsResolver for GlobalNpmPackageResolver { ensure_registry_read_permission(&self.fs, permissions, ®istry_path, path) } } - -async fn cache_packages_in_resolver( - resolver: &GlobalNpmPackageResolver, -) -> Result<(), AnyError> { - let package_partitions = resolver.resolution.all_packages_partitioned(); - - cache_packages( - package_partitions.packages, - &resolver.cache, - &resolver.registry_url, - ) - .await?; - - // create the copy package folders - for copy in package_partitions.copy_packages { - resolver.cache.ensure_copy_package( - ©.get_package_cache_folder_id(), - &resolver.registry_url, - )?; - } - - Ok(()) -} diff --git a/cli/npm/resolvers/local.rs b/cli/npm/resolvers/local.rs index b2ad08357..e14d7e0c5 100644 --- a/cli/npm/resolvers/local.rs +++ b/cli/npm/resolvers/local.rs @@ -24,6 +24,7 @@ use deno_core::url::Url; use deno_npm::resolution::NpmResolutionSnapshot; use deno_npm::NpmPackageCacheFolderId; use deno_npm::NpmPackageId; +use deno_npm::NpmSystemInfo; use deno_runtime::deno_core::futures; use deno_runtime::deno_fs; use deno_runtime::deno_node::NodePermissions; @@ -52,6 +53,7 @@ pub struct LocalNpmPackageResolver { registry_url: Url, root_node_modules_path: PathBuf, root_node_modules_url: Url, + system_info: NpmSystemInfo, } impl LocalNpmPackageResolver { @@ -62,6 +64,7 @@ impl LocalNpmPackageResolver { registry_url: Url, node_modules_folder: PathBuf, resolution: Arc<NpmResolution>, + system_info: NpmSystemInfo, ) -> Self { Self { fs, @@ -72,6 +75,7 @@ impl LocalNpmPackageResolver { root_node_modules_url: Url::from_directory_path(&node_modules_folder) .unwrap(), root_node_modules_path: node_modules_folder, + system_info, } } @@ -205,6 +209,7 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { &self.progress_bar, &self.registry_url, &self.root_node_modules_path, + &self.system_info, ) .await } @@ -230,6 +235,7 @@ async fn sync_resolution_with_fs( progress_bar: &ProgressBar, registry_url: &Url, root_node_modules_dir_path: &Path, + system_info: &NpmSystemInfo, ) -> Result<(), AnyError> { if snapshot.is_empty() { return Ok(()); // don't create the directory @@ -254,7 +260,8 @@ async fn sync_resolution_with_fs( // Copy (hardlink in future) <global_registry_cache>/<package_id>/ to // node_modules/.deno/<package_folder_id_folder_name>/node_modules/<package_name> let sync_download = should_sync_download(); - let mut package_partitions = snapshot.all_packages_partitioned(); + let mut package_partitions = + snapshot.all_system_packages_partitioned(system_info); if sync_download { // we're running the tests not with --quiet // and we want the output to be deterministic diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs index f54e509f0..a41727dda 100644 --- a/cli/npm/resolvers/mod.rs +++ b/cli/npm/resolvers/mod.rs @@ -18,6 +18,7 @@ use deno_npm::resolution::NpmResolutionSnapshot; use deno_npm::resolution::PackageReqNotFoundError; use deno_npm::resolution::SerializedNpmResolutionSnapshot; use deno_npm::NpmPackageId; +use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs::FileSystem; use deno_runtime::deno_node::NodePermissions; use deno_runtime::deno_node::NodeResolutionMode; @@ -289,6 +290,7 @@ pub fn create_npm_fs_resolver( registry_url: Url, resolution: Arc<NpmResolution>, maybe_node_modules_path: Option<PathBuf>, + system_info: NpmSystemInfo, ) -> Arc<dyn NpmPackageFsResolver> { match maybe_node_modules_path { Some(node_modules_folder) => Arc::new(LocalNpmPackageResolver::new( @@ -298,12 +300,14 @@ pub fn create_npm_fs_resolver( registry_url, node_modules_folder, resolution, + system_info, )), None => Arc::new(GlobalNpmPackageResolver::new( fs, cache, registry_url, resolution, + system_info, )), } } |