node-nmconfig

3 min read Original article ↗

nmConfig

Build Status

Handy and strongly opinionated config helper on top of reconfig.

So what about it?

Here in Namshi we like our configuration: incremental, overridable, and defined in a compact way.
As well as we like to don't go nuts when we clone a project repo for the 1st time.
This is why we came up with tools like reconfig and file-ensure. With nmConfig we put all this things together in a convenient lib that turns all of this in a matter of a require() instruction.

What does it do:

  • Automatically creates a config/ directory and the needed files if they are not present:
config/
     |- base.yml
     |- dev.example.yml
     |- staging.yml
     |- live.yml
  • Compiles your config files, figures out your environment and applies the needed merging on the base.yml one:

#base.yml

characters:

  yoda: jedi

  anakin: jedi

  obiWan: jedi

#dev.yml

characters:

  anakin: sith

will result in:

{

  characters: {

    yoda: 'jedi',

    anakin: 'sith',

    obiWan: 'jedi'

  }

}

You can eventually define configuration paths in your app's package.json too, using your app's name as key, and they'll be added to the final configuration:

{

  "name": "myConfigurableApp",

  "version": "0.0.1",

  "description": "I can configure apps",

  "myConfigurableApp": {

    "characters": {

      "benSolo": "sith"

    }

  }

{

  characters: {

    yoda: 'jedi',

    anakin: 'sith',

    obiWan: 'jedi',

    benSolo: 'sith'

  }

}

  • returns you a reconfig instance:

console.log(config.get('characters.anakin'));

  • Figures out a reconfig's env overrider prefix from your package.json:

{

  "name": "myApp",

  "version": "0.1.0",

  "description": "this is my app, there are many like it, but this one is mine!"

}

will yield a MYAPP_CONFIG env prefix for reconfig (check this section on reconfig's doc for more infos on what this does)

  • Ensure you've a dev.yml on your dev machine, or eventually creates one from dev.example.yml

Options Params:

Options parameters:

  • baseFiles: A list of files creating the base configuration before applying the environment specific config. These files will be merged in order, the env file will be the last applied.

  • separator: The separator Reconfig will use for console vars overlays.

  • projectName: Defines Your project's name. If none is given, the project's name will be inferred form your package.json "name" value. All spaces will be removed.

  • prefix: The prefix that Reconfig will use while grabbing console variable and applying overlays.

  • ensure: Tells to nmConfig to check for the existence of .yml file. If a .example.yml is found, it will be used to produce the ensured file.

  • env: Forced value for the environment: by default nmConfig will read you env form:
    - PROJECTNAME_ENV
    - NODE_ENV
    - or default to "dev"

NOTE: If you want to output the value of your system configuration on loading your config then you can set an option in your environment config file with a value of verboseConfig: true at the top level. If this is set then the config will be printed to STDOUT.

Installation

Install this library via NPM:

npm install node-nmconfig

Usage

var config = require('node-nmconfig')();

var config = require('node-nmconfig')({  });

If you need it on the client side we highly recommend browserify.

Tests

This library is a little convenience wrapper on top of extensively tested projects, so for once we can be a little bit lazy and skip them ;)
We do like tests tho, so if you feel giving us a hand we'll be more than happy to see some PR love on this side :D