diff options
Diffstat (limited to 'deps/npm/node_modules/read-installed/read-installed.js')
-rw-r--r-- | deps/npm/node_modules/read-installed/read-installed.js | 86 |
1 files changed, 62 insertions, 24 deletions
diff --git a/deps/npm/node_modules/read-installed/read-installed.js b/deps/npm/node_modules/read-installed/read-installed.js index 9ca482dab..f9104934d 100644 --- a/deps/npm/node_modules/read-installed/read-installed.js +++ b/deps/npm/node_modules/read-installed/read-installed.js @@ -98,6 +98,8 @@ var asyncMap = require("slide").asyncMap var semver = require("semver") var readJson = require("read-package-json") var url = require("url") +var util = require("util") +var extend = require("util-extend") module.exports = readInstalled @@ -105,20 +107,32 @@ function readInstalled (folder, opts, cb) { if (typeof opts === 'function') { cb = opts opts = {} + } else { + opts = extend({}, opts) } - var depth = Infinity || opts.depth, log = function () {} || opts.log, dev = false || opts.dev - readInstalled_(folder, null, null, null, 0, depth, dev, function (er, obj) { + if (typeof opts.depth !== 'number') + opts.depth = Infinity + + opts.depth = Math.max(0, opts.depth) + + if (typeof opts.log !== 'function') + opts.log = function () {} + + opts.dev = !!opts.dev + + readInstalled_(folder, null, null, null, 0, opts, function (er, obj) { if (er) return cb(er) // now obj has all the installed things, where they're installed // figure out the inheritance links, now that the object is built. - resolveInheritance(obj, log) + resolveInheritance(obj, opts) + markExtraneous(obj) cb(null, obj) }) } var rpSeen = {} -function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, dev, cb) { +function readInstalled_ (folder, parent, name, reqver, depth, opts, cb) { var installed , obj , real @@ -181,29 +195,36 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, dev, cb) obj.invalid = true } - if (parent - && !(name in parent.dependencies) - && (dev || !(name in (parent.devDependencies || {})))) { - obj.extraneous = true + if (parent) { + var deps = parent.dependencies || {} + var inDeps = name in deps + var devDeps = parent.devDependencies || {} + var inDev = opts.dev && (name in devDeps) + if (!inDeps && !inDev) { + obj.extraneous = true + } } + obj.path = obj.path || folder obj.realPath = real obj.link = link if (parent && !obj.link) obj.parent = parent rpSeen[real] = obj obj.depth = depth - //if (depth >= maxDepth) return cb(null, obj) + //if (depth >= opts.depth) return cb(null, obj) asyncMap(installed, function (pkg, cb) { var rv = obj.dependencies[pkg] - if (!rv && obj.devDependencies && !dev) rv = obj.devDependencies[pkg] - if (depth >= maxDepth) { + if (!rv && obj.devDependencies && opts.dev) + rv = obj.devDependencies[pkg] + + if (depth >= opts.depth) { // just try to get the version number var pkgfolder = path.resolve(folder, "node_modules", pkg) , jsonFile = path.resolve(pkgfolder, "package.json") return readJson(jsonFile, function (er, depData) { // already out of our depth, ignore errors if (er || !depData || !depData.version) return cb(null, obj) - if (depth === maxDepth) { + if (depth === opts.depth) { // edge case, ignore dependencies depData.dependencies = {} depData.peerDependencies = {} @@ -216,8 +237,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, dev, cb) } readInstalled_( path.resolve(folder, "node_modules/"+pkg) - , obj, pkg, obj.dependencies[pkg], depth + 1, maxDepth - , dev + , obj, pkg, obj.dependencies[pkg], depth + 1, opts , cb ) }, function (er, installedData) { @@ -242,7 +262,7 @@ function readInstalled_ (folder, parent, name, reqver, depth, maxDepth, dev, cb) // starting from a root object, call findUnmet on each layer of children var riSeen = [] -function resolveInheritance (obj, log) { +function resolveInheritance (obj, opts) { if (typeof obj !== "object") return if (riSeen.indexOf(obj) !== -1) return riSeen.push(obj) @@ -250,18 +270,18 @@ function resolveInheritance (obj, log) { obj.dependencies = {} } Object.keys(obj.dependencies).forEach(function (dep) { - findUnmet(obj.dependencies[dep], log) + findUnmet(obj.dependencies[dep], opts) }) Object.keys(obj.dependencies).forEach(function (dep) { - resolveInheritance(obj.dependencies[dep], log) + resolveInheritance(obj.dependencies[dep], opts) }) - findUnmet(obj, log) + findUnmet(obj, opts) } // find unmet deps by walking up the tree object. // No I/O var fuSeen = [] -function findUnmet (obj, log) { +function findUnmet (obj, opts) { if (fuSeen.indexOf(obj) !== -1) return fuSeen.push(obj) //console.error("find unmet", obj.name, obj.parent && obj.parent.name) @@ -288,13 +308,11 @@ function findUnmet (obj, log) { && semver.validRange(deps[d], true) && !semver.satisfies(found.version, deps[d], true)) { // the bad thing will happen - log("unmet dependency", obj.path + " requires "+d+"@'"+deps[d] + opts.log("unmet dependency", obj.path + " requires "+d+"@'"+deps[d] +"' but will load\n" +found.path+",\nwhich is version "+found.version ) found.invalid = true - } else { - found.extraneous = false } deps[d] = found } @@ -318,8 +336,6 @@ function findUnmet (obj, log) { if (!dependency) return - dependency.extraneous = false - if (!semver.satisfies(dependency.version, peerDeps[d], true)) { dependency.peerInvalid = true } @@ -328,6 +344,28 @@ function findUnmet (obj, log) { return obj } +function recursivelyMarkExtraneous (obj, extraneous) { + // stop recursion if we're not changing anything + if (obj.extraneous === extraneous) return + + obj.extraneous = extraneous + var deps = obj.dependencies = obj.dependencies || {} + Object.keys(deps).forEach(function(d){ + recursivelyMarkExtraneous(deps[d], extraneous) + }); +} + +function markExtraneous (obj) { + // start from the root object and mark as non-extraneous all modules that haven't been previously flagged as + // extraneous then propagate to all their dependencies + var deps = obj.dependencies = obj.dependencies || {} + Object.keys(deps).forEach(function(d){ + if (!deps[d].extraneous){ + recursivelyMarkExtraneous(deps[d], false); + } + }); +} + function copy (obj) { if (!obj || typeof obj !== 'object') return obj if (Array.isArray(obj)) return obj.map(copy) |