diff options
author | nlf <quitlahok@gmail.com> | 2022-08-01 21:11:55 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-01 21:11:55 +0300 |
commit | 47cc95d9ffb37fc8ff62a1d5554eab16d303aa43 (patch) | |
tree | e223c5a34162e567d930d3989dd888b58bdaec37 /workspaces/arborist/test | |
parent | a6153cfd2b0764e69d103b33af6b42978b0403f4 (diff) |
fix(arborist): use the sourceReference root rather than the node root for overrides (#5227)
when we examine override references, if we look at only `this.from.root.package` the root could actually be a virtual one. in order to ensure we resolve references from the real root, we instead need to look at `this.from.sourceReference.root.package` to get the correct value.
closes #4395
Diffstat (limited to 'workspaces/arborist/test')
-rw-r--r-- | workspaces/arborist/test/edge.js | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/workspaces/arborist/test/edge.js b/workspaces/arborist/test/edge.js index 8bd12bbc1..9d1352351 100644 --- a/workspaces/arborist/test/edge.js +++ b/workspaces/arborist/test/edge.js @@ -809,6 +809,147 @@ t.same(bundledEdge.explain(), { from: bundleParent.explain(), }, 'bundled edge.explain as expected') +t.test('override references find the correct root', (t) => { + const overrides = new OverrideSet({ + overrides: { + foo: '$foo', + }, + }) + + const root = { + name: 'root', + packageName: 'root', + edgesOut: new Map(), + edgesIn: new Set(), + explain: () => 'root node explanation', + package: { + name: 'root', + version: '1.2.3', + dependencies: { + foo: '^1.0.0', + }, + overrides: { + foo: '$foo', + }, + }, + get version () { + return this.package.version + }, + isTop: true, + parent: null, + overrides, + resolve (n) { + return n === 'foo' ? foo : null + }, + addEdgeOut (edge) { + this.edgesOut.set(edge.name, edge) + }, + addEdgeIn (edge) { + this.edgesIn.add(edge) + }, + } + + const foo = { + name: 'foo', + packageName: 'foo', + edgesOut: new Map(), + edgesIn: new Set(), + explain: () => 'foo node explanation', + package: { + name: 'foo', + version: '1.2.3', + dependencies: {}, + }, + get version () { + return this.package.version + }, + parent: root, + root: root, + resolve (n) { + return n === 'bar' ? bar : this.parent.resolve(n) + }, + addEdgeOut (edge) { + this.edgesOut.set(edge.name, edge) + }, + addEdgeIn (edge) { + this.edgesIn.add(edge) + }, + } + foo.overrides = overrides.getNodeRule(foo) + + const bar = { + name: 'bar', + packageName: 'bar', + edgesOut: new Map(), + edgesIn: new Set(), + explain: () => 'bar node explanation', + package: { + name: 'bar', + version: '1.2.3', + dependencies: { + foo: '^2.0.0', + }, + }, + get version () { + return this.package.version + }, + parent: foo, + root: root, + resolve (n) { + return this.parent.resolve(n) + }, + addEdgeOut (edge) { + this.edgesOut.set(edge.name, edge) + }, + addEdgeIn (edge) { + this.edgesIn.add(edge) + }, + } + bar.overrides = foo.overrides.getNodeRule(bar) + + const virtualBar = { + name: 'bar', + packageName: 'bar', + edgesOut: new Map(), + edgesIn: new Set(), + explain: () => 'bar node explanation', + package: { + name: 'bar', + version: '1.2.3', + dependencies: { + foo: '^2.0.0', + }, + }, + parent: null, + root: null, + sourceReference: bar, + get version () { + return this.package.version + }, + resolve (n) { + return bar.resolve(n) + }, + addEdgeOut (edge) { + this.edgesOut.set(edge.name, edge) + }, + addEdgeIn (edge) { + this.edgesIn.add(edge) + }, + } + virtualBar.overrides = overrides + + const edge = new Edge({ + from: virtualBar, + type: 'prod', + spec: '^2.0.0', + name: 'foo', + overrides: overrides.getEdgeRule({ name: 'foo', spec: '^2.0.0' }), + }) + + t.ok(edge.valid, 'edge is valid') + t.end() +}) + t.test('shrinkwrapped and bundled deps are not overridden and remain valid', (t) => { const overrides = new OverrideSet({ overrides: { |