summaryrefslogtreecommitdiff
path: root/deps/npm/lib/install/copy-tree.js
blob: a5b558cf598b73517d869f50f8041cb5c3cc7baf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
'use strict'
var createNode = require('./node.js').create
module.exports = function (tree, filter) {
  return copyTree(tree, {}, filter)
}

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, filter)
  copyModuleList(newTree, 'requiredBy', cache, filter)
  return newTree
}

function copyModuleList (tree, key, cache, filter) {
  var newList = []
  if (tree[key]) {
    tree[key].forEach(function (child) {
      const copy = copyTree(child, cache, filter)
      if (copy) {
        newList.push(copy)
      }
    })
  }
  tree[key] = newList
}