Skip to content

Commit 050284d

Browse files
authored
fix(arborist): pass the edge to fromPath in order to determine correct path (#5233)
by passing in the edge we can determine if the edge is overridden, and if it is the path we want to return is the project root since that's what user's will have define their overrides relative to
1 parent 47cc95d commit 050284d

File tree

7 files changed

+266
-32
lines changed

7 files changed

+266
-32
lines changed

workspaces/arborist/lib/arborist/build-ideal-tree.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1076,9 +1076,8 @@ This is a one-time fix-up, please be patient...
10761076
// if it fails at this point, though, dont' worry because it
10771077
// may well be an optional dep that has gone missing. it'll
10781078
// fail later anyway.
1079-
const from = fromPath(placed)
10801079
promises.push(...this[_problemEdges](placed).map(e =>
1081-
this[_fetchManifest](npa.resolve(e.name, e.spec, from))
1080+
this[_fetchManifest](npa.resolve(e.name, e.spec, fromPath(placed, e)))
10821081
.catch(er => null)))
10831082
},
10841083
})

workspaces/arborist/lib/dep-valid.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const depValid = (child, requested, requestor) => {
2020
// file: deps that depend on other files/dirs, we must resolve the
2121
// location based on the *requestor* file/dir, not where it ends up.
2222
// '' is equivalent to '*'
23-
requested = npa.resolve(child.name, requested || '*', fromPath(requestor))
23+
requested = npa.resolve(child.name, requested || '*', fromPath(requestor, requestor.edgesOut.get(child.name)))
2424
} catch (er) {
2525
// Not invalid because the child doesn't match, but because
2626
// the spec itself is not supported. Nothing would match,

workspaces/arborist/lib/from-path.js

+15-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,19 @@
66
const { dirname } = require('path')
77
const npa = require('npm-package-arg')
88

9-
const fromPath = (node, spec) =>
10-
spec && spec.type === 'file' ? dirname(spec.fetchSpec)
11-
: node.realpath
9+
const fromPath = (node, spec, edge) => {
10+
if (edge && edge.overrides && edge.overrides.name === edge.name && edge.overrides.value) {
11+
// fromPath could be called with a node that has a virtual root, if that happens
12+
// we want to make sure we get the real root node when overrides are in use. this
13+
// is to allow things like overriding a dependency with a tarball file that's a
14+
// relative path from the project root
15+
return node.sourceReference
16+
? node.sourceReference.root.realpath
17+
: node.root.realpath
18+
}
1219

13-
module.exports = node => fromPath(node, node.resolved && npa(node.resolved))
20+
return spec && spec.type === 'file' ? dirname(spec.fetchSpec)
21+
: node.realpath
22+
}
23+
24+
module.exports = (node, edge) => fromPath(node, node.resolved && npa(node.resolved), edge)

workspaces/arborist/tap-snapshots/test/edge.js.test.cjs

+189
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,27 @@ Edge {
8888
"version": "1.2.3",
8989
},
9090
"resolve": Function resolve(n),
91+
"root": Object {
92+
"addEdgeIn": Function addEdgeIn(edge),
93+
"addEdgeOut": Function addEdgeOut(edge),
94+
"edgesIn": Set {},
95+
"edgesOut": Map {
96+
"missing" => Edge {
97+
"peerConflicted": false,
98+
},
99+
},
100+
"explain": Function explain(),
101+
"isTop": true,
102+
"name": "top",
103+
"package": Object {
104+
"name": "top",
105+
"version": "1.2.3",
106+
},
107+
"packageName": "top",
108+
"parent": null,
109+
"resolve": Function resolve(n),
110+
"version": "1.2.3",
111+
},
91112
"version": "1.2.3",
92113
},
93114
"invalid": false,
@@ -188,6 +209,27 @@ Edge {
188209
"version": "1.2.3",
189210
},
190211
"resolve": Function resolve(n),
212+
"root": Object {
213+
"addEdgeIn": Function addEdgeIn(edge),
214+
"addEdgeOut": Function addEdgeOut(edge),
215+
"edgesIn": Set {},
216+
"edgesOut": Map {
217+
"missing" => Edge {
218+
"peerConflicted": false,
219+
},
220+
},
221+
"explain": Function explain(),
222+
"isTop": true,
223+
"name": "top",
224+
"package": Object {
225+
"name": "top",
226+
"version": "1.2.3",
227+
},
228+
"packageName": "top",
229+
"parent": null,
230+
"resolve": Function resolve(n),
231+
"version": "1.2.3",
232+
},
191233
"version": "1.2.3",
192234
},
193235
"invalid": true,
@@ -345,6 +387,27 @@ Edge {
345387
"version": "1.2.3",
346388
},
347389
"resolve": Function resolve(n),
390+
"root": Object {
391+
"addEdgeIn": Function addEdgeIn(edge),
392+
"addEdgeOut": Function addEdgeOut(edge),
393+
"edgesIn": Set {},
394+
"edgesOut": Map {
395+
"missing" => Edge {
396+
"peerConflicted": false,
397+
},
398+
},
399+
"explain": Function explain(),
400+
"isTop": true,
401+
"name": "top",
402+
"package": Object {
403+
"name": "top",
404+
"version": "1.2.3",
405+
},
406+
"packageName": "top",
407+
"parent": null,
408+
"resolve": Function resolve(n),
409+
"version": "1.2.3",
410+
},
348411
"version": "1.2.3",
349412
},
350413
"resolve": Function resolve(n),
@@ -414,6 +477,27 @@ Edge {
414477
"version": "1.2.3",
415478
},
416479
"resolve": Function resolve(n),
480+
"root": Object {
481+
"addEdgeIn": Function addEdgeIn(edge),
482+
"addEdgeOut": Function addEdgeOut(edge),
483+
"edgesIn": Set {},
484+
"edgesOut": Map {
485+
"missing" => Edge {
486+
"peerConflicted": false,
487+
},
488+
},
489+
"explain": Function explain(),
490+
"isTop": true,
491+
"name": "top",
492+
"package": Object {
493+
"name": "top",
494+
"version": "1.2.3",
495+
},
496+
"packageName": "top",
497+
"parent": null,
498+
"resolve": Function resolve(n),
499+
"version": "1.2.3",
500+
},
417501
"version": "1.2.3",
418502
},
419503
"resolve": Function resolve(n),
@@ -614,6 +698,27 @@ Edge {
614698
"version": "1.2.3",
615699
},
616700
"resolve": Function resolve(n),
701+
"root": Object {
702+
"addEdgeIn": Function addEdgeIn(edge),
703+
"addEdgeOut": Function addEdgeOut(edge),
704+
"edgesIn": Set {},
705+
"edgesOut": Map {
706+
"missing" => Edge {
707+
"peerConflicted": false,
708+
},
709+
},
710+
"explain": Function explain(),
711+
"isTop": true,
712+
"name": "top",
713+
"package": Object {
714+
"name": "top",
715+
"version": "1.2.3",
716+
},
717+
"packageName": "top",
718+
"parent": null,
719+
"resolve": Function resolve(n),
720+
"version": "1.2.3",
721+
},
617722
"version": "1.2.3",
618723
},
619724
"resolve": Function resolve(n),
@@ -697,6 +802,27 @@ Edge {
697802
"version": "1.2.3",
698803
},
699804
"resolve": Function resolve(n),
805+
"root": Object {
806+
"addEdgeIn": Function addEdgeIn(edge),
807+
"addEdgeOut": Function addEdgeOut(edge),
808+
"edgesIn": Set {},
809+
"edgesOut": Map {
810+
"a" => Edge {
811+
"peerConflicted": false,
812+
},
813+
},
814+
"explain": Function explain(),
815+
"isTop": true,
816+
"name": "top",
817+
"package": Object {
818+
"name": "top",
819+
"version": "1.2.3",
820+
},
821+
"packageName": "top",
822+
"parent": null,
823+
"resolve": Function resolve(n),
824+
"version": "1.2.3",
825+
},
700826
"version": "1.2.3",
701827
},
702828
"type": "peer",
@@ -748,6 +874,27 @@ Edge {
748874
"version": "1.2.3",
749875
},
750876
"resolve": Function resolve(n),
877+
"root": Object {
878+
"addEdgeIn": Function addEdgeIn(edge),
879+
"addEdgeOut": Function addEdgeOut(edge),
880+
"edgesIn": Set {},
881+
"edgesOut": Map {
882+
"missing" => Edge {
883+
"peerConflicted": false,
884+
},
885+
},
886+
"explain": Function explain(),
887+
"isTop": true,
888+
"name": "top",
889+
"package": Object {
890+
"name": "top",
891+
"version": "1.2.3",
892+
},
893+
"packageName": "top",
894+
"parent": null,
895+
"resolve": Function resolve(n),
896+
"version": "1.2.3",
897+
},
751898
"version": "1.2.3",
752899
},
753900
"invalid": false,
@@ -814,6 +961,27 @@ Edge {
814961
"version": "1.2.3",
815962
},
816963
"resolve": Function resolve(n),
964+
"root": Object {
965+
"addEdgeIn": Function addEdgeIn(edge),
966+
"addEdgeOut": Function addEdgeOut(edge),
967+
"edgesIn": Set {},
968+
"edgesOut": Map {
969+
"missing" => Edge {
970+
"peerConflicted": false,
971+
},
972+
},
973+
"explain": Function explain(),
974+
"isTop": true,
975+
"name": "top",
976+
"package": Object {
977+
"name": "top",
978+
"version": "1.2.3",
979+
},
980+
"packageName": "top",
981+
"parent": null,
982+
"resolve": Function resolve(n),
983+
"version": "1.2.3",
984+
},
817985
"version": "1.2.3",
818986
},
819987
"resolve": Function resolve(n),
@@ -868,6 +1036,27 @@ Edge {
8681036
"version": "1.2.3",
8691037
},
8701038
"resolve": Function resolve(n),
1039+
"root": Object {
1040+
"addEdgeIn": Function addEdgeIn(edge),
1041+
"addEdgeOut": Function addEdgeOut(edge),
1042+
"edgesIn": Set {},
1043+
"edgesOut": Map {
1044+
"missing" => Edge {
1045+
"peerConflicted": false,
1046+
},
1047+
},
1048+
"explain": Function explain(),
1049+
"isTop": true,
1050+
"name": "top",
1051+
"package": Object {
1052+
"name": "top",
1053+
"version": "1.2.3",
1054+
},
1055+
"packageName": "top",
1056+
"parent": null,
1057+
"resolve": Function resolve(n),
1058+
"version": "1.2.3",
1059+
},
8711060
"version": "1.2.3",
8721061
},
8731062
"invalid": false,

0 commit comments

Comments
 (0)