@@ -8,6 +8,7 @@ var log = require('npmlog')
88var path = require ( 'path' )
99var ssri = require ( 'ssri' )
1010var 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 ( ! / ^ p r o d ( u c t i o n ) ? $ / . test ( npm . config . get ( 'only' ) ) && ! npm . config . get ( 'production' ) ) ||
239245 / ^ d e v ( e l o p m e n t ) ? $ / . test ( npm . config . get ( 'only' ) ) ||
240246 / ^ d e v ( e l o p m e n t ) ? $ / . test ( npm . config . get ( 'also' ) )
241247 const includeProd = ! / ^ d e v ( e l o p m e n t ) ? $ / . 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