function merge (target, source) {
if (isMergeable(source)) {
  var keys = Object.keys(source);
  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var sourceSetting = source[key];
    var targetSetting = target[key];

    if (isMergeable(sourceSetting)) {
      // It's a nested object, so merge it recursively
      target[key] = merge(targetSetting || {}, sourceSetting);
    }
    else if (sourceSetting !== undefined) {
      // It's a scalar value, function, or array. No merging necessary. Just overwrite the target value.
      target[key] = sourceSetting;
    }
  }
}
return target;
}
Merges the properties of the source object into the target object.

@param {object} target - The object that we're populating
@param {?object} source - The options that are being merged
@returns {object}