aboutsummaryrefslogtreecommitdiff
path: root/deps/node/deps/npm/node_modules/pacote/extract.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/npm/node_modules/pacote/extract.js')
-rw-r--r--deps/node/deps/npm/node_modules/pacote/extract.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/deps/node/deps/npm/node_modules/pacote/extract.js b/deps/node/deps/npm/node_modules/pacote/extract.js
new file mode 100644
index 00000000..d2ab47de
--- /dev/null
+++ b/deps/node/deps/npm/node_modules/pacote/extract.js
@@ -0,0 +1,70 @@
+'use strict'
+
+const BB = require('bluebird')
+
+const extractStream = require('./lib/extract-stream.js')
+const fs = require('fs')
+const mkdirp = BB.promisify(require('mkdirp'))
+const npa = require('npm-package-arg')
+const optCheck = require('./lib/util/opt-check.js')
+const path = require('path')
+const rimraf = BB.promisify(require('rimraf'))
+const withTarballStream = require('./lib/with-tarball-stream.js')
+
+const truncateAsync = BB.promisify(fs.truncate)
+const readFileAsync = BB.promisify(fs.readFile)
+const appendFileAsync = BB.promisify(fs.appendFile)
+
+module.exports = extract
+function extract (spec, dest, opts) {
+ opts = optCheck(opts)
+ spec = npa(spec, opts.where)
+ const startTime = Date.now()
+
+ return withTarballStream(spec, opts, stream => {
+ return tryExtract(spec, stream, dest, opts)
+ })
+ .then(() => {
+ if (!opts.resolved) {
+ const pjson = path.join(dest, 'package.json')
+ return readFileAsync(pjson, 'utf8')
+ .then(str => truncateAsync(pjson)
+ .then(() => appendFileAsync(pjson, str.replace(
+ /}\s*$/,
+ `\n,"_resolved": ${
+ JSON.stringify(opts.resolved || '')
+ }\n,"_integrity": ${
+ JSON.stringify(opts.integrity || '')
+ }\n,"_from": ${
+ JSON.stringify(spec.toString())
+ }\n}`
+ ))))
+ }
+ })
+ .then(() => opts.log.silly(
+ 'extract',
+ `${spec} extracted to ${dest} (${Date.now() - startTime}ms)`
+ ))
+}
+
+function tryExtract (spec, tarStream, dest, opts) {
+ return new BB((resolve, reject) => {
+ tarStream.on('error', reject)
+ setImmediate(resolve)
+ })
+ .then(() => rimraf(dest))
+ .then(() => mkdirp(dest))
+ .then(() => new BB((resolve, reject) => {
+ const xtractor = extractStream(spec, dest, opts)
+ tarStream.on('error', reject)
+ xtractor.on('error', reject)
+ xtractor.on('close', resolve)
+ tarStream.pipe(xtractor)
+ }))
+ .catch(err => {
+ if (err.code === 'EINTEGRITY') {
+ err.message = `Verification failed while extracting ${spec}:\n${err.message}`
+ }
+ throw err
+ })
+}