custom-app
Version:
ITIMS��Ʒ�鿪��ר��React���,�Dz��ý��ּ�dhcc-app���������
108 lines (102 loc) • 3.8 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var isWhat = require('is-what');
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 (!isWhat.isPlainObject(newComer)) {
// extend merge rules
if (extensions && isWhat.isArray(extensions)) {
extensions.forEach(function (extend) {
newComer = extend(origin, newComer);
});
}
return newComer;
}
// define newObject to merge all values upon
var newObject = {};
if (isWhat.isPlainObject(origin)) {
var props_1 = Object.getOwnPropertyNames(origin);
var symbols_1 = Object.getOwnPropertySymbols(origin);
newObject = props_1.concat(symbols_1).reduce(function (carry, key) {
// @ts-ignore
var targetVal = origin[key];
if ((!isWhat.isSymbol(key) && !Object.getOwnPropertyNames(newComer).includes(key)) ||
(isWhat.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 = props.concat(symbols).reduce(function (carry, key) {
// re-define the origin and newComer as targetVal and newVal
var newVal = newComer[key];
var targetVal = (isWhat.isPlainObject(origin))
// @ts-ignore
? origin[key]
: undefined;
// extend merge rules
if (extensions && isWhat.isArray(extensions)) {
extensions.forEach(function (extend) {
newVal = extend(targetVal, newVal);
});
}
// When newVal is an object do the merge recursively
if (targetVal !== undefined && isWhat.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 (isWhat.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 (isWhat.isArray(originVal) && isWhat.isArray(newVal)) {
// concat logic
return originVal.concat(newVal);
}
return newVal; // always return newVal as fallback!!
}
exports.merge = merge;
exports.concatArrays = concatArrays;
exports.default = merge;