@stryke/helpers
Version:
A package containing miscellaneous helper functions that are used across many different Storm Software projects.
36 lines (35 loc) • 1.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.deepMerge = deepMerge;
var _isFunction = require("@stryke/type-checks/is-function");
var _isMergeableObject = require("@stryke/type-checks/is-mergeable-object");
var _propertyExists = require("@stryke/type-checks/property-exists");
const b = e => Array.isArray(e) ? [] : {},
o = (e, r) => r.clone !== !1 && r.isMergeableObject(e) ? deepMerge(b(e), e, r) : e,
g = (e, r, n) => [...e, ...r].map(a => o(a, n)),
u = (e, r) => {
if (!r.customMerge) return deepMerge;
const n = r.customMerge(e);
return (0, _isFunction.isFunction)(n) ? n : deepMerge;
},
s = e => [...Object.keys(e), ...(Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(e).filter(r => Object.propertyIsEnumerable.call(e, r)) : [])],
M = (e, r, n) => {
const a = {};
if (n.isMergeableObject(e)) for (const t of s(e)) a[t] = o(e[t], n);
for (const t of s(r)) a[t] = (0, _propertyExists.propertyUnsafe)(e, t) && n.isMergeableObject(r[t]) ? u(t, n)(e[t], r[t], n) : o(r[t], n);
return a;
};
function deepMerge(e, r, n) {
if (!e || !r) return e || r;
const a = n ?? {};
a.arrayMerge ??= g, a.isMergeableObject ??= _isMergeableObject.isMergeableObject, a.cloneUnlessOtherwiseSpecified ??= o;
const t = Array.isArray(r),
y = Array.isArray(e);
return t === y ? t ? a.arrayMerge(e, r, a) : M(e, r, a) : o(r, a);
}
deepMerge.all = function (r, n) {
if (!Array.isArray(r)) throw new TypeError("first argument should be an array");
return r.reduce((a, t) => deepMerge(a, t, n), {});
};