diff options
Diffstat (limited to 'deps/npm/lib/install/is-extraneous.js')
-rw-r--r-- | deps/npm/lib/install/is-extraneous.js | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/deps/npm/lib/install/is-extraneous.js b/deps/npm/lib/install/is-extraneous.js index cd4d954668..f0d599965f 100644 --- a/deps/npm/lib/install/is-extraneous.js +++ b/deps/npm/lib/install/is-extraneous.js @@ -1,14 +1,37 @@ 'use strict' -var path = require('path') -var isDev = require('./is-dev.js').isDev -var npm = require('../npm.js') - -module.exports = function (tree) { - var pkg = tree.package - var requiredBy = pkg._requiredBy.filter(function (req) { return req[0] !== '#' }) - var isTopLevel = tree.parent == null - var isChildOfTop = !isTopLevel && tree.parent.parent == null - var isTopGlobal = isChildOfTop && tree.parent.path === path.resolve(npm.globalDir, '..') - var topHasNoPackageJson = isChildOfTop && tree.parent.error - return !isTopLevel && (!isChildOfTop || !topHasNoPackageJson) && !isTopGlobal && requiredBy.length === 0 && !isDev(tree) +module.exports = isExtraneous + +function isExtraneous (tree) { + var result = !isNotExtraneous(tree) + return result +} + +function isNotRequired (tree) { + return tree.requiredBy && tree.requiredBy.length === 0 +} + +function parentHasNoPjson (tree) { + return tree.parent && tree.parent.isTop && tree.parent.error +} + +function topHasNoPjson (tree) { + var top = tree + while (!top.isTop) top = top.parent + return top.error +} + +function isNotExtraneous (tree, isCycle) { + if (!isCycle) isCycle = {} + if (tree.isTop || tree.userRequired) { + return true + } else if (isNotRequired(tree) && parentHasNoPjson(tree)) { + return true + } else if (isCycle[tree.path]) { + return topHasNoPjson(tree) + } else { + isCycle[tree.path] = true + return tree.requiredBy && tree.requiredBy.some(function (node) { + return isNotExtraneous(node, Object.create(isCycle)) + }) + } } |