Home Intro Source Mebo GitHub

src/Utils/deepMerge.js

const assert = require('assert');
const TypeCheck = require('js-typecheck');


/**
 * Merges two plain objects recursively and returns a new one
 *
 * @param {Object} objectA - plain object a
 * @param {Object} objectB - plain object b
 * @return {Object}
 * @private
 */
function deepMerge(objectA, objectB){

  assert(TypeCheck.isPlainObject(objectA), 'objectA needs to be a plain object');
  assert(TypeCheck.isPlainObject(objectB), 'objectB needs to be a plain object');

  const result = {...objectA};

  for (const key in objectB){

    // merging objects
    if (TypeCheck.isPlainObject(objectB[key]) && key in objectA){
      result[key] = deepMerge(objectA[key], objectB[key]);
    }
    // overriding / assigning
    else{
      result[key] = objectB[key];
    }
  }

  return result;
}

module.exports = deepMerge;