@catalyststack/subsystem-config v1.0.1
subsystem-config
An opinionated configuration subsystem for Node.js applications.
This subsystem is a lightweight minimal dependency subsystem which make prod ready configuration trivial, allowing you to load configurations from a range of sources including:
- setting in code via
setDefault()
andconfig.setOverride()
- yaml files/folders via
loadFile()
,loadFolder()
orloadFileOrFolder()
- application
package.json
- application and system
etc
folders - application
config
folder using NODE_ENV file(s) - environment variables
- command line files & arguments
Configurations are loaded into buckets which overload one another in the order they are loaded.
A default behaviour helper function loadDefaultStrategy()
is also provided to
give a sane one call default for loading configurations. In most instances you
would just call this and get a good load behaviour:
1. Application defaults: config.setDefault()
2. Application package.json
: <app_root>/package.json
3. Application etc: <app_root>/etc
4. Environment default: <app_root>/config/default
5. Environment files: <app_root>/config/<NODE_ENV, *>
6. System etc folder: /etc/<app_name>
7. ENVIRONMENT variables: <app_name>_PATH_TO_CONFIG_ENTRY=<VALUE>
8. Commandline config files: [-c|--config] /path/to/config/file/or/folder
9. Commandline arguments: --config:ppath.to[0].config.entry=<VALUE>
10. Application overrides: config.setOverride()
Installation
npm install --save '@catalyststack/subsystem-config'
Usage
The subsystem exposes a singleton instance of the Config
class so that you can
just require the subsystem and have access to your configurations:
const config = require('@catalyststack/subsystem-config');
// Initialize config subsystem
// NOTE: This should only be done once
config.init();
config.loadDefaultStrategy();
Once initialzed, values are accessible via the get()
method:
const config = require('@catalyststack/subsystem-config');
function printName()
const name = config.get('path.to.some.object.name', 'default-name');
console.log(name);
}
Also regardless of initialization, at any point within your code you can set a
default or override value via the setDefault()
and setOverride()
methods:
const config = require('@catalyststack/subsystem-config');
config.setDefault('path.to.some.default', 'if nothing else overloads this');
config.setOverride('path.to.some.override', 'force this value regardless of overloads');
Paths support both object
and array
traversal using their respective .
and
[0]
notations:
console.log(config.get('path.to.some.object.value'));
console.log(config.get('path.to.some.array[0]'));
TODO
- Implement plugin system which lets external modules attach functions (S3)
- Implement cli alias to config path to allow for universal easy cli based config
- Implement loading of both files and folders when both exist
- Implement ignoring of hidden files/folders
- Implement folder default file
- Implement
get()
operation data validation e.g. expect non empty string etc - Implement function to delete a specific bucket
- Implement cache container which is read before trying to deep resolve
- Add
...
alias support for previous stack array values i.e. deep merge previous stack array values and then push following values after - Add reference document generation