summaryrefslogtreecommitdiff
path: root/deps/npm/lib/install/action/extract.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/install/action/extract.js')
-rw-r--r--deps/npm/lib/install/action/extract.js163
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)
+ }, () => {})
}
}