node/deps/npm/lib/utils/flat-options.js
Luigi Pinca dc05c70c8f
deps: upgrade npm to 7.0.7
PR-URL: https://github.com/nodejs/node/pull/35908
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ruy Adorno <ruyadorno@github.com>
Reviewed-By: Guy Bedford <guybedford@gmail.com>
2020-11-02 16:18:50 -05:00

248 lines
7.8 KiB
JavaScript

// return a flattened config object with canonical names suitable for
// passing to dependencies like arborist, pacote, npm-registry-fetch, etc.
const log = require('npmlog')
const crypto = require('crypto')
const npmSession = crypto.randomBytes(8).toString('hex')
log.verbose('npm-session', npmSession)
const { join } = require('path')
const buildOmitList = npm => {
const include = npm.config.get('include') || []
const omit = new Set((npm.config.get('omit') || [])
.filter(type => !include.includes(type)))
const only = npm.config.get('only')
if (/^prod(uction)?$/.test(only) || npm.config.get('production'))
omit.add('dev')
if (/dev/.test(npm.config.get('also')))
omit.delete('dev')
if (npm.config.get('dev'))
omit.delete('dev')
if (npm.config.get('optional') === false)
omit.add('optional')
npm.config.set('omit', [...omit])
return [...omit]
}
const flatOptions = npm => npm.flatOptions || Object.freeze({
// Note that many of these do not come from configs or cli flags
// per se, though they may be implied or defined by them.
log,
npmSession,
dmode: npm.modes.exec,
fmode: npm.modes.file,
umask: npm.modes.umask,
hashAlgorithm: 'sha1', // XXX should this be sha512?
color: !!npm.color,
includeStaged: npm.config.get('include-staged'),
preferDedupe: npm.config.get('prefer-dedupe'),
ignoreScripts: npm.config.get('ignore-scripts'),
projectScope: npm.projectScope,
npmVersion: npm.version,
nodeVersion: npm.config.get('node-version'),
// npm.command is not set until AFTER flatOptions are defined
// so we need to make this a getter.
get npmCommand () {
return npm.command
},
tmp: npm.tmp,
cache: join(npm.config.get('cache'), '_cacache'),
prefix: npm.prefix,
globalPrefix: npm.globalPrefix,
localPrefix: npm.localPrefix,
global: npm.config.get('global'),
metricsRegistry: npm.config.get('metrics-registry') ||
npm.config.get('registry'),
sendMetrics: npm.config.get('send-metrics'),
registry: npm.config.get('registry'),
scope: npm.config.get('scope'),
access: npm.config.get('access'),
alwaysAuth: npm.config.get('always-auth'),
audit: npm.config.get('audit'),
auditLevel: npm.config.get('audit-level'),
authType: npm.config.get('auth-type'),
ssoType: npm.config.get('sso-type'),
ssoPollFrequency: npm.config.get('sso-poll-frequency'),
before: npm.config.get('before'),
browser: npm.config.get('browser'),
ca: npm.config.get('ca'),
cafile: npm.config.get('cafile'),
cert: npm.config.get('cert'),
key: npm.config.get('key'),
// XXX remove these when we don't use lockfile any more, once
// arborist is handling the installation process
cacheLockRetries: npm.config.get('cache-lock-retries'),
cacheLockStale: npm.config.get('cache-lock-stale'),
cacheLockWait: npm.config.get('cache-lock-wait'),
lockFile: {
retries: npm.config.get('cache-lock-retries'),
stale: npm.config.get('cache-lock-stale'),
wait: npm.config.get('cache-lock-wait'),
},
// XXX remove these once no longer used
get cacheMax () {
return npm.config.get('cache-max')
},
get cacheMin () {
return npm.config.get('cache-min')
},
// token creation options
cidr: npm.config.get('cidr'),
readOnly: npm.config.get('read-only'),
// npm version options
preid: npm.config.get('preid'),
tagVersionPrefix: npm.config.get('tag-version-prefix'),
allowSameVersion: npm.config.get('allow-same-version'),
// npm version git options
message: npm.config.get('message'),
commitHooks: npm.config.get('commit-hooks'),
gitTagVersion: npm.config.get('git-tag-version'),
signGitCommit: npm.config.get('sign-git-commit'),
signGitTag: npm.config.get('sign-git-tag'),
// only used for npm ls in v7, not update
depth: npm.config.get('depth'),
all: npm.config.get('all'),
// Output configs
unicode: npm.config.get('unicode'),
json: npm.config.get('json'),
long: npm.config.get('long'),
parseable: npm.config.get('parseable'),
// options for npm search
search: {
description: npm.config.get('description'),
exclude: npm.config.get('searchexclude'),
limit: npm.config.get('searchlimit') || 20,
opts: npm.config.get('searchopts'),
staleness: npm.config.get('searchstaleness'),
},
dryRun: npm.config.get('dry-run'),
engineStrict: npm.config.get('engine-strict'),
retry: {
retries: npm.config.get('fetch-retries'),
factor: npm.config.get('fetch-retry-factor'),
maxTimeout: npm.config.get('fetch-retry-maxtimeout'),
minTimeout: npm.config.get('fetch-retry-mintimeout'),
},
timeout: npm.config.get('fetch-timeout'),
force: npm.config.get('force'),
formatPackageLock: npm.config.get('format-package-lock'),
fund: npm.config.get('fund'),
// binary locators
git: npm.config.get('git'),
npmBin: require.main.filename,
nodeBin: process.env.NODE || process.execPath,
viewer: npm.config.get('viewer'),
editor: npm.config.get('editor'),
// configs that affect how we build trees
binLinks: npm.config.get('bin-links'),
rebuildBundle: npm.config.get('rebuild-bundle'),
// --no-shrinkwrap is the same as --no-package-lock
packageLock: !(npm.config.get('package-lock') === false ||
npm.config.get('shrinkwrap') === false),
packageLockOnly: npm.config.get('package-lock-only'),
globalStyle: npm.config.get('global-style'),
legacyBundling: npm.config.get('legacy-bundling'),
scriptShell: npm.config.get('script-shell') || undefined,
shell: npm.config.get('shell'),
omit: buildOmitList(npm),
legacyPeerDeps: npm.config.get('legacy-peer-deps'),
strictPeerDeps: npm.config.get('strict-peer-deps'),
// npx stuff
call: npm.config.get('call'),
package: npm.config.get('package'),
// used to build up the appropriate {add:{...}} options to Arborist.reify
save: npm.config.get('save'),
saveBundle: npm.config.get('save-bundle') && !npm.config.get('save-peer'),
saveType: npm.config.get('save-optional') && npm.config.get('save-peer')
? 'peerOptional'
: npm.config.get('save-optional') ? 'optional'
: npm.config.get('save-dev') ? 'dev'
: npm.config.get('save-peer') ? 'peer'
: npm.config.get('save-prod') ? 'prod'
: null,
savePrefix: npm.config.get('save-exact') ? ''
: npm.config.get('save-prefix'),
// configs for npm-registry-fetch
otp: npm.config.get('otp'),
offline: npm.config.get('offline'),
preferOffline: getPreferOffline(npm),
preferOnline: getPreferOnline(npm),
strictSSL: npm.config.get('strict-ssl'),
defaultTag: npm.config.get('tag'),
get tag () {
return npm.config.get('tag')
},
userAgent: npm.config.get('user-agent'),
// yes, it's fine, just do it, jeez, stop asking
yes: npm.config.get('yes'),
...getScopesAndAuths(npm),
// npm fund exclusive option to select an item from a funding list
which: npm.config.get('which'),
// socks proxy can be configured in https-proxy or proxy field
// note that the various (HTTPS_|HTTP_|)PROXY environs will be
// respected if this is not set.
proxy: npm.config.get('https-proxy') || npm.config.get('proxy'),
noProxy: npm.config.get('noproxy'),
})
const getPreferOnline = npm => {
const po = npm.config.get('prefer-online')
if (po !== undefined)
return po
return npm.config.get('cache-max') <= 0
}
const getPreferOffline = npm => {
const po = npm.config.get('prefer-offline')
if (po !== undefined)
return po
return npm.config.get('cache-min') >= 9999
}
// pull out all the @scope:<key> and //host:key config fields
// these are used by npm-registry-fetch for authing against registries
const getScopesAndAuths = npm => {
const scopesAndAuths = {}
// pull out all the @scope:... configs into a flat object.
for (const key in npm.config.list[0]) {
if (/@.*:registry$/i.test(key) || /^\/\//.test(key))
scopesAndAuths[key] = npm.config.get(key)
}
return scopesAndAuths
}
module.exports = flatOptions