index.js
function customOverrider (a, b, propertyName) {
  if (b == null) {
    return a
  }

  if (a == null) {
    // Invoke default overrider
    return undefined
  }

  // Some objects have custom overriders
  if (b._customize_custom_overrider && b._customize_custom_overrider instanceof Function) {
    return b._customize_custom_overrider(a, b, propertyName)
  }

  // Arrays should be concatenated
  if (Array.isArray(a)) {
    return a.concat(b)
  }

  // Merge values resolving promises, if they are not leaf-promises
  if (isPromiseAlike(a) || isPromiseAlike(b)) {
    return Promise.all([a, b]).then(function ([_a, _b]) {
      // Merge the promise results
      return mergeWith({}, { x: _a }, { x: _b }, customOverrider).x
    })
  }
  // None of these options apply. Implicit "undefined" return value to invoke default overrider.
}
function customOverrider (a, b, propertyName) {
  if (b == null) {
    return a
  }

  if (a == null) {
    // Invoke default overrider
    return undefined
  }

  // Some objects have custom overriders
  if (b._customize_custom_overrider && b._customize_custom_overrider instanceof Function) {
    return b._customize_custom_overrider(a, b, propertyName)
  }

  // Arrays should be concatenated
  if (Array.isArray(a)) {
    return a.concat(b)
  }

  // Merge values resolving promises, if they are not leaf-promises
  if (isPromiseAlike(a) || isPromiseAlike(b)) {
    return Promise.all([a, b]).then(function ([_a, _b]) {
      // Merge the promise results
      return mergeWith({}, { x: _a }, { x: _b }, customOverrider).x
    })
  }
  // None of these options apply. Implicit "undefined" return value to invoke default overrider.
}
function customOverrider ( a , b , propertyName ) { if ( b == null ) { return a } if ( a == null ) { // Invoke default overrider return undefined } // Some objects have custom overriders if ( b . _customize_custom_overrider && b . _customize_custom_overrider instanceof Function ) { return b . _customize_custom_overrider ( a , b , propertyName ) } // Arrays should be concatenated if ( Array . isArray ( a ) ) { return a . concat ( b ) } // Merge values resolving promises, if they are not leaf-promises if ( isPromiseAlike ( a ) || isPromiseAlike ( b ) ) { return Promise . all ( [ a , b ] ) . then ( function ( [ _a , _b ] ) { // Merge the promise results return mergeWith ( { } , { x : _a } , { x : _b } , customOverrider ) . x } ) } // None of these options apply. Implicit "undefined" return value to invoke default overrider. }
Customize has predefined override rules for merging configs.

* If the overriding object has a `_customize_custom_overrider` function-property,
it isk called to perform the merger.
* Arrays are concatenated
* Promises are resolved and the results are merged


@param a the overridden value
@param b the overriding value
@param propertyName the property name
@returns {*} the merged value
@private
@readonly
Customize has predefined override rules for merging configs .