Merge Option Objects
npm install merge-options
> Merge Option Objects
merge-options considers plain objects as Option Objects, everything else as Option Values.
```
$ npm install --save merge-options
`js
const mergeOptions = require('merge-options');
mergeOptions({foo: 0}, {bar: 1}, {baz: 2}, {bar: 3})
//=> {foo: 0, bar: 3, baz: 2}
mergeOptions({nested: {unicorns: 'none'}}, {nested: {unicorns: 'many'}})
//=> {nested: {unicorns: 'many'}}
mergeOptions({[Symbol.for('key')]: 0}, {[Symbol.for('key')]: 42})
//=> {Symbol(key): 42}
`
`js
const mergeOptions = require('merge-options').bind({ignoreUndefined: true});
mergeOptions({foo: 'bar'}, {foo: undefined})
//=> {foo: 'bar'}
`
mergeOptions recursively merges one or more Option Objects into a new one and returns that. The options are merged in order, thus Option Values of additional options take precedence over previous ones.
The merging does not alter the passed option arguments, taking roughly the following steps:
recursively cloning[1] Option Objects and arrays until reaching Option Values*
copying[1] references to Option Values* to the result object
`js
const defaultOpts = {
fn: () => false, // functions are Option Values
promise: Promise.reject(new Error()), // all non-plain objects are Option Values
array: ['foo'], // arrays are Option Values
nested: {unicorns: 'none'} // {…} is plain, therefore an Option Object
};
const opts = {
fn: () => true, // [1]
promise: Promise.resolve('bar'), // [2]
array: ['baz'], // [3]
nested: {unicorns: 'many'} // [4]
};
mergeOptions(defaultOpts, opts)
//=>
{
fn: [Function], // === [1]
promise: Promise { 'bar' }, // === [2]
array: ['baz'], // !== [3] (arrays are cloned)
nested: {unicorns: 'many'} // !== [4] (Option Objects are cloned)
}
`
#### config
Type: object
##### config.concatArrays
Type: booleanfalse
Default:
Concatenate arrays:
`js
mergeOptions({src: ['src/']}, {src: ['test/']})
//=> {src: ['test/**']}
// Via call
mergeOptions.call({concatArrays: true}, {src: ['src/']}, {src: ['test/']})
//=> {src: ['src/', 'test/']}
// Via apply
mergeOptions.apply({concatArrays: true}, [{src: ['src/']}, {src: ['test/']}])
//=> {src: ['src/', 'test/']}
`
##### config.ignoreUndefined
Type: booleanfalse
Default:
Ignore undefined values:
`js
mergeOptions({foo: 'bar'}, {foo: undefined})
//=> {foo: undefined}
// Via call
mergeOptions.call({ignoreUndefined: true}, {foo: 'bar'}, {foo: undefined})
//=> {foo: 'bar'}
// Via apply
mergeOptions.apply({ignoreUndefined: true}, [{foo: 'bar'}, {foo: undefined}])
//=> {foo: 'bar'}
``
* See object-assign if you need a ES2015 Object.assign() ponyfill
* See deep-assign if you need to do Object.assign() recursively
MIT © Michael Mayer