Source: engine/universal/capabilities/parser/objectParser/insertAndMergeRecursively.js

/**
 * @module insertAndMergeRecursively
 * @memberof module:@proceed/capabilities.module:parser.module:objectParser
 */

/**
  A Function that brings the parameter and value to required format
  @param {object}
  @param {array}
  @param {*}
   @returns {object} of the parameter and the value pairs
*/
function insertRecursively(merged = {}, keys, value) {
  let mergedValue;
  if (keys.length === 1) {
    if (Object.keys(merged).indexOf(keys[0]) >= 0) {
      throw new Error(`Found multiple values for ${keys[0]}`);
    }
    mergedValue = value;
  } else {
    mergedValue = insertRecursively(merged[keys[0]], keys.slice(1), value);
  }
  const result = { ...merged };
  result[keys[0]] = mergedValue;
  return result;
}

/**
    A Function that merges the arguments to the required form for native function call
    if the parameter is an object, semantic description uses '/' to identify the level
    of the key in an object eg: { 'option/blackwhite': false }
    returns eg: options: { blackWhite: false} }
    @param {object}
    @param {object}
    @returns {object}
  */
function changeForNativeExecution(a, b) {
  if (a === undefined || b === undefined) {
    return a || b;
  }
  let merged = {};
  for (const key of Object.keys(a)) {
    merged = insertRecursively(merged, key.split('/'), a[key]);
  }
  for (const key of Object.keys(b)) {
    merged = insertRecursively(merged, key.split('/'), b[key]);
  }
  return merged;
}

module.exports = changeForNativeExecution;