UNPKG

2.09 kBJavaScriptView Raw
1
2module.exports = rebuild
3
4var readInstalled = require("read-installed")
5 , semver = require("semver")
6 , log = require("npmlog")
7 , npm = require("./npm.js")
8 , npa = require("npm-package-arg")
9
10rebuild.usage = "npm rebuild [<name>[@<version>] [name[@<version>] ...]]"
11
12rebuild.completion = require("./utils/completion/installed-deep.js")
13
14function 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)
18 if (er) return cb(er)
19 var set = filter(data, args)
20 , folders = Object.keys(set).filter(function (f) {
21 return f !== npm.prefix
22 })
23 if (!folders.length) return cb()
24 log.silly("rebuild set", folders)
25 cleanBuild(folders, set, cb)
26 })
27}
28
29function cleanBuild (folders, set, cb) {
30 npm.commands.build(folders, function (er) {
31 if (er) return cb(er)
32 console.log(folders.map(function (f) {
33 return set[f] + " " + f
34 }).join("\n"))
35 cb()
36 })
37}
38
39function filter (data, args, set, seen) {
40 if (!set) set = {}
41 if (!seen) seen = {}
42 if (set.hasOwnProperty(data.path)) return set
43 if (seen.hasOwnProperty(data.path)) return set
44 seen[data.path] = true
45 var pass
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 ++) {
49 var arg = args[i]
50 , nv = npa(arg)
51 , n = nv.name
52 , v = nv.rawSpec
53 if (n !== data.name) continue
54 if (!semver.satisfies(data.version, v, true)) continue
55 pass = true
56 break
57 }
58 }
59 if (pass && data._id) {
60 log.verbose("rebuild", "path, id", [data.path, data._id])
61 set[data.path] = data._id
62 }
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) {
67 // return
68 var dep = data.dependencies[d]
69 if (typeof dep === "string") return
70 filter(dep, args, set, seen)
71 })
72 return set
73}