UNPKG

mergician

Version:

Uniquely flexible and light-weight utility for cloning and deep (recursive) merging of JavaScript objects. Supports descriptor values, accessor functions, and custom prototypes. Provides advanced options for customizing the clone/merge process.

10 lines (9 loc) 4.54 kB
/*! * mergician * v2.0.2 * https://jhildenbiddle.github.io/mergician/ * (c) 2022-2024 John Hildenbiddle * MIT license */ function M(...r){let l={};return r.forEach(f=>{f.forEach(e=>{l[e]=e in l?++l[e]:1})}),l}function I(...r){return r.reduce((l,f)=>l.filter(Set.prototype.has,new Set(f)))}function C(...r){let l=M(...r);return Object.keys(l).filter(f=>l[f]>1)}function F(...r){let l=M(...r);return Object.keys(l).filter(f=>l[f]<r.length)}function N(...r){let l=M(...r);return Object.keys(l).filter(f=>l[f]===1)}function U(r,l=!1){let f=Object.getOwnPropertyNames(r);if(l)for(let e in r)!f.includes(e)&&f.push(e);return f}function E(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function x(r){if(!E(r))return!1;let l=["writable","enumerable","configurable"].some(p=>p in r),f=["get","set"].some(p=>typeof r[p]=="function"),e=["get","set"].every(p=>p in r),m="value"in r&&l||f&&(e||l);if(m){let p=["configurable","get","set","enumerable","value","writable"];m=Object.keys(r).some(P=>!(P in p))}return m}var b={onlyKeys:[],skipKeys:[],onlyCommonKeys:!1,onlyUniversalKeys:!1,skipCommonKeys:!1,skipUniversalKeys:!1,invokeGetters:!1,skipSetters:!1,appendArrays:!1,prependArrays:!1,dedupArrays:!1,sortArrays:!1,hoistEnumerable:!1,hoistProto:!1,skipProto:!1,filter:Function.prototype,beforeEach:Function.prototype,afterEach:Function.prototype,onCircular:Function.prototype};function _(r,...l){let f=arguments.length===1?arguments[0]:{},e={...b,...f},m=new Map,p=new Map,P=typeof e.sortArrays=="function"?e.sortArrays:void 0,O=new WeakMap,k=0;function w(a){return U(a,e.hoistEnumerable)}function A(...a){let y;a.length>1&&(e.onlyCommonKeys?y=C(...a.map(n=>w(n))):e.onlyUniversalKeys?y=I(...a.map(n=>w(n))):e.skipCommonKeys?y=N(...a.map(n=>w(n))):e.skipUniversalKeys&&(y=F(...a.map(n=>w(n))))),!y&&e.onlyKeys.length&&(y=e.onlyKeys),y&&y!==e.onlyKeys&&e.onlyKeys.length&&(y=y.filter(n=>e.onlyKeys.includes(n)));let D=a.reduce((n,i)=>{O.set(i,n);let u=y||w(i);e.skipKeys.length&&(u=u.filter(h=>e.skipKeys.indexOf(h)===-1));for(let h=0;h<u.length;h++){let o=u[h],g=n[o],c={configurable:!0,enumerable:!0};if(!(o in i))continue;let K=!1,t=i[o],d=Object.getOwnPropertyDescriptor(i,o);if(d&&typeof d.set=="function"&&typeof d.get!="function"){e.skipSetters||Object.defineProperty(n,o,d);continue}if(e.filter!==b.filter){let s=e.filter({depth:k,key:o,srcObj:i,srcVal:t,targetObj:n,targetVal:g});if(s!==void 0&&!s)continue}if(e.beforeEach!==b.beforeEach){let s=e.beforeEach({depth:k,key:o,srcObj:i,srcVal:t,targetObj:n,targetVal:g});s!==void 0&&(K=!0,t=s)}if(typeof t=="object"&&t!==null&&O.has(i[o])){let s=e.onCircular({depth:k,key:o,srcObj:i,srcVal:i[o],targetObj:n,targetVal:g});if(s===void 0){t=O.get(i[o]),n[o]=t;continue}K=!0,t=s}if(Array.isArray(t)){if(t=[...t],Array.isArray(g)&&(e.appendArrays?t=[...g,...t]:e.prependArrays&&(t=[...t,...g])),e.dedupArrays)if(e.afterEach!==b.afterEach)t=[...new Set(t)];else{let s=m.get(n);s&&!s.includes(o)?s.push(o):m.set(n,[o])}if(e.sortArrays)if(e.afterEach!==b.afterEach)t=t.sort(P);else{let s=p.get(n);s&&!s.includes(o)?s.push(o):p.set(n,[o])}}else t instanceof Date?t=new Date(t):E(t)&&(!K||!x(t))&&(k++,E(g)?t=A(g,t):t=A(t),k--);if(e.afterEach!==b.afterEach){let s=e.afterEach({depth:k,key:o,mergeVal:t,srcObj:i,targetObj:n});s!==void 0&&(K=!0,t=s)}if(K){let s=x(t)?t:{configurable:!0,enumerable:!0,value:t,writable:!0};Object.defineProperty(n,o,s);continue}if(d){let{configurable:s,enumerable:G,get:V,set:S,writable:R}=d;Object.assign(c,{configurable:s,enumerable:G}),typeof V=="function"&&(e.invokeGetters?c.value=t:c.get=V),!e.skipSetters&&typeof S=="function"&&!Object.hasOwnProperty.call(c,"value")&&(c.set=S),!c.get&&!c.set&&(c.writable=!!R)}!c.get&&!c.set&&!("value"in c)&&(c.value=t,c.writable=d&&"writable"in d?d.writable:!0),Object.defineProperty(n,o,c)}return n},{});for(let[n,i]of m.entries())for(let u of i){let h=Object.getOwnPropertyDescriptor(n,u),{configurable:o,enumerable:g,writable:c}=h;Object.defineProperty(n,u,{configurable:o,enumerable:g,value:[...new Set(n[u])],writable:c!==void 0?c:!0})}for(let[n,i]of p.entries())for(let u of i)n[u].sort(P);let v=D;if(!e.skipProto){let n=a.reduce((i,u)=>{let h=Object.getPrototypeOf(u);return h&&h!==Object.prototype&&i.push(h),i},[]);if(n.length){let i=A(...n);e.hoistProto?v=A(i,D):v=Object.create(i,Object.getOwnPropertyDescriptors(D))}}return v}return arguments.length===1?function(...a){return arguments.length===1?_({...e,...a[0]}):A(...a)}:A(...arguments)}export{_ as mergician}; //# sourceMappingURL=mergician.esm.min.js.map