Skip to content

Commit a774fb7

Browse files
fix(arborist): respect --omit flag in linked install strategy (#9066)
1 parent d1996a7 commit a774fb7

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

workspaces/arborist/lib/arborist/isolated-reifier.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ module.exports = cls => class IsolatedReifier extends cls {
9090
**/
9191
async makeIdealGraph () {
9292
const idealTree = this.idealTree
93+
const omit = new Set(this.options.omit)
9394

9495
this.idealGraph = {
9596
external: [],
@@ -110,7 +111,9 @@ module.exports = cls => class IsolatedReifier extends cls {
110111
processed.add(next.location)
111112
next.edgesOut.forEach(edge => {
112113
if (edge.to && !(next.package.bundleDependencies || next.package.bundledDependencies || []).includes(edge.to.name)) {
113-
queue.push(edge.to)
114+
if (!edge.to.shouldOmit?.(omit)) {
115+
queue.push(edge.to)
116+
}
114117
}
115118
})
116119
// local `file:` deps are in fsChildren but are not workspaces.

workspaces/arborist/test/isolated-mode.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2055,6 +2055,48 @@ function parseGraphRecursive (key, deps) {
20552055
return { name, version, workspace, peer, dependencies }
20562056
}
20572057

2058+
tap.test('omit dev dependencies with linked strategy', async t => {
2059+
const graph = {
2060+
registry: [
2061+
{ name: 'which', version: '1.0.0', dependencies: { isexe: '^1.0.0' } },
2062+
{ name: 'isexe', version: '1.0.0' },
2063+
{ name: 'eslint', version: '1.0.0' },
2064+
],
2065+
root: {
2066+
name: 'myapp',
2067+
version: '1.0.0',
2068+
dependencies: { which: '1.0.0' },
2069+
devDependencies: { eslint: '1.0.0' },
2070+
},
2071+
workspaces: [
2072+
{
2073+
name: 'mylib',
2074+
version: '1.0.0',
2075+
dependencies: { isexe: '1.0.0' },
2076+
devDependencies: { eslint: '1.0.0' },
2077+
},
2078+
],
2079+
}
2080+
2081+
const { dir, registry } = await getRepo(graph)
2082+
const cache = fs.mkdtempSync(`${getTempDir()}/test-`)
2083+
const arborist = new Arborist({
2084+
path: dir,
2085+
registry,
2086+
packumentCache: new Map(),
2087+
cache,
2088+
omit: ['dev'],
2089+
})
2090+
await arborist.reify({ installStrategy: 'linked' })
2091+
2092+
const storeDir = path.join(dir, 'node_modules', '.store')
2093+
const storeEntries = fs.readdirSync(storeDir)
2094+
2095+
t.ok(storeEntries.some(e => e.startsWith('which@')), 'prod dep which is in store')
2096+
t.ok(storeEntries.some(e => e.startsWith('isexe@')), 'prod dep isexe is in store')
2097+
t.notOk(storeEntries.some(e => e.startsWith('eslint@')), 'dev dep eslint is not in store')
2098+
})
2099+
20582100
/*
20592101
* TO TEST:
20602102
* --------------------------------------

0 commit comments

Comments
 (0)