UNPKG

@stryke/helpers

Version:

A package containing miscellaneous helper functions that are used across many different Storm Software projects.

2 lines (1 loc) 1.16 kB
import{isFunction as c}from"@stryke/type-checks/is-function";import{isMergeableObject as i}from"@stryke/type-checks/is-mergeable-object";import{propertyUnsafe as l}from"@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 c(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]=l(e,t)&&n.isMergeableObject(r[t])?u(t,n)(e[t],r[t],n):o(r[t],n);return a};export function deepMerge(e,r,n){if(!e||!r)return e||r;const a=n??{};a.arrayMerge??=g,a.isMergeableObject??=i,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),{})};