lib/defaults.js
function(target, source) {
    target = cloneJSON(target);

    for (var key in source) {
      if (source.hasOwnProperty(key)) {
        if (isObject(target[key]) && isObject(source[key])) {
          target[key] = merge(target[key], source[key]);
        } else {
          target[key] = source[key];
        }
      }
    }
    return target;
  }
function(target, source) {
    target = cloneJSON(target);

    for (var key in source) {
      if (source.hasOwnProperty(key)) {
        if (isObject(target[key]) && isObject(source[key])) {
          target[key] = merge(target[key], source[key]);
        } else {
          target[key] = source[key];
        }
      }
    }
    return target;
  }
function ( target , source ) { target = cloneJSON ( target ) ; for ( var key in source ) { if ( source . hasOwnProperty ( key ) ) { if ( isObject ( target [ key ] ) && isObject ( source [ key ] ) ) { target [ key ] = merge ( target [ key ] , source [ key ] ) ; } else { target [ key ] = source [ key ] ; } } } return target ; }
returns a result of deep merge of two objects

@param {Object} target
@param {Object} source
@return {Object}
returns a result of deep merge of two objects