From bef7481282f18f5b8ad864dc76669801187029fe Mon Sep 17 00:00:00 2001 From: Brian DeHamer Date: Fri, 15 Sep 2023 07:44:54 -0700 Subject: [PATCH] fix: query with workspace descendents (#6782) Fixes a query bug which omits some dependencies in scenarios where a workspace has a dependency on another workspace in the project. --- workspaces/arborist/lib/query-selector-all.js | 10 +++++++++- workspaces/arborist/test/query-selector-all.js | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/workspaces/arborist/lib/query-selector-all.js b/workspaces/arborist/lib/query-selector-all.js index 36334e5a859f1..b20b0ebee6936 100644 --- a/workspaces/arborist/lib/query-selector-all.js +++ b/workspaces/arborist/lib/query-selector-all.js @@ -719,7 +719,10 @@ const hasAscendant = (node, compareNodes, seen = new Set()) => { } if (node.isTop && node.resolveParent) { - return hasAscendant(node.resolveParent, compareNodes) + /* istanbul ignore if - investigate if linksIn check obviates need for this */ + if (hasAscendant(node.resolveParent, compareNodes)) { + return true + } } for (const edge of node.edgesIn) { // TODO Need a test with an infinite loop @@ -731,6 +734,11 @@ const hasAscendant = (node, compareNodes, seen = new Set()) => { return true } } + for (const linkNode of node.linksIn) { + if (hasAscendant(linkNode, compareNodes, seen)) { + return true + } + } return false } diff --git a/workspaces/arborist/test/query-selector-all.js b/workspaces/arborist/test/query-selector-all.js index e206e0bb36482..10a670a31f1fb 100644 --- a/workspaces/arborist/test/query-selector-all.js +++ b/workspaces/arborist/test/query-selector-all.js @@ -24,6 +24,7 @@ t.test('query-selector-all', async t => { │ └── lorem@1.0.0 (production dep of baz) ├── abbrev@1.1.1 (production dep of query-selector-all-tests) ├─┬ b@1.0.0 -> ./b (workspace) + │ ├── a@2.0.0 (dev dep of b, deduped) │ └── bar@2.0.0 (production dep of b, deduped) ├─┬ bar@2.0.0 (production dep of query-selector-all-tests) │ └── moo@3.0.0 (production dep of bar) @@ -513,7 +514,7 @@ t.test('query-selector-all', async t => { ['*:has(* > #bar:semver(1.4.0))', ['foo@2.2.2']], ['*:has(> #bar:semver(1.4.0))', ['foo@2.2.2']], ['.workspace:has(> * > #lorem)', ['a@1.0.0']], - ['.workspace:has(* #lorem, ~ #b)', ['a@1.0.0']], + ['.workspace:has(* #lorem, ~ #b)', ['a@1.0.0', 'b@1.0.0']], // is pseudo [':is(#a, #b) > *', ['a@1.0.0', 'bar@2.0.0', 'baz@1.0.0']], @@ -960,5 +961,6 @@ t.test('query-selector-all', async t => { [':root #bar:semver(1) ~ *', ['dash-separated-pkg@1.0.0']], ['#bar:semver(2), #foo', ['bar@2.0.0', 'foo@2.2.2']], ['#a, #bar:semver(2), #foo:semver(2.2.2)', ['a@1.0.0', 'bar@2.0.0', 'foo@2.2.2']], + ['#b *', ['a@1.0.0', 'bar@2.0.0', 'baz@1.0.0', 'lorem@1.0.0', 'moo@3.0.0']], ]) })