mirror of
https://github.com/nodejs/node.git
synced 2025-05-16 10:12:54 +00:00

PR-URL: https://github.com/nodejs/node/pull/14235 Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Yuta Hiroto <hello@about-hiroppy.com> Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: James M Snell <jasnell@gmail.com>
59 lines
2.0 KiB
JavaScript
59 lines
2.0 KiB
JavaScript
'use strict'
|
|
|
|
const BB = require('bluebird')
|
|
|
|
const fs = require('graceful-fs')
|
|
const iferr = require('iferr')
|
|
const inflateShrinkwrap = require('./inflate-shrinkwrap.js')
|
|
const log = require('npmlog')
|
|
const parseJSON = require('../utils/parse-json.js')
|
|
const path = require('path')
|
|
const PKGLOCK_VERSION = require('../npm.js').lockfileVersion
|
|
|
|
const readFileAsync = BB.promisify(fs.readFile)
|
|
|
|
module.exports = readShrinkwrap
|
|
function readShrinkwrap (child, next) {
|
|
if (child.package._shrinkwrap) return process.nextTick(next)
|
|
BB.join(
|
|
maybeReadFile('npm-shrinkwrap.json', child),
|
|
// Don't read non-root lockfiles
|
|
child.isTop && maybeReadFile('package-lock.json', child),
|
|
child.isTop && maybeReadFile('package.json', child),
|
|
(shrinkwrap, lockfile, pkgJson) => {
|
|
if (shrinkwrap && lockfile) {
|
|
log.warn('read-shrinkwrap', 'Ignoring package-lock.json because there is already an npm-shrinkwrap.json. Please use only one of the two.')
|
|
}
|
|
const name = shrinkwrap ? 'npm-shrinkwrap.json' : 'package-lock.json'
|
|
let parsed = null
|
|
if (shrinkwrap || lockfile) {
|
|
try {
|
|
parsed = parseJSON(shrinkwrap || lockfile)
|
|
} catch (ex) {
|
|
throw ex
|
|
}
|
|
}
|
|
if (parsed && parsed.lockfileVersion !== PKGLOCK_VERSION) {
|
|
log.warn('read-shrinkwrap', `This version of npm is compatible with lockfileVersion@${PKGLOCK_VERSION}, but ${name} was generated for lockfileVersion@${parsed.lockfileVersion || 0}. I'll try to do my best with it!`)
|
|
}
|
|
child.package._shrinkwrap = parsed
|
|
}
|
|
).then(() => next(), next)
|
|
}
|
|
|
|
function maybeReadFile (name, child) {
|
|
return readFileAsync(
|
|
path.join(child.path, name)
|
|
).catch({code: 'ENOENT'}, () => null)
|
|
}
|
|
|
|
module.exports.andInflate = function (child, next) {
|
|
readShrinkwrap(child, iferr(next, function () {
|
|
if (child.package._shrinkwrap) {
|
|
return inflateShrinkwrap(child, child.package._shrinkwrap || {}, next)
|
|
} else {
|
|
return next()
|
|
}
|
|
}))
|
|
}
|