Skip to content

Commit

Permalink
fix(arborist): dependencies from registries with a peerDependency on …
Browse files Browse the repository at this point in the history
…a workspace (#6193)

* fix(arborist): support dependencies from registries with a peer dependency on a workspace
  • Loading branch information
ixalon authored Mar 2, 2023
1 parent 84fbaf2 commit 962a12e
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 1 deletion.
2 changes: 1 addition & 1 deletion workspaces/arborist/lib/arborist/build-ideal-tree.js
Original file line number Diff line number Diff line change
Expand Up @@ -1243,7 +1243,7 @@ This is a one-time fix-up, please be patient...
if (isWorkspace) {
const existingNode = this.idealTree.edgesOut.get(spec.name).to
if (existingNode && existingNode.isWorkspace && existingNode.satisfies(edge)) {
return edge.to
return existingNode
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159849,6 +159849,94 @@ ArboristNode {
}
`

exports[`test/arborist/build-ideal-tree.js TAP workspaces should allow cyclic peer dependencies between workspaces and packages from a repository > must match snapshot 1`] = `
ArboristNode {
"children": Map {
"foo" => ArboristNode {
"edgesIn": Set {
EdgeIn {
"from": "workspace-a",
"name": "foo",
"spec": ">=1.0.0",
"type": "prod",
},
},
"edgesOut": Map {
"workspace-a" => EdgeOut {
"name": "workspace-a",
"spec": "1.0.0",
"to": "node_modules/workspace-a",
"type": "peer",
},
},
"location": "node_modules/foo",
"name": "foo",
"path": "{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository/node_modules/foo",
"version": "1.0.0",
},
"workspace-a" => ArboristLink {
"edgesIn": Set {
EdgeIn {
"from": "",
"name": "workspace-a",
"spec": "file:{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository/workspace-a",
"type": "workspace",
},
EdgeIn {
"from": "node_modules/foo",
"name": "workspace-a",
"spec": "1.0.0",
"type": "peer",
},
},
"isWorkspace": true,
"location": "node_modules/workspace-a",
"name": "workspace-a",
"path": "{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository/node_modules/workspace-a",
"realpath": "{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository/workspace-a",
"resolved": "file:../workspace-a",
"target": ArboristNode {
"location": "workspace-a",
},
"version": "1.0.0",
},
},
"edgesOut": Map {
"workspace-a" => EdgeOut {
"name": "workspace-a",
"spec": "file:{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository/workspace-a",
"to": "node_modules/workspace-a",
"type": "workspace",
},
},
"fsChildren": Set {
ArboristNode {
"edgesOut": Map {
"foo" => EdgeOut {
"name": "foo",
"spec": ">=1.0.0",
"to": "node_modules/foo",
"type": "prod",
},
},
"isWorkspace": true,
"location": "workspace-a",
"name": "workspace-a",
"path": "{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository/workspace-a",
"version": "1.0.0",
},
},
"isProjectRoot": true,
"location": "",
"name": "tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository",
"packageName": "root",
"path": "{CWD}/test/arborist/tap-testdir-build-ideal-tree-workspaces-should-allow-cyclic-peer-dependencies-between-workspaces-and-packages-from-a-repository",
"workspaces": Map {
"workspace-a" => "workspace-a",
},
}
`

exports[`test/arborist/build-ideal-tree.js TAP workspaces should ignore nested node_modules folders > expect resolving Promise 1`] = `
ArboristNode {
"children": Map {
Expand Down
46 changes: 46 additions & 0 deletions workspaces/arborist/test/arborist/build-ideal-tree.js
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,52 @@ t.test('workspaces', t => {
t.matchSnapshot(printTree(await tree))
})

t.test('should allow cyclic peer dependencies between workspaces and packages from a repository', async t => {
generateNocks(t, {
foo: {
versions: ['1.0.0'],
peerDependencies: ['workspace-a'],
},
})
const path = t.testdir({
'package.json': JSON.stringify({
name: 'root',
dependencies: {
'workspace-a': '*',
},
workspaces: ['workspace-a'],
}),
'workspace-a': {
'package.json': JSON.stringify({
name: 'workspace-a',
version: '1.0.0',
dependencies: {
foo: '>=1.0.0',
},
}),
},
})

const arb = new Arborist({
...OPT,
path,
workspaces: ['workspace-a'],
})

const tree = arb.buildIdealTree({
path,
add: [
'foo',
],
})

// just assert that the buildIdealTree call resolves, if there's a
// problem here it will reject because of nock disabling requests
await t.resolves(tree)

t.matchSnapshot(printTree(await tree))
})

t.test('workspace nodes are used instead of fetching manifests when they are valid', async t => {
// turn off networking, this should never make a registry request
nock.disableNetConnect()
Expand Down

0 comments on commit 962a12e

Please sign in to comment.