1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 'use strict'
- var defaultTemplate = {
- package: {
- version: '',
- dependencies: {},
- devDependencies: {},
- optionalDependencies: {}
- },
- loaded: false,
- children: [],
- requiredBy: [],
- requires: [],
- missingDeps: {},
- missingDevDeps: {},
- phantomChildren: {},
- path: null,
- realpath: null,
- location: null,
- userRequired: false,
- save: false,
- saveSpec: null,
- isTop: false,
- fromBundle: false
- }
- function isLink (node) {
- return node && node.isLink
- }
- function isInLink (node) {
- return node && (node.isInLink || node.isLink)
- }
- var create = exports.create = function (node, template, isNotTop) {
- if (!template) template = defaultTemplate
- Object.keys(template).forEach(function (key) {
- if (template[key] != null && typeof template[key] === 'object' && !(template[key] instanceof Array)) {
- if (!node[key]) node[key] = {}
- return create(node[key], template[key], true)
- }
- if (node[key] != null) return
- node[key] = template[key]
- })
- if (!isNotTop) {
- // isLink is true for the symlink and everything inside it.
- // by contrast, isInLink is true for only the things inside a link
- if (node.isLink == null) node.isLink = isLink(node.parent)
- if (node.isInLink == null) node.isInLink = isInLink(node.parent)
- if (node.fromBundle == null) {
- node.fromBundle = false
- }
- }
- return node
- }
- exports.reset = function (node) {
- reset(node, new Set())
- }
- function reset (node, seen) {
- if (seen.has(node)) return
- seen.add(node)
- var child = create(node)
- // FIXME: cleaning up after read-package-json's mess =(
- if (child.package._id === '@') delete child.package._id
- child.isTop = false
- child.requiredBy = []
- child.requires = []
- child.missingDeps = {}
- child.missingDevDeps = {}
- child.phantomChildren = {}
- child.location = null
- child.children.forEach(function (child) { reset(child, seen) })
- }
|