From 0e7511d144bdb6624e4c0fdfb31b4b42ed2954c9 Mon Sep 17 00:00:00 2001 From: Nathan Fritz Date: Tue, 15 Mar 2022 11:10:04 -0700 Subject: [PATCH] fix(arborist): _findMissingEdges missing dependency due to inconsistent path separators (#4261) Co-authored-by: Salvador Jacobi --- .../arborist/lib/arborist/load-actual.js | 2 +- .../arborist/test/arborist/load-actual.js | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/workspaces/arborist/lib/arborist/load-actual.js b/workspaces/arborist/lib/arborist/load-actual.js index c06ed80265e02..b04fc88f65ccb 100644 --- a/workspaces/arborist/lib/arborist/load-actual.js +++ b/workspaces/arborist/lib/arborist/load-actual.js @@ -435,7 +435,7 @@ module.exports = cls => class ActualLoader extends cls { if (d.dummy) { // it's a placeholder, so likely would not have loaded this dep, // unless another dep in the tree also needs it. - const depPath = `${p}/node_modules/${name}` + const depPath = normalize(`${p}/node_modules/${name}`) const cached = this[_cache].get(depPath) if (!cached || cached.dummy) { depPromises.push(this[_loadFSNode]({ diff --git a/workspaces/arborist/test/arborist/load-actual.js b/workspaces/arborist/test/arborist/load-actual.js index 464bdc77ba058..ae8c5f80f81ad 100644 --- a/workspaces/arborist/test/arborist/load-actual.js +++ b/workspaces/arborist/test/arborist/load-actual.js @@ -423,6 +423,51 @@ t.test('load global space with link deps', async t => { }) }) +t.test('no edge errors for nested deps', async t => { + const path = t.testdir({ + 'package.json': JSON.stringify({ + name: 'a', + version: '1.0.0', + dependencies: { + b: '1.0.0', + }, + }), + node_modules: { + b: { + 'package.json': JSON.stringify({ + name: 'b', + version: '1.0.0', + dependencies: { + c: '1.0.0', + }, + }), + }, + c: { + 'package.json': JSON.stringify({ + name: 'c', + version: '1.0.0', + }), + }, + }, + }) + + // disable treeCheck since it prevents the original issue from occuring + const ArboristNoTreeCheck = t.mock('../../lib/arborist', { + '../../lib/tree-check.js': tree => tree, + }) + const loadActualNoTreeCheck = (path, opts) => + new ArboristNoTreeCheck({ path, ...opts }).loadActual(opts) + + const tree = await loadActualNoTreeCheck(path) + + // assert that no outgoing edges have errors + for (const node of tree.inventory.values()) { + for (const [name, edge] of node.edgesOut.entries()) { + t.equal(edge.error, null, `node ${node.name} has outgoing edge to ${name} with error ${edge.error}`) + } + } +}) + t.test('loading a workspace maintains overrides', async t => { const path = t.testdir({ 'package.json': JSON.stringify({