From 63ec6dda3c5391a4c7010c11065417a966b605db Mon Sep 17 00:00:00 2001 From: kumavis Date: Mon, 22 Feb 2021 15:32:14 +0800 Subject: [PATCH] Add edge.bundled flag, include in explain() output PR-URL: https://github.com/npm/arborist/pull/241 Credit: @kumavis Close: #241 Reviewed-by: @isaacs --- lib/edge.js | 10 +++++++- test/edge.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/lib/edge.js b/lib/edge.js index c5f00faff..79510d509 100644 --- a/lib/edge.js +++ b/lib/edge.js @@ -87,16 +87,24 @@ class Edge { // return the edge data, and an explanation of how that edge came to be here [_explain] (seen) { - const { error, from } = this + const { error, from, bundled } = this return { type: this.type, name: this.name, spec: this.spec, + ...(bundled ? { bundled } : {}), ...(error ? { error } : {}), ...(from ? { from: from.explain(null, seen) } : {}), } } + get bundled () { + if (!this.from) + return false + const { package: { bundleDependencies = [] } } = this.from + return bundleDependencies.includes(this.name) + } + get workspace () { return this[_type] === 'workspace' } diff --git a/test/edge.js b/test/edge.js index c90e203a1..a8a28d467 100644 --- a/test/edge.js +++ b/test/edge.js @@ -440,3 +440,67 @@ t.match( }, 'should return a minimal human-readable representation of the edge obj' ) + +const bundleChild = { + name: 'bundle-child', + edgesOut: new Map(), + edgesIn: new Set(), + explain: () => 'bundleChild explanation', + package: { name: 'bundle-child', version: '1.2.3' }, + get version () { + return this.package.version + }, + isTop: false, + parent: top, + resolve (n) { + return this.parent.resolve(n) + }, + addEdgeOut (edge) { + this.edgesOut.set(edge.name, edge) + }, + addEdgeIn (edge) { + this.edgesIn.add(edge) + }, +} + +const bundleParent = { + name: 'bundle-parent', + edgesOut: new Map(), + edgesIn: new Set(), + explain: () => 'bundleParent explanation', + package: { name: 'bundle-parent', version: '5.6.7', bundleDependencies: ['bundle-child'] }, + get version () { + return this.package.version + }, + isTop: false, + parent: top, + resolve (n) { + return n === 'bundle-child' ? bundleChild : undefined + }, + addEdgeOut (edge) { + this.edgesOut.set(edge.name, edge) + }, + addEdgeIn (edge) { + this.edgesIn.add(edge) + }, +} + +const bundledEdge = new Edge({ + from: bundleParent, + type: 'prod', + name: 'bundle-child', + spec: '1.2.3', +}) + +t.ok(bundledEdge.satisfiedBy(bundleChild), 'bundled dependency') +const fromBundleDependencies = bundledEdge.from && bundledEdge.from.package.bundleDependencies +t.deepEqual(fromBundleDependencies, ['bundle-child'], 'edge.from bundledDependencies as expected') +t.deepEqual(bundledEdge.name, 'bundle-child', 'edge name as expected') +t.equal(bundledEdge.bundled, true, 'bundled prop is true') +t.deepEqual(bundledEdge.explain(), { + type: 'prod', + name: 'bundle-child', + spec: '1.2.3', + bundled: true, + from: bundleParent.explain(), +}, 'bundled edge.explain as expected')