Skip to content

Commit ae2d982

Browse files
ljharblukekarrys
andauthored
fix(arborist): node.target can be null when it is a file dep or symlink (#7027)
Co-authored-by: Luke Karrys <[email protected]>
1 parent 5a2e334 commit ae2d982

File tree

13 files changed

+2231
-2
lines changed

13 files changed

+2231
-2
lines changed

workspaces/arborist/lib/arborist/load-actual.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ module.exports = cls => class ActualLoader extends cls {
333333

334334
async #loadFSTree (node) {
335335
const did = this.#actualTreeLoaded
336-
if (!did.has(node.target.realpath)) {
336+
if (!node.isLink && !did.has(node.target.realpath)) {
337337
did.add(node.target.realpath)
338338
await this.#loadFSChildren(node.target)
339339
return Promise.all(

workspaces/arborist/lib/tree-check.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ const checkTree = (tree, checkUnreachable = true) => {
9090
})
9191
}
9292

93-
if (node.path === tree.root.path && node !== tree.root) {
93+
if (node.path === tree.root.path && node !== tree.root && !tree.root.isLink) {
9494
throw Object.assign(new Error('node with same path as root'), {
9595
node: node.path,
9696
tree: tree.path,

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

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,6 +2007,140 @@ ArboristNode {
20072007
}
20082008
`
20092009

2010+
exports[`test/arborist/reify.js TAP bundled file dep with same name as other dep > must match snapshot 1`] = `
2011+
ArboristNode {
2012+
"children": Map {
2013+
"@fixtures/has-package-exports" => ArboristLink {
2014+
"bundleDependencies": Array [
2015+
"abbrev",
2016+
],
2017+
"edgesIn": Set {
2018+
EdgeIn {
2019+
"from": "",
2020+
"name": "@fixtures/has-package-exports",
2021+
"spec": "file:fixtures-has-package-exports",
2022+
"type": "prod",
2023+
},
2024+
},
2025+
"location": "node_modules/@fixtures/has-package-exports",
2026+
"name": "@fixtures/has-package-exports",
2027+
"path": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/node_modules/@fixtures/has-package-exports",
2028+
"realpath": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/fixtures-has-package-exports",
2029+
"resolved": "file:../../fixtures-has-package-exports",
2030+
"target": ArboristNode {
2031+
"location": "fixtures-has-package-exports",
2032+
},
2033+
},
2034+
"@ljharb/has-package-exports-patterns" => ArboristNode {
2035+
"edgesIn": Set {
2036+
EdgeIn {
2037+
"from": "node_modules/has-package-exports",
2038+
"name": "@ljharb/has-package-exports-patterns",
2039+
"spec": "^0.0.2",
2040+
"type": "prod",
2041+
},
2042+
},
2043+
"location": "node_modules/@ljharb/has-package-exports-patterns",
2044+
"name": "@ljharb/has-package-exports-patterns",
2045+
"path": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/node_modules/@ljharb/has-package-exports-patterns",
2046+
"resolved": "https://registry.npmjs.org/@ljharb/has-package-exports-patterns/-/has-package-exports-patterns-0.0.2.tgz",
2047+
"version": "0.0.2",
2048+
},
2049+
"has-package-exports" => ArboristNode {
2050+
"edgesIn": Set {
2051+
EdgeIn {
2052+
"from": "",
2053+
"name": "has-package-exports",
2054+
"spec": "^1.3.0",
2055+
"type": "prod",
2056+
},
2057+
},
2058+
"edgesOut": Map {
2059+
"@ljharb/has-package-exports-patterns" => EdgeOut {
2060+
"name": "@ljharb/has-package-exports-patterns",
2061+
"spec": "^0.0.2",
2062+
"to": "node_modules/@ljharb/has-package-exports-patterns",
2063+
"type": "prod",
2064+
},
2065+
},
2066+
"location": "node_modules/has-package-exports",
2067+
"name": "has-package-exports",
2068+
"path": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/node_modules/has-package-exports",
2069+
"resolved": "https://registry.npmjs.org/has-package-exports/-/has-package-exports-1.3.0.tgz",
2070+
"version": "1.3.0",
2071+
},
2072+
},
2073+
"edgesOut": Map {
2074+
"@fixtures/has-package-exports" => EdgeOut {
2075+
"name": "@fixtures/has-package-exports",
2076+
"spec": "file:fixtures-has-package-exports",
2077+
"to": "node_modules/@fixtures/has-package-exports",
2078+
"type": "prod",
2079+
},
2080+
"has-package-exports" => EdgeOut {
2081+
"name": "has-package-exports",
2082+
"spec": "^1.3.0",
2083+
"to": "node_modules/has-package-exports",
2084+
"type": "prod",
2085+
},
2086+
},
2087+
"fsChildren": Set {
2088+
ArboristNode {
2089+
"bundleDependencies": Array [
2090+
"abbrev",
2091+
],
2092+
"children": Map {
2093+
"has-package-exports" => ArboristLink {
2094+
"bundleDependencies": Array [
2095+
"abbrev",
2096+
],
2097+
"dev": true,
2098+
"edgesIn": Set {
2099+
EdgeIn {
2100+
"from": "fixtures-has-package-exports",
2101+
"name": "has-package-exports",
2102+
"spec": "file:.",
2103+
"type": "dev",
2104+
},
2105+
},
2106+
"location": "fixtures-has-package-exports/node_modules/has-package-exports",
2107+
"name": "has-package-exports",
2108+
"path": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/fixtures-has-package-exports/node_modules/has-package-exports",
2109+
"realpath": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/fixtures-has-package-exports",
2110+
"resolved": "file:..",
2111+
"target": ArboristNode {
2112+
"location": "fixtures-has-package-exports",
2113+
},
2114+
},
2115+
},
2116+
"dev": true,
2117+
"edgesOut": Map {
2118+
"abbrev" => EdgeOut {
2119+
"error": "MISSING",
2120+
"name": "abbrev",
2121+
"spec": "1.1.1",
2122+
"to": null,
2123+
"type": "prod",
2124+
},
2125+
"has-package-exports" => EdgeOut {
2126+
"name": "has-package-exports",
2127+
"spec": "file:.",
2128+
"to": "fixtures-has-package-exports/node_modules/has-package-exports",
2129+
"type": "dev",
2130+
},
2131+
},
2132+
"location": "fixtures-has-package-exports",
2133+
"name": "@fixtures/has-package-exports",
2134+
"path": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep/fixtures-has-package-exports",
2135+
},
2136+
},
2137+
"isProjectRoot": true,
2138+
"location": "",
2139+
"name": "tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep",
2140+
"path": "{CWD}/test/arborist/tap-testdir-reify-bundled-file-dep-with-same-name-as-other-dep",
2141+
}
2142+
`
2143+
20102144
exports[`test/arborist/reify.js TAP collide case-variant dep names > tree 1 1`] = `
20112145
ArboristNode {
20122146
"children": Map {

workspaces/arborist/test/arborist/reify.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ const newArb = (opt) => new Arborist({
160160

161161
const reify = (path, opt) => newArb({ path, ...(opt || {}) }).reify(opt)
162162

163+
t.test('bundled file dep with same name as other dep', async t => {
164+
const tree = await printReified(fixture(t, 'conflict-bundle-file-dep'))
165+
t.matchSnapshot(tree)
166+
})
167+
163168
t.test('tarball deps with transitive tarball deps', t =>
164169
t.resolveMatchSnapshot(printReified(fixture(t, 'tarball-dependencies'))))
165170

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"bundleDependencies": true,
3+
"dependencies": {
4+
"abbrev": "1.1.1"
5+
},
6+
"devDependencies": {
7+
"has-package-exports": "file:."
8+
}
9+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dependencies": {
3+
"@fixtures/has-package-exports": "file:fixtures-has-package-exports",
4+
"has-package-exports": "^1.3.0"
5+
}
6+
}

0 commit comments

Comments
 (0)