23 lines
674 B
JavaScript
23 lines
674 B
JavaScript
|
'use strict'
|
||
|
module.exports = isOptional
|
||
|
|
||
|
const isOptDep = require('./is-opt-dep.js')
|
||
|
const moduleName = require('../utils/module-name.js')
|
||
|
|
||
|
function isOptional (node, seen) {
|
||
|
if (!seen) seen = new Set()
|
||
|
// If a node is not required by anything, then we've reached
|
||
|
// the top level package.
|
||
|
if (seen.has(node) || node.requiredBy.length === 0) {
|
||
|
return false
|
||
|
}
|
||
|
seen.add(node)
|
||
|
const swOptional = node.fromShrinkwrap && node.package._optional
|
||
|
const result = node.requiredBy.every(function (req) {
|
||
|
if (req.fakeChild && swOptional) return true
|
||
|
return isOptDep(req, moduleName(node)) || isOptional(req, seen)
|
||
|
})
|
||
|
seen.delete(node)
|
||
|
return result
|
||
|
}
|