kojak

1.2.1 • Public • Published

Kojak

(Named after an Irish Setter in a Stephen King novel, because all the better names are taken)

A simple configuration container class, designed for handling settings objects easily. Design considerations:

  • support environment-based property choices at any depth
  • provide a native interface for getting and setting (no special methods required)
  • support modification after creation
  • support environment-changes after creation

It's a known limitation that convoluted series of setting a mix of keys and objects may result in unintuitive results - things set directly take precedence over objects set afterwards due to internal design. For sanity, either always set things using objects, or only use objects during the constructor phase and thereafter set directly on keys (e.g. settings.foo = 'bar' instead of settings.set({foo: 'bar'} where possible)

API

new Kojak([one, [two, [...])

Creates a new settings object with optional properties provided during creation

.set(value, override = true)

Adds an object to the Kojak collection, making top-level keys from the value available as top-level keys on the Kojak object. override defines if the new data should take preccedence over existing data.

.set(path, value, override = true)

Adds the defined path to the Kojak collection. A path is either a simple key name or a dot-separated path. It uses Lodash _.set internally.

.get(path, default)

Returns the value at the provided path, or the default if it is undefined. It uses Lodash _.get internally.

.setEnv(name)

Changes the chosen environment for path-resolution.

.useEnv(options)

Imports properties from process.env according to provided options.

settings.useEnv({
    prefix: '', // prefix string
    requirePrefix: false, // only add keys which match the prefix
    stripPrefix: false, // remove the prefix from keys that start with it
 
    castNumbers: false, // should numeric values be cast as Numbers
    
    split: /__/, // regex for splitting keys into nested parameters
    filter: /.*/, // regex for filtering keys which are added
    override: true // whether to override, or only provide defaults,
})

Examples

Basic usage, with a nested environment branch

// NODE_ENV=development
let settings = new Kojak({
  color: {
    production: 'blue',
    development: 'green'
  }
});
console.log(settings.color) // 'green'

A top-level environment branch

// NODE_ENV=production
let settings = new Kojak({
    production: {
        color: 'blue'
    },
    development: {
        color: 'green'
    }
});
console.log(settings.color) // 'blue'

Importing parameters from envvars

// NODE_PORT=9182, NESTED__VALUE=hello
let settings = new Kojak();
settings.useEnv();
console.log(settings.node_port); // '9182'
console.log(settings.nested.value); // 'hello'

Importing some parameters from envvars

// NODE_PORT=9182, NESTED__VALUE=hello
let settings = new Kojak();
settings.useEnv({
    prefix: 'NODE_',
    requirePrefix: true,
    stripPrefix: true,
    castNumbers: true
});
console.log(settings.port); // 9182

Getting a nested value with a default

let settings = new Kojak();
settings.set({flagColor: {top: 'white', bottom: 'red'}})
console.log(settings.flagColor.top) // 'white'
console.log(settings.get('flagColor.left', 'blank')) // 'blank'

Setting default-values after other things

let settings = new Kojak({color: 'white'})
 
settings.set({color: 'blue', size: 'large'}, false); // false signifies it's a default
console.log(settings.color) // 'white'
console.log(settings.size) // 'large'

Setting default values during construction

let defaults = {color: 'white', size: 'large'};
let settings = new Kojak(defaults, {color: 'blue'}); // right-most values take precedence
 
console.log(settings.color) // 'blue'
console.log(settings.size) // 'large'

Readme

Keywords

Package Sidebar

Install

npm i kojak

Weekly Downloads

0

Version

1.2.1

License

MIT

Unpacked Size

13.4 kB

Total Files

4

Last publish

Collaborators

  • richthegeek