UNPKG

2.76 kBJavaScriptView Raw
1import { __assign, __spreadArray } from "tslib";
2import { isNonNullObject } from "./objects.js";
3var hasOwnProperty = Object.prototype.hasOwnProperty;
4export function mergeDeep() {
5 var sources = [];
6 for (var _i = 0; _i < arguments.length; _i++) {
7 sources[_i] = arguments[_i];
8 }
9 return mergeDeepArray(sources);
10}
11export function mergeDeepArray(sources) {
12 var target = sources[0] || {};
13 var count = sources.length;
14 if (count > 1) {
15 var merger = new DeepMerger();
16 for (var i = 1; i < count; ++i) {
17 target = merger.merge(target, sources[i]);
18 }
19 }
20 return target;
21}
22var defaultReconciler = function (target, source, property) {
23 return this.merge(target[property], source[property]);
24};
25var DeepMerger = (function () {
26 function DeepMerger(reconciler) {
27 if (reconciler === void 0) { reconciler = defaultReconciler; }
28 this.reconciler = reconciler;
29 this.isObject = isNonNullObject;
30 this.pastCopies = new Set();
31 }
32 DeepMerger.prototype.merge = function (target, source) {
33 var _this = this;
34 var context = [];
35 for (var _i = 2; _i < arguments.length; _i++) {
36 context[_i - 2] = arguments[_i];
37 }
38 if (isNonNullObject(source) && isNonNullObject(target)) {
39 Object.keys(source).forEach(function (sourceKey) {
40 if (hasOwnProperty.call(target, sourceKey)) {
41 var targetValue = target[sourceKey];
42 if (source[sourceKey] !== targetValue) {
43 var result = _this.reconciler.apply(_this, __spreadArray([target, source, sourceKey], context, false));
44 if (result !== targetValue) {
45 target = _this.shallowCopyForMerge(target);
46 target[sourceKey] = result;
47 }
48 }
49 }
50 else {
51 target = _this.shallowCopyForMerge(target);
52 target[sourceKey] = source[sourceKey];
53 }
54 });
55 return target;
56 }
57 return source;
58 };
59 DeepMerger.prototype.shallowCopyForMerge = function (value) {
60 if (isNonNullObject(value)) {
61 if (!this.pastCopies.has(value)) {
62 if (Array.isArray(value)) {
63 value = value.slice(0);
64 }
65 else {
66 value = __assign({ __proto__: Object.getPrototypeOf(value) }, value);
67 }
68 this.pastCopies.add(value);
69 }
70 }
71 return value;
72 };
73 return DeepMerger;
74}());
75export { DeepMerger };
76//# sourceMappingURL=mergeDeep.js.map
\No newline at end of file