deepmerge-plus
Version:
A library for deep (recursive) merging of Javascript objects
73 lines (64 loc) • 2.2 kB
JavaScript
import e from "is-mergeable-object";
function cloneUnlessOtherwiseSpecified(e, r, t) {
const n = (!r || !1 !== r.clone) && _isMergeableObject(e, r, t);
let a = n ? deepmerge(function emptyTarget(e) {
return Array.isArray(e) ? [] : {};
}(e), e, r) : e;
return null != r && r.keyValueOrMode && !n && t && "key" in t && (t.destination && (a = t.destination[t.key] || a),
t.target && (a = t.target[t.key] || a), t.source && (a = t.source[t.key] || a)),
a;
}
function _isMergeableObject(t, n, a) {
var i;
let l = null == n || null === (i = n.isMergeableObject) || void 0 === i ? void 0 : i.call(n, t, e, n, a);
return null == l && (l = "boolean" == typeof (null == t ? void 0 : t[r]) ? t[r] : e(t)),
l;
}
function defaultArrayMerge(e, r, t) {
return e.concat(r).map((function(e, r, n) {
return cloneUnlessOtherwiseSpecified(e, t, {
key: r
});
}));
}
function deepmerge(e, r, t) {
const n = Array.isArray(r);
return n === Array.isArray(e) ? n ? ((t || {
arrayMerge: defaultArrayMerge
}).arrayMerge || defaultArrayMerge)(e, r, t) : function mergeObject(e, r, t) {
let n = {};
return _isMergeableObject(e, t) && Object.keys(e).forEach((function(a) {
n[a] = cloneUnlessOtherwiseSpecified(e[a], t, {
key: a,
source: r,
target: e,
destination: n
});
})), Object.keys(r).forEach((function(a) {
n[a] = _isMergeableObject(r[a], t, {
key: a,
source: r,
target: e
}) && e[a] ? deepmerge(e[a], r[a], t) : cloneUnlessOtherwiseSpecified(r[a], t, {
key: a,
source: r,
target: e
});
})), n;
}(e, r, t) : cloneUnlessOtherwiseSpecified(r, t, {
target: e,
source: r
});
}
function isMergeable(r) {
return e(r);
}
const r = Symbol.for("SYMBOL_IS_MERGEABLE");
function deepmergeAll(e, r) {
if (!Array.isArray(e)) throw new Error("first argument should be an array");
return e.reduce((function(e, t) {
return deepmerge(e, t, r);
}), {});
}
export { r as SYMBOL_IS_MERGEABLE, _isMergeableObject, deepmergeAll as all, deepmerge, deepmergeAll, deepmerge as default, isMergeable };
//# sourceMappingURL=index.esm.mjs.map