mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-11-03 23:29:03 +00:00 
			
		
		
		
	
		
			
	
	
		
			258 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			258 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# config-chain
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A module for loading custom configurations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## NOTE: Feature Freeze
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](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.
							 |