/**
* @file merge-options.js
* @module merge-options
*/
import {each, isPlain} from './obj';
/**
* Deep-merge one or more options objects, recursively merging **only** plain
* object properties.
*
* @param {Object[]} sources
* One or more objects to merge into a new object.
*
* @returns {Object}
* A new object that is the merged result of all sources.
*/
export default function mergeOptions(...sources) {
const result = {};
sources.forEach(source => {
if (!source) {
return;
}
each(source, (value, key) => {
if (!isPlain(value)) {
result[key] = value;
return;
}
if (!isPlain(result[key])) {
result[key] = {};
}
result[key] = mergeOptions(result[key], value);
});
});
return result;
}