UNPKG

2.15 kBJavaScriptView Raw
1
2module.exports = rebuild
3
4var readInstalled = require("read-installed")
5 , semver = require("semver")
6 , log = require("npmlog")
7 , path = require("path")
8 , npm = require("./npm.js")
9 , asyncMap = require("slide").asyncMap
10 , fs = require("graceful-fs")
11
12rebuild.usage = "npm rebuild [<name>[@<version>] [name[@<version>] ...]]"
13
14rebuild.completion = require("./utils/completion/installed-deep.js")
15
16function rebuild (args, cb) {
17 var opt = { depth: npm.config.get("depth") }
18 readInstalled(npm.prefix, opt, function (er, data) {
19 log.info("readInstalled", typeof data)
20 if (er) return cb(er)
21 var set = filter(data, args)
22 , folders = Object.keys(set).filter(function (f) {
23 return f !== npm.prefix
24 })
25 if (!folders.length) return cb()
26 log.silly("rebuild set", folders)
27 cleanBuild(folders, set, cb)
28 })
29}
30
31function cleanBuild (folders, set, cb) {
32 npm.commands.build(folders, function (er) {
33 if (er) return cb(er)
34 console.log(folders.map(function (f) {
35 return set[f] + " " + f
36 }).join("\n"))
37 cb()
38 })
39}
40
41function filter (data, args, set, seen) {
42 if (!set) set = {}
43 if (!seen) seen = {}
44 if (set.hasOwnProperty(data.path)) return set
45 if (seen.hasOwnProperty(data.path)) return set
46 seen[data.path] = true
47 var pass
48 if (!args.length) pass = true // rebuild everything
49 else if (data.name && data._id) {
50 for (var i = 0, l = args.length; i < l; i ++) {
51 var arg = args[i]
52 , nv = arg.split("@")
53 , n = nv.shift()
54 , v = nv.join("@")
55 if (n !== data.name) continue
56 if (!semver.satisfies(data.version, v, true)) continue
57 pass = true
58 break
59 }
60 }
61 if (pass && data._id) {
62 log.verbose("rebuild", "path, id", [data.path, data._id])
63 set[data.path] = data._id
64 }
65 // need to also dive through kids, always.
66 // since this isn't an install these won't get auto-built unless
67 // they're not dependencies.
68 Object.keys(data.dependencies || {}).forEach(function (d) {
69 // return
70 var dep = data.dependencies[d]
71 if (typeof dep === "string") return
72 filter(dep, args, set, seen)
73 })
74 return set
75}