diff options
Diffstat (limited to 'deps/npm/lib/prune.js')
-rw-r--r-- | deps/npm/lib/prune.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/deps/npm/lib/prune.js b/deps/npm/lib/prune.js new file mode 100644 index 0000000000..4a02dc1f8a --- /dev/null +++ b/deps/npm/lib/prune.js @@ -0,0 +1,40 @@ +// prune extraneous packages. + +module.exports = prune + +prune.usage = "npm prune" + +var readInstalled = require("./utils/read-installed.js") + , npm = require("./npm.js") + +prune.completion = require("./utils/completion/installed-deep.js") + +function prune (args, cb) { + readInstalled(npm.prefix, function (er, data) { + if (er) return cb(er) + prune_(args, data, cb) + }) +} + +function prune_ (args, data, cb) { + npm.commands.unbuild(prunables(args, data, []), cb) +} + +function prunables (args, data, seen) { + var deps = data.dependencies || {} + return Object.keys(deps).map(function (d) { + if (typeof deps[d] !== "object" + || seen.indexOf(deps[d]) !== -1) return null + seen.push(deps[d]) + if (deps[d].extraneous + && (args.length === 0 || args.indexOf(d) !== -1)) { + var extra = deps[d] + delete deps[d] + return extra.path + } + return prunables(args, deps[d], seen) + }).filter(function (d) { return d !== null }) + .reduce(function FLAT (l, r) { + return l.concat(Array.isArray(r) ? r.reduce(FLAT,[]) : r) + }, []) +} |