ajsfw
Version:
Ajs Framework
67 lines (66 loc) • 2.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var DeepMerge = (function () {
function DeepMerge() {
}
DeepMerge.isMergeableObject = function (val) {
var nonNullObject = val && typeof val === "object";
return nonNullObject
&& Object.prototype.toString.call(val) !== "[object RegExp]"
&& Object.prototype.toString.call(val) !== "[object Date]";
};
DeepMerge.emptyTarget = function (val) {
return Array.isArray(val) ? [] : {};
};
DeepMerge.cloneIfNecessary = function (value, optionsArgument) {
var clone = optionsArgument && optionsArgument.clone === true;
return (clone && DeepMerge.isMergeableObject(value)) ?
DeepMerge.merge(DeepMerge.emptyTarget(value), value, optionsArgument) : value;
};
DeepMerge.defaultArrayMerge = function (target, source, optionsArgument) {
var destination = target.slice();
source.forEach(function (e, i) {
if (typeof destination[i] === "undefined") {
destination[i] = DeepMerge.cloneIfNecessary(e, optionsArgument);
}
else if (DeepMerge.isMergeableObject(e)) {
destination[i] = DeepMerge.merge(target[i], e, optionsArgument);
}
else if (target.indexOf(e) === -1) {
destination.push(DeepMerge.cloneIfNecessary(e, optionsArgument));
}
});
return destination;
};
DeepMerge.mergeObject = function (target, source, optionsArgument) {
var destination = {};
if (DeepMerge.isMergeableObject(target)) {
Object.keys(target).forEach(function (key) {
destination[key] = DeepMerge.cloneIfNecessary(target[key], optionsArgument);
});
}
Object.keys(source).forEach(function (key) {
if (!DeepMerge.isMergeableObject(source[key]) || !target[key]) {
destination[key] = DeepMerge.cloneIfNecessary(source[key], optionsArgument);
}
else {
destination[key] = DeepMerge.merge(target[key], source[key], optionsArgument);
}
});
return destination;
};
DeepMerge.merge = function (target, source, optionsArgument) {
var array = Array.isArray(source);
var options = optionsArgument || { arrayMerge: DeepMerge.defaultArrayMerge };
var arrayMerge = options.arrayMerge || DeepMerge.defaultArrayMerge;
if (array) {
return Array.isArray(target) ?
arrayMerge(target, source, optionsArgument) : DeepMerge.cloneIfNecessary(source, optionsArgument);
}
else {
return DeepMerge.mergeObject(target, source, optionsArgument);
}
};
return DeepMerge;
}());
exports.DeepMerge = DeepMerge;