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
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 };
|