summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/npm/managed/resolvers/local.rs15
-rw-r--r--tests/specs/install/workspace_node_modules_not_exists/__test__.jsonc15
-rw-r--r--tests/specs/install/workspace_node_modules_not_exists/deno.json7
-rw-r--r--tests/specs/install/workspace_node_modules_not_exists/install.out22
-rw-r--r--tests/specs/install/workspace_node_modules_not_exists/package1/package.json5
-rw-r--r--tests/specs/install/workspace_node_modules_not_exists/package2/package.json5
6 files changed, 67 insertions, 2 deletions
diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs
index eb6f9de9b..d0fd523e2 100644
--- a/cli/npm/managed/resolvers/local.rs
+++ b/cli/npm/managed/resolvers/local.rs
@@ -10,6 +10,7 @@ use std::cmp::Ordering;
use std::collections::hash_map::Entry;
use std::collections::BTreeMap;
use std::collections::HashMap;
+use std::collections::HashSet;
use std::fs;
use std::path::Path;
use std::path::PathBuf;
@@ -620,6 +621,9 @@ async fn sync_resolution_with_fs(
let mut found_names: HashMap<&String, &PackageNv> = HashMap::new();
+ // set of node_modules in workspace packages that we've already ensured exist
+ let mut existing_child_node_modules_dirs: HashSet<PathBuf> = HashSet::new();
+
// 4. Create symlinks for package json dependencies
{
for remote in npm_install_deps_provider.remote_pkgs() {
@@ -667,8 +671,15 @@ async fn sync_resolution_with_fs(
);
if install_in_child {
// symlink the dep into the package's child node_modules folder
- let dest_path =
- remote.base_dir.join("node_modules").join(&remote.alias);
+ let dest_node_modules = remote.base_dir.join("node_modules");
+ if !existing_child_node_modules_dirs.contains(&dest_node_modules) {
+ fs::create_dir_all(&dest_node_modules).with_context(|| {
+ format!("Creating '{}'", dest_node_modules.display())
+ })?;
+ existing_child_node_modules_dirs.insert(dest_node_modules.clone());
+ }
+ let mut dest_path = dest_node_modules;
+ dest_path.push(&remote.alias);
symlink_package_dir(&local_registry_package_path, &dest_path)?;
} else {
diff --git a/tests/specs/install/workspace_node_modules_not_exists/__test__.jsonc b/tests/specs/install/workspace_node_modules_not_exists/__test__.jsonc
new file mode 100644
index 000000000..a39eb5e1f
--- /dev/null
+++ b/tests/specs/install/workspace_node_modules_not_exists/__test__.jsonc
@@ -0,0 +1,15 @@
+// Regression test for https://github.com/denoland/deno/issues/25493
+//
+// `deno install` where we need to create a `node_modules` for a workspace member
+// due to conflicting package versions, but when we go to set it up, the
+// symlink target path (`package2/node_modules/chalk`) has `node_modules` as its parent,
+// and it doesn't exist yet
+{
+ "tempDir": true,
+ "steps": [
+ {
+ "args": "install",
+ "output": "install.out"
+ }
+ ]
+}
diff --git a/tests/specs/install/workspace_node_modules_not_exists/deno.json b/tests/specs/install/workspace_node_modules_not_exists/deno.json
new file mode 100644
index 000000000..b3cca048f
--- /dev/null
+++ b/tests/specs/install/workspace_node_modules_not_exists/deno.json
@@ -0,0 +1,7 @@
+{
+ "nodeModulesDir": "auto",
+ "workspace": [
+ "./package1",
+ "./package2"
+ ]
+}
diff --git a/tests/specs/install/workspace_node_modules_not_exists/install.out b/tests/specs/install/workspace_node_modules_not_exists/install.out
new file mode 100644
index 000000000..22f7e4307
--- /dev/null
+++ b/tests/specs/install/workspace_node_modules_not_exists/install.out
@@ -0,0 +1,22 @@
+[UNORDERED_START]
+Download http://localhost:4260/chalk
+Download http://localhost:4260/ansi-styles
+Download http://localhost:4260/supports-color
+Download http://localhost:4260/color-convert
+Download http://localhost:4260/has-flag
+Download http://localhost:4260/color-name
+Download http://localhost:4260/chalk/chalk-4.1.2.tgz
+Download http://localhost:4260/chalk/chalk-5.0.1.tgz
+Download http://localhost:4260/supports-color/supports-color-7.2.0.tgz
+Download http://localhost:4260/ansi-styles/ansi-styles-4.3.0.tgz
+Download http://localhost:4260/has-flag/has-flag-4.0.0.tgz
+Download http://localhost:4260/color-convert/color-convert-2.0.1.tgz
+Download http://localhost:4260/color-name/color-name-1.1.4.tgz
+Initialize supports-color@7.2.0
+Initialize chalk@4.1.2
+Initialize ansi-styles@4.3.0
+Initialize color-name@1.1.4
+Initialize color-convert@2.0.1
+Initialize has-flag@4.0.0
+Initialize chalk@5.0.1
+[UNORDERED_END]
diff --git a/tests/specs/install/workspace_node_modules_not_exists/package1/package.json b/tests/specs/install/workspace_node_modules_not_exists/package1/package.json
new file mode 100644
index 000000000..0c5e77484
--- /dev/null
+++ b/tests/specs/install/workspace_node_modules_not_exists/package1/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "chalk": "4.1.2"
+ }
+}
diff --git a/tests/specs/install/workspace_node_modules_not_exists/package2/package.json b/tests/specs/install/workspace_node_modules_not_exists/package2/package.json
new file mode 100644
index 000000000..48d3d6917
--- /dev/null
+++ b/tests/specs/install/workspace_node_modules_not_exists/package2/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "chalk": "5.0.1"
+ }
+}