all files / stampit/src/ merge.js

97.5% Statements 39/40
95.45% Branches 21/22
100% Functions 6/6
100% Lines 25/25
1 branch Ignored     
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   3815× 3244×     2457× 2457× 2457×   2346× 2346×   2343× 2343×   2343× 16181× 16181× 16181×   16178×     2343×     2781×     1702×     936×    
import isObject from './isObject';
import slice from './slice';
 
function mergeOne(dst, src, shallow) {
  if (src === undefined) return dst;
  const srcIdObject = isObject(src);
  if (!srcIdObject) return src; // not a POJO, array, or function
 
  const dstIsArray = Array.isArray(dst);
  const srcIsArray = Array.isArray(src);
  if (srcIsArray) return (dstIsArray ? dst : []).concat(src);
 
  Iif (shallow === undefined) shallow = false;
  if (dstIsArray) return mergeOne({}, src, shallow);
 
  const keys = Object.keys(src);
  if (!dst) dst = {};
 
  for (let i = 0; i < keys.length; i++) {
    const key = keys[i];
    const srcValue = src[key];
    if (srcValue === undefined) continue;
 
    dst[key] = shallow ? src[key] : mergeOne(dst[key], srcValue, shallow);
  }
 
  return dst;
}
 
function mergeFew(dst, srcs, shallow) {
  return srcs.reduce((target, src) => mergeOne(target, src, shallow), dst);
}
 
export function assign(dst) {
  return mergeFew(dst, slice.call(arguments, 1), true);
}
 
export function merge(dst) {
  return mergeFew(dst, slice.call(arguments, 1), false);
}