@npmcli/configConfiguration management for the npm cli.
This module is the spiritual descendant ofnpmconf, and the code that once lived in npm'slib/config/ folder.
It does the management of configuration files that npm uses, but
importantly, does not define all the configuration defaults or types, as
those parts make more sense to live within the npm CLI itself.
The only exceptions:
prefix config value has some special semantics, setting the localproject config file is loaded based on the local prefix (which cannode_modulespackage.json file, or package-lock.json file.)userconfig value, as set by the environment and CLI (defaulting to~/.npmrc, is used to load user configs.globalconfig value, as set by the environment, CLI, anduserconfig file (defaulting to $PREFIX/etc/npmrc) is used to loadbuiltin config, read from a npmrc file in the root of the npmThe resulting hierarchy of configs:
--some-key=some-value on the command line. These arenopt, which is not a great choice, butnpm_config_some_key=some_value in thesome-key = some-value in thelocalPrefix folder (ie, the cwd, or its nearest parent that containsnode_modules folder or package.json file.)some-key = some-value in ~/.npmrc.userconfig config value can be overridden by the cli, env, orproject configs to change this value.some-key = some-value inglobalPrefix folder, which is inferred by looking at the locationprefix setting in the cli, env,project, or userconfig. The globalconfig value at any of thosesome-key = some-value in/usr/local/lib/node_modules/npm/npmrc. This is not configurable, andnpmPath folder.const Config = require('@npmcli/config')
const { shorthands, definitions, flatten } = require('@npmcli/config/lib/definitions')
const conf = new Config({
// path to the npm module being run
npmPath: resolve(__dirname, '..'),
definitions,
shorthands,
flatten,
// optional, defaults to process.argv
// argv: [] <- if you are using this package in your own cli
// and dont want to have colliding argv
argv: process.argv,
// optional, defaults to process.env
env: process.env,
// optional, defaults to process.execPath
execPath: process.execPath,
// optional, defaults to process.platform
platform: process.platform,
// optional, defaults to process.cwd()
cwd: process.cwd(),
})
// emits log events on the process object
// see `proc-log` for more info
process.on('log', (level, ...args) => {
console.log(level, ...args)
})
// returns a promise that fails if config loading fails, and
// resolves when the config object is ready for action
conf.load().then(() => {
conf.validate()
console.log('loaded ok! some-key = ' + conf.get('some-key'))
}).catch(er => {
console.error('error loading configs!', er)
})
The Config class is the sole export.
const Config = require('@npmcli/config')
Config.typeDefsThe type definitions passed to nopt for CLI option parsing and known
configuration validation.
new Config(options)Options:
types Types of all known config values. Note that some are effectivelyshorthands An object mapping a shorthand value to an array of CLIdefaults Default values for each of the known configuration keys.npmPath The path to the npm module, for loading the builtin configcwd Optional, defaults to process.cwd(), used for inferring thelocalPrefix and loading the project config.platform Optional, defaults to process.platform. Used when inferringglobalPrefix from the execPath, since this is done diferently onexecPath Optional, defaults to process.execPath. Used to infer theglobalPrefix.env Optional, defaults to process.env. Source of the environmentargv Optional, defaults to process.argv. Source of the CLI optionsReturns a config object, which is not yet loaded.
Fields:
config.globalPrefix The prefix for global operations. Set by theprefix config value, or defaults based on the location of theexecPath option.config.localPrefix The prefix for local operations. Set by theprefix config value on the CLI only, or defaults to either the cwd ornode_modules folder or package.jsonconfig.sources A read-only Map of the file (or a comment, if no fileconfig.data A Map of config level to ConfigData objects. Thesesource The source where this data was loaded from.raw The raw data used to generate this config data, as it was parseddata The data object reflecting the inheritance of configs up to thisloadError Any errors encountered that prevented the loading of thisconfig.list A list sorted in priority of all the config data objects inconfig.list[0] is the cli level,config.list[1] is the env level, and so on.cwd The cwd paramenv The env paramargv The argv paramexecPath The execPath paramplatform The platform paramdefaults The defaults paramshorthands The shorthands paramtypes The types paramnpmPath The npmPath paramglobalPrefix The effective globalPrefixlocalPrefix The effective localPrefixprefix If config.get('global') is true, then globalPrefix,localPrefixhome The user's home directory, found by looking at env.HOME oros.homedir().loaded A boolean indicating whether or not configs are loadedvalid A getter that returns true if all the config objects are valid.config.set(...) will beconfig.valid is read.config.load()Load configuration from the various sources of information.
Returns a Promise that resolves when configuration is loaded, and fails
if a fatal error is encountered.
config.find(key)Find the effective place in the configuration levels a given key is set.
Returns one of: cli, env, project, user, global, builtin, ordefault.
Returns null if the key is not set.
config.get(key, where = 'cli')Load the given key from the config stack.
config.set(key, value, where = 'cli')Set the key to the specified value, at the specified level in the config
stack.
config.delete(key, where = 'cli')Delete the configuration key from the specified level in the config stack.
config.validate(where)Verify that all known configuration options are set to valid values, and
log a warning if they are invalid.
Invalid auth options will cause this method to throw an error with a code
property of ERR_INVALID_AUTH, and a problems property listing the specific
concerns with the current configuration.
If where is not set, then all config objects are validated.
Returns true if all configs are valid.
Note that it's usually enough (and more efficient) to just checkconfig.valid, since each data object is marked for re-evaluation on everyconfig.set() operation.
config.repair(problems)Accept an optional array of problems (as thrown by config.validate()) and
perform the necessary steps to resolve them. If no problems are provided,
this method will call config.validate() internally to retrieve them.
Note that you must await config.save('user') in order to persist the changes.
config.isDefault(key)Returns true if the value is coming directly from the
default definitions, if the current value for the key config is
coming from any other source, returns false.
This method can be used for avoiding or tweaking default values, e.g:
Given a global default definition of foo='foo' it's possible to read that
value such as:
js const save = config.get('foo')Now in a different place of your app it's possible to avoid using the
foo
default value, by checking to see if the current config value is currently
one that was defined by the default definitions:
js const save = config.isDefault('foo') ? 'bar' : config.get('foo')
config.save(where)Save the config file specified by the where param. Must be one ofproject, user, global, builtin.