| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | 'use strict'const BB = require('bluebird')const figgyPudding = require('figgy-pudding')const stat = BB.promisify(require('graceful-fs').stat)const gentlyRm = BB.promisify(require('../../utils/gently-rm.js'))const mkdirp = BB.promisify(require('gentle-fs').mkdir)const moduleName = require('../../utils/module-name.js')const moduleStagingPath = require('../module-staging-path.js')const move = require('../../utils/move.js')const npa = require('npm-package-arg')const npm = require('../../npm.js')let npmConfigconst packageId = require('../../utils/package-id.js')const path = require('path')const localWorker = require('./extract-worker.js')const workerFarm = require('worker-farm')const isRegistry = require('../../utils/is-registry.js')const WORKER_PATH = require.resolve('./extract-worker.js')let workersconst ExtractOpts = figgyPudding({  log: {}}, { other () { return true } })// Disabled for now. Re-enable someday. Just not today.const ENABLE_WORKERS = falseextract.init = () => {  if (ENABLE_WORKERS) {    workers = workerFarm({      maxConcurrentCallsPerWorker: npm.limit.fetch,      maxRetries: 1    }, WORKER_PATH)  }  return BB.resolve()}extract.teardown = () => {  if (ENABLE_WORKERS) {    workerFarm.end(workers)    workers = null  }  return BB.resolve()}module.exports = extractfunction extract (staging, pkg, log) {  log.silly('extract', packageId(pkg))  const extractTo = moduleStagingPath(staging, pkg)  if (!npmConfig) {    npmConfig = require('../../config/figgy-config.js')  }  let opts = ExtractOpts(npmConfig()).concat({    integrity: pkg.package._integrity,    resolved: pkg.package._resolved  })  const args = [    pkg.package._requested,    extractTo,    opts  ]  return BB.fromNode((cb) => {    let launcher = localWorker    let msg = args    const spec = typeof args[0] === 'string' ? npa(args[0]) : args[0]    args[0] = spec.raw    if (ENABLE_WORKERS && (isRegistry(spec) || spec.type === 'remote')) {      // We can't serialize these options      opts = opts.concat({        loglevel: opts.log.level,        log: null,        dirPacker: null,        Promise: null,        _events: null,        _eventsCount: null,        list: null,        sources: null,        _maxListeners: null,        root: null      })      // workers will run things in parallel!      launcher = workers      try {        msg = JSON.stringify(msg)      } catch (e) {        return cb(e)      }    }    launcher(msg, cb)  }).then(() => {    if (pkg.package.bundleDependencies || anyBundled(pkg)) {      return readBundled(pkg, staging, extractTo)    }  }).then(() => {    return gentlyRm(path.join(extractTo, 'node_modules'))  })}function anyBundled (top, pkg) {  if (!pkg) pkg = top  return pkg.children.some((child) => child.fromBundle === top || anyBundled(top, child))}function readBundled (pkg, staging, extractTo) {  return BB.map(pkg.children, (child) => {    if (!child.fromBundle) return    if (child.error) {      throw child.error    } else {      return stageBundledModule(pkg, child, staging, extractTo)    }  }, {concurrency: 10})}function stageBundledModule (bundler, child, staging, parentPath) {  const stageFrom = path.join(parentPath, 'node_modules', moduleName(child))  const stageTo = moduleStagingPath(staging, child)  return BB.map(child.children, (child) => {    if (child.error) {      throw child.error    } else {      return stageBundledModule(bundler, child, staging, stageFrom)    }  }).then(() => {    return finishModule(bundler, child, stageTo, stageFrom)  })}function finishModule (bundler, child, stageTo, stageFrom) {  // If we were the one's who bundled this module…  if (child.fromBundle === bundler) {    return mkdirp(path.dirname(stageTo)).then(() => {      return move(stageFrom, stageTo)    })  } else {    return stat(stageFrom).then(() => gentlyRm(stageFrom), () => {})  }}
 |