summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-10-02 15:11:43 -0700
committerGitHub <noreply@github.com>2024-10-02 15:11:43 -0700
commitcb74975ab2b88a984c11a9bbb33ff2a36ccb2acb (patch)
treeba479203e730059484e42c360db3595322c4b10b
parentcac28b52621975137b86d4fd6efc32cecc10d682 (diff)
fix(install): compare versions directly to decide whether to create a child node_modules dir for a workspace member (#26001)
Fixes #25861. Previously we were attempting to match the version requirement against the version already present in `node_modules` root, and if they didn't match we would create a node_modules dir in the workspace member's directory with the dependency. Aside from the fact that this caused the panic, on second thought it just doesn't make sense in general. We shouldn't be semver matching, as resolution has already occurred and decided what package versions are required. Instead, we can just compare the versions directly.
-rw-r--r--cli/npm/managed/resolvers/local.rs6
-rw-r--r--tests/specs/install/workspace_member_with_tag_dep/__test__.jsonc9
-rw-r--r--tests/specs/install/workspace_member_with_tag_dep/install.out3
-rw-r--r--tests/specs/install/workspace_member_with_tag_dep/package.json6
-rw-r--r--tests/specs/install/workspace_member_with_tag_dep/package1/package.json5
5 files changed, 26 insertions, 3 deletions
diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs
index 59ba27d05..edc7c7ea0 100644
--- a/cli/npm/managed/resolvers/local.rs
+++ b/cli/npm/managed/resolvers/local.rs
@@ -518,9 +518,9 @@ async fn sync_resolution_with_fs(
// linked into the root
match found_names.entry(remote_alias) {
Entry::Occupied(nv) => {
- alias_clashes
- || remote.req.name != nv.get().name // alias to a different package (in case of duplicate aliases)
- || !remote.req.version_req.matches(&nv.get().version) // incompatible version
+ // alias to a different package (in case of duplicate aliases)
+ // or the version doesn't match the version in the root node_modules
+ alias_clashes || &remote_pkg.id.nv != *nv.get()
}
Entry::Vacant(entry) => {
entry.insert(&remote_pkg.id.nv);
diff --git a/tests/specs/install/workspace_member_with_tag_dep/__test__.jsonc b/tests/specs/install/workspace_member_with_tag_dep/__test__.jsonc
new file mode 100644
index 000000000..254fe8b98
--- /dev/null
+++ b/tests/specs/install/workspace_member_with_tag_dep/__test__.jsonc
@@ -0,0 +1,9 @@
+{
+ "tempDir": true,
+ "steps": [
+ {
+ "args": "install",
+ "output": "install.out"
+ }
+ ]
+}
diff --git a/tests/specs/install/workspace_member_with_tag_dep/install.out b/tests/specs/install/workspace_member_with_tag_dep/install.out
new file mode 100644
index 000000000..b8114c12a
--- /dev/null
+++ b/tests/specs/install/workspace_member_with_tag_dep/install.out
@@ -0,0 +1,3 @@
+Download http://localhost:4260/@denotest/esm-basic
+Download http://localhost:4260/@denotest/esm-basic/1.0.0.tgz
+Initialize @denotest/esm-basic@1.0.0
diff --git a/tests/specs/install/workspace_member_with_tag_dep/package.json b/tests/specs/install/workspace_member_with_tag_dep/package.json
new file mode 100644
index 000000000..58aa5d5cc
--- /dev/null
+++ b/tests/specs/install/workspace_member_with_tag_dep/package.json
@@ -0,0 +1,6 @@
+{
+ "dependencies": {
+ "@denotest/esm-basic": "latest"
+ },
+ "workspaces": ["package1"]
+}
diff --git a/tests/specs/install/workspace_member_with_tag_dep/package1/package.json b/tests/specs/install/workspace_member_with_tag_dep/package1/package.json
new file mode 100644
index 000000000..150a7df6a
--- /dev/null
+++ b/tests/specs/install/workspace_member_with_tag_dep/package1/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "@denotest/esm-basic": "latest"
+ }
+}