summaryrefslogtreecommitdiff
path: root/cli/npm
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm')
-rw-r--r--cli/npm/byonm.rs20
-rw-r--r--cli/npm/managed/mod.rs23
-rw-r--r--cli/npm/managed/resolvers/local.rs22
-rw-r--r--cli/npm/managed/resolvers/mod.rs4
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,