| 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 npmConfig
 
- const 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 workers
 
- const ExtractOpts = figgyPudding({
 
-   log: {}
 
- }, { other () { return true } })
 
- // Disabled for now. Re-enable someday. Just not today.
 
- const ENABLE_WORKERS = false
 
- extract.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 = extract
 
- function 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), () => {})
 
-   }
 
- }
 
 
  |