@lxndr/config

Configuration manager for Node.js and web applications

Stats

StarsIssuesVersionUpdatedCreatedSize
@lxndr/config
021.0.43 years ago5 years agoMinified + gzip package size for @lxndr/config in KB

Readme

build status dependencies status devDependencies status Build Status

Application configuration manager for Node.js and browsers.

API

new Config([options])
  /* static methods */
  register(name, klass) -> void
  /* instance methods */
  use(provider, [options]) -> this
  reset() -> void
  reload() -> Primise
  persist() -> Promise
  of(key) -> ConfigProxy
  get([key, [defaultValue]]) -> any
  set([key], value) -> this

Usage:

const config = new Config({
  enchance: true
});

Options:

  • enchance (= false) - Forces Config constructor to create proxified version of itself. See below.

Schema:

Schema allows you to define what to do with specific parts of your configuration.

This is completely optional and can be defined at any time. Schema mostly used when reload() and persist() are called, and does not validate values.

/* only define default value */
config.schema({
  'user.name': 'guest',
  'user.role': ['guest']
});

/* more complex example */
config.schema({
  'user.role': {
    type: 'array',
    default: ['guest'],
    stringified: true
  }
});

NOTE: Array ['guest'] is just an example, you can default to any type of value.

Providers:

Providers define places and the ways the values for configuration are loaded and stored.

/* static object (the object is cloned) */
config.use({
  a: 1,
  b: [2, 3, true]
});

/* registers a function that called every configuration reloaded */
config.use(function () {
  return Promise.resolve({
    user: {
      name: 'guest',
      role: ['guest']
    }
  });
});

/* browser local storage */
config.use('localStorage', {
  writable: true
});

/* JSON file */
config.use('file', {
  path: './config.json'
});

/* YAML file */
config.use('file', {
  path: './config.yaml',
  parser: 'yaml'
});

/* directory */
config.use('directory', {
  path: './config',
  parser: 'yaml' /* defaults to 'json' */
});

You have to call reload() after calling use().

Getting:

/* simple get */
const v = config.get('user.roles');
const v = config.get('user.roles[0]');
/* with default value */
const v = config.get('user.roles', ['guest']);
/* in enchanced mode */
const v = config['user.roles'];
/* or even */
const v = config.user.roles;

Setting:

/* simple set */
config.set('user.name', 'admin');
config.set('user.roles[0]', 'admin');
/* in enchanced mode */
const v = config['user.roles[0]'] = 'admin';

Loading and saving:

You have to call it every time you add providers.

config.reload().catch(err => {
  console.error(err.message);
});

You have to call it every time you change configuration and what to save it.

config.persist().catch(err => {
  console.error(err.message);
});

Namespaces:

const cfg = config.of('b')

Custom parser:

import * as json5 from 'json5';

const config = new Config()
  .use('file', {
    path: './config.json5',
    parser: {
      parse(text) {
        return json5.parse(text);
      },
      stringify(value) {
        /* prettify output, this have to be human-readable file */
        return json5.stringify(value, ' ', 2);
      }
    }
  });

Custom provider:

config.use(new SequelizeConfigProvider({
  model: 'param'
}));

or

/* register configuration provider class */
config.register('seqelize', SequelizeConfigProvider);
/* add configuration provider */
config.use('seqelize', {
  model: 'param'
});

on how to make your own configuration provider class see src/providers directory.

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.