You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.7 KiB

import { isPlainObject, isArray, isSymbol } from 'is-what';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
function assignProp(carry, key, newVal, originalObject) {
var propType = originalObject.propertyIsEnumerable(key)
? 'enumerable'
: 'nonenumerable';
if (propType === 'enumerable')
carry[key] = newVal;
if (propType === 'nonenumerable') {
Object.defineProperty(carry, key, {
value: newVal,
enumerable: false,
writable: true,
configurable: true
});
}
}
function mergeRecursively(origin, newComer, extensions) {
// work directly on newComer if its not an object
if (!isPlainObject(newComer)) {
// extend merge rules
if (extensions && isArray(extensions)) {
extensions.forEach(function (extend) {
newComer = extend(origin, newComer);
});
}
return newComer;
}
// define newObject to merge all values upon
var newObject = {};
if (isPlainObject(origin)) {
var props_1 = Object.getOwnPropertyNames(origin);
var symbols_1 = Object.getOwnPropertySymbols(origin);
newObject = __spreadArrays(props_1, symbols_1).reduce(function (carry, key) {
// @ts-ignore
var targetVal = origin[key];
if ((!isSymbol(key) && !Object.getOwnPropertyNames(newComer).includes(key)) ||
(isSymbol(key) && !Object.getOwnPropertySymbols(newComer).includes(key))) {
assignProp(carry, key, targetVal, origin);
}
return carry;
}, {});
}
var props = Object.getOwnPropertyNames(newComer);
var symbols = Object.getOwnPropertySymbols(newComer);
var result = __spreadArrays(props, symbols).reduce(function (carry, key) {
// re-define the origin and newComer as targetVal and newVal
var newVal = newComer[key];
var targetVal = (isPlainObject(origin))
// @ts-ignore
? origin[key]
: undefined;
// extend merge rules
if (extensions && isArray(extensions)) {
extensions.forEach(function (extend) {
newVal = extend(targetVal, newVal);
});
}
// When newVal is an object do the merge recursively
if (targetVal !== undefined && isPlainObject(newVal)) {
newVal = mergeRecursively(targetVal, newVal, extensions);
}
assignProp(carry, key, newVal, newComer);
return carry;
}, newObject);
return result;
}
/**
* Merge anything recursively.
* Objects get merged, special objects (classes etc.) are re-assigned "as is".
* Basic types overwrite objects or other basic types.
*
* @param {(IConfig | any)} origin
* @param {...any[]} newComers
* @returns the result
*/
function merge(origin) {
var newComers = [];
for (var _i = 1; _i < arguments.length; _i++) {
newComers[_i - 1] = arguments[_i];
}
var extensions = null;
var base = origin;
if (isPlainObject(origin) && origin.extensions && Object.keys(origin).length === 1) {
base = {};
extensions = origin.extensions;
}
return newComers.reduce(function (result, newComer) {
return mergeRecursively(result, newComer, extensions);
}, base);
}
function concatArrays(originVal, newVal) {
if (isArray(originVal) && isArray(newVal)) {
// concat logic
return originVal.concat(newVal);
}
return newVal; // always return newVal as fallback!!
}
export default merge;
export { concatArrays, merge };