diff options
Diffstat (limited to 'deps/node/deps/npm/lib/shrinkwrap.js')
-rw-r--r-- | deps/node/deps/npm/lib/shrinkwrap.js | 275 |
1 files changed, 0 insertions, 275 deletions
diff --git a/deps/node/deps/npm/lib/shrinkwrap.js b/deps/node/deps/npm/lib/shrinkwrap.js deleted file mode 100644 index dbb12b5b..00000000 --- a/deps/node/deps/npm/lib/shrinkwrap.js +++ /dev/null @@ -1,275 +0,0 @@ -'use strict' - -const BB = require('bluebird') - -const chain = require('slide').chain -const detectIndent = require('detect-indent') -const detectNewline = require('detect-newline') -const readFile = BB.promisify(require('graceful-fs').readFile) -const getRequested = require('./install/get-requested.js') -const id = require('./install/deps.js') -const iferr = require('iferr') -const isOnlyOptional = require('./install/is-only-optional.js') -const isOnlyDev = require('./install/is-only-dev.js') -const lifecycle = require('./utils/lifecycle.js') -const log = require('npmlog') -const moduleName = require('./utils/module-name.js') -const move = require('move-concurrently') -const npm = require('./npm.js') -const path = require('path') -const readPackageTree = BB.promisify(require('read-package-tree')) -const ssri = require('ssri') -const stringifyPackage = require('stringify-package') -const validate = require('aproba') -const writeFileAtomic = require('write-file-atomic') -const unixFormatPath = require('./utils/unix-format-path.js') -const isRegistry = require('./utils/is-registry.js') - -const PKGLOCK = 'package-lock.json' -const SHRINKWRAP = 'npm-shrinkwrap.json' -const PKGLOCK_VERSION = npm.lockfileVersion - -// emit JSON describing versions of all packages currently installed (for later -// use with shrinkwrap install) -shrinkwrap.usage = 'npm shrinkwrap' - -module.exports = exports = shrinkwrap -exports.treeToShrinkwrap = treeToShrinkwrap - -function shrinkwrap (args, silent, cb) { - if (typeof cb !== 'function') { - cb = silent - silent = false - } - - if (args.length) { - log.warn('shrinkwrap', "doesn't take positional args") - } - - move( - path.resolve(npm.prefix, PKGLOCK), - path.resolve(npm.prefix, SHRINKWRAP), - { Promise: BB } - ).then(() => { - log.notice('', `${PKGLOCK} has been renamed to ${SHRINKWRAP}. ${SHRINKWRAP} will be used for future installations.`) - return readFile(path.resolve(npm.prefix, SHRINKWRAP)).then((d) => { - return JSON.parse(d) - }) - }, (err) => { - if (err.code !== 'ENOENT') { - throw err - } else { - return readPackageTree(npm.localPrefix).then( - id.computeMetadata - ).then((tree) => { - return BB.fromNode((cb) => { - createShrinkwrap(tree, { - silent, - defaultFile: SHRINKWRAP - }, cb) - }) - }) - } - }).then((data) => cb(null, data), cb) -} - -module.exports.createShrinkwrap = createShrinkwrap - -function createShrinkwrap (tree, opts, cb) { - opts = opts || {} - lifecycle(tree.package, 'preshrinkwrap', tree.path, function () { - const pkginfo = treeToShrinkwrap(tree) - chain([ - [lifecycle, tree.package, 'shrinkwrap', tree.path], - [shrinkwrap_, tree.path, pkginfo, opts], - [lifecycle, tree.package, 'postshrinkwrap', tree.path] - ], iferr(cb, function (data) { - cb(null, pkginfo) - })) - }) -} - -function treeToShrinkwrap (tree) { - validate('O', arguments) - var pkginfo = {} - if (tree.package.name) pkginfo.name = tree.package.name - if (tree.package.version) pkginfo.version = tree.package.version - if (tree.children.length) { - pkginfo.requires = true - shrinkwrapDeps(pkginfo.dependencies = {}, tree, tree) - } - return pkginfo -} - -function shrinkwrapDeps (deps, top, tree, seen) { - validate('OOO', [deps, top, tree]) - if (!seen) seen = new Set() - if (seen.has(tree)) return - seen.add(tree) - sortModules(tree.children).forEach(function (child) { - var childIsOnlyDev = isOnlyDev(child) - var pkginfo = deps[moduleName(child)] = {} - var requested = getRequested(child) || child.package._requested || {} - pkginfo.version = childVersion(top, child, requested) - if (requested.type === 'git' && child.package._from) { - pkginfo.from = child.package._from - } - if (child.fromBundle || child.isInLink) { - pkginfo.bundled = true - } else { - if (isRegistry(requested)) { - pkginfo.resolved = child.package._resolved - } - // no integrity for git deps as integirty hashes are based on the - // tarball and we can't (yet) create consistent tarballs from a stable - // source. - if (requested.type !== 'git') { - pkginfo.integrity = child.package._integrity || undefined - if (!pkginfo.integrity && child.package._shasum) { - pkginfo.integrity = ssri.fromHex(child.package._shasum, 'sha1') - } - } - } - if (childIsOnlyDev) pkginfo.dev = true - if (isOnlyOptional(child)) pkginfo.optional = true - if (child.requires.length) { - pkginfo.requires = {} - sortModules(child.requires).forEach((required) => { - var requested = getRequested(required, child) || required.package._requested || {} - pkginfo.requires[moduleName(required)] = childRequested(top, required, requested) - }) - } - if (child.children.length) { - pkginfo.dependencies = {} - shrinkwrapDeps(pkginfo.dependencies, top, child, seen) - } - }) -} - -function sortModules (modules) { - // sort modules with the locale-agnostic Unicode sort - var sortedModuleNames = modules.map(moduleName).sort() - return modules.sort((a, b) => ( - sortedModuleNames.indexOf(moduleName(a)) - sortedModuleNames.indexOf(moduleName(b)) - )) -} - -function childVersion (top, child, req) { - if (req.type === 'directory' || req.type === 'file') { - return 'file:' + unixFormatPath(path.relative(top.path, child.package._resolved || req.fetchSpec)) - } else if (!isRegistry(req) && !child.fromBundle) { - return child.package._resolved || req.saveSpec || req.rawSpec - } else { - return child.package.version - } -} - -function childRequested (top, child, requested) { - if (requested.type === 'directory' || requested.type === 'file') { - return 'file:' + unixFormatPath(path.relative(top.path, child.package._resolved || requested.fetchSpec)) - } else if (requested.type === 'git' && child.package._from) { - return child.package._from - } else if (!isRegistry(requested) && !child.fromBundle) { - return child.package._resolved || requested.saveSpec || requested.rawSpec - } else if (requested.type === 'tag') { - // tags are not ranges we can match against, so we invent a "reasonable" - // one based on what we actually installed. - return npm.config.get('save-prefix') + child.package.version - } else if (requested.saveSpec || requested.rawSpec) { - return requested.saveSpec || requested.rawSpec - } else if (child.package._from || (child.package._requested && child.package._requested.rawSpec)) { - return child.package._from.replace(/^@?[^@]+@/, '') || child.package._requested.rawSpec - } else { - return child.package.version - } -} - -function shrinkwrap_ (dir, pkginfo, opts, cb) { - save(dir, pkginfo, opts, cb) -} - -function save (dir, pkginfo, opts, cb) { - // copy the keys over in a well defined order - // because javascript objects serialize arbitrarily - BB.join( - checkPackageFile(dir, SHRINKWRAP), - checkPackageFile(dir, PKGLOCK), - checkPackageFile(dir, 'package.json'), - (shrinkwrap, lockfile, pkg) => { - const info = ( - shrinkwrap || - lockfile || - { - path: path.resolve(dir, opts.defaultFile || PKGLOCK), - data: '{}', - indent: pkg && pkg.indent, - newline: pkg && pkg.newline - } - ) - const updated = updateLockfileMetadata(pkginfo, pkg && JSON.parse(pkg.raw)) - const swdata = stringifyPackage(updated, info.indent, info.newline) - if (swdata === info.raw) { - // skip writing if file is identical - log.verbose('shrinkwrap', `skipping write for ${path.basename(info.path)} because there were no changes.`) - cb(null, pkginfo) - } else { - writeFileAtomic(info.path, swdata, (err) => { - if (err) return cb(err) - if (opts.silent) return cb(null, pkginfo) - if (!shrinkwrap && !lockfile) { - log.notice('', `created a lockfile as ${path.basename(info.path)}. You should commit this file.`) - } - cb(null, pkginfo) - }) - } - } - ).then((file) => { - }, cb) -} - -function updateLockfileMetadata (pkginfo, pkgJson) { - // This is a lot of work just to make sure the extra metadata fields are - // between version and dependencies fields, without affecting any other stuff - const newPkg = {} - let metainfoWritten = false - const metainfo = new Set([ - 'lockfileVersion', - 'preserveSymlinks' - ]) - Object.keys(pkginfo).forEach((k) => { - if (k === 'dependencies') { - writeMetainfo(newPkg) - } - if (!metainfo.has(k)) { - newPkg[k] = pkginfo[k] - } - if (k === 'version') { - writeMetainfo(newPkg) - } - }) - if (!metainfoWritten) { - writeMetainfo(newPkg) - } - function writeMetainfo (pkginfo) { - pkginfo.lockfileVersion = PKGLOCK_VERSION - if (process.env.NODE_PRESERVE_SYMLINKS) { - pkginfo.preserveSymlinks = process.env.NODE_PRESERVE_SYMLINKS - } - metainfoWritten = true - } - return newPkg -} - -function checkPackageFile (dir, name) { - const file = path.resolve(dir, name) - return readFile( - file, 'utf8' - ).then((data) => { - return { - path: file, - raw: data, - indent: detectIndent(data).indent, - newline: detectNewline(data) - } - }).catch({code: 'ENOENT'}, () => {}) -} |