Code coverage report for lib/utils/merge.js

Statements: 95.24% (20 / 21)      Branches: 90% (18 / 20)      Functions: 100% (4 / 4)      Lines: 95% (19 / 20)     

All files » lib/utils/ » merge.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 451   1   1 31                 1 40     40 567 530       40 93   93   31       31 22 4   9 5         40  
var clone = require('./clone');
 
module.exports = merge;
 
function typesMatch(a, b) {
  return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b));
}
 
/**
 * A deep merge of the source based on the target.
 * @param  {Object} source   [description]
 * @param  {Object} target   [description]
 * @return {Object}          [description]
 */
function merge(source, target, result) {
  Eif (result === undefined) result = clone(source);
 
  // merge missing values from the target to the source
  Object.getOwnPropertyNames(target).forEach(function (key) {
    if (source[key] === undefined) {
      result[key] = target[key];
    }
  });
 
  Object.getOwnPropertyNames(source).forEach(function (key) {
    var value = source[key];
 
    if (target[key] && typesMatch(value, target[key])) {
      // merge empty values
      Iif (value === '') {
        result[key] = target[key];
      }
 
      if (Array.isArray(value)) {
        if (value.length === 0 && target[key].length) {
          result[key] = target[key].slice(0);
        }
      } else if (typeof value === "object") {
        result[key] = merge(value, target[key]);
      }
    }
  });
 
  return result;
}