When combining objects from many sources, deep copy is used:
// a{sub: {foo: 'foo'},arr: ['foo']}// b{sub: {bar: 'bar'},arr: ['bar']}// combined (a + b){sub: {foo: 'foo',bar: 'bar'},arr: ['foo','bar']}// E.g you want completely to overwrite `arr` property, then prefix the key's name with `!`// a{sub: {foo: 'foo'},arr: ['foo']}// b{sub: {bar: 'bar'},'!arr': ['bar']}// combined (a + b){sub: {foo: 'foo',bar: 'bar'},arr: ['bar']}
Example:
importAppCfgfrom'appcfg'constconfig=awaitAppCfg.fetch([// from file. (with Special Folder format syntax support){path: '%APPDATA%/.appName/config.yml',// set this source as writable for configuration persistancewritable: true},// ENV + .env{dotenv: true,// per default CWD is checked, can be overridenpath: './foo/bar/'},// directory{path: 'defaults/**.yml'},// mongodb{mongo: 'barSettings'},// from file, but use only nested property{path: 'package.json',getterProperty: 'atma'}]);
Command Line overrides
Command line arguments are parsed and also set to the configuration object.
Ways to define the variables. (Example defines DEBUG and TEST flags)
directly in the configuration
// foo.ymldebug: truetest: true
from the command line:
> node index --debug --test
using environment configuration(comma delimited)
$ set ENV=DEBUG,TEST
# also
$ set NODE_ENV=DEBUG,TEST
$ node index
.toJSON():Object
Returns clean json configuration object.
.done(callback)
Fire the callback when the configuration is loaded
Source
Common properties for all source types
{// Define specific property to extract SUB-JSON from the loaded configuration// @default: null
getterProperty: String// Define specific property in the root configuration,// where the loaded configuration should be inserted into// @default: null
setterProperty: String// Specify if this source can be used for persistence// @default: false
writable: Boolean// Fires before source $read function is called// (e.g. change this.path property or any other things)
beforeRead: Function<Source,RootConfig>// Fires after source completes reading// (e.g. access config object in `Source.config`)afterRead: Function<Source,RootConfig>// If true, do not log any warning if the source returns 404// @default: falseoptional: true// If true, then waits until all previous sources are loaded// @default: false
sync: true}
FileSource
{// File pathpath: String}
DirectorySource
It will be mapped to multiple FileSources
{// Directory path with GLOB look-up, e.g. 'configs/**.json'path: String}
MongoDBSource
Depends on ClassJS
{// Collection namemongo: String,// if source is writable// @default: truewritable: Boolean// MongoDB Connection Settings// It can be also specified in previous configuration source, under `mongodb` property// @default: null -settings: {// connection stringconnection: String// or// Port, default 27017port: Number,// IP, default '127.0.0.1'ip: String,// Database name, no defaultdb: String}}
CustomSource
This source type can suit any needs.
// Constructor with the Deferrable Interface and the method `read`FunctionclassFoo{config: anyasyncread(){// do any reads and calcs, after that resolve the sourcethis.config=awaitloadConfig();}}