Skip to content
This repository was archived by the owner on Aug 11, 2022. It is now read-only.

Commit b3f98d8

Browse files
committed
install: Filter optional deps during diff-trees
This allows `--no-optional` runs to include optional dependencies in the lockfile while excluding them from installation on disk.
1 parent 471ee1c commit b3f98d8

2 files changed

Lines changed: 18 additions & 15 deletions

File tree

lib/install/deps.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -489,12 +489,6 @@ function loadDeps (tree, log, next) {
489489
if (!tree.package.dependencies) tree.package.dependencies = {}
490490
asyncMap(Object.keys(tree.package.dependencies), function (dep, done) {
491491
var version = tree.package.dependencies[dep]
492-
if (tree.package.optionalDependencies &&
493-
tree.package.optionalDependencies[dep] &&
494-
!npm.config.get('optional')) {
495-
return done()
496-
}
497-
498492
addDependency(dep, version, tree, log.newGroup('loadDep:' + dep), andHandleOptionalErrors(log, tree, dep, done))
499493
}, andForEachChild(loadDeps, andFinishTracker(log, next)))
500494
}

lib/install/diff-trees.js

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var log = require('npmlog')
88
var path = require('path')
99
var ssri = require('ssri')
1010
var moduleName = require('../utils/module-name.js')
11+
var isOnlyOptional = require('./is-only-optional.js')
1112

1213
// we don't use get-requested because we're operating on files on disk, and
1314
// we don't want to extropolate from what _should_ be there.
@@ -234,18 +235,26 @@ var diffTrees = module.exports._diffTrees = function (oldTree, newTree) {
234235
.map((flatname) => toRemove[flatname])
235236
.forEach((pkg) => setAction(differences, 'remove', pkg))
236237

238+
return filterActions(differences)
239+
}
240+
241+
function filterActions (differences) {
242+
const includeOpt = npm.config.get('optional')
237243
const includeDev = npm.config.get('dev') ||
238244
(!/^prod(uction)?$/.test(npm.config.get('only')) && !npm.config.get('production')) ||
239245
/^dev(elopment)?$/.test(npm.config.get('only')) ||
240246
/^dev(elopment)?$/.test(npm.config.get('also'))
241247
const includeProd = !/^dev(elopment)?$/.test(npm.config.get('only'))
242-
if (!includeProd || !includeDev) {
243-
log.silly('diff-trees', 'filtering actions:', 'includeDev', includeDev, 'includeProd', includeProd)
244-
differences = differences.filter((diff) => {
245-
const pkg = diff[1]
246-
const pkgIsOnlyDev = isOnlyDev(pkg)
247-
return (!includeProd && pkgIsOnlyDev) || (includeDev && pkgIsOnlyDev) || (includeProd && !pkgIsOnlyDev)
248-
})
249-
}
250-
return differences
248+
if (includeProd && includeDev && includeOpt) return differences
249+
250+
log.silly('diff-trees', 'filtering actions:', 'includeDev', includeDev, 'includeProd', includeProd, 'includeOpt', includeOpt)
251+
return differences.filter((diff) => {
252+
const pkg = diff[1]
253+
const pkgIsOnlyDev = isOnlyDev(pkg)
254+
const pkgIsOnlyOpt = isOnlyOptional(pkg)
255+
if (!includeProd && pkgIsOnlyDev) return true
256+
if (includeDev && pkgIsOnlyDev) return true
257+
if (includeProd && !pkgIsOnlyDev && (includeOpt || !pkgIsOnlyOpt)) return true
258+
return false
259+
})
251260
}

0 commit comments

Comments
 (0)