• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2
3var defaultTemplate = {
4  package: {
5    version: '',
6    dependencies: {},
7    devDependencies: {},
8    optionalDependencies: {}
9  },
10  loaded: false,
11  children: [],
12  requiredBy: [],
13  requires: [],
14  missingDeps: {},
15  missingDevDeps: {},
16  phantomChildren: {},
17  path: null,
18  realpath: null,
19  location: null,
20  userRequired: false,
21  save: false,
22  saveSpec: null,
23  isTop: false,
24  fromBundle: false
25}
26
27function isLink (node) {
28  return node && node.isLink
29}
30function isInLink (node) {
31  return node && (node.isInLink || node.isLink)
32}
33
34var create = exports.create = function (node, template, isNotTop) {
35  if (!template) template = defaultTemplate
36  Object.keys(template).forEach(function (key) {
37    if (template[key] != null && typeof template[key] === 'object' && !(template[key] instanceof Array)) {
38      if (!node[key]) node[key] = {}
39      return create(node[key], template[key], true)
40    }
41    if (node[key] != null) return
42    node[key] = template[key]
43  })
44  if (!isNotTop) {
45    // isLink is true for the symlink and everything inside it.
46    // by contrast, isInLink is true for only the things inside a link
47    if (node.isLink == null) node.isLink = isLink(node.parent)
48    if (node.isInLink == null) node.isInLink = isInLink(node.parent)
49    if (node.fromBundle == null) {
50      node.fromBundle = false
51    }
52  }
53  return node
54}
55
56exports.reset = function (node) {
57  reset(node, new Set())
58}
59
60function reset (node, seen) {
61  if (seen.has(node)) return
62  seen.add(node)
63  var child = create(node)
64
65  // FIXME: cleaning up after read-package-json's mess =(
66  if (child.package._id === '@') delete child.package._id
67
68  child.isTop = false
69  child.requiredBy = []
70  child.requires = []
71  child.missingDeps = {}
72  child.missingDevDeps = {}
73  child.phantomChildren = {}
74  child.location = null
75
76  child.children.forEach(function (child) { reset(child, seen) })
77}
78