summaryrefslogtreecommitdiff
path: root/deps/npm/lib/install/is-extraneous.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/install/is-extraneous.js')
-rw-r--r--deps/npm/lib/install/is-extraneous.js47
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))
+ })
+ }
}