101
Version:
common javascript utils that can be required selectively that assume es5+
49 lines (44 loc) • 1.24 kB
JavaScript
/**
* @module 101/defaults
*/
var isObject = require('./is-object');
var isBoolean = require('./is-boolean');
var exists = require('./exists');
/**
* Mixes in properties from source into target when
* the property is not a property of `target`
* @param {Object} [target] Mix into
* @param {Object} source The defaults description
* @return {Object} THe resulting target
*/
module.exports = defaults;
function defaults (target, source, deep) {
if (arguments.length === 1) {
source = target;
return function (target) {
return defaults(target, source);
};
} else if (isBoolean(source)) {
deep = source;
source = target;
return function (target) {
return defaults(target, source, deep);
};
}
target = target || {};
deep = deep || false;
if (!source) {
return target;
}
return reduceObject(target, source, deep);
}
function reduceObject (target, source, deep) {
return Object.keys(source).reduce(function (target, key) {
if (isObject(target[key]) && isObject(source[key]) && deep) {
reduceObject(target[key], source[key]);
return target;
}
target[key] = exists(target[key]) ? target[key] : source[key];
return target;
}, target);
}