code: function mergeObjects(source, target, opts) {
    const properties = Object.keys(source)
  
    for (let i = 0; i < properties.length; i++) {
      const property = properties[i]
  
      // Is this property on the list of exclusions?
      if (opts.exclusions.indexOf(property) !== -1) {
        continue
      }
  
      let item = source[property]
  
      // Is this an object? Should we perform recursive merge?
      if (opts.recurse && item instanceof Object) {
        // If the item on the source is object, we must have such object on the target as well
        // So we either reuse any such existing "receiving" object or we create a new one
        const receiver = target[property] instanceof Object ? target[property]
                                                            : new item.constructor()
  
        // "To understand recursion, you must first understand recursion."
        item = doMerge(item, receiver, opts)
      }
  
      target[property] = item
    }
  
    return target
  }
docs: Merge two objects
  
  @private
  @param     {Object}    source    Source to merge
  @param     {Object}    target    Target to merge into
  @param     {Object}    opts      Options for the merge
  @return    {Object}