diff options
Diffstat (limited to 'deps/npm/lib/install/action/extract.js')
-rw-r--r-- | deps/npm/lib/install/action/extract.js | 163 |
1 files changed, 74 insertions, 89 deletions
diff --git a/deps/npm/lib/install/action/extract.js b/deps/npm/lib/install/action/extract.js index fd9562c184..7839177850 100644 --- a/deps/npm/lib/install/action/extract.js +++ b/deps/npm/lib/install/action/extract.js @@ -1,67 +1,56 @@ 'use strict' -var path = require('path') -var iferr = require('iferr') -var asyncMap = require('slide').asyncMap -var fs = require('graceful-fs') -var mkdirp = require('mkdirp') -var move = require('../../utils/move.js') -var gentlyRm = require('../../utils/gently-rm.js') -var updatePackageJson = require('../update-package-json') -var npm = require('../../npm.js') -var moduleName = require('../../utils/module-name.js') -var packageId = require('../../utils/package-id.js') -var cache = require('../../cache.js') -var moduleStagingPath = require('../module-staging-path.js') -var readPackageJson = require('read-package-json') -module.exports = function (staging, pkg, log, next) { - log.silly('extract', packageId(pkg)) - var up = npm.config.get('unsafe-perm') - var user = up ? null : npm.config.get('user') - var group = up ? null : npm.config.get('group') - var extractTo = moduleStagingPath(staging, pkg) - cache.unpack(pkg.package.name, pkg.package.version, extractTo, null, null, user, group, - andUpdatePackageJson(pkg, staging, extractTo, - andStageBundledChildren(pkg, staging, extractTo, log, - andRemoveExtraneousBundles(extractTo, next)))) -} - -function andUpdatePackageJson (pkg, staging, extractTo, next) { - return iferr(next, function () { - readPackageJson(path.join(extractTo, 'package.json'), false, function (err, metadata) { - if (!err) { - // Copy _ keys (internal to npm) and any missing keys from the possibly incomplete - // registry metadata over to the full package metadata read off of disk. - Object.keys(pkg.package).forEach(function (key) { - if (key[0] === '_' || !(key in metadata)) metadata[key] = pkg.package[key] - }) - metadata.name = pkg.package.name // things go wrong if these don't match - pkg.package = metadata - } - updatePackageJson(pkg, extractTo, next) - }) - }) -} +const BB = require('bluebird') -function andStageBundledChildren (pkg, staging, extractTo, log, next) { - return iferr(next, function () { - if (!pkg.package.bundleDependencies) return next() +const fs = BB.promisifyAll(require('graceful-fs')) +const gentlyRm = BB.promisify(require('../../utils/gently-rm.js')) +const log = require('npmlog') +const mkdirp = BB.promisify(require('mkdirp')) +const moduleName = require('../../utils/module-name.js') +const moduleStagingPath = require('../module-staging-path.js') +const move = BB.promisify(require('../../utils/move.js')) +const npa = require('npm-package-arg') +const npm = require('../../npm.js') +const packageId = require('../../utils/package-id.js') +const pacote = require('pacote') +const pacoteOpts = require('../../config/pacote') +const path = require('path') - asyncMap(pkg.children, andStageBundledModule(pkg, staging, extractTo), next) +module.exports = extract +function extract (staging, pkg, log) { + log.silly('extract', packageId(pkg)) + const up = npm.config.get('unsafe-perm') + const user = up ? null : npm.config.get('user') + const group = up ? null : npm.config.get('group') + const extractTo = moduleStagingPath(staging, pkg) + const opts = pacoteOpts({ + uid: user, + gid: group, + integrity: pkg.package._integrity }) -} - -function andRemoveExtraneousBundles (extractTo, next) { - return iferr(next, function () { - gentlyRm(path.join(extractTo, 'node_modules'), next) + return pacote.extract( + pkg.package._resolved + ? npa.resolve(pkg.package.name, pkg.package._resolved) + : pkg.package._requested, + extractTo, + opts + ).then(() => { + if (pkg.package.bundleDependencies) { + return readBundled(pkg, staging, extractTo) + } + }).then(() => { + return gentlyRm(path.join(extractTo, 'node_modules')) }) } -function andStageBundledModule (bundler, staging, parentPath) { - return function (child, next) { - if (child.error) return next(child.error) - stageBundledModule(bundler, child, staging, parentPath, next) - } +function readBundled (pkg, staging, extractTo) { + return BB.map(pkg.children, (child) => { + if (child.error) { + throw child.error + } else { + return stageBundledModule(pkg, child, staging, extractTo) + } + }, {concurrency: 10}) } function getTree (pkg) { @@ -70,47 +59,43 @@ function getTree (pkg) { } function warn (pkg, code, msg) { - var tree = getTree(pkg) - var err = new Error(msg) + const tree = getTree(pkg) + const err = new Error(msg) err.code = code tree.warnings.push(err) } -function stageBundledModule (bundler, child, staging, parentPath, next) { - var stageFrom = path.join(parentPath, 'node_modules', child.package.name) - var stageTo = moduleStagingPath(staging, child) - - return asyncMap(child.children, andStageBundledModule(bundler, staging, stageFrom), iferr(next, finishModule)) +function stageBundledModule (bundler, child, staging, parentPath) { + const stageFrom = path.join(parentPath, 'node_modules', child.package.name) + const stageTo = moduleStagingPath(staging, child) - function finishModule () { - // If we were the one's who bundled this module… - if (child.fromBundle === bundler) { - return moveModule() + return BB.map(child.children, (child) => { + if (child.error) { + throw child.error } else { - return checkForReplacement() + return stageBundledModule(bundler, child, staging, stageFrom) } - } - - function moveModule () { - return mkdirp(path.dirname(stageTo), iferr(next, function () { - return move(stageFrom, stageTo, iferr(next, updateMovedPackageJson)) - })) - } + }).then(() => { + return finishModule(bundler, child, stageTo, stageFrom) + }) +} - function checkForReplacement () { - return fs.stat(stageFrom, function (notExists, exists) { - if (exists) { - warn(bundler, 'EBUNDLEOVERRIDE', 'In ' + packageId(bundler) + - ' replacing bundled version of ' + moduleName(child) + - ' with ' + packageId(child)) - return gentlyRm(stageFrom, next) - } else { - return next() - } +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) }) - } - - function updateMovedPackageJson () { - updatePackageJson(child, stageTo, next) + } else { + return fs.statAsync(stageFrom).then(() => { + const bundlerId = packageId(bundler) + if (!getTree(bundler).warnings.some((w) => { + return w.code === 'EBUNDLEOVERRIDE' + })) { + warn(bundler, 'EBUNDLEOVERRIDE', `${bundlerId} had bundled packages that do not match the required version(s). They have been replaced with non-bundled versions.`) + } + log.verbose('bundle', `EBUNDLEOVERRIDE: Replacing ${bundlerId}'s bundled version of ${moduleName(child)} with ${packageId(child)}.`) + return gentlyRm(stageFrom) + }, () => {}) } } |