deps: upgrade npm to 8.5.0

PR-URL: https://github.com/nodejs/node/pull/41925
Reviewed-By: Derek Lewis <DerekNonGeneric@inf.is>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Mestery <mestery@protonmail.com>
This commit is contained in:
npm-robot 2022-02-11 11:51:11 +02:00 committed by GitHub
parent 214d7da675
commit 69ffb3e77f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
48 changed files with 1050 additions and 235 deletions

View file

@ -388,3 +388,4 @@ project.
* [npm stop](/commands/npm-stop)
* [npm config](/commands/npm-config)
* [npm workspaces](/using-npm/workspaces)
* [npx](/commands/npx)

View file

@ -175,3 +175,4 @@ This resulted in some shifts in its functionality:
* [npm restart](/commands/npm-restart)
* [npm stop](/commands/npm-stop)
* [npm config](/commands/npm-config)
* [npm exec](/commands/npm-exec)

View file

@ -1351,7 +1351,7 @@ If a package would be saved at install time by the use of `--save`,
`--save-dev`, or `--save-optional`, then also put it in the
`bundleDependencies` list.
Ignore if `--save-peer` is set, since peerDependencies cannot be bundled.
Ignored if `--save-peer` is set, since peerDependencies cannot be bundled.
<!-- automatically generated, do not edit manually -->
<!-- see lib/utils/config/definitions.js -->

View file

@ -440,6 +440,7 @@ project.</p>
<li><a href="../commands/npm-stop.html">npm stop</a></li>
<li><a href="../commands/npm-config.html">npm config</a></li>
<li><a href="../using-npm/workspaces.html">npm workspaces</a></li>
<li><a href="../commands/npx.html">npx</a></li>
</ul>
</div>

View file

@ -160,7 +160,7 @@ tree at all, use <a href="../commands/npm-explain.html"><code>npm explain</code>
the results to only the paths to the packages named. Note that nested
packages will <em>also</em> show the paths to the specified packages. For
example, running <code>npm ls promzard</code> in npm's source tree will show:</p>
<pre lang="bash"><code>npm@8.4.1 /path/to/npm
<pre lang="bash"><code>npm@8.5.0 /path/to/npm
└─┬ init-package-json@0.0.4
└── promzard@0.1.5
</code></pre>

View file

@ -149,7 +149,7 @@ npm command-line interface
<pre lang="bash"><code>npm &lt;command&gt; [args]
</code></pre>
<h3 id="version">Version</h3>
<p>8.4.1</p>
<p>8.5.0</p>
<h3 id="description">Description</h3>
<p>npm is the package manager for the Node JavaScript platform. It puts
modules in place so that node can find them, and manages dependency

View file

@ -277,6 +277,7 @@ in the <code>npx</code> executable for backwards compatibility.</li>
<li><a href="../commands/npm-restart.html">npm restart</a></li>
<li><a href="../commands/npm-stop.html">npm stop</a></li>
<li><a href="../commands/npm-config.html">npm config</a></li>
<li><a href="../commands/npm-exec.html">npm exec</a></li>
</ul>
</div>

View file

@ -1229,7 +1229,7 @@ defaults to <code>false</code></li>
<p>If a package would be saved at install time by the use of <code>--save</code>,
<code>--save-dev</code>, or <code>--save-optional</code>, then also put it in the
<code>bundleDependencies</code> list.</p>
<p>Ignore if <code>--save-peer</code> is set, since peerDependencies cannot be bundled.</p>
<p>Ignored if <code>--save-peer</code> is set, since peerDependencies cannot be bundled.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h4 id="save-dev"><code>save-dev</code></h4>

View file

@ -2,6 +2,7 @@ const liborg = require('libnpmorg')
const otplease = require('../utils/otplease.js')
const Table = require('cli-table3')
const BaseCommand = require('../base-command.js')
const log = require('../utils/log-shim.js')
class Org extends BaseCommand {
static description = 'Manage orgs'
@ -32,7 +33,10 @@ class Org extends BaseCommand {
}
async exec ([cmd, orgname, username, role], cb) {
return otplease(this.npm.flatOptions, opts => {
return otplease({
...this.npm.flatOptions,
log,
}, opts => {
switch (cmd) {
case 'add':
case 'set':

View file

@ -1,11 +1,8 @@
const util = require('util')
const pacote = require('pacote')
const libpack = require('libnpmpack')
const npa = require('npm-package-arg')
const path = require('path')
const log = require('../utils/log-shim')
const { getContents, logTar } = require('../utils/tar.js')
const writeFile = util.promisify(require('fs').writeFile)
const BaseCommand = require('../base-command.js')
class Pack extends BaseCommand {
@ -28,7 +25,6 @@ class Pack extends BaseCommand {
}
const unicode = this.npm.config.get('unicode')
const dryRun = this.npm.config.get('dry-run')
const json = this.npm.config.get('json')
// Get the manifests and filenames first so we can bail early on manifest
@ -40,24 +36,15 @@ class Pack extends BaseCommand {
if (!manifest._id) {
throw new Error('Invalid package, must have name and version')
}
const filename = `${manifest.name}-${manifest.version}.tgz`
.replace(/^@/, '').replace(/\//, '-')
manifests.push({ arg, filename, manifest })
manifests.push({ arg, manifest })
}
// Load tarball names up for printing afterward to isolate from the
// noise generated during packing
const tarballs = []
for (const { arg, filename, manifest } of manifests) {
for (const { arg, manifest } of manifests) {
const tarballData = await libpack(arg, this.npm.flatOptions)
const pkgContents = await getContents(manifest, tarballData)
const tarballFilename = path.resolve(this.npm.config.get('pack-destination'), filename)
if (!dryRun) {
await writeFile(tarballFilename, tarballData)
}
tarballs.push(pkgContents)
}

View file

@ -83,7 +83,8 @@ class Publish extends BaseCommand {
})
}
const tarballData = await pack(spec, opts)
// we pass dryRun: true to libnpmpack so it doesn't write the file to disk
const tarballData = await pack(spec, { ...opts, dryRun: true })
const pkgContents = await getContents(manifest, tarballData)
// The purpose of re-reading the manifest is in case it changed,

View file

@ -84,7 +84,7 @@ class Unpublish extends BaseCommand {
)
}
const opts = this.npm.flatOptions
const opts = { ...this.npm.flatOptions, log }
if (!spec || path.resolve(spec.name) === this.npm.localPrefix) {
// if there's a package.json in the current folder, then
// read the package name and version out of that.

View file

@ -1455,6 +1455,7 @@ define('pack-destination', {
description: `
Directory in which \`npm pack\` will save tarballs.
`,
flatten,
})
define('parseable', {
@ -1587,7 +1588,7 @@ define('save', {
default: true,
defaultDescription: `\`true\` unless when using \`npm update\` or
\`npm dedupe\` where it defaults to \`false\``,
usage: '-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer',
usage: '-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle',
type: Boolean,
short: 'S',
description: `
@ -1610,7 +1611,7 @@ define('save-bundle', {
\`--save-dev\`, or \`--save-optional\`, then also put it in the
\`bundleDependencies\` list.
Ignore if \`--save-peer\` is set, since peerDependencies cannot be bundled.
Ignored if \`--save-peer\` is set, since peerDependencies cannot be bundled.
`,
flatten (key, obj, flatOptions) {
// XXX update arborist to just ignore it if resulting saveType is peer

View file

@ -462,5 +462,7 @@ npm help stop
npm help config
.IP \(bu 2
npm help workspaces
.IP \(bu 2
npm help npx
.RE

View file

@ -26,7 +26,7 @@ example, running \fBnpm ls promzard\fP in npm's source tree will show:
.P
.RS 2
.nf
npm@8\.4\.1 /path/to/npm
npm@8\.5\.0 /path/to/npm
└─┬ init\-package\-json@0\.0\.4
└── promzard@0\.1\.5
.fi

View file

@ -10,7 +10,7 @@ npm <command> [args]
.RE
.SS Version
.P
8\.4\.1
8\.5\.0
.SS Description
.P
npm is the package manager for the Node JavaScript platform\. It puts

View file

@ -209,5 +209,7 @@ npm help restart
npm help stop
.IP \(bu 2
npm help config
.IP \(bu 2
npm help exec
.RE

View file

@ -1704,7 +1704,7 @@ If a package would be saved at install time by the use of \fB\-\-save\fP,
\fB\-\-save\-dev\fP, or \fB\-\-save\-optional\fP, then also put it in the
\fBbundleDependencies\fP list\.
.P
Ignore if \fB\-\-save\-peer\fP is set, since peerDependencies cannot be bundled\.
Ignored if \fB\-\-save\-peer\fP is set, since peerDependencies cannot be bundled\.
<!\-\- automatically generated, do not edit manually \-\->
<!\-\- see lib/utils/config/definitions\.js \-\->

View file

@ -1250,24 +1250,40 @@ This is a one-time fix-up, please be patient...
// Don't bother to load the manifest for link deps, because the target
// might be within another package that doesn't exist yet.
const { legacyPeerDeps } = this
return spec.type === 'directory'
? this[_linkFromSpec](name, spec, parent, edge)
: this[_fetchManifest](spec)
.then(pkg => new Node({ name, pkg, parent, legacyPeerDeps }), error => {
error.requiredBy = edge.from.location || '.'
// failed to load the spec, either because of enotarget or
// fetch failure of some other sort. save it so we can verify
// later that it's optional, otherwise the error is fatal.
const n = new Node({
name,
parent,
error,
legacyPeerDeps,
})
this[_loadFailures].add(n)
return n
// spec is a directory, link it
if (spec.type === 'directory') {
return this[_linkFromSpec](name, spec, parent, edge)
}
// if the spec matches a workspace name, then see if the workspace node will
// satisfy the edge. if it does, we return the workspace node to make sure it
// takes priority.
if (this.idealTree.workspaces && this.idealTree.workspaces.has(spec.name)) {
const existingNode = this.idealTree.edgesOut.get(spec.name).to
if (existingNode && existingNode.isWorkspace && existingNode.satisfies(edge)) {
return edge.to
}
}
// spec isn't a directory, and either isn't a workspace or the workspace we have
// doesn't satisfy the edge. try to fetch a manifest and build a node from that.
return this[_fetchManifest](spec)
.then(pkg => new Node({ name, pkg, parent, legacyPeerDeps }), error => {
error.requiredBy = edge.from.location || '.'
// failed to load the spec, either because of enotarget or
// fetch failure of some other sort. save it so we can verify
// later that it's optional, otherwise the error is fatal.
const n = new Node({
name,
parent,
error,
legacyPeerDeps,
})
this[_loadFailures].add(n)
return n
})
}
[_linkFromSpec] (name, spec, parent, edge) {

View file

@ -1369,6 +1369,10 @@ module.exports = cls => class Reifier extends cls {
devDependencies = {},
optionalDependencies = {},
peerDependencies = {},
// bundleDependencies is not required by PackageJson like the other fields here
// PackageJson also doesn't omit an empty array for this field so defaulting this
// to an empty array would add that field to every package.json file.
bundleDependencies,
} = tree.package
pkgJson.update({
@ -1376,6 +1380,7 @@ module.exports = cls => class Reifier extends cls {
devDependencies,
optionalDependencies,
peerDependencies,
bundleDependencies,
})
await pkgJson.save()
}

View file

@ -1,6 +1,6 @@
{
"name": "@npmcli/arborist",
"version": "4.3.0",
"version": "4.3.1",
"description": "Manage node_modules trees",
"dependencies": {
"@isaacs/string-locale-compare": "^1.1.0",

View file

@ -3,11 +3,12 @@
const envExpr = /(\\*)\$\{([^}]+)\}/g
module.exports = (f, env) => f.replace(envExpr, (orig, esc, name) => {
const val = env[name] !== undefined ? env[name] : `\$\{${name}\}`
const val = env[name] !== undefined ? env[name] : `$\{${name}}`
// consume the escape chars that are relevant.
if (esc.length % 2)
if (esc.length % 2) {
return orig.substr((esc.length + 1) / 2)
}
return (esc.substr(esc.length / 2)) + val
})

View file

@ -3,6 +3,8 @@ const walkUp = require('walk-up-path')
const ini = require('ini')
const nopt = require('nopt')
const mkdirp = require('mkdirp-infer-owner')
const mapWorkspaces = require('@npmcli/map-workspaces')
const rpj = require('read-package-json-fast')
/* istanbul ignore next */
const myUid = process.getuid && process.getuid()
@ -91,7 +93,6 @@ class Config {
execPath = process.execPath,
cwd = process.cwd(),
}) {
// turn the definitions into nopt's weirdo syntax
this.definitions = definitions
const types = {}
@ -100,8 +101,9 @@ class Config {
for (const [key, def] of Object.entries(definitions)) {
defaults[key] = def.default
types[key] = def.type
if (def.deprecated)
if (def.deprecated) {
this.deprecated[key] = def.deprecated.trim().replace(/\n +/, '\n')
}
}
// populated the first time we flatten the object
@ -162,41 +164,48 @@ class Config {
// return the location where key is found.
find (key) {
if (!this.loaded)
if (!this.loaded) {
throw new Error('call config.load() before reading values')
}
return this[_find](key)
}
[_find] (key) {
// have to look in reverse order
const entries = [...this.data.entries()]
for (let i = entries.length - 1; i > -1; i--) {
const [where, { data }] = entries[i]
if (hasOwnProperty(data, key))
if (hasOwnProperty(data, key)) {
return where
}
}
return null
}
get (key, where) {
if (!this.loaded)
if (!this.loaded) {
throw new Error('call config.load() before reading values')
}
return this[_get](key, where)
}
// we need to get values sometimes, so use this internal one to do so
// while in the process of loading.
[_get] (key, where = null) {
if (where !== null && !confTypes.has(where)) {
throw new Error('invalid config location param: ' + where)
}
const { data, source } = this.data.get(where || 'cli')
const { data } = this.data.get(where || 'cli')
return where === null || hasOwnProperty(data, key) ? data[key] : undefined
}
set (key, val, where = 'cli') {
if (!this.loaded)
if (!this.loaded) {
throw new Error('call config.load() before setting values')
if (!confTypes.has(where))
}
if (!confTypes.has(where)) {
throw new Error('invalid config location param: ' + where)
}
this[_checkDeprecated](key)
const { data } = this.data.get(where)
data[key] = val
@ -209,8 +218,9 @@ class Config {
}
get flat () {
if (this[_flatOptions])
if (this[_flatOptions]) {
return this[_flatOptions]
}
// create the object for flat options passed to deps
process.emit('time', 'config:load:flatten')
@ -225,16 +235,19 @@ class Config {
}
delete (key, where = 'cli') {
if (!this.loaded)
if (!this.loaded) {
throw new Error('call config.load() before deleting values')
if (!confTypes.has(where))
}
if (!confTypes.has(where)) {
throw new Error('invalid config location param: ' + where)
}
delete this.data.get(where).data[key]
}
async load () {
if (this.loaded)
if (this.loaded) {
throw new Error('attempting to load npm config multiple times')
}
process.emit('time', 'config:load')
// first load the defaults, which sets the global prefix
@ -282,7 +295,9 @@ class Config {
const creds = this.getCredentialsByURI(reg)
// ignore this error because a failed set will strip out anything that
// might be a security hazard, which was the intention.
try { this.setCredentialsByURI(reg, creds) } catch (_) {}
try {
this.setCredentialsByURI(reg, creds)
} catch (_) {}
process.emit('timeEnd', 'config:load:credentials')
// set proper globalPrefix now that everything is loaded
@ -319,14 +334,16 @@ class Config {
}
loadHome () {
if (this.env.HOME)
if (this.env.HOME) {
return this.home = this.env.HOME
}
this.home = homedir()
}
loadGlobalPrefix () {
if (this.globalPrefix)
if (this.globalPrefix) {
throw new Error('cannot load default global prefix more than once')
}
if (this.env.PREFIX) {
this.globalPrefix = this.env.PREFIX
@ -338,17 +355,18 @@ class Config {
this.globalPrefix = dirname(dirname(this.execPath))
// destdir only is respected on Unix
if (this.env.DESTDIR)
if (this.env.DESTDIR) {
this.globalPrefix = join(this.env.DESTDIR, this.globalPrefix)
}
}
}
loadEnv () {
const prefix = 'npm_config_'
const conf = Object.create(null)
for (const [envKey, envVal] of Object.entries(this.env)) {
if (!/^npm_config_/i.test(envKey) || envVal === '')
if (!/^npm_config_/i.test(envKey) || envVal === '') {
continue
}
const key = envKey.substr('npm_config_'.length)
.replace(/(?!^)_/g, '-') // don't replace _ at the start of the key
.toLowerCase()
@ -368,9 +386,10 @@ class Config {
}
get valid () {
for (const [where, {valid}] of this.data.entries()) {
if (valid === false || valid === null && !this.validate(where))
for (const [where, { valid }] of this.data.entries()) {
if (valid === false || valid === null && !this.validate(where)) {
return false
}
}
return true
}
@ -378,11 +397,12 @@ class Config {
validate (where) {
if (!where) {
let valid = true
for (const [where, obj] of this.data.entries()) {
for (const [where] of this.data.entries()) {
// no need to validate our defaults, we know they're fine
// cli was already validated when parsed the first time
if (where === 'default' || where === 'builtin' || where === 'cli')
if (where === 'default' || where === 'builtin' || where === 'cli') {
continue
}
const ret = this.validate(where)
valid = valid && ret
}
@ -424,14 +444,15 @@ class Config {
this.data.get(where)[_valid] = false
if (Array.isArray(type)) {
if (type.includes(typeDefs.url.type))
if (type.includes(typeDefs.url.type)) {
type = typeDefs.url.type
else {
} else {
/* istanbul ignore if - no actual configs matching this, but
* path types SHOULD be handled this way, like URLs, for the
* same reason */
if (type.includes(typeDefs.path.type))
if (type.includes(typeDefs.path.type)) {
type = typeDefs.path.type
}
}
}
@ -469,15 +490,17 @@ class Config {
this.sources.set(source, where)
if (er) {
conf.loadError = er
if (er.code !== 'ENOENT')
if (er.code !== 'ENOENT') {
this.log.verbose('config', `error loading ${where} config`, er)
}
} else {
conf.raw = obj
for (const [key, value] of Object.entries(obj)) {
const k = envReplace(key, this.env)
const v = this.parseField(value, k)
if (where !== 'default')
if (where !== 'default') {
this[_checkDeprecated](k, where, obj, [key, value])
}
conf.data[k] = v
}
}
@ -528,9 +551,9 @@ class Config {
// up loading the "project" config where the "userconfig" will be,
// which causes some calamaties. So, we only load project config if
// it doesn't match what the userconfig will be.
if (projectFile !== this[_get]('userconfig'))
if (projectFile !== this[_get]('userconfig')) {
return this[_loadFile](projectFile, 'project')
else {
} else {
this.data.get('project').source = '(same as "user" config, ignored)'
this.sources.set(this.data.get('project').source, 'project')
}
@ -543,23 +566,65 @@ class Config {
return
}
const cliWorkspaces = this[_get]('workspaces', 'cli')
for (const p of walkUp(this.cwd)) {
// walk up until we have a nm dir or a pj file
const hasAny = (await Promise.all([
stat(resolve(p, 'node_modules'))
.then(st => st.isDirectory())
.catch(() => false),
stat(resolve(p, 'package.json'))
.then(st => st.isFile())
.catch(() => false),
])).some(is => is)
if (hasAny) {
const hasNodeModules = await stat(resolve(p, 'node_modules'))
.then((st) => st.isDirectory())
.catch(() => false)
const hasPackageJson = await stat(resolve(p, 'package.json'))
.then((st) => st.isFile())
.catch(() => false)
if (!this.localPrefix && (hasNodeModules || hasPackageJson)) {
this.localPrefix = p
return
// if workspaces are disabled, return now
if (cliWorkspaces === false) {
return
}
// otherwise, continue the loop
continue
}
if (this.localPrefix && hasPackageJson) {
// if we already set localPrefix but this dir has a package.json
// then we need to see if `p` is a workspace root by reading its package.json
// however, if reading it fails then we should just move on
const pkg = await rpj(resolve(p, 'package.json')).catch(() => false)
if (!pkg) {
continue
}
const workspaces = await mapWorkspaces({ cwd: p, pkg })
for (const w of workspaces.values()) {
if (w === this.localPrefix) {
// see if there's a .npmrc file in the workspace, if so log a warning
const hasNpmrc = await stat(resolve(this.localPrefix, '.npmrc'))
.then((st) => st.isFile())
.catch(() => false)
if (hasNpmrc) {
this.log.warn(`ignoring workspace config at ${this.localPrefix}/.npmrc`)
}
// set the workspace in the default layer, which allows it to be overridden easily
const { data } = this.data.get('default')
data.workspace = [this.localPrefix]
this.localPrefix = p
this.log.info(`found workspace root at ${this.localPrefix}`)
// we found a root, so we return now
return
}
}
}
}
this.localPrefix = this.cwd
if (!this.localPrefix) {
this.localPrefix = this.cwd
}
}
loadUserConfig () {
@ -571,10 +636,12 @@ class Config {
}
async save (where) {
if (!this.loaded)
if (!this.loaded) {
throw new Error('call config.load() before saving')
if (!confFileTypes.has(where))
}
if (!confFileTypes.has(where)) {
throw new Error('invalid config location param: ' + where)
}
const conf = this.data.get(where)
conf[_raw] = { ...conf.data }
conf[_loadError] = null
@ -586,7 +653,9 @@ class Config {
// we ignore this error because the failed set already removed
// anything that might be a security hazard, and it won't be
// saved back to the .npmrc file, so we're good.
try { this.setCredentialsByURI(reg, creds) } catch (_) {}
try {
this.setCredentialsByURI(reg, creds)
} catch (_) {}
}
const iniData = ini.stringify(conf.data).trim() + '\n'
@ -602,8 +671,9 @@ class Config {
/* istanbul ignore if - this is best-effort and a pita to test */
if (myUid === 0) {
const st = await stat(dir).catch(() => null)
if (st && (st.uid !== myUid || st.gid !== myGid))
if (st && (st.uid !== myUid || st.gid !== myGid)) {
await chown(conf.source, st.uid, st.gid).catch(() => {})
}
}
const mode = where === 'user' ? 0o600 : 0o666
await chmod(conf.source, mode)
@ -651,8 +721,9 @@ class Config {
email = email ||
this.get('email', 'user') ||
this.get(`${nerfed}:email`, 'user')
if (email)
if (email) {
this.set('email', email, 'user')
}
}
// field that hasn't been used as documented for a LONG time,
@ -668,10 +739,12 @@ class Config {
this.delete(`${nerfed}:_password`, 'user')
this.delete(`${nerfed}:username`, 'user')
} else if (username || password) {
if (!username)
if (!username) {
throw new Error('must include username')
if (!password)
}
if (!password) {
throw new Error('must include password')
}
this.delete(`${nerfed}:_authToken`, 'user')
this.set(`${nerfed}:username`, username, 'user')
// note: not encrypted, no idea why we bothered to do this, but oh well
@ -689,8 +762,9 @@ class Config {
const creds = {}
const email = this.get(`${nerfed}:email`) || this.get('email')
if (email)
if (email) {
creds.email = email
}
const tokenReg = this.get(`${nerfed}:_authToken`) ||
this.get(`${nerfed}:_authtoken`) ||
@ -725,8 +799,9 @@ class Config {
// at this point, we can only use the values if the URI is the
// default registry.
const defaultNerf = nerfDart(this.get('registry'))
if (nerfed !== defaultNerf)
if (nerfed !== defaultNerf) {
return creds
}
const userDef = this.get('username')
const passDef = this.get('_password')
@ -741,8 +816,9 @@ class Config {
// Handle the old-style _auth=<base64> style for the default
// registry, if set.
const auth = this.get('_auth')
if (!auth)
if (!auth) {
return creds
}
const authDecode = Buffer.from(auth, 'base64').toString('utf8')
const authSplit = authDecode.split(':')
@ -755,7 +831,9 @@ class Config {
// set up the environment object we have with npm_config_* environs
// for all configs that are different from their default values, and
// set EDITOR and HOME.
setEnvs () { setEnvs(this) }
setEnvs () {
setEnvs(this)
}
}
const _data = Symbol('data')
@ -781,25 +859,37 @@ class ConfigData {
}
set source (s) {
if (this[_source])
if (this[_source]) {
throw new Error('cannot set ConfigData source more than once')
}
this[_source] = s
}
get source () { return this[_source] }
get source () {
return this[_source]
}
set loadError (e) {
if (this[_loadError] || this[_raw])
if (this[_loadError] || this[_raw]) {
throw new Error('cannot set ConfigData loadError after load')
}
this[_loadError] = e
}
get loadError () { return this[_loadError] }
get loadError () {
return this[_loadError]
}
set raw (r) {
if (this[_raw] || this[_loadError])
if (this[_raw] || this[_loadError]) {
throw new Error('cannot set ConfigData raw after load')
}
this[_raw] = r
}
get raw () { return this[_raw] }
get raw () {
return this[_raw]
}
}
module.exports = Config

View file

@ -6,10 +6,11 @@ const { resolve } = require('path')
const { parse: umaskParse } = require('./umask.js')
const parseField = (f, key, opts, listElement = false) => {
if (typeof f !== 'string' && !Array.isArray(f))
if (typeof f !== 'string' && !Array.isArray(f)) {
return f
}
const { platform, types, log, home, env } = opts
const { platform, types, home, env } = opts
// type can be array or a single thing. coerce to array.
const typeList = new Set([].concat(types[key]))
@ -20,8 +21,9 @@ const parseField = (f, key, opts, listElement = false) => {
const isNumber = typeList.has(typeDefs.Number.type)
const isList = !listElement && typeList.has(Array)
if (Array.isArray(f))
if (Array.isArray(f)) {
return !isList ? f : f.map(field => parseField(field, key, opts, true))
}
// now we know it's a string
f = f.trim()
@ -29,12 +31,14 @@ const parseField = (f, key, opts, listElement = false) => {
// list types get put in the environment separated by double-\n
// usually a single \n would suffice, but ca/cert configs can contain
// line breaks and multiple entries.
if (isList)
if (isList) {
return parseField(f.split('\n\n'), key, opts)
}
// --foo is like --foo=true for boolean types
if (isBool && !isString && f === '')
if (isBool && !isString && f === '') {
return true
}
// string types can be the string 'true', 'false', etc.
// otherwise, parse these values out
@ -51,10 +55,11 @@ const parseField = (f, key, opts, listElement = false) => {
if (isPath) {
const homePattern = platform === 'win32' ? /^~(\/|\\)/ : /^~\//
if (homePattern.test(f) && home)
if (homePattern.test(f) && home) {
f = resolve(home, f.substr(2))
else
} else {
f = resolve(f)
}
}
if (isUmask) {
@ -66,8 +71,9 @@ const parseField = (f, key, opts, listElement = false) => {
}
}
if (isNumber && !isNaN(f))
if (isNumber && !isNaN(f)) {
f = +f
}
return f
}

View file

@ -22,15 +22,17 @@ const sameConfigValue = (def, val) =>
: sameArrayValue(def, val)
const sameArrayValue = (def, val) => {
if (def.length !== val.length)
if (def.length !== val.length) {
return false
}
for (let i = 0; i < def.length; i++) {
/* istanbul ignore next - there are no array configs where the default
* is not an empty array, so this loop is a no-op, but it's the correct
* thing to do if we ever DO add a config like that. */
if (def[i] !== val[i])
if (def[i] !== val[i]) {
return false
}
}
return true
}
@ -38,16 +40,15 @@ const sameArrayValue = (def, val) => {
const setEnv = (env, rawKey, rawVal) => {
const val = envVal(rawVal)
const key = envKey(rawKey, val)
if (key && val !== null)
if (key && val !== null) {
env[key] = val
}
}
const setEnvs = (config) => {
// This ensures that all npm config values that are not the defaults are
// shared appropriately with child processes, without false positives.
const {
globalPrefix,
platform,
env,
defaults,
definitions,
@ -68,19 +69,22 @@ const setEnvs = (config) => {
const envSet = new Set(Object.keys(envConf))
for (const key in cliConf) {
const { deprecated, envExport = true } = definitions[key] || {}
if (deprecated || envExport === false)
if (deprecated || envExport === false) {
continue
}
if (sameConfigValue(defaults[key], cliConf[key])) {
// config is the default, if the env thought different, then we
// have to set it BACK to the default in the environment.
if (!sameConfigValue(envConf[key], cliConf[key]))
if (!sameConfigValue(envConf[key], cliConf[key])) {
setEnv(env, key, cliConf[key])
}
} else {
// config is not the default. if the env wasn't the one to set
// it that way, then we have to put it in the env
if (!(envSet.has(key) && !cliSet.has(key)))
if (!(envSet.has(key) && !cliSet.has(key))) {
setEnv(env, key, cliConf[key])
}
}
}
@ -88,16 +92,19 @@ const setEnvs = (config) => {
env.HOME = config.home
env.npm_config_global_prefix = config.globalPrefix
env.npm_config_local_prefix = config.localPrefix
if (cliConf.editor)
if (cliConf.editor) {
env.EDITOR = cliConf.editor
}
// note: this doesn't afect the *current* node process, of course, since
// it's already started, but it does affect the options passed to scripts.
if (cliConf['node-options'])
if (cliConf['node-options']) {
env.NODE_OPTIONS = cliConf['node-options']
}
if (require.main && require.main.filename)
if (require.main && require.main.filename) {
env.npm_execpath = require.main.filename
}
env.NODE = env.npm_node_execpath = config.execPath
}

View file

@ -5,15 +5,17 @@ const { Umask, validate: validateUmask } = require('./umask.js')
const semver = require('semver')
const validateSemver = (data, k, val) => {
const valid = semver.valid(val)
if (!valid)
if (!valid) {
return false
}
data[k] = valid
}
const noptValidatePath = nopt.typeDefs.path.validate
const validatePath = (data, k, val) => {
if (typeof val !== 'string')
if (typeof val !== 'string') {
return false
}
return noptValidatePath(data, k, val)
}

View file

@ -2,15 +2,18 @@
// returns a string for one thing, or an array of descriptions
const typeDefs = require('./type-defs.js')
const typeDescription = t => {
if (!t || typeof t !== 'function' && typeof t !== 'object')
if (!t || typeof t !== 'function' && typeof t !== 'object') {
return t
}
if (Array.isArray(t))
if (Array.isArray(t)) {
return t.map(t => typeDescription(t))
}
for (const { type, description } of Object.values(typeDefs)) {
if (type === t)
if (type === t) {
return description || type
}
}
return t

View file

@ -1,18 +1,21 @@
class Umask {}
const parse = val => {
if (typeof val === 'string') {
if (/^0o?[0-7]+$/.test(val))
if (/^0o?[0-7]+$/.test(val)) {
return parseInt(val.replace(/^0o?/, ''), 8)
else if (/^[1-9][0-9]*$/.test(val))
} else if (/^[1-9][0-9]*$/.test(val)) {
return parseInt(val, 10)
else
} else {
throw new Error(`invalid umask value: ${val}`)
}
}
if (typeof val !== 'number')
if (typeof val !== 'number') {
throw new Error(`invalid umask value: ${val}`)
}
val = Math.floor(val)
if (val < 0 || val > 511)
if (val < 0 || val > 511) {
throw new Error(`invalid umask value: ${val}`)
}
return val
}

View file

@ -1,7 +1,8 @@
{
"name": "@npmcli/config",
"version": "2.4.0",
"version": "3.0.0",
"files": [
"bin",
"lib"
],
"main": "lib/index.js",
@ -10,30 +11,41 @@
"type": "git",
"url": "git+https://github.com/npm/config"
},
"author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
"author": "GitHub Inc.",
"license": "ISC",
"scripts": {
"test": "tap",
"snap": "tap",
"preversion": "npm test",
"postversion": "npm publish",
"prepublishOnly": "git push origin --follow-tags"
"prepublishOnly": "git push origin --follow-tags",
"lint": "eslint '**/*.js'",
"postlint": "npm-template-check",
"lintfix": "npm run lint -- --fix",
"posttest": "npm run lint",
"template-copy": "npm-template-copy --force"
},
"tap": {
"check-coverage": true,
"coverage-map": "map.js"
},
"devDependencies": {
"@npmcli/template-oss": "^2.5.1",
"tap": "^15.0.4"
},
"dependencies": {
"@npmcli/map-workspaces": "^2.0.0",
"ini": "^2.0.0",
"mkdirp-infer-owner": "^2.0.0",
"nopt": "^5.0.0",
"read-package-json-fast": "^2.0.3",
"semver": "^7.3.4",
"walk-up-path": "^1.0.0"
},
"engines": {
"node": ">=10"
"node": "^12.13.0 || ^14.15.0 || >=16"
},
"templateOSS": {
"version": "2.6.0"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "are-we-there-yet",
"version": "2.0.0",
"version": "3.0.0",
"description": "Keep track of the overall completion of many disparate processes",
"main": "lib/index.js",
"scripts": {
@ -13,7 +13,9 @@
"preversion": "npm test",
"postversion": "npm publish",
"prepublishOnly": "git push origin --follow-tags",
"snap": "tap"
"snap": "tap",
"postlint": "npm-template-check",
"template-copy": "npm-template-copy --force"
},
"repository": {
"type": "git",
@ -26,9 +28,9 @@
},
"homepage": "https://github.com/npm/are-we-there-yet",
"devDependencies": {
"@npmcli/eslint-config": "^1.0.0",
"@npmcli/template-oss": "^1.0.2",
"eslint": "^7.32.0",
"@npmcli/eslint-config": "^2.0.0",
"@npmcli/template-oss": "^2.7.1",
"eslint": "^8.8.0",
"eslint-plugin-node": "^11.1.0",
"tap": "^15.0.9"
},
@ -41,7 +43,7 @@
"lib"
],
"engines": {
"node": ">=10"
"node": "^12.13.0 || ^14.15.0 || >=16"
},
"tap": {
"branches": 68,
@ -49,5 +51,7 @@
"functions": 86,
"lines": 92
},
"templateVersion": "1.0.2"
"templateOSS": {
"version": "2.7.1"
}
}

View file

@ -3,6 +3,9 @@
const pacote = require('pacote')
const npa = require('npm-package-arg')
const runScript = require('@npmcli/run-script')
const path = require('path')
const util = require('util')
const writeFile = util.promisify(require('fs').writeFile)
module.exports = pack
async function pack (spec = 'file:.', opts = {}) {
@ -33,6 +36,14 @@ async function pack (spec = 'file:.', opts = {}) {
integrity: manifest._integrity,
})
// check for explicit `false` so the default behavior is to skip writing to disk
if (opts.dryRun === false) {
const filename = `${manifest.name}-${manifest.version}.tgz`
.replace(/^@/, '').replace(/\//, '-')
const destination = path.resolve(opts.packDestination, filename)
await writeFile(destination, tarball)
}
if (spec.type === 'directory') {
// postpack
await runScript({

View file

@ -1,6 +1,6 @@
{
"name": "libnpmpack",
"version": "3.0.1",
"version": "3.1.0",
"description": "Programmatic API for the bits behind npm pack",
"author": "GitHub Inc.",
"main": "lib/index.js",

View file

@ -89,7 +89,7 @@ function checkNoProxy (uri, opts) {
const host = new url.URL(uri).hostname.split('.').reverse()
let noproxy = (opts.noProxy || getProcessEnv('no_proxy'))
if (typeof noproxy === 'string') {
noproxy = noproxy.split(/\s*,\s*/g)
noproxy = noproxy.split(',').map(n => n.trim())
}
return noproxy && noproxy.some(no => {

View file

@ -0,0 +1,15 @@
The ISC License
Copyright (c) 2010-2022 Isaac Z. Schlueter and Contributors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View file

@ -0,0 +1,581 @@
const perf = typeof performance === 'object' && performance &&
typeof performance.now === 'function' ? performance : Date
const warned = new Set()
const deprecatedOption = (opt, msg) => {
const code = `LRU_CACHE_OPTION_${opt}`
if (shouldWarn(code)) {
warn(code, `The ${opt} option is deprecated. ${msg}`, LRUCache)
}
}
const deprecatedMethod = (method, msg) => {
const code = `LRU_CACHE_METHOD_${method}`
if (shouldWarn(code)) {
const { prototype } = LRUCache
const { get } = Object.getOwnPropertyDescriptor(prototype, method)
warn(code, `The ${method} method is deprecated. ${msg}`, get)
}
}
const deprecatedProperty = (field, msg) => {
const code = `LRU_CACHE_PROPERTY_${field}`
if (shouldWarn(code)) {
const { prototype } = LRUCache
const { get } = Object.getOwnPropertyDescriptor(prototype, field)
warn(code, `The ${field} property is deprecated. ${msg}`, get)
}
}
const shouldWarn = (code) => !(process.noDeprecation || warned.has(code))
const warn = (code, msg, fn) => {
warned.add(code)
process.emitWarning(msg, 'DeprecationWarning', code, fn)
}
const isPosInt = n => n && n === Math.floor(n) && n > 0 && isFinite(n)
/* istanbul ignore next - This is a little bit ridiculous, tbh.
* The maximum array length is 2^32-1 or thereabouts on most JS impls.
* And well before that point, you're caching the entire world, I mean,
* that's ~32GB of just integers for the next/prev links, plus whatever
* else to hold that many keys and values. Just filling the memory with
* zeroes at init time is brutal when you get that big.
* But why not be complete?
* Maybe in the future, these limits will have expanded. */
const getUintArray = max => !isPosInt(max) ? null
: max <= Math.pow(2, 8) ? Uint8Array
: max <= Math.pow(2, 16) ? Uint16Array
: max <= Math.pow(2, 32) ? Uint32Array
: max <= Number.MAX_SAFE_INTEGER ? ZeroArray
: null
class ZeroArray extends Array {
constructor (size) {
super(size)
this.fill(0)
}
}
class Stack {
constructor (max) {
const UintArray = getUintArray(max)
this.heap = new UintArray(max)
this.length = 0
}
push (n) {
this.heap[this.length++] = n
}
pop () {
return this.heap[--this.length]
}
}
class LRUCache {
constructor (options = {}) {
const {
max,
ttl,
ttlResolution = 1,
ttlAutopurge,
updateAgeOnGet,
allowStale,
dispose,
disposeAfter,
noDisposeOnSet,
maxSize,
sizeCalculation,
} = options
// deprecated options, don't trigger a warning for getting them if
// the thing being passed in is another LRUCache we're copying.
const {
length,
maxAge,
stale,
} = options instanceof LRUCache ? {} : options
if (!isPosInt(max)) {
throw new TypeError('max option must be an integer')
}
const UintArray = getUintArray(max)
if (!UintArray) {
throw new Error('invalid max value: ' + max)
}
this.max = max
this.maxSize = maxSize || 0
this.sizeCalculation = sizeCalculation || length
if (this.sizeCalculation) {
if (!this.maxSize) {
throw new TypeError('cannot set sizeCalculation without setting maxSize')
}
if (typeof this.sizeCalculation !== 'function') {
throw new TypeError('sizeCalculating set to non-function')
}
}
this.keyMap = new Map()
this.keyList = new Array(max).fill(null)
this.valList = new Array(max).fill(null)
this.next = new UintArray(max)
this.prev = new UintArray(max)
this.head = 0
this.tail = 0
this.free = new Stack(max)
this.initialFill = 1
this.size = 0
if (typeof dispose === 'function') {
this.dispose = dispose
}
if (typeof disposeAfter === 'function') {
this.disposeAfter = disposeAfter
this.disposed = []
} else {
this.disposeAfter = null
this.disposed = null
}
this.noDisposeOnSet = !!noDisposeOnSet
if (this.maxSize) {
if (!isPosInt(this.maxSize)) {
throw new TypeError('maxSize must be a positive integer if specified')
}
this.initializeSizeTracking()
}
this.allowStale = !!allowStale || !!stale
this.updateAgeOnGet = !!updateAgeOnGet
this.ttlResolution = isPosInt(ttlResolution) || ttlResolution === 0
? ttlResolution : 1
this.ttlAutopurge = !!ttlAutopurge
this.ttl = ttl || maxAge || 0
if (this.ttl) {
if (!isPosInt(this.ttl)) {
throw new TypeError('ttl must be a positive integer if specified')
}
this.initializeTTLTracking()
}
if (stale) {
deprecatedOption('stale', 'please use options.allowStale instead')
}
if (maxAge) {
deprecatedOption('maxAge', 'please use options.ttl instead')
}
if (length) {
deprecatedOption('length', 'please use options.sizeCalculation instead')
}
}
initializeTTLTracking () {
this.ttls = new ZeroArray(this.max)
this.starts = new ZeroArray(this.max)
this.setItemTTL = (index, ttl) => {
this.starts[index] = ttl !== 0 ? perf.now() : 0
this.ttls[index] = ttl
if (ttl !== 0 && this.ttlAutopurge) {
const t = setTimeout(() => {
if (this.isStale(index)) {
this.delete(this.keyList[index])
}
}, ttl + 1)
/* istanbul ignore else - unref() not supported on all platforms */
if (t.unref) {
t.unref()
}
}
}
this.updateItemAge = (index) => {
this.starts[index] = this.ttls[index] !== 0 ? perf.now() : 0
}
// debounce calls to perf.now() to 1s so we're not hitting
// that costly call repeatedly.
let cachedNow = 0
const getNow = () => {
const n = perf.now()
if (this.ttlResolution > 0) {
cachedNow = n
const t = setTimeout(() => cachedNow = 0, this.ttlResolution)
/* istanbul ignore else - not available on all platforms */
if (t.unref) {
t.unref()
}
}
return n
}
this.isStale = (index) => {
return this.ttls[index] !== 0 && this.starts[index] !== 0 &&
((cachedNow || getNow()) - this.starts[index] > this.ttls[index])
}
}
updateItemAge (index) {}
setItemTTL (index, ttl) {}
isStale (index) { return false }
initializeSizeTracking () {
this.calculatedSize = 0
this.sizes = new ZeroArray(this.max)
this.removeItemSize = index => this.calculatedSize -= this.sizes[index]
this.addItemSize = (index, v, k, size, sizeCalculation) => {
const s = size || (sizeCalculation ? sizeCalculation(v, k) : 0)
this.sizes[index] = isPosInt(s) ? s : 0
const maxSize = this.maxSize - this.sizes[index]
while (this.calculatedSize > maxSize) {
this.evict()
}
this.calculatedSize += this.sizes[index]
}
this.delete = k => {
if (this.size !== 0) {
const index = this.keyMap.get(k)
if (index !== undefined) {
this.calculatedSize -= this.sizes[index]
}
}
return LRUCache.prototype.delete.call(this, k)
}
}
removeItemSize (index) {}
addItemSize (index, v, k, size, sizeCalculation) {}
*indexes () {
if (this.size) {
for (let i = this.tail; true; i = this.prev[i]) {
if (!this.isStale(i)) {
yield i
}
if (i === this.head) {
break
}
}
}
}
*rindexes () {
if (this.size) {
for (let i = this.head; true; i = this.next[i]) {
if (!this.isStale(i)) {
yield i
}
if (i === this.tail) {
break
}
}
}
}
*entries () {
for (const i of this.indexes()) {
yield [this.keyList[i], this.valList[i]]
}
}
*keys () {
for (const i of this.indexes()) {
yield this.keyList[i]
}
}
*values () {
for (const i of this.indexes()) {
yield this.valList[i]
}
}
[Symbol.iterator] () {
return this.entries()
}
find (fn, getOptions = {}) {
for (const i of this.indexes()) {
if (fn(this.valList[i], this.keyList[i], this)) {
return this.get(this.keyList[i], getOptions)
}
}
}
forEach (fn, thisp = this) {
for (const i of this.indexes()) {
fn.call(thisp, this.valList[i], this.keyList[i], this)
}
}
rforEach (fn, thisp = this) {
for (const i of this.rindexes()) {
fn.call(thisp, this.valList[i], this.keyList[i], this)
}
}
get prune () {
deprecatedMethod('prune', 'Please use cache.purgeStale() instead.')
return this.purgeStale
}
purgeStale () {
let deleted = false
if (this.size) {
for (let i = this.head; true; i = this.next[i]) {
const b = i === this.tail
if (this.isStale(i)) {
this.delete(this.keyList[i])
deleted = true
}
if (b) {
break
}
}
}
return deleted
}
dump () {
const arr = []
for (const i of this.indexes()) {
const key = this.keyList[i]
const value = this.valList[i]
const entry = { value }
if (this.ttls) {
entry.ttl = this.ttls[i]
}
if (this.sizes) {
entry.size = this.sizes[i]
}
arr.unshift([key, entry])
}
return arr
}
load (arr) {
this.clear()
for (const [key, entry] of arr) {
this.set(key, entry.value, entry)
}
}
dispose (v, k, reason) {}
set (k, v, {
ttl = this.ttl,
noDisposeOnSet = this.noDisposeOnSet,
size = 0,
sizeCalculation = this.sizeCalculation,
} = {}) {
let index = this.size === 0 ? undefined : this.keyMap.get(k)
if (index === undefined) {
// addition
index = this.newIndex()
this.keyList[index] = k
this.valList[index] = v
this.keyMap.set(k, index)
this.next[this.tail] = index
this.prev[index] = this.tail
this.tail = index
this.size ++
this.addItemSize(index, v, k, size, sizeCalculation)
} else {
// update
const oldVal = this.valList[index]
if (v !== oldVal) {
if (!noDisposeOnSet) {
this.dispose(oldVal, k, 'set')
if (this.disposeAfter) {
this.disposed.push([oldVal, k, 'set'])
}
}
this.removeItemSize(index)
this.valList[index] = v
this.addItemSize(index, v, k, size, sizeCalculation)
}
this.moveToTail(index)
}
if (ttl !== 0 && this.ttl === 0 && !this.ttls) {
this.initializeTTLTracking()
}
this.setItemTTL(index, ttl)
if (this.disposeAfter) {
while (this.disposed.length) {
this.disposeAfter(...this.disposed.shift())
}
}
return this
}
newIndex () {
if (this.size === 0) {
return this.tail
}
if (this.size === this.max) {
return this.evict()
}
if (this.free.length !== 0) {
return this.free.pop()
}
// initial fill, just keep writing down the list
return this.initialFill++
}
pop () {
if (this.size) {
const val = this.valList[this.head]
this.evict()
return val
}
}
evict () {
const head = this.head
const k = this.keyList[head]
const v = this.valList[head]
this.dispose(v, k, 'evict')
if (this.disposeAfter) {
this.disposed.push([v, k, 'evict'])
}
this.removeItemSize(head)
this.head = this.next[head]
this.keyMap.delete(k)
this.size --
return head
}
has (k) {
return this.keyMap.has(k) && !this.isStale(this.keyMap.get(k))
}
// like get(), but without any LRU updating or TTL expiration
peek (k, { allowStale = this.allowStale } = {}) {
const index = this.keyMap.get(k)
if (index !== undefined && (allowStale || !this.isStale(index))) {
return this.valList[index]
}
}
get (k, {
allowStale = this.allowStale,
updateAgeOnGet = this.updateAgeOnGet,
} = {}) {
const index = this.keyMap.get(k)
if (index !== undefined) {
if (this.isStale(index)) {
const value = allowStale ? this.valList[index] : undefined
this.delete(k)
return value
} else {
this.moveToTail(index)
if (updateAgeOnGet) {
this.updateItemAge(index)
}
return this.valList[index]
}
}
}
connect (p, n) {
this.prev[n] = p
this.next[p] = n
}
moveToTail (index) {
// if tail already, nothing to do
// if head, move head to next[index]
// else
// move next[prev[index]] to next[index] (head has no prev)
// move prev[next[index]] to prev[index]
// prev[index] = tail
// next[tail] = index
// tail = index
if (index !== this.tail) {
if (index === this.head) {
this.head = this.next[index]
} else {
this.connect(this.prev[index], this.next[index])
}
this.connect(this.tail, index)
this.tail = index
}
}
get del () {
deprecatedMethod('del', 'Please use cache.delete() instead.')
return this.delete
}
delete (k) {
let deleted = false
if (this.size !== 0) {
const index = this.keyMap.get(k)
if (index !== undefined) {
deleted = true
if (this.size === 1) {
this.clear()
} else {
this.removeItemSize(index)
this.dispose(this.valList[index], k, 'delete')
if (this.disposeAfter) {
this.disposed.push([this.valList[index], k, 'delete'])
}
this.keyMap.delete(k)
this.keyList[index] = null
this.valList[index] = null
if (index === this.tail) {
this.tail = this.prev[index]
} else if (index === this.head) {
this.head = this.next[index]
} else {
this.next[this.prev[index]] = this.next[index]
this.prev[this.next[index]] = this.prev[index]
}
this.size --
this.free.push(index)
}
}
}
if (this.disposed) {
while (this.disposed.length) {
this.disposeAfter(...this.disposed.shift())
}
}
return deleted
}
clear () {
if (this.dispose !== LRUCache.prototype.dispose) {
for (const index of this.rindexes()) {
this.dispose(this.valList[index], this.keyList[index], 'delete')
}
}
if (this.disposeAfter) {
for (const index of this.rindexes()) {
this.disposed.push([this.valList[index], this.keyList[index], 'delete'])
}
}
this.keyMap.clear()
this.valList.fill(null)
this.keyList.fill(null)
if (this.ttls) {
this.ttls.fill(0)
this.starts.fill(0)
}
if (this.sizes) {
this.sizes.fill(0)
}
this.head = 0
this.tail = 0
this.initialFill = 1
this.free.length = 0
this.calculatedSize = 0
this.size = 0
if (this.disposed) {
while (this.disposed.length) {
this.disposeAfter(...this.disposed.shift())
}
}
}
get reset () {
deprecatedMethod('reset', 'Please use cache.clear() instead.')
return this.clear
}
get length () {
deprecatedProperty('length', 'Please use cache.size instead.')
return this.size
}
}
module.exports = LRUCache

View file

@ -0,0 +1,34 @@
{
"name": "lru-cache",
"description": "A cache object that deletes the least-recently-used items.",
"version": "7.3.1",
"author": "Isaac Z. Schlueter <i@izs.me>",
"keywords": [
"mru",
"lru",
"cache"
],
"scripts": {
"test": "tap",
"snap": "tap",
"preversion": "npm test",
"postversion": "npm publish",
"prepublishOnly": "git push origin --follow-tags"
},
"main": "index.js",
"repository": "git://github.com/isaacs/node-lru-cache.git",
"devDependencies": {
"benchmark": "^2.1.4",
"tap": "^15.1.6"
},
"license": "ISC",
"files": [
"index.js"
],
"engines": {
"node": ">=12"
},
"tap": {
"coverage-map": "map.js"
}
}

View file

@ -1,6 +1,6 @@
{
"name": "make-fetch-happen",
"version": "10.0.0",
"version": "10.0.2",
"description": "Opinionated, caching, retrying fetch client",
"main": "lib/index.js",
"files": [
@ -17,7 +17,8 @@
"lint": "eslint '**/*.js'",
"lintfix": "npm run lint -- --fix",
"postlint": "npm-template-check",
"snap": "tap"
"snap": "tap",
"template-copy": "npm-template-copy --force"
},
"repository": "https://github.com/npm/make-fetch-happen",
"keywords": [
@ -32,34 +33,33 @@
"author": "GitHub Inc.",
"license": "ISC",
"dependencies": {
"agentkeepalive": "^4.1.3",
"cacache": "^15.2.0",
"agentkeepalive": "^4.2.0",
"cacache": "^15.3.0",
"http-cache-semantics": "^4.1.0",
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
"is-lambda": "^1.0.1",
"lru-cache": "^6.0.0",
"minipass": "^3.1.3",
"lru-cache": "^7.3.1",
"minipass": "^3.1.6",
"minipass-collect": "^1.0.2",
"minipass-fetch": "^1.3.2",
"minipass-fetch": "^1.4.1",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"negotiator": "^0.6.3",
"promise-retry": "^2.0.1",
"socks-proxy-agent": "^6.0.0",
"ssri": "^8.0.0"
"socks-proxy-agent": "^6.1.1",
"ssri": "^8.0.1"
},
"devDependencies": {
"@npmcli/template-oss": "^2.5.1",
"eslint": "^8.7.0",
"@npmcli/template-oss": "^2.7.1",
"eslint": "^8.8.0",
"mkdirp": "^1.0.4",
"nock": "^13.0.11",
"npmlog": "^6.0.0",
"require-inject": "^1.4.2",
"nock": "^13.2.4",
"npmlog": "^6.0.1",
"rimraf": "^3.0.2",
"safe-buffer": "^5.2.1",
"standard-version": "^9.3.0",
"tap": "^15.0.9"
"standard-version": "^9.3.2",
"tap": "^15.1.6"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16"
@ -70,6 +70,6 @@
"check-coverage": true
},
"templateOSS": {
"version": "2.5.1"
"version": "2.7.1"
}
}

View file

@ -1,5 +1,6 @@
'use strict'
const npa = require('npm-package-arg')
const { URL } = require('url')
// Find the longest registry key that is used for some kind of auth
// in the options.

View file

@ -1,6 +1,6 @@
{
"name": "npm-registry-fetch",
"version": "12.0.1",
"version": "12.0.2",
"description": "Fetch-based http client for use with npm registry APIs",
"main": "lib",
"files": [
@ -19,7 +19,8 @@
"npmclilint": "npmcli-lint",
"postsnap": "npm run lintfix --",
"postlint": "npm-template-check",
"snap": "tap"
"snap": "tap",
"template-copy": "npm-template-copy --force"
},
"repository": "https://github.com/npm/npm-registry-fetch",
"keywords": [
@ -30,21 +31,21 @@
"author": "GitHub Inc.",
"license": "ISC",
"dependencies": {
"make-fetch-happen": "^10.0.0",
"minipass": "^3.1.3",
"minipass-fetch": "^1.3.0",
"make-fetch-happen": "^10.0.1",
"minipass": "^3.1.6",
"minipass-fetch": "^1.4.1",
"minipass-json-stream": "^1.0.1",
"minizlib": "^2.0.0",
"npm-package-arg": "^8.0.0"
"minizlib": "^2.1.2",
"npm-package-arg": "^8.1.5"
},
"devDependencies": {
"@npmcli/template-oss": "^2.5.1",
"cacache": "^15.0.0",
"nock": "^13.1.0",
"npmlog": "^4.1.2",
"@npmcli/template-oss": "^2.7.1",
"cacache": "^15.3.0",
"nock": "^13.2.4",
"npmlog": "^6.0.0",
"require-inject": "^1.4.4",
"ssri": "^8.0.0",
"tap": "^15.0.4"
"ssri": "^8.0.1",
"tap": "^15.1.6"
},
"tap": {
"check-coverage": true,
@ -54,6 +55,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
},
"templateOSS": {
"version": "2.5.1"
"version": "2.7.1"
}
}

View file

@ -292,8 +292,9 @@ log.emitLog = function (m) {
var disp = log.disp[m.level] != null ? log.disp[m.level] : m.level
this.clearProgress()
m.message.split(/\r?\n/).forEach(function (line) {
if (this.heading) {
this.write(this.heading, this.headingStyle)
var heading = this.heading
if (heading) {
this.write(heading, this.headingStyle)
this.write(' ')
}
this.write(disp, log.style[m.level])
@ -390,11 +391,11 @@ log.style = {}
log.levels = {}
log.disp = {}
log.addLevel('silly', -Infinity, { inverse: true }, 'sill')
log.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb')
log.addLevel('verbose', 1000, { fg: 'cyan', bg: 'black' }, 'verb')
log.addLevel('info', 2000, { fg: 'green' })
log.addLevel('timing', 2500, { fg: 'green', bg: 'black' })
log.addLevel('http', 3000, { fg: 'green', bg: 'black' })
log.addLevel('notice', 3500, { fg: 'blue', bg: 'black' })
log.addLevel('notice', 3500, { fg: 'cyan', bg: 'black' })
log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')
log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')
log.addLevel('silent', Infinity)

View file

@ -2,7 +2,7 @@
"author": "GitHub Inc.",
"name": "npmlog",
"description": "logger for npm",
"version": "6.0.0",
"version": "6.0.1",
"repository": {
"type": "git",
"url": "https://github.com/npm/npmlog.git"
@ -23,24 +23,27 @@
"preversion": "npm test",
"postversion": "npm publish",
"prepublishOnly": "git push origin --follow-tags",
"snap": "tap"
"snap": "tap",
"template-copy": "npm-template-copy --force"
},
"dependencies": {
"are-we-there-yet": "^2.0.0",
"are-we-there-yet": "^3.0.0",
"console-control-strings": "^1.1.0",
"gauge": "^4.0.0",
"set-blocking": "^2.0.0"
},
"devDependencies": {
"@npmcli/template-oss": "^2.3.0",
"tap": "^15.0.9"
"@npmcli/template-oss": "^2.7.1",
"tap": "^15.1.6"
},
"license": "ISC",
"templateVersion": "2.3.0",
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16"
},
"tap": {
"branches": 95
},
"templateOSS": {
"version": "2.7.1"
}
}

14
deps/npm/package.json vendored
View file

@ -1,5 +1,5 @@
{
"version": "8.4.1",
"version": "8.5.0",
"name": "npm",
"description": "a package manager for JavaScript",
"workspaces": [
@ -55,9 +55,9 @@
},
"dependencies": {
"@isaacs/string-locale-compare": "^1.1.0",
"@npmcli/arborist": "^4.3.0",
"@npmcli/arborist": "^4.3.1",
"@npmcli/ci-detect": "^1.4.0",
"@npmcli/config": "^2.4.0",
"@npmcli/config": "^3.0.0",
"@npmcli/map-workspaces": "^2.0.0",
"@npmcli/package-json": "^1.0.1",
"@npmcli/run-script": "^2.0.0",
@ -85,12 +85,12 @@
"libnpmfund": "^2.0.2",
"libnpmhook": "^7.0.1",
"libnpmorg": "^3.0.1",
"libnpmpack": "^3.0.1",
"libnpmpack": "^3.1.0",
"libnpmpublish": "^5.0.1",
"libnpmsearch": "^4.0.1",
"libnpmteam": "^3.0.1",
"libnpmversion": "^2.0.2",
"make-fetch-happen": "^10.0.0",
"make-fetch-happen": "^10.0.2",
"minipass": "^3.1.6",
"minipass-pipeline": "^1.2.4",
"mkdirp": "^1.0.4",
@ -103,9 +103,9 @@
"npm-package-arg": "^8.1.5",
"npm-pick-manifest": "^6.1.1",
"npm-profile": "^6.0.0",
"npm-registry-fetch": "^12.0.1",
"npm-registry-fetch": "^12.0.2",
"npm-user-validate": "^1.0.1",
"npmlog": "^6.0.0",
"npmlog": "^6.0.1",
"opener": "^1.5.2",
"pacote": "^12.0.3",
"parse-conflict-json": "^2.0.1",

View file

@ -170,7 +170,7 @@ npm dedupe
Options:
[--global-style] [--legacy-bundling] [--strict-peer-deps] [--no-package-lock]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
[--no-audit] [--no-bin-links] [--no-fund] [--dry-run]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
@ -447,7 +447,7 @@ npm install <git:// url>
npm install <github username>/<github project>
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global] [--global-style] [--legacy-bundling]
[--strict-peer-deps] [--no-package-lock]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
@ -494,7 +494,7 @@ npm install-test <git:// url>
npm install-test <github username>/<github project>
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global] [--global-style] [--legacy-bundling]
[--strict-peer-deps] [--no-package-lock]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
@ -517,7 +517,7 @@ npm link (in package dir)
npm link [<@scope>/]<pkg>[@<version>]
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global] [--global-style] [--legacy-bundling]
[--strict-peer-deps] [--no-package-lock]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
@ -1013,7 +1013,7 @@ Usage:
npm uninstall [<@scope>/]<pkg>...
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
[-ws|--workspaces] [--include-workspace-root]
@ -1063,7 +1063,7 @@ npm update [<pkg>...]
Options:
[-g|--global] [--global-style] [--legacy-bundling] [--strict-peer-deps]
[--no-package-lock]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
[--no-audit] [--no-bin-links] [--no-fund] [--dry-run]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]

View file

@ -1430,7 +1430,7 @@ If a package would be saved at install time by the use of \`--save\`,
\`--save-dev\`, or \`--save-optional\`, then also put it in the
\`bundleDependencies\` list.
Ignore if \`--save-peer\` is set, since peerDependencies cannot be bundled.
Ignored if \`--save-peer\` is set, since peerDependencies cannot be bundled.
`
exports[`test/lib/utils/config/definitions.js TAP > config description for save-dev 1`] = `

View file

@ -1225,7 +1225,7 @@ If a package would be saved at install time by the use of \`--save\`,
\`--save-dev\`, or \`--save-optional\`, then also put it in the
\`bundleDependencies\` list.
Ignore if \`--save-peer\` is set, since peerDependencies cannot be bundled.
Ignored if \`--save-peer\` is set, since peerDependencies cannot be bundled.
<!-- automatically generated, do not edit manually -->
<!-- see lib/utils/config/definitions.js -->

View file

@ -311,7 +311,7 @@ All commands:
Options:
[--global-style] [--legacy-bundling] [--strict-peer-deps] [--no-package-lock]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
[--no-audit] [--no-bin-links] [--no-fund] [--dry-run]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
@ -556,7 +556,7 @@ All commands:
npm install <github username>/<github project>
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global] [--global-style] [--legacy-bundling]
[--strict-peer-deps] [--no-package-lock]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
@ -599,7 +599,7 @@ All commands:
npm install-test <github username>/<github project>
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global] [--global-style] [--legacy-bundling]
[--strict-peer-deps] [--no-package-lock]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
@ -620,7 +620,7 @@ All commands:
npm link [<@scope>/]<pkg>[@<version>]
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-E|--save-exact] [-g|--global] [--global-style] [--legacy-bundling]
[--strict-peer-deps] [--no-package-lock]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
@ -1054,7 +1054,7 @@ All commands:
npm uninstall [<@scope>/]<pkg>...
Options:
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
[-ws|--workspaces] [--include-workspace-root]
@ -1098,7 +1098,7 @@ All commands:
Options:
[-g|--global] [--global-style] [--legacy-bundling] [--strict-peer-deps]
[--no-package-lock]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer]
[-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle]
[--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] [--ignore-scripts]
[--no-audit] [--no-bin-links] [--no-fund] [--dry-run]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]

View file

@ -83,7 +83,8 @@ t.test('npm org add', async t => {
await org.exec(['add', 'orgname', 'username'])
t.strictSame(
t.ok(orgSetArgs.opts.log, 'got passed a logger')
t.match(
orgSetArgs,
{
org: 'orgname',
@ -148,7 +149,8 @@ t.test('npm org add - more users', async t => {
})
await org.exec(['add', 'orgname', 'username'])
t.strictSame(
t.ok(orgSetArgs.opts.log, 'got passed a logger')
t.match(
orgSetArgs,
{
org: 'orgname',
@ -175,7 +177,8 @@ t.test('npm org add - json output', async t => {
await org.exec(['add', 'orgname', 'username'])
t.strictSame(
t.ok(orgSetArgs.opts.log, 'got passed a logger')
t.match(
orgSetArgs,
{
org: 'orgname',
@ -209,7 +212,8 @@ t.test('npm org add - parseable output', async t => {
await org.exec(['add', 'orgname', 'username'])
t.strictSame(
t.ok(orgSetArgs.opts.log, 'got passed a logger')
t.match(
orgSetArgs,
{
org: 'orgname',
@ -239,7 +243,8 @@ t.test('npm org add - silent output', async t => {
await org.exec(['add', 'orgname', 'username'])
t.strictSame(
t.ok(orgSetArgs.opts.log, 'got passed a logger')
t.match(
orgSetArgs,
{
org: 'orgname',
@ -261,7 +266,8 @@ t.test('npm org rm', async t => {
await org.exec(['rm', 'orgname', 'username'])
t.strictSame(
t.ok(orgRmArgs.opts.log, 'got passed a logger')
t.match(
orgRmArgs,
{
org: 'orgname',
@ -270,7 +276,8 @@ t.test('npm org rm', async t => {
},
'libnpmorg.rm received the correct args'
)
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -323,7 +330,8 @@ t.test('npm org rm - one user left', async t => {
await org.exec(['rm', 'orgname', 'username'])
t.strictSame(
t.ok(orgRmArgs.opts.log, 'got passed a logger')
t.match(
orgRmArgs,
{
org: 'orgname',
@ -332,7 +340,8 @@ t.test('npm org rm - one user left', async t => {
},
'libnpmorg.rm received the correct args'
)
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -358,7 +367,8 @@ t.test('npm org rm - json output', async t => {
await org.exec(['rm', 'orgname', 'username'])
t.strictSame(
t.ok(orgRmArgs.opts.log, 'got passed a logger')
t.match(
orgRmArgs,
{
org: 'orgname',
@ -367,7 +377,8 @@ t.test('npm org rm - json output', async t => {
},
'libnpmorg.rm received the correct args'
)
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -398,7 +409,8 @@ t.test('npm org rm - parseable output', async t => {
await org.exec(['rm', 'orgname', 'username'])
t.strictSame(
t.ok(orgRmArgs.opts.log, 'got passed a logger')
t.match(
orgRmArgs,
{
org: 'orgname',
@ -407,7 +419,8 @@ t.test('npm org rm - parseable output', async t => {
},
'libnpmorg.rm received the correct args'
)
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -436,7 +449,8 @@ t.test('npm org rm - silent output', async t => {
await org.exec(['rm', 'orgname', 'username'])
t.strictSame(
t.ok(orgRmArgs.opts.log, 'got passed a logger')
t.match(
orgRmArgs,
{
org: 'orgname',
@ -445,7 +459,8 @@ t.test('npm org rm - silent output', async t => {
},
'libnpmorg.rm received the correct args'
)
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -470,7 +485,8 @@ t.test('npm org ls', async t => {
await org.exec(['ls', 'orgname'])
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -497,7 +513,8 @@ t.test('npm org ls - user filter', async t => {
await org.exec(['ls', 'orgname', 'username'])
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -522,7 +539,8 @@ t.test('npm org ls - user filter, missing user', async t => {
await org.exec(['ls', 'orgname', 'username'])
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -560,7 +578,8 @@ t.test('npm org ls - json output', async t => {
await org.exec(['ls', 'orgname'])
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -587,7 +606,8 @@ t.test('npm org ls - parseable output', async t => {
await org.exec(['ls', 'orgname'])
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',
@ -623,7 +643,8 @@ t.test('npm org ls - silent output', async t => {
await org.exec(['ls', 'orgname'])
t.strictSame(
t.ok(orgLsArgs.opts.log, 'got passed a logger')
t.match(
orgLsArgs,
{
org: 'orgname',

View file

@ -76,8 +76,9 @@ t.test('no args --force', async t => {
const libnpmpublish = {
unpublish (spec, opts) {
t.ok(opts.log, 'gets passed a logger')
t.equal(spec.raw, 'pkg@1.0.0', 'should unpublish expected spec')
t.same(
t.match(
opts,
{
publishConfig: undefined,
@ -177,12 +178,8 @@ t.test('unpublish <pkg>@version', async t => {
const libnpmpublish = {
unpublish (spec, opts) {
t.ok(opts.log, 'gets passed a logger')
t.equal(spec.raw, 'pkg@1.0.0', 'should unpublish expected parsed spec')
t.same(
opts,
{},
'should unpublish with expected opts'
)
},
}