diff options
Diffstat (limited to 'deps/node/deps/npm/node_modules/pacote/lib/finalize-manifest.js')
-rw-r--r-- | deps/node/deps/npm/node_modules/pacote/lib/finalize-manifest.js | 254 |
1 files changed, 0 insertions, 254 deletions
diff --git a/deps/node/deps/npm/node_modules/pacote/lib/finalize-manifest.js b/deps/node/deps/npm/node_modules/pacote/lib/finalize-manifest.js deleted file mode 100644 index 80b37989..00000000 --- a/deps/node/deps/npm/node_modules/pacote/lib/finalize-manifest.js +++ /dev/null @@ -1,254 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const cacache = require('cacache') -const cacheKey = require('./util/cache-key') -const fetchFromManifest = require('./fetch').fromManifest -const finished = require('./util/finished') -const minimatch = require('minimatch') -const normalize = require('normalize-package-data') -const optCheck = require('./util/opt-check') -const path = require('path') -const pipe = BB.promisify(require('mississippi').pipe) -const ssri = require('ssri') -const tar = require('tar') - -// `finalizeManifest` takes as input the various kinds of manifests that -// manifest handlers ('lib/fetchers/*.js#manifest()') return, and makes sure -// they are: -// -// * filled out with any required data that the handler couldn't fill in -// * formatted consistently -// * cached so we don't have to repeat this work more than necessary -// -// The biggest thing this package might do is do a full tarball extraction in -// order to find missing bits of metadata required by the npm installer. For -// example, it will fill in `_shrinkwrap`, `_integrity`, and other details that -// the plain manifest handlers would require a tarball to fill out. If a -// handler returns everything necessary, this process is skipped. -// -// If we get to the tarball phase, the corresponding tarball handler for the -// requested type will be invoked and the entire tarball will be read from the -// stream. -// -module.exports = finalizeManifest -function finalizeManifest (pkg, spec, opts) { - const key = finalKey(pkg, spec) - opts = optCheck(opts) - - const cachedManifest = (opts.cache && key && !opts.preferOnline && !opts.fullMetadata && !opts.enjoyBy) - ? cacache.get.info(opts.cache, key, opts) - : BB.resolve(null) - - return cachedManifest.then(cached => { - if (cached && cached.metadata && cached.metadata.manifest) { - return new Manifest(cached.metadata.manifest) - } else { - return tarballedProps(pkg, spec, opts).then(props => { - return pkg && pkg.name - ? new Manifest(pkg, props, opts.fullMetadata) - : new Manifest(props, null, opts.fullMetadata) - }).then(manifest => { - const cacheKey = key || finalKey(manifest, spec) - if (!opts.cache || !cacheKey) { - return manifest - } else { - return cacache.put( - opts.cache, cacheKey, '.', { - metadata: { - id: manifest._id, - manifest, - type: 'finalized-manifest' - } - } - ).then(() => manifest) - } - }) - } - }) -} - -module.exports.Manifest = Manifest -function Manifest (pkg, fromTarball, fullMetadata) { - fromTarball = fromTarball || {} - if (fullMetadata) { - Object.assign(this, pkg) - } - this.name = pkg.name - this.version = pkg.version - this.engines = pkg.engines || fromTarball.engines - this.cpu = pkg.cpu || fromTarball.cpu - this.os = pkg.os || fromTarball.os - this.dependencies = pkg.dependencies || {} - this.optionalDependencies = pkg.optionalDependencies || {} - this.devDependencies = pkg.devDependencies || {} - const bundled = ( - pkg.bundledDependencies || - pkg.bundleDependencies || - false - ) - this.bundleDependencies = bundled - this.peerDependencies = pkg.peerDependencies || {} - this.deprecated = pkg.deprecated || false - - // These depend entirely on each handler - this._resolved = pkg._resolved - - // Not all handlers (or registries) provide these out of the box, - // and if they don't, we need to extract and read the tarball ourselves. - // These are details required by the installer. - this._integrity = pkg._integrity || fromTarball._integrity || null - this._shasum = pkg._shasum || fromTarball._shasum || null - this._shrinkwrap = pkg._shrinkwrap || fromTarball._shrinkwrap || null - this.bin = pkg.bin || fromTarball.bin || null - - if (this.bin && Array.isArray(this.bin)) { - // Code yanked from read-package-json. - const m = (pkg.directories && pkg.directories.bin) || '.' - this.bin = this.bin.reduce((acc, mf) => { - if (mf && mf.charAt(0) !== '.') { - const f = path.basename(mf) - acc[f] = path.join(m, mf) - } - return acc - }, {}) - } - - this._id = null - - // TODO - freezing and inextensibility pending npm changes. See test suite. - // Object.preventExtensions(this) - normalize(this) - - // I don't want this why did you give it to me. Go away. 🔥🔥🔥🔥 - delete this.readme - - // Object.freeze(this) -} - -// Some things aren't filled in by standard manifest fetching. -// If this function needs to do its work, it will grab the -// package tarball, extract it, and take whatever it needs -// from the stream. -function tarballedProps (pkg, spec, opts) { - const needsShrinkwrap = (!pkg || ( - pkg._hasShrinkwrap !== false && - !pkg._shrinkwrap - )) - const needsBin = !!(!pkg || ( - !pkg.bin && - pkg.directories && - pkg.directories.bin - )) - const needsIntegrity = !pkg || (!pkg._integrity && pkg._integrity !== false) - const needsShasum = !pkg || (!pkg._shasum && pkg._shasum !== false) - const needsHash = needsIntegrity || needsShasum - const needsManifest = !pkg || !pkg.name - const needsExtract = needsShrinkwrap || needsBin || needsManifest - if (!needsShrinkwrap && !needsBin && !needsHash && !needsManifest) { - return BB.resolve({}) - } else { - opts = optCheck(opts) - const tarStream = fetchFromManifest(pkg, spec, opts) - const extracted = needsExtract && new tar.Parse() - return BB.join( - needsShrinkwrap && jsonFromStream('npm-shrinkwrap.json', extracted), - needsManifest && jsonFromStream('package.json', extracted), - needsBin && getPaths(extracted), - needsHash && ssri.fromStream(tarStream, { algorithms: ['sha1', 'sha512'] }), - needsExtract && pipe(tarStream, extracted), - (sr, mani, paths, hash) => { - if (needsManifest && !mani) { - const err = new Error(`Non-registry package missing package.json: ${spec}.`) - err.code = 'ENOPACKAGEJSON' - throw err - } - const extraProps = mani || {} - delete extraProps._resolved - // drain out the rest of the tarball - tarStream.resume() - // if we have directories.bin, we need to collect any matching files - // to add to bin - if (paths && paths.length) { - const dirBin = mani - ? (mani && mani.directories && mani.directories.bin) - : (pkg && pkg.directories && pkg.directories.bin) - if (dirBin) { - extraProps.bin = {} - paths.forEach(filePath => { - if (minimatch(filePath, dirBin + '/**')) { - const relative = path.relative(dirBin, filePath) - if (relative && relative[0] !== '.') { - extraProps.bin[path.basename(relative)] = path.join(dirBin, relative) - } - } - }) - } - } - return Object.assign(extraProps, { - _shrinkwrap: sr, - _resolved: (mani && mani._resolved) || - (pkg && pkg._resolved) || - spec.fetchSpec, - _integrity: needsIntegrity && hash && hash.sha512 && hash.sha512[0].toString(), - _shasum: needsShasum && hash && hash.sha1 && hash.sha1[0].hexDigest() - }) - } - ) - } -} - -function jsonFromStream (filename, dataStream) { - return BB.fromNode(cb => { - dataStream.on('error', cb) - dataStream.on('close', cb) - dataStream.on('entry', entry => { - const filePath = entry.header.path.replace(/[^/]+\//, '') - if (filePath !== filename) { - entry.resume() - } else { - let data = '' - entry.on('error', cb) - finished(entry).then(() => { - try { - cb(null, JSON.parse(data)) - } catch (err) { - cb(err) - } - }, err => { - cb(err) - }) - entry.on('data', d => { data += d }) - } - }) - }) -} - -function getPaths (dataStream) { - return BB.fromNode(cb => { - let paths = [] - dataStream.on('error', cb) - dataStream.on('close', () => cb(null, paths)) - dataStream.on('entry', function handler (entry) { - const filePath = entry.header.path.replace(/[^/]+\//, '') - entry.resume() - paths.push(filePath) - }) - }) -} - -function finalKey (pkg, spec) { - if (pkg && pkg._uniqueResolved) { - // git packages have a unique, identifiable id, but no tar sha - return cacheKey(`${spec.type}-manifest`, pkg._uniqueResolved) - } else { - return ( - pkg && pkg._integrity && - cacheKey( - `${spec.type}-manifest`, - `${pkg._resolved}:${ssri.stringify(pkg._integrity)}` - ) - ) - } -} |