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