1 |
|
2 |
|
3 | module.exports = prune
|
4 | module.exports.Pruner = Pruner
|
5 |
|
6 | prune.usage = 'npm prune [[<@scope>/]<pkg>...] [--production]'
|
7 |
|
8 | var npm = require('./npm.js')
|
9 | var log = require('npmlog')
|
10 | var util = require('util')
|
11 | var moduleName = require('./utils/module-name.js')
|
12 | var Installer = require('./install.js').Installer
|
13 | var isExtraneous = require('./install/is-extraneous.js')
|
14 | var isOnlyDev = require('./install/is-only-dev.js')
|
15 | var removeDeps = require('./install/deps.js').removeDeps
|
16 | var loadExtraneous = require('./install/deps.js').loadExtraneous
|
17 | var chain = require('slide').chain
|
18 | var computeMetadata = require('./install/deps.js').computeMetadata
|
19 |
|
20 | prune.completion = require('./utils/completion/installed-deep.js')
|
21 |
|
22 | function prune (args, cb) {
|
23 | var dryrun = !!npm.config.get('dry-run')
|
24 | new Pruner('.', dryrun, args).run(cb)
|
25 | }
|
26 |
|
27 | function Pruner (where, dryrun, args) {
|
28 | Installer.call(this, where, dryrun, args)
|
29 | this.autoPrune = true
|
30 | }
|
31 | util.inherits(Pruner, Installer)
|
32 |
|
33 | Pruner.prototype.loadAllDepsIntoIdealTree = function (cb) {
|
34 | log.silly('uninstall', 'loadAllDepsIntoIdealTree')
|
35 |
|
36 | var cg = this.progress['loadIdealTree:loadAllDepsIntoIdealTree']
|
37 | var steps = []
|
38 |
|
39 | computeMetadata(this.idealTree)
|
40 | var self = this
|
41 | var excludeDev = npm.config.get('production') || /^prod(uction)?$/.test(npm.config.get('only'))
|
42 | function shouldPrune (child) {
|
43 | if (isExtraneous(child)) return true
|
44 | if (!excludeDev) return false
|
45 | return isOnlyDev(child)
|
46 | }
|
47 | function getModuleName (child) {
|
48 |
|
49 |
|
50 | return moduleName(child)
|
51 | }
|
52 | function matchesArg (name) {
|
53 | return self.args.length === 0 || self.args.indexOf(name) !== -1
|
54 | }
|
55 | function nameObj (name) {
|
56 | return {name: name}
|
57 | }
|
58 | var toPrune = this.idealTree.children.filter(shouldPrune).map(getModuleName).filter(matchesArg).map(nameObj)
|
59 |
|
60 | steps.push(
|
61 | [removeDeps, toPrune, this.idealTree, null],
|
62 | [loadExtraneous, this.idealTree, cg.newGroup('loadExtraneous')])
|
63 | chain(steps, cb)
|
64 | }
|
65 |
|
66 | Pruner.prototype.runPreinstallTopLevelLifecycles = function (cb) { cb() }
|
67 | Pruner.prototype.runPostinstallTopLevelLifecycles = function (cb) { cb() }
|
68 | Pruner.prototype.saveToDependencies = function (cb) { cb() }
|