|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- # config-chain
-
- A module for loading custom configurations
-
- ## NOTE: Feature Freeze
-
- [![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)
-
- This module is frozen.
-
- In general, we recommend using [rc](https://github.com/dominictarr/rc) instead,
- but as [npm](https://github.com/npmjs/npm) depends on this, it cannot be changed.
-
-
- ## Install
-
- ```sh
- yarn add config-chain
-
- # npm users
- npm install --save config-chain
- ```
-
- ## Usage
-
- ```js
- const cc = require('config-chain');
-
- console.log(cc.env('TERM_', process.env));
- /*
- { SESSION_ID: 'w1:5F38',
- PROGRAM_VERSION: '3.1.2',
- PROGRAM: 'iTerm.app' }
- */
- ```
-
- The `.env` function gets all the keys on the provided object which are
- prefixed by the specified prefix, removes the prefix, and puts the values on a new object.
-
- <br/>
-
- ## Full Usage
-
- ``` js
-
- // npm install config-chain
-
- var cc = require('config-chain')
- , opts = require('optimist').argv //ALWAYS USE OPTIMIST FOR COMMAND LINE OPTIONS.
- , env = opts.env || process.env.YOUR_APP_ENV || 'dev' //SET YOUR ENV LIKE THIS.
-
- // EACH ARG TO CONFIGURATOR IS LOADED INTO CONFIGURATION CHAIN
- // EARLIER ITEMS OVERIDE LATER ITEMS
- // PUTS COMMAND LINE OPTS FIRST, AND DEFAULTS LAST!
-
- //strings are interpereted as filenames.
- //will be loaded synchronously
-
- var conf =
- cc(
- //OVERRIDE SETTINGS WITH COMMAND LINE OPTS
- opts,
-
- //ENV VARS IF PREFIXED WITH 'myApp_'
-
- cc.env('myApp_'), //myApp_foo = 'like this'
-
- //FILE NAMED BY ENV
- path.join(__dirname, 'config.' + env + '.json'),
-
- //IF `env` is PRODUCTION
- env === 'prod'
- ? path.join(__dirname, 'special.json') //load a special file
- : null //NULL IS IGNORED!
-
- //SUBDIR FOR ENV CONFIG
- path.join(__dirname, 'config', env, 'config.json'),
-
- //SEARCH PARENT DIRECTORIES FROM CURRENT DIR FOR FILE
- cc.find('config.json'),
-
- //PUT DEFAULTS LAST
- {
- host: 'localhost'
- port: 8000
- })
-
- var host = conf.get('host')
-
- // or
-
- var host = conf.store.host
-
- ```
-
- Finally, flexible configurations! 👌
-
- ## Custom Configuations
-
- ```javascript
- var cc = require('config-chain')
-
- // all the stuff you did before
- var config = cc({
- some: 'object'
- },
- cc.find('config.json'),
- cc.env('myApp_')
- )
- // CONFIGS AS A SERVICE, aka "CaaS", aka EVERY DEVOPS DREAM OMG!
- .addUrl('http://configurator:1234/my-configs')
- // ASYNC FTW!
- .addFile('/path/to/file.json')
-
- // OBJECTS ARE OK TOO, they're SYNC but they still ORDER RIGHT
- // BECAUSE PROMISES ARE USED BUT NO, NOT *THOSE* PROMISES, JUST
- // ACTUAL PROMISES LIKE YOU MAKE TO YOUR MOM, KEPT OUT OF LOVE
- .add({ another: 'object' })
-
- // DIE A THOUSAND DEATHS IF THIS EVER HAPPENS!!
- .on('error', function (er) {
- // IF ONLY THERE WAS SOMETHIGN HARDER THAN THROW
- // MY SORROW COULD BE ADEQUATELY EXPRESSED. /o\
- throw er
- })
-
- // THROW A PARTY IN YOUR FACE WHEN ITS ALL LOADED!!
- .on('load', function (config) {
- console.awesome('HOLY SHIT!')
- })
- ```
-
- # API Docs
-
- ## cc(...args)
-
- MAKE A CHAIN AND ADD ALL THE ARGS.
-
- If the arg is a STRING, then it shall be a JSON FILENAME.
-
- RETURN THE CHAIN!
-
- ## cc.json(...args)
-
- Join the args into a JSON filename!
-
- SYNC I/O!
-
- ## cc.find(relativePath)
-
- SEEK the RELATIVE PATH by climbing the TREE OF DIRECTORIES.
-
- RETURN THE FOUND PATH!
-
- SYNC I/O!
-
- ## cc.parse(content, file, type)
-
- Parse the content string, and guess the type from either the
- specified type or the filename.
-
- RETURN THE RESULTING OBJECT!
-
- NO I/O!
-
- ## cc.env(prefix, env=process.env)
-
- Get all the keys on the provided object which are
- prefixed by the specified prefix, removes the prefix, and puts the values on a new object.
-
- RETURN THE RESULTING OBJECT!
-
- NO I/O!
-
- ## cc.ConfigChain()
-
- The ConfigChain class for CRAY CRAY JQUERY STYLE METHOD CHAINING!
-
- One of these is returned by the main exported function, as well.
-
- It inherits (prototypically) from
- [ProtoList](https://github.com/isaacs/proto-list/), and also inherits
- (parasitically) from
- [EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)
-
- It has all the methods from both, and except where noted, they are
- unchanged.
-
- ### LET IT BE KNOWN THAT chain IS AN INSTANCE OF ConfigChain.
-
- ## chain.sources
-
- A list of all the places where it got stuff. The keys are the names
- passed to addFile or addUrl etc, and the value is an object with some
- info about the data source.
-
- ## chain.addFile(filename, type, [name=filename])
-
- Filename is the name of the file. Name is an arbitrary string to be
- used later if you desire. Type is either 'ini' or 'json', and will
- try to guess intelligently if omitted.
-
- Loaded files can be saved later.
-
- ## chain.addUrl(url, type, [name=url])
-
- Same as the filename thing, but with a url.
-
- Can't be saved later.
-
- ## chain.addEnv(prefix, env, [name='env'])
-
- Add all the keys from the env object that start with the prefix.
-
- ## chain.addString(data, file, type, [name])
-
- Parse the string and add it to the set. (Mainly used internally.)
-
- ## chain.add(object, [name])
-
- Add the object to the set.
-
- ## chain.root {Object}
-
- The root from which all the other config objects in the set descend
- prototypically.
-
- Put your defaults here.
-
- ## chain.set(key, value, name)
-
- Set the key to the value on the named config object. If name is
- unset, then set it on the first config object in the set. (That is,
- the one with the highest priority, which was added first.)
-
- ## chain.get(key, [name])
-
- Get the key from the named config object explicitly, or from the
- resolved configs if not specified.
-
- ## chain.save(name, type)
-
- Write the named config object back to its origin.
-
- Currently only supported for env and file config types.
-
- For files, encode the data according to the type.
-
- ## chain.on('save', function () {})
-
- When one or more files are saved, emits `save` event when they're all
- saved.
-
- ## chain.on('load', function (chain) {})
-
- When the config chain has loaded all the specified files and urls and
- such, the 'load' event fires.
|