diff options
Diffstat (limited to 'node_modules/pacote/lib/fetchers/directory.js')
-rw-r--r-- | node_modules/pacote/lib/fetchers/directory.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/node_modules/pacote/lib/fetchers/directory.js b/node_modules/pacote/lib/fetchers/directory.js new file mode 100644 index 000000000..4f7f8847a --- /dev/null +++ b/node_modules/pacote/lib/fetchers/directory.js @@ -0,0 +1,71 @@ +'use strict' + +const BB = require('bluebird') + +const Fetcher = require('../fetch') +const glob = BB.promisify(require('glob')) +const packDir = require('../util/pack-dir') +const path = require('path') +const pipe = BB.promisify(require('mississippi').pipe) +const through = require('mississippi').through + +const readFileAsync = BB.promisify(require('fs').readFile) + +const fetchDirectory = module.exports = Object.create(null) + +Fetcher.impl(fetchDirectory, { + // `directory` manifests come from the actual manifest/lockfile data. + manifest (spec, opts) { + const pkgPath = path.join(spec.fetchSpec, 'package.json') + const srPath = path.join(spec.fetchSpec, 'npm-shrinkwrap.json') + return BB.join( + readFileAsync(pkgPath).then(JSON.parse).catch({code: 'ENOENT'}, err => { + err.code = 'ENOPACKAGEJSON' + throw err + }), + readFileAsync(srPath).then(JSON.parse).catch({code: 'ENOENT'}, () => null), + (pkg, sr) => { + pkg._shrinkwrap = sr + pkg._hasShrinkwrap = !!sr + pkg._resolved = spec.fetchSpec + pkg._integrity = false // Don't auto-calculate integrity + return pkg + } + ).then(pkg => { + if (!pkg.bin && pkg.directories && pkg.directories.bin) { + const dirBin = pkg.directories.bin + return glob(path.join(spec.fetchSpec, dirBin, '/**'), {nodir: true}).then(matches => { + matches.forEach(filePath => { + const relative = path.relative(spec.fetchSpec, filePath) + if (relative && relative[0] !== '.') { + if (!pkg.bin) { pkg.bin = {} } + pkg.bin[path.basename(relative)] = relative + } + }) + }).then(() => pkg) + } else { + return pkg + } + }) + }, + + // As of npm@5, the npm installer doesn't pack + install directories: it just + // creates symlinks. This code is here because `npm pack` still needs the + // ability to create a tarball from a local directory. + tarball (spec, opts) { + const stream = through() + this.manifest(spec, opts).then(mani => { + return pipe(this.fromManifest(mani, spec, opts), stream) + }).catch(err => stream.emit('error', err)) + return stream + }, + + // `directory` tarballs are generated in a very similar way to git tarballs. + fromManifest (manifest, spec, opts) { + const stream = through() + packDir(manifest, manifest._resolved, manifest._resolved, stream, opts).catch(err => { + stream.emit('error', err) + }) + return stream + } +}) |