const { resolve, basename } = require('path')
const { unlink } = require('fs').promises
const Arborist = require('@npmcli/arborist')
const log = require('../utils/log-shim')
const BaseCommand = require('../base-command.js')
class Shrinkwrap extends BaseCommand {
static description = 'Lock down dependency versions for publication'
static name = 'shrinkwrap'
static ignoreImplicitWorkspace = false
async exec () {
// if has a npm-shrinkwrap.json, nothing to do
// if has a package-lock.json, rename to npm-shrinkwrap.json
// if has neither, load the actual tree and save that as npm-shrinkwrap.json
//
// loadVirtual, fall back to loadActual
// rename shrinkwrap file type, and tree.meta.save()
if (this.npm.global) {
const er = new Error('`npm shrinkwrap` does not work for global packages')
er.code = 'ESHRINKWRAPGLOBAL'
throw er
}
const path = this.npm.prefix
const sw = resolve(path, 'npm-shrinkwrap.json')
const arb = new Arborist({ ...this.npm.flatOptions, path })
const tree = await arb.loadVirtual().catch(() => arb.loadActual())
const { meta } = tree
const newFile = meta.hiddenLockfile || !meta.loadedFromDisk
const oldFilename = meta.filename
const notSW = !newFile && basename(oldFilename) !== 'npm-shrinkwrap.json'
// The computed lockfile version of a hidden lockfile is always 3
// even if the actual value of the property is a different.
// When shrinkwrap is run with only a hidden lockfile we want to
// set the shrinkwrap lockfile version as whatever was explicitly
// requested with a fallback to the actual value from the hidden
// lockfile.
if (meta.hiddenLockfile) {
meta.lockfileVersion = arb.options.lockfileVersion ||
meta.originalLockfileVersion
}
meta.hiddenLockfile = false
meta.filename = sw
await meta.save()
const updatedVersion = meta.originalLockfileVersion !== meta.lockfileVersion
? meta.lockfileVersion
: null
if (newFile) {
let message = 'created a lockfile as npm-shrinkwrap.json'
if (updatedVersion) {
message += ` with version ${updatedVersion}`
}
log.notice('', message)
} else if (notSW) {
await unlink(oldFilename)
let message = 'package-lock.json has been renamed to npm-shrinkwrap.json'
if (updatedVersion) {
message += ` and updated to version ${updatedVersion}`
}
log.notice('', message)
} else if (updatedVersion) {
log.notice('', `npm-shrinkwrap.json updated to version ${updatedVersion}`)
} else {
log.notice('', 'npm-shrinkwrap.json up to date')
}
}
}
module.exports = Shrinkwrap
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| access.js | File | 6.08 KB | 0644 |
|
| adduser.js | File | 1.32 KB | 0644 |
|
| audit.js | File | 13.86 KB | 0644 |
|
| bugs.js | File | 815 B | 0644 |
|
| cache.js | File | 7.07 KB | 0644 |
|
| ci.js | File | 3.51 KB | 0644 |
|
| completion.js | File | 8.73 KB | 0644 |
|
| config.js | File | 10.04 KB | 0644 |
|
| dedupe.js | File | 1.4 KB | 0644 |
|
| deprecate.js | File | 2.03 KB | 0644 |
|
| diff.js | File | 8.12 KB | 0644 |
|
| dist-tag.js | File | 5.45 KB | 0644 |
|
| docs.js | File | 447 B | 0644 |
|
| doctor.js | File | 11.51 KB | 0644 |
|
| edit.js | File | 2 KB | 0644 |
|
| exec.js | File | 2.54 KB | 0644 |
|
| explain.js | File | 3.55 KB | 0644 |
|
| explore.js | File | 2.3 KB | 0644 |
|
| find-dupes.js | File | 622 B | 0644 |
|
| fund.js | File | 6.51 KB | 0644 |
|
| get.js | File | 524 B | 0644 |
|
| help-search.js | File | 5.49 KB | 0644 |
|
| help.js | File | 3.54 KB | 0644 |
|
| hook.js | File | 3.77 KB | 0644 |
|
| init.js | File | 6.9 KB | 0644 |
|
| install-ci-test.js | File | 373 B | 0644 |
|
| install-test.js | File | 370 B | 0644 |
|
| install.js | File | 5.11 KB | 0644 |
|
| link.js | File | 5.15 KB | 0644 |
|
| ll.js | File | 234 B | 0644 |
|
| login.js | File | 1.32 KB | 0644 |
|
| logout.js | File | 1.3 KB | 0644 |
|
| ls.js | File | 16.73 KB | 0644 |
|
| org.js | File | 4.14 KB | 0644 |
|
| outdated.js | File | 8.76 KB | 0644 |
|
| owner.js | File | 5.91 KB | 0644 |
|
| pack.js | File | 2.37 KB | 0644 |
|
| ping.js | File | 917 B | 0644 |
|
| pkg.js | File | 3.5 KB | 0644 |
|
| prefix.js | File | 303 B | 0644 |
|
| profile.js | File | 11.19 KB | 0644 |
|
| prune.js | File | 779 B | 0644 |
|
| publish.js | File | 6.5 KB | 0644 |
|
| query.js | File | 2.9 KB | 0644 |
|
| rebuild.js | File | 2.14 KB | 0644 |
|
| repo.js | File | 1.24 KB | 0644 |
|
| restart.js | File | 310 B | 0644 |
|
| root.js | File | 258 B | 0644 |
|
| run-script.js | File | 6.81 KB | 0644 |
|
| search.js | File | 2.68 KB | 0644 |
|
| set.js | File | 572 B | 0644 |
|
| shrinkwrap.js | File | 2.64 KB | 0644 |
|
| star.js | File | 1.87 KB | 0644 |
|
| stars.js | File | 1.03 KB | 0644 |
|
| start.js | File | 300 B | 0644 |
|
| stop.js | File | 295 B | 0644 |
|
| team.js | File | 4.44 KB | 0644 |
|
| test.js | File | 295 B | 0644 |
|
| token.js | File | 6.64 KB | 0644 |
|
| uninstall.js | File | 1.51 KB | 0644 |
|
| unpublish.js | File | 4.54 KB | 0644 |
|
| unstar.js | File | 182 B | 0644 |
|
| update.js | File | 1.71 KB | 0644 |
|
| version.js | File | 3.58 KB | 0644 |
|
| view.js | File | 14.38 KB | 0644 |
|
| whoami.js | File | 474 B | 0644 |
|