Source: utils.js

var _ = require('lodash')
;

/**
  @namespace Utils
**/
var Utils = module.exports = {};

/**
 * Takes an object of defaults and an object of options or a function that sets the options to 'this'
 * @function Utils.defaults
 * @param {Object} defs - An object of defaults
 * @param {Object|Function} opts - An object of options, or a function
 * @returns {Object}
 *
 * @example
 * // uses an object as the options
 * // returns {a: 'one', b: 2, c: {d: 3, e: 'four'}}
 * Utils.defaults({a: 1, b: 2, c: {d: 3, e: 4}}, {a: 'one', c: {e: 'four'}})
 *
 * @example
 * // uses a function to set the options
 * // returns {a: 'one', b: 2, c: {d: 3, e: 'four'}}
 * Utils.defaults({a: 1, b: 2, c: {d: 3, e: 4}}, function(){
 *   this.a = 'one';
 *   this.c.e = 'four';
 * })
 */
Utils.defaults = function (defs, opts)
{
  var opts = opts || {};

  if( !_.isObject(defs) )
  {
    throw(new Error('Utils.defaults: expected arg[0] opts be object-like'));
  }

  if( _.isFunction(opts) )
  {
    var clone = _.cloneDeep(defs)
    opts.call(clone);
    return clone;
  }
  else if( _.isObject(opts) )
  {
    var clone = _.cloneDeep(defs);
    _.merge(clone, opts);
    return clone;
  }
  else
  {
    throw(new Error("Utils.defauts: expected arg[1] opts be object-like or function"));
  }
}