mirror of
				https://github.com/crazy-max/ghaction-upx.git
				synced 2025-11-04 04:58:11 -07: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.
 |