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