diff options
Diffstat (limited to 'cli/npm')
-rw-r--r-- | cli/npm/byonm.rs | 20 | ||||
-rw-r--r-- | cli/npm/managed/mod.rs | 23 | ||||
-rw-r--r-- | cli/npm/managed/resolvers/local.rs | 22 | ||||
-rw-r--r-- | cli/npm/managed/resolvers/mod.rs | 4 |
4 files changed, 53 insertions, 16 deletions
diff --git a/cli/npm/byonm.rs b/cli/npm/byonm.rs index 0d4b9d4d4..bbd5da8ec 100644 --- a/cli/npm/byonm.rs +++ b/cli/npm/byonm.rs @@ -6,6 +6,7 @@ use std::path::PathBuf; use std::sync::Arc; use deno_ast::ModuleSpecifier; +use deno_config::package_json::PackageJsonDepValue; use deno_core::anyhow::bail; use deno_core::error::AnyError; use deno_core::serde_json; @@ -87,13 +88,22 @@ impl ByonmCliNpmResolver { req: &PackageReq, pkg_json: &PackageJson, ) -> Option<String> { - let deps = pkg_json.resolve_local_package_json_version_reqs(); + let deps = pkg_json.resolve_local_package_json_deps(); for (key, value) in deps { if let Ok(value) = value { - if value.name == req.name - && value.version_req.intersects(&req.version_req) - { - return Some(key); + match value { + PackageJsonDepValue::Req(dep_req) => { + if dep_req.name == req.name + && dep_req.version_req.intersects(&req.version_req) + { + return Some(key); + } + } + PackageJsonDepValue::Workspace(_workspace) => { + if key == req.name && req.version_req.tag() == Some("workspace") { + return Some(key); + } + } } } } diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs index 393fc8632..467703b05 100644 --- a/cli/npm/managed/mod.rs +++ b/cli/npm/managed/mod.rs @@ -29,7 +29,7 @@ use resolution::AddPkgReqsResult; use crate::args::CliLockfile; use crate::args::NpmProcessState; use crate::args::NpmProcessStateKind; -use crate::args::PackageJsonDepsProvider; +use crate::args::PackageJsonInstallDepsProvider; use crate::cache::FastInsecureHasher; use crate::http_util::HttpClientProvider; use crate::util::fs::canonicalize_path_maybe_not_exists_with_fs; @@ -66,7 +66,7 @@ pub struct CliNpmResolverManagedCreateOptions { pub text_only_progress_bar: crate::util::progress_bar::ProgressBar, pub maybe_node_modules_path: Option<PathBuf>, pub npm_system_info: NpmSystemInfo, - pub package_json_deps_provider: Arc<PackageJsonDepsProvider>, + pub package_json_deps_provider: Arc<PackageJsonInstallDepsProvider>, pub npmrc: Arc<ResolvedNpmRc>, } @@ -131,7 +131,7 @@ fn create_inner( npm_api: Arc<CliNpmRegistryApi>, npm_cache: Arc<NpmCache>, npm_rc: Arc<ResolvedNpmRc>, - package_json_deps_provider: Arc<PackageJsonDepsProvider>, + package_json_deps_provider: Arc<PackageJsonInstallDepsProvider>, text_only_progress_bar: crate::util::progress_bar::ProgressBar, node_modules_dir_path: Option<PathBuf>, npm_system_info: NpmSystemInfo, @@ -152,6 +152,7 @@ fn create_inner( let fs_resolver = create_npm_fs_resolver( fs.clone(), npm_cache.clone(), + &package_json_deps_provider, &text_only_progress_bar, resolution.clone(), tarball_cache.clone(), @@ -249,7 +250,7 @@ pub struct ManagedCliNpmResolver { maybe_lockfile: Option<Arc<CliLockfile>>, npm_api: Arc<CliNpmRegistryApi>, npm_cache: Arc<NpmCache>, - package_json_deps_provider: Arc<PackageJsonDepsProvider>, + package_json_deps_provider: Arc<PackageJsonInstallDepsProvider>, resolution: Arc<NpmResolution>, tarball_cache: Arc<TarballCache>, text_only_progress_bar: ProgressBar, @@ -273,7 +274,7 @@ impl ManagedCliNpmResolver { maybe_lockfile: Option<Arc<CliLockfile>>, npm_api: Arc<CliNpmRegistryApi>, npm_cache: Arc<NpmCache>, - package_json_deps_provider: Arc<PackageJsonDepsProvider>, + package_json_deps_provider: Arc<PackageJsonInstallDepsProvider>, resolution: Arc<NpmResolution>, tarball_cache: Arc<TarballCache>, text_only_progress_bar: ProgressBar, @@ -459,12 +460,14 @@ impl ManagedCliNpmResolver { pub async fn ensure_top_level_package_json_install( &self, ) -> Result<bool, AnyError> { - let Some(reqs) = self.package_json_deps_provider.reqs() else { - return Ok(false); - }; if !self.top_level_install_flag.raise() { return Ok(false); // already did this } + let reqs = self.package_json_deps_provider.remote_pkg_reqs(); + if reqs.is_empty() { + return Ok(false); + } + // check if something needs resolving before bothering to load all // the package information (which is slow) if reqs @@ -477,8 +480,7 @@ impl ManagedCliNpmResolver { return Ok(false); // everything is already resolvable } - let reqs = reqs.into_iter().cloned().collect::<Vec<_>>(); - self.add_package_reqs(&reqs).await.map(|_| true) + self.add_package_reqs(reqs).await.map(|_| true) } pub async fn cache_package_info( @@ -563,6 +565,7 @@ impl CliNpmResolver for ManagedCliNpmResolver { create_npm_fs_resolver( self.fs.clone(), self.npm_cache.clone(), + &self.package_json_deps_provider, &self.text_only_progress_bar, npm_resolution.clone(), self.tarball_cache.clone(), diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs index d338720b6..e8fffa0cd 100644 --- a/cli/npm/managed/resolvers/local.rs +++ b/cli/npm/managed/resolvers/local.rs @@ -15,6 +15,7 @@ use std::path::PathBuf; use std::rc::Rc; use std::sync::Arc; +use crate::args::PackageJsonInstallDepsProvider; use crate::cache::CACHE_PERM; use crate::npm::cache_dir::mixed_case_package_name_decode; use crate::util::fs::atomic_write_file_with_retries; @@ -57,6 +58,7 @@ use super::common::RegistryReadPermissionChecker; pub struct LocalNpmPackageResolver { cache: Arc<NpmCache>, fs: Arc<dyn deno_fs::FileSystem>, + pkg_json_deps_provider: Arc<PackageJsonInstallDepsProvider>, progress_bar: ProgressBar, resolution: Arc<NpmResolution>, tarball_cache: Arc<TarballCache>, @@ -67,9 +69,11 @@ pub struct LocalNpmPackageResolver { } impl LocalNpmPackageResolver { + #[allow(clippy::too_many_arguments)] pub fn new( cache: Arc<NpmCache>, fs: Arc<dyn deno_fs::FileSystem>, + pkg_json_deps_provider: Arc<PackageJsonInstallDepsProvider>, progress_bar: ProgressBar, resolution: Arc<NpmResolution>, tarball_cache: Arc<TarballCache>, @@ -79,6 +83,7 @@ impl LocalNpmPackageResolver { Self { cache, fs: fs.clone(), + pkg_json_deps_provider, progress_bar, resolution, tarball_cache, @@ -221,6 +226,7 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { sync_resolution_with_fs( &self.resolution.snapshot(), &self.cache, + &self.pkg_json_deps_provider, &self.progress_bar, &self.tarball_cache, &self.root_node_modules_path, @@ -244,12 +250,13 @@ impl NpmPackageFsResolver for LocalNpmPackageResolver { async fn sync_resolution_with_fs( snapshot: &NpmResolutionSnapshot, cache: &Arc<NpmCache>, + pkg_json_deps_provider: &PackageJsonInstallDepsProvider, progress_bar: &ProgressBar, tarball_cache: &Arc<TarballCache>, root_node_modules_dir_path: &Path, system_info: &NpmSystemInfo, ) -> Result<(), AnyError> { - if snapshot.is_empty() { + if snapshot.is_empty() && pkg_json_deps_provider.workspace_pkgs().is_empty() { return Ok(()); // don't create the directory } @@ -475,6 +482,19 @@ async fn sync_resolution_with_fs( bin_entries.finish(snapshot, &bin_node_modules_dir_path)?; } + // 7. Create symlinks for the workspace packages + { + // todo(#24419): this is not exactly correct because it should + // install correctly for a workspace (potentially in sub directories), + // but this is good enough for a first pass + for workspace in pkg_json_deps_provider.workspace_pkgs() { + symlink_package_dir( + &workspace.pkg_dir, + &root_node_modules_dir_path.join(&workspace.alias), + )?; + } + } + setup_cache.save(); drop(single_process_lock); drop(pb_clear_guard); diff --git a/cli/npm/managed/resolvers/mod.rs b/cli/npm/managed/resolvers/mod.rs index 2d812a2be..a7f545916 100644 --- a/cli/npm/managed/resolvers/mod.rs +++ b/cli/npm/managed/resolvers/mod.rs @@ -10,6 +10,7 @@ use std::sync::Arc; use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs::FileSystem; +use crate::args::PackageJsonInstallDepsProvider; use crate::util::progress_bar::ProgressBar; pub use self::common::NpmPackageFsResolver; @@ -21,9 +22,11 @@ use super::cache::NpmCache; use super::cache::TarballCache; use super::resolution::NpmResolution; +#[allow(clippy::too_many_arguments)] pub fn create_npm_fs_resolver( fs: Arc<dyn FileSystem>, npm_cache: Arc<NpmCache>, + pkg_json_deps_provider: &Arc<PackageJsonInstallDepsProvider>, progress_bar: &ProgressBar, resolution: Arc<NpmResolution>, tarball_cache: Arc<TarballCache>, @@ -34,6 +37,7 @@ pub fn create_npm_fs_resolver( Some(node_modules_folder) => Arc::new(LocalNpmPackageResolver::new( npm_cache, fs, + pkg_json_deps_provider.clone(), progress_bar.clone(), resolution, tarball_cache, |