mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-10-31 06:08:33 +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. |