Skip to content

Commit 0860159

Browse files
authored
fix: ensure workspace links query parents correctly (#6829)
1 parent 7c459d2 commit 0860159

2 files changed

Lines changed: 56 additions & 14 deletions

File tree

workspaces/arborist/lib/query-selector-all.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,11 @@ const depTypes = {
695695
// the compare nodes array
696696
const hasParent = (node, compareNodes) => {
697697
// All it takes is one so we loop and return on the first hit
698-
for (const compareNode of compareNodes) {
698+
for (let compareNode of compareNodes) {
699+
if (compareNode.isLink) {
700+
compareNode = compareNode.target
701+
}
702+
699703
// follows logical parent for link anscestors
700704
if (node.isTop && (node.resolveParent === compareNode)) {
701705
return true

workspaces/arborist/test/query-selector-all.js

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ t.test('query-selector-all', async t => {
2828
│ └── bar@2.0.0 (production dep of b, deduped)
2929
├─┬ bar@2.0.0 (production dep of query-selector-all-tests)
3030
│ └── moo@3.0.0 (production dep of bar)
31+
|-┬ c@1.0.0 -> ./c (workspace)
32+
│ └── b@1.0.0 (production dep of c, deduped)
3133
├─┬ foo@2.2.2 (dev dep of query-selector-all-tests)
3234
│ ├─┬ bar@1.4.0 (production dep of foo, deduped)
3335
│ │ └── dasher@2.0.0 (overridden peer dep of bar)
@@ -65,6 +67,9 @@ t.test('query-selector-all', async t => {
6567
'1.0.0': undefined,
6668
'1.0.1': yesterday,
6769
},
70+
c: {
71+
'1.0.0': today,
72+
},
6873
'dash-separated-pkg': {
6974
'1.0.0': dayBeforeYesterday,
7075
'2.0.0': yesterday,
@@ -173,6 +178,7 @@ t.test('query-selector-all', async t => {
173178
},
174179
}),
175180
},
181+
c: t.fixture('symlink', '../c'),
176182
foo: {
177183
node_modules: {
178184
bar: {
@@ -275,10 +281,19 @@ t.test('query-selector-all', async t => {
275281
bar: '^2.0.0',
276282
},
277283
}) },
284+
c: {
285+
'package.json': JSON.stringify({
286+
name: 'c',
287+
version: '1.0.0',
288+
dependencies: {
289+
b: '^1.0.0',
290+
},
291+
}),
292+
},
278293
'package.json': JSON.stringify({
279294
name: 'query-selector-all-tests',
280295
version: '1.0.0',
281-
workspaces: ['a', 'b'],
296+
workspaces: ['a', 'b', 'c'],
282297
dependencies: {
283298
a: '^1.0.0',
284299
abbrev: '^1.1.1',
@@ -387,6 +402,7 @@ t.test('query-selector-all', async t => {
387402
'query-selector-all-tests@1.0.0',
388403
'a@1.0.0',
389404
'b@1.0.0',
405+
'c@1.0.0',
390406
'@npmcli/abbrev@2.0.0-beta.45',
391407
'abbrev@1.1.1',
392408
'bar@2.0.0',
@@ -404,6 +420,7 @@ t.test('query-selector-all', async t => {
404420
['* > *', [
405421
'a@1.0.0',
406422
'b@1.0.0',
423+
'c@1.0.0',
407424
'abbrev@1.1.1',
408425
'bar@2.0.0',
409426
'baz@1.0.0',
@@ -425,18 +442,19 @@ t.test('query-selector-all', async t => {
425442
[':root > *', [
426443
'a@1.0.0',
427444
'b@1.0.0',
445+
'c@1.0.0',
428446
'abbrev@1.1.1',
429447
'bar@2.0.0',
430448
'foo@2.2.2',
431449
'ipsum@npm:sit@1.0.0',
432450
'moo@3.0.0',
433451
'recur@1.0.0',
434452
]],
435-
[':root > .workspace', ['a@1.0.0', 'b@1.0.0']],
436-
[':root > *.workspace', ['a@1.0.0', 'b@1.0.0']],
453+
[':root > .workspace', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
454+
[':root > *.workspace', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
437455
[':root > .workspace[name=a]', ['a@1.0.0']],
438456
[':root > [name=bar]', ['bar@2.0.0']],
439-
[':root > .workspace[version=1.0.0]', ['a@1.0.0', 'b@1.0.0']],
457+
[':root > .workspace[version=1.0.0]', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
440458
[':root > .workspace[name=a][version=1.0.0]', ['a@1.0.0']],
441459
[':root > :root', []],
442460
['* > :root', []],
@@ -452,6 +470,7 @@ t.test('query-selector-all', async t => {
452470
'a@1.0.0',
453471
'abbrev@1.1.1',
454472
'b@1.0.0',
473+
'c@1.0.0',
455474
'dash-separated-pkg@1.0.0',
456475
'dasher@2.0.0',
457476
'lorem@1.0.0',
@@ -461,12 +480,12 @@ t.test('query-selector-all', async t => {
461480
'a@1.0.0',
462481
'abbrev@1.1.1',
463482
'b@1.0.0',
483+
'c@1.0.0',
464484
'moo@3.0.0',
465485
]],
466486
[':extraneous', ['@npmcli/abbrev@2.0.0-beta.45']],
467487
[':invalid', ['lorem@1.0.0']],
468-
[':link', ['a@1.0.0', 'b@1.0.0']],
469-
[':link', ['a@1.0.0', 'b@1.0.0']],
488+
[':link', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
470489
[':deduped', [
471490
'bar@2.0.0',
472491
'moo@3.0.0',
@@ -481,6 +500,7 @@ t.test('query-selector-all', async t => {
481500
'query-selector-all-tests@1.0.0',
482501
'a@1.0.0',
483502
'b@1.0.0',
503+
'c@1.0.0',
484504
'@npmcli/abbrev@2.0.0-beta.45',
485505
'abbrev@1.1.1',
486506
'bar@2.0.0',
@@ -494,34 +514,36 @@ t.test('query-selector-all', async t => {
494514
'recur@1.0.0',
495515
'sive@1.0.0',
496516
]],
497-
[':root > .workspace:not(#b)', ['a@1.0.0']],
498-
[':root > .workspace > *:not(#bar)', ['a@1.0.0', 'baz@1.0.0']],
517+
[':root > .workspace:not(#b)', ['a@1.0.0', 'c@1.0.0']],
518+
[':root > .workspace > *:not(#bar)', ['a@1.0.0', 'b@1.0.0', 'baz@1.0.0']],
499519
['.bundled ~ :not(.workspace)', [
500520
'bar@2.0.0',
501521
'foo@2.2.2',
502522
'ipsum@npm:sit@1.0.0',
503523
'moo@3.0.0',
504524
'recur@1.0.0',
505525
]],
506-
['*:root > *:empty:not(*[name^=a], #b)', ['moo@3.0.0']],
526+
['*:root > *:empty:not(*[name^=a], #b, #c)', ['moo@3.0.0']],
507527
[':not(:not(:link))', [
508528
'a@1.0.0',
509529
'b@1.0.0',
530+
'c@1.0.0',
510531
]],
511532

512533
// has pseudo
513534
[':root > *:has(* > #bar:semver(1.4.0))', ['foo@2.2.2']],
514535
['*:has(* > #bar:semver(1.4.0))', ['foo@2.2.2']],
515536
['*:has(> #bar:semver(1.4.0))', ['foo@2.2.2']],
516537
['.workspace:has(> * > #lorem)', ['a@1.0.0']],
517-
['.workspace:has(* #lorem, ~ #b)', ['a@1.0.0', 'b@1.0.0']],
538+
['.workspace:has(* #lorem, ~ #b)', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
518539

519540
// is pseudo
520541
[':is(#a, #b) > *', ['a@1.0.0', 'bar@2.0.0', 'baz@1.0.0']],
521542
// TODO: ipsum is not empty but its child is missing so it doesn't return a
522543
// result here
523544
[':root > *:is(.prod:not(:empty), .dev > [name=bar]) > *', [
524545
'a@1.0.0',
546+
'b@1.0.0',
525547
'bar@2.0.0',
526548
'baz@1.0.0',
527549
'dasher@2.0.0',
@@ -538,6 +560,7 @@ t.test('query-selector-all', async t => {
538560
'query-selector-all-tests@1.0.0',
539561
'a@1.0.0',
540562
'b@1.0.0',
563+
'c@1.0.0',
541564
'@npmcli/abbrev@2.0.0-beta.45',
542565
'abbrev@1.1.1',
543566
'bar@2.0.0',
@@ -557,6 +580,7 @@ t.test('query-selector-all', async t => {
557580
[':type(range)', [
558581
'a@1.0.0',
559582
'abbrev@1.1.1',
583+
'b@1.0.0',
560584
'bar@2.0.0',
561585
'baz@1.0.0',
562586
'dash-separated-pkg@1.0.0',
@@ -584,11 +608,12 @@ t.test('query-selector-all', async t => {
584608
[':path(./node_modules/bar)', ['bar@2.0.0']],
585609
[':path(node_modules/foo/node_modules/bar)', ['bar@1.4.0']],
586610
[':path(**/bar)', ['bar@2.0.0', 'bar@1.4.0']],
587-
[':path(*)', ['a@1.0.0', 'b@1.0.0']],
611+
[':path(*)', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
588612
[':path()', [
589613
'query-selector-all-tests@1.0.0',
590614
'a@1.0.0',
591615
'b@1.0.0',
616+
'c@1.0.0',
592617
'@npmcli/abbrev@2.0.0-beta.45',
593618
'abbrev@1.1.1',
594619
'bar@2.0.0',
@@ -609,6 +634,7 @@ t.test('query-selector-all', async t => {
609634
'query-selector-all-tests@1.0.0',
610635
'a@1.0.0',
611636
'b@1.0.0',
637+
'c@1.0.0',
612638
'@npmcli/abbrev@2.0.0-beta.45',
613639
'abbrev@1.1.1',
614640
'bar@2.0.0',
@@ -627,6 +653,7 @@ t.test('query-selector-all', async t => {
627653
'query-selector-all-tests@1.0.0',
628654
'a@1.0.0',
629655
'b@1.0.0',
656+
'c@1.0.0',
630657
'abbrev@1.1.1',
631658
'bar@2.0.0',
632659
'baz@1.0.0',
@@ -690,6 +717,7 @@ t.test('query-selector-all', async t => {
690717
'query-selector-all-tests@1.0.0',
691718
'a@1.0.0',
692719
'b@1.0.0',
720+
'c@1.0.0',
693721
'baz@1.0.0',
694722
'dash-separated-pkg@1.0.0',
695723
'ipsum@npm:sit@1.0.0',
@@ -702,6 +730,7 @@ t.test('query-selector-all', async t => {
702730
'query-selector-all-tests@1.0.0',
703731
'a@1.0.0',
704732
'b@1.0.0',
733+
'c@1.0.0',
705734
'abbrev@1.1.1',
706735
'baz@1.0.0',
707736
'dash-separated-pkg@1.0.0',
@@ -720,6 +749,7 @@ t.test('query-selector-all', async t => {
720749
'query-selector-all-tests@1.0.0',
721750
'a@1.0.0',
722751
'b@1.0.0',
752+
'c@1.0.0',
723753
'baz@1.0.0',
724754
'dash-separated-pkg@1.0.0',
725755
'ipsum@npm:sit@1.0.0',
@@ -731,6 +761,7 @@ t.test('query-selector-all', async t => {
731761
'query-selector-all-tests@1.0.0',
732762
'a@1.0.0',
733763
'b@1.0.0',
764+
'c@1.0.0',
734765
'baz@1.0.0',
735766
'dash-separated-pkg@1.0.0',
736767
'ipsum@npm:sit@1.0.0',
@@ -832,6 +863,7 @@ t.test('query-selector-all', async t => {
832863
'query-selector-all-tests@1.0.0',
833864
'a@1.0.0',
834865
'b@1.0.0',
866+
'c@1.0.0',
835867
'@npmcli/abbrev@2.0.0-beta.45',
836868
'abbrev@1.1.1',
837869
'bar@2.0.0',
@@ -882,15 +914,18 @@ t.test('query-selector-all', async t => {
882914
'query-selector-all-tests@1.0.0',
883915
'a@1.0.0',
884916
'b@1.0.0',
917+
'c@1.0.0',
885918
'abbrev@1.1.1',
886919
'bar@2.0.0',
887920
'baz@1.0.0',
888921
'ipsum@npm:sit@1.0.0',
889922
'lorem@1.0.0',
890923
'moo@3.0.0',
891924
]],
892-
['.workspace', ['a@1.0.0', 'b@1.0.0']],
893-
['.workspace > *', ['a@1.0.0', 'bar@2.0.0', 'baz@1.0.0']],
925+
['.workspace', ['a@1.0.0', 'b@1.0.0', 'c@1.0.0']],
926+
['.workspace > *', ['a@1.0.0', 'b@1.0.0', 'bar@2.0.0', 'baz@1.0.0']],
927+
['.workspace .workspace', ['a@1.0.0', 'b@1.0.0']],
928+
['.workspace .workspace .workspace', ['a@1.0.0']],
894929
['.workspace ~ *', [
895930
'abbrev@1.1.1',
896931
'bar@2.0.0',
@@ -911,9 +946,11 @@ t.test('query-selector-all', async t => {
911946
'sive@1.0.0',
912947
]],
913948
['.dev *', [
949+
'baz@1.0.0',
914950
'dash-separated-pkg@1.0.0',
915951
'dasher@2.0.0',
916952
'bar@1.4.0',
953+
'lorem@1.0.0',
917954
'recur@1.0.0',
918955
'sive@1.0.0',
919956
]],
@@ -923,6 +960,7 @@ t.test('query-selector-all', async t => {
923960
['.bundled ~ *', [
924961
'a@1.0.0',
925962
'b@1.0.0',
963+
'c@1.0.0',
926964
'bar@2.0.0',
927965
'foo@2.2.2',
928966
'ipsum@npm:sit@1.0.0',

0 commit comments

Comments
 (0)