2 module.exports = rebuild
4 var readInstalled = require("read-installed")
5 , semver = require("semver")
6 , log = require("npmlog")
7 , npm = require("./npm.js")
8 , npa = require("npm-package-arg")
10 rebuild.usage = "npm rebuild [<name>[@<version>] [name[@<version>] ...]]"
12 rebuild.completion = require("./utils/completion/installed-deep.js")
14 function rebuild (args, cb) {
15 var opt = { depth: npm.config.get("depth"), dev: true }
16 readInstalled(npm.prefix, opt, function (er, data) {
17 log.info("readInstalled", typeof data)
19 var set = filter(data, args)
20 , folders = Object.keys(set).filter(function (f) {
21 return f !== npm.prefix
23 if (!folders.length) return cb()
24 log.silly("rebuild set", folders)
25 cleanBuild(folders, set, cb)
29 function cleanBuild (folders, set, cb) {
30 npm.commands.build(folders, function (er) {
32 console.log(folders.map(function (f) {
33 return set[f] + " " + f
39 function filter (data, args, set, seen) {
42 if (set.hasOwnProperty(data.path)) return set
43 if (seen.hasOwnProperty(data.path)) return set
44 seen[data.path] = true
46 if (!args.length) pass = true // rebuild everything
47 else if (data.name && data._id) {
48 for (var i = 0, l = args.length; i < l; i ++) {
53 if (n !== data.name) continue
54 if (!semver.satisfies(data.version, v, true)) continue
59 if (pass && data._id) {
60 log.verbose("rebuild", "path, id", [data.path, data._id])
61 set[data.path] = data._id
63 // need to also dive through kids, always.
64 // since this isn't an install these won't get auto-built unless
65 // they're not dependencies.
66 Object.keys(data.dependencies || {}).forEach(function (d) {
68 var dep = data.dependencies[d]
69 if (typeof dep === "string") return
70 filter(dep, args, set, seen)