Configuration management for the npm cli.
This module is the spiritual descendant of
npmconf
, and the code that once lived in npm's
lib/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:
- The
prefix
config value has some special semantics, setting the local prefix if specified on the CLI options and not in global mode, or the global prefix otherwise. - The
project
config file is loaded based on the local prefix (which can only be set by the CLI config options, and otherwise defaults to a walk up the folder tree to the first parent containing anode_modules
folder,package.json
file, orpackage-lock.json
file.) - The
userconfig
value, as set by the environment and CLI (defaulting to~/.npmrc
, is used to load user configs. - The
globalconfig
value, as set by the environment, CLI, anduserconfig
file (defaulting to$PREFIX/etc/npmrc
) is used to load global configs. - A
builtin
config, read from anpmrc
file in the root of the npm project itself, overrides all defaults.
The resulting hierarchy of configs:
- CLI switches. eg
--some-key=some-value
on the command line. These are parsed bynopt
, which is not a great choice, but it's the one that npm has used forever, and changing it will be difficult. - Environment variables. eg
npm_config_some_key=some_value
in the environment. There is no way at this time to modify this prefix. - INI-formatted project configs. eg
some-key = some-value
in thelocalPrefix
folder (ie, thecwd
, or its nearest parent that contains either anode_modules
folder orpackage.json
file.) - INI-formatted userconfig file. eg
some-key = some-value
in~/.npmrc
. Theuserconfig
config value can be overridden by thecli
,env
, orproject
configs to change this value. - INI-formatted globalconfig file. eg
some-key = some-value
in theglobalPrefix
folder, which is inferred by looking at the location of the node executable, or theprefix
setting in thecli
,env
,project
, oruserconfig
. Theglobalconfig
value at any of those levels can override this. - INI-formatted builtin config file. eg
some-key = some-value
in/usr/local/lib/node_modules/npm/npmrc
. This is not configurable, and is determined by looking in thenpmPath
folder. - Default values (passed in by npm when it loads this module).
const Config = require('@npmcli/config')
// the types of all the configs we know about
const types = require('./config/types.js')
// default values for all the configs we know about
const defaults = require('./config/defaults.js')
// if you want -c to be short for --call and so on, define it here
const shorthands = require('./config/shorthands.js')
const conf = new Config({
// path to the npm module being run
npmPath: resolve(__dirname, '..'),
types,
shorthands,
defaults,
// optional, defaults to process.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(() => {
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')
The type definitions passed to nopt
for CLI option parsing and known
configuration validation.
Options:
types
Types of all known config values. Note that some are effectively given semantic value in the config loading process itself.shorthands
An object mapping a shorthand value to an array of CLI arguments that replace it.defaults
Default values for each of the known configuration keys. These should be defined for all configs given a type, and must be valid.npmPath
The path to thenpm
module, for loading thebuiltin
config file.cwd
Optional, defaults toprocess.cwd()
, used for inferring thelocalPrefix
and loading theproject
config.platform
Optional, defaults toprocess.platform
. Used when inferring theglobalPrefix
from theexecPath
, since this is done diferently on Windows.execPath
Optional, defaults toprocess.execPath
. Used to infer theglobalPrefix
.env
Optional, defaults toprocess.env
. Source of the environment variables for configuration.argv
Optional, defaults toprocess.argv
. Source of the CLI options used for configuration.
Returns a config
object, which is not yet loaded.
Fields:
config.globalPrefix
The prefix forglobal
operations. Set by theprefix
config value, or defaults based on the location of theexecPath
option.config.localPrefix
The prefix forlocal
operations. Set by theprefix
config value on the CLI only, or defaults to either thecwd
or its nearest ancestor containing anode_modules
folder orpackage.json
file.config.sources
A read-onlyMap
of the file (or a comment, if no file found, or relevant) to the config level loaded from that source.config.data
AMap
of config level toConfigData
objects. These objects should not be modified directly under any circumstances.source
The source where this data was loaded from.raw
The raw data used to generate this config data, as it was parsed initially from the environment, config file, or CLI options.data
The data object reflecting the inheritance of configs up to this point in the chain.loadError
Any errors encountered that prevented the loading of this config data.
config.list
A list sorted in priority of all the config data objects in the prototype chain.config.list[0]
is thecli
level,config.list[1]
is theenv
level, and so on.cwd
Thecwd
paramenv
Theenv
paramargv
Theargv
paramexecPath
TheexecPath
paramplatform
Theplatform
paramdefaults
Thedefaults
paramshorthands
Theshorthands
paramtypes
Thetypes
paramnpmPath
ThenpmPath
paramglobalPrefix
The effectiveglobalPrefix
localPrefix
The effectivelocalPrefix
prefix
Ifconfig.get('global')
is true, thenglobalPrefix
, otherwiselocalPrefix
home
The user's home directory, found by looking atenv.HOME
or callingos.homedir()
.loaded
A boolean indicating whether or not configs are loadedvalid
A getter that returnstrue
if all the config objects are valid. Any data objects that have been modified withconfig.set(...)
will be re-evaluated whenconfig.valid
is read.
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.
Find the effective place in the configuration levels a given key is set.
Returns one of: cli
, env
, project
, user
, global
, builtin
, or
default
.
Returns null
if the key is not set.
Load the given key from the config stack.
Set the key to the specified value, at the specified level in the config stack.
Delete the configuration key from the specified level in the config stack.
Verify that all known configuration options are set to valid values, and log a warning if they are invalid.
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 check
config.valid
, since each data object is marked for re-evaluation on every
config.set()
operation.
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:
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:const save = config.isDefault('foo') ? 'bar' : config.get('foo')
Save the config file specified by the where
param. Must be one of
project
, user
, global
, builtin
.