diff options
Diffstat (limited to 'lib/unbuild.js')
-rw-r--r-- | lib/unbuild.js | 120 |
1 files changed, 64 insertions, 56 deletions
diff --git a/lib/unbuild.js b/lib/unbuild.js index 998d6e39f..670cfc125 100644 --- a/lib/unbuild.js +++ b/lib/unbuild.js @@ -1,62 +1,70 @@ module.exports = unbuild module.exports.rmStuff = rmStuff -unbuild.usage = "npm unbuild <folder>\n(this is plumbing)" +unbuild.usage = 'npm unbuild <folder>\n(this is plumbing)' -var readJson = require("read-package-json") - , gentlyRm = require("./utils/gently-rm.js") - , npm = require("./npm.js") - , path = require("path") - , isInside = require("path-is-inside") - , lifecycle = require("./utils/lifecycle.js") - , asyncMap = require("slide").asyncMap - , chain = require("slide").chain - , log = require("npmlog") - , build = require("./build.js") +var readJson = require('read-package-json') +var gentlyRm = require('./utils/gently-rm.js') +var npm = require('./npm.js') +var path = require('path') +var isInside = require('path-is-inside') +var lifecycle = require('./utils/lifecycle.js') +var asyncMap = require('slide').asyncMap +var chain = require('slide').chain +var log = require('npmlog') +var build = require('./build.js') // args is a list of folders. // remove any bins/etc, and then delete the folder. function unbuild (args, silent, cb) { - if (typeof silent === "function") cb = silent, silent = false + if (typeof silent === 'function') { + cb = silent + silent = false + } asyncMap(args, unbuild_(silent), cb) } -function unbuild_ (silent) { return function (folder, cb_) { - function cb (er) { - cb_(er, path.relative(npm.root, folder)) - } - folder = path.resolve(folder) - var base = isInside(folder, npm.prefix) ? npm.prefix : folder - delete build._didBuild[folder] - log.verbose("unbuild", folder.substr(npm.prefix.length + 1)) - readJson(path.resolve(folder, "package.json"), function (er, pkg) { - // if no json, then just trash it, but no scripts or whatever. - if (er) return gentlyRm(folder, false, base, cb) - chain - ( [ [lifecycle, pkg, "preuninstall", folder, false, true] - , [lifecycle, pkg, "uninstall", folder, false, true] - , !silent && function(cb) { +function unbuild_ (silent) { + return function (folder, cb_) { + function cb (er) { + cb_(er, path.relative(npm.root, folder)) + } + folder = path.resolve(folder) + var base = isInside(folder, npm.prefix) ? npm.prefix : folder + delete build._didBuild[folder] + log.verbose('unbuild', folder.substr(npm.prefix.length + 1)) + readJson(path.resolve(folder, 'package.json'), function (er, pkg) { + // if no json, then just trash it, but no scripts or whatever. + if (er) return gentlyRm(folder, false, base, cb) + chain( + [ + [lifecycle, pkg, 'preuninstall', folder, false, true], + [lifecycle, pkg, 'uninstall', folder, false, true], + !silent && function (cb) { log.clearProgress() - console.log("unbuild " + pkg._id) + console.log('unbuild ' + pkg._id) log.showProgress() cb() - } - , [rmStuff, pkg, folder] - , [lifecycle, pkg, "postuninstall", folder, false, true] - , [gentlyRm, folder, false, base] ] - , cb ) - }) -}} + }, + [rmStuff, pkg, folder], + [lifecycle, pkg, 'postuninstall', folder, false, true], + [gentlyRm, folder, false, base] + ], + cb + ) + }) + } +} function rmStuff (pkg, folder, cb) { // if it's global, and folder is in {prefix}/node_modules, // then bins are in {prefix}/bin // otherwise, then bins are in folder/../.bin var parent = path.dirname(folder) - , gnm = npm.dir - , top = gnm === parent + var gnm = npm.dir + var top = gnm === parent - log.verbose("unbuild rmStuff", pkg._id, "from", gnm) - if (!top) log.verbose("unbuild rmStuff", "in", parent) + log.verbose('unbuild rmStuff', pkg._id, 'from', gnm) + if (!top) log.verbose('unbuild rmStuff', 'in', parent) asyncMap([rmBins, rmMans], function (fn, cb) { fn(pkg, folder, parent, top, cb) }, cb) @@ -64,11 +72,11 @@ function rmStuff (pkg, folder, cb) { function rmBins (pkg, folder, parent, top, cb) { if (!pkg.bin) return cb() - var binRoot = top ? npm.bin : path.resolve(parent, ".bin") + var binRoot = top ? npm.bin : path.resolve(parent, '.bin') asyncMap(Object.keys(pkg.bin), function (b, cb) { - if (process.platform === "win32") { - chain([ [gentlyRm, path.resolve(binRoot, b) + ".cmd", true] - , [gentlyRm, path.resolve(binRoot, b), true] ], cb) + if (process.platform === 'win32') { + chain([ [gentlyRm, path.resolve(binRoot, b) + '.cmd', true], + [gentlyRm, path.resolve(binRoot, b), true] ], cb) } else { gentlyRm(path.resolve(binRoot, b), true, cb) } @@ -76,14 +84,14 @@ function rmBins (pkg, folder, parent, top, cb) { } function rmMans (pkg, folder, parent, top, cb) { - if (!pkg.man - || !top - || process.platform === "win32" - || !npm.config.get("global")) { + if (!pkg.man || + !top || + process.platform === 'win32' || + !npm.config.get('global')) { return cb() } - var manRoot = path.resolve(npm.config.get("prefix"), "share", "man") - log.verbose("rmMans", "man files are", pkg.man, "in", manRoot) + var manRoot = path.resolve(npm.config.get('prefix'), 'share', 'man') + log.verbose('rmMans', 'man files are', pkg.man, 'in', manRoot) asyncMap(pkg.man, function (man, cb) { if (Array.isArray(man)) { man.forEach(rmMan) @@ -92,25 +100,25 @@ function rmMans (pkg, folder, parent, top, cb) { } function rmMan (man) { - log.silly("rmMan", "preparing to remove", man) + log.silly('rmMan', 'preparing to remove', man) var parseMan = man.match(/(.*\.([0-9]+)(\.gz)?)$/) if (!parseMan) { log.error( - "rmMan", man, "is not a valid name for a man file.", - "Man files must end with a number, " + - "and optionally a .gz suffix if they are compressed." + 'rmMan', man, 'is not a valid name for a man file.', + 'Man files must end with a number, ' + + 'and optionally a .gz suffix if they are compressed.' ) return cb() } var stem = parseMan[1] var sxn = parseMan[2] - var gz = parseMan[3] || "" + var gz = parseMan[3] || '' var bn = path.basename(stem) var manDest = path.join( manRoot, - "man"+sxn, - (bn.indexOf(pkg.name) === 0 ? bn : pkg.name+"-"+bn)+"."+sxn+gz + 'man' + sxn, + (bn.indexOf(pkg.name) === 0 ? bn : pkg.name + '-' + bn) + '.' + sxn + gz ) gentlyRm(manDest, true, cb) } |