summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/read-installed/read-installed.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/read-installed/read-installed.js')
-rw-r--r--deps/npm/node_modules/read-installed/read-installed.js86
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)