diff options
Diffstat (limited to 'deps/npm/lib/install/copy-tree.js')
-rw-r--r-- | deps/npm/lib/install/copy-tree.js | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/deps/npm/lib/install/copy-tree.js b/deps/npm/lib/install/copy-tree.js index 67a9c687a2..a5b558cf59 100644 --- a/deps/npm/lib/install/copy-tree.js +++ b/deps/npm/lib/install/copy-tree.js @@ -1,25 +1,31 @@ 'use strict' - -module.exports = function (tree) { - return copyTree(tree, {}) +var createNode = require('./node.js').create +module.exports = function (tree, filter) { + return copyTree(tree, {}, filter) } -function copyTree (tree, cache) { - if (cache[tree.path]) return cache[tree.path] - var newTree = cache[tree.path] = Object.create(tree) - copyModuleList(newTree, 'children', cache) +function copyTree (tree, cache, filter) { + if (filter && !filter(tree)) { return null } + if (cache[tree.path]) { return cache[tree.path] } + var newTree = cache[tree.path] = createNode(Object.assign({}, tree)) + copyModuleList(newTree, 'children', cache, filter) newTree.children.forEach(function (child) { child.parent = newTree }) - copyModuleList(newTree, 'requires', cache) - copyModuleList(newTree, 'requiredBy', cache) + copyModuleList(newTree, 'requires', cache, filter) + copyModuleList(newTree, 'requiredBy', cache, filter) return newTree } -function copyModuleList (tree, key, cache) { +function copyModuleList (tree, key, cache, filter) { var newList = [] - tree[key].forEach(function (child) { - newList.push(copyTree(child, cache)) - }) + if (tree[key]) { + tree[key].forEach(function (child) { + const copy = copyTree(child, cache, filter) + if (copy) { + newList.push(copy) + } + }) + } tree[key] = newList } |