| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | 
module.exports = rebuildvar readInstalled = require('read-installed')var semver = require('semver')var log = require('npmlog')var npm = require('./npm.js')var npa = require('npm-package-arg')var usage = require('./utils/usage')var output = require('./utils/output.js')rebuild.usage = usage(  'rebuild',  'npm rebuild [[<@scope>/<name>]...]')rebuild.completion = require('./utils/completion/installed-deep.js')function rebuild (args, cb) {  var opt = { depth: npm.config.get('depth'), dev: true }  readInstalled(npm.prefix, opt, function (er, data) {    log.info('readInstalled', typeof data)    if (er) return cb(er)    var set = filter(data, args)    var folders = Object.keys(set).filter(function (f) {      return f !== npm.prefix    })    if (!folders.length) return cb()    log.silly('rebuild set', folders)    cleanBuild(folders, set, cb)  })}function cleanBuild (folders, set, cb) {  npm.commands.build(folders, function (er) {    if (er) return cb(er)    output(folders.map(function (f) {      return set[f] + ' ' + f    }).join('\n'))    cb()  })}function filter (data, args, set, seen) {  if (!set) set = {}  if (!seen) seen = new Set()  if (set.hasOwnProperty(data.path)) return set  if (seen.has(data)) return set  seen.add(data)  var pass  if (!args.length) pass = true // rebuild everything  else if (data.name && data._id) {    for (var i = 0, l = args.length; i < l; i++) {      var arg = args[i]      var nv = npa(arg)      var n = nv.name      var v = nv.rawSpec      if (n !== data.name) continue      if (!semver.satisfies(data.version, v, true)) continue      pass = true      break    }  }  if (pass && data._id) {    log.verbose('rebuild', 'path, id', [data.path, data._id])    set[data.path] = data._id  }  // need to also dive through kids, always.  // since this isn't an install these won't get auto-built unless  // they're not dependencies.  Object.keys(data.dependencies || {}).forEach(function (d) {    // return    var dep = data.dependencies[d]    if (typeof dep === 'string') return    filter(dep, args, set, seen)  })  return set}
 |