Source: object-utils/modules/defaults.js

/**
 * @summary defaults
 * @version 3.0.0
 * @since 1.0.0
 * @author Arian Khosravi<arian.khosravi@aofl.com>
 */

/**
 * Assigns missing defaultOptions onto the target object.
 *
 * @memberof module:@aofl/object-utils
 *
 * @param {Object} target
 * @param {Object} defaultOptions
 *
 * @return {Object}
 */
const defaults = (target, defaults) => {
  const recurse = (t, d) => {
    for (const key in d) {
      /* istanbul ignore next */
      if (!Object.prototype.hasOwnProperty.call(d, key)) continue;
      if (typeof t[key] === 'undefined') {
        if (Array.isArray(d[key])) {
          t[key] = [].concat(d[key]);
        } else if (typeof d[key] === 'object') {
          t[key] = {};
          recurse(t[key], d[key]);
        } else {
          t[key] = d[key];
        }
      } else {
        if (typeof t[key] === 'object' && !Array.isArray(t[key])) {
          recurse(t[key], d[key]);
        }
      }
    }
  };

  recurse(target, defaults);
};

export {defaults};