@npmcli/config

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 resulting hierarchy of configs:

USAGE

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(() => {
  conf.validate()
  console.log('loaded ok! some-key = ' + conf.get('some-key'))
}).catch(er => {
  console.error('error loading configs!', er)
})

API

The Config class is the sole export.

const Config = require('@npmcli/config')

static Config.typeDefs

The type definitions passed to nopt for CLI option parsing and known configuration validation.

constructor new Config(options)

Options:

Returns a config object, which is not yet loaded.

Fields:

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, or default.

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 check config.valid, since each data object is marked for re-evaluation on every config.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:

    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')

config.save(where)

Save the config file specified by the where param. Must be one of project, user, global, builtin.