limu
Version:
A fast js lib of immutable data, based on shallow copy on read and mark modified on write mechanism
2 lines (1 loc) • 19.2 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).limu={})}(this,(function(e){"use strict";const t=Symbol("V"),n=Symbol("IMMUT_BASE"),r=Symbol("IS_RAW"),o=Symbol("P"),a="Map",s="Set",c="Array",i=[Symbol.iterator,Symbol.toStringTag,r],l={Map:a,Set:s,Array:c},u="[object Object]",f="[object Map]",p="[object Set]",d="[object Array]",y="[object Function]",h={[f]:a,[p]:s,[d]:c,[u]:"Object"},m=["push","pop","shift","splice","unshift","reverse","copyWithin","delete","fill"],v=["set","clear","delete"],g=["add","clear","delete"],k=["splice","sort","unshift","shift"],M={[a]:["clear","delete","entries","forEach","get","has","keys","set","values"],[s]:["add","clear","delete","entries","forEach","has","keys","values"],[c]:["concat","copyWithin","entries","every","fill","filter","find","findIndex","flat","flatMap","forEach","includes","indexOf","join","keys","lastIndexOf","map","pop","push","reduce","reduceRight","reverse","shift","unshift","slice","some","sort","splice","values","valueOf"]},P={[a]:["clear","set","delete"],[s]:["clear","add","delete"],[c]:["pop","push","shift","unshift","splice","sort","copyWithin"]},b={[a]:["forEach","get"],[s]:["forEach"],[c]:["forEach","map"]},x="get",O="set",V="del";function S(e,t=""){e.value>=Number.MAX_SAFE_INTEGER?(e.value=1,e.prefixSeed+=1):e.value+=1;const{value:n,prefixSeed:r}=e;return`${t}${r}_${n}`}const w={value:0,prefixSeed:1},E={value:0,prefixSeed:1},j={value:0,prefixSeed:1},C={value:0,prefixSeed:1},A={},I={};const T={autoFreeze:!1,autoRevoke:!0},D=Object.prototype.toString,N=!!Reflect,B=Object.prototype.hasOwnProperty;function R(e,t){return N?Reflect.has(e,t):B.call(e,t)}function _(e){return D.call(e)}function z(...e){return e}function F(e){return _(e)===u}function K(e){return _(e)===f}function $(e){return _(e)===p}function W(e){return _(e)===y}function G(e){var t=_(e);return h[t]}function U(e){const t=_(e);return![u,d,f,p,y].includes(t)}function J(e){return"AsyncFunction"===e.constructor.name||"function"==typeof e.then}function L(e){return"undefined"!=typeof Promise&&e instanceof Promise}function X(e){var t=typeof e;return"number"===t||"string"===t&&/^[0-9]*$/.test(e)}function q(e){return"symbol"==typeof e}function H(e,n){const r=function(e){return e&&e[t]||""}(e);return!!r&&r!==n}function Q(e){const t=e=>{if(U(e))return e;let n=e;if(Array.isArray(e)&&(n=e.slice(),n.forEach(((e,r)=>{n[r]=t(e)}))),$(e)){const r=Array.from(e);r.forEach(((e,n)=>{r[n]=t(e)})),n=new Set(r)}return K(e)&&(n=new Map(e),n.forEach(((e,r)=>{n.set(r,t(e))}))),F(e)&&(n={},Object.keys(e).forEach((r=>{n[r]=t(e[r])}))),n};return t(e)}function Y(e,t){if(t.immutBase)return e;return function(e,t){if(t)return e;if(Array.isArray(e))return e.slice();let n=e;return e&&F(e)&&(n=Object.assign({},e)),K(e)&&(n=new Map(e)),$(e)&&(n=new Set(e)),n}(e,t.readOnly)}function Z(e){const t=e;if(!q(e))return e;let n=A[t];return n||(n=S(j,"SI_"),A[t]=n),n}function ee(e,t){const n=e.map((e=>e.join("|"))),r=t.join("|");return n.indexOf(r)}function te(e,t){let n=e;return t&&(n=ne(e,!0)),n.join("|")}function ne(e,t){let n=[];if(t)return e.forEach((e=>{const t=Z(e);n.push(t)})),n;n=e.slice();const r=e.length-1,o=Z(e[r]);return n[r]=o,n}function re(e,t,n){const{keyPaths:r,keyStrPaths:o}=e,a=n||ne(t);ee(o,a)<0&&(r.push(t),o.push(a))}function oe(e,t){const n=e.get(t);if(void 0!==n)return n;const r=e.get(Number(t)||t);return void 0!==r?r:void 0}function ae(e,t){let n,r=e;const o=t.length-1;let a=!0;for(let e=0;e<=o;e++){const s=t[e];if(!r&&e<o){a=!1;break}n=K(r)?oe(r,s):r[s],r=n}return{val:n,isGetted:a}}function se(e,t,n){let r=e;const o=t.length-1;for(let e=0;e<=o&&r;e++){const a=t[e];if(e===o){r[a]=n;break}r=K(r)?oe(r,a):r[a]}}function ce(e,t){const n=te(e);let r="";for(const e of t){const t=`${te(e,!0)}|`;if(n.startsWith(t)){r=n.substring(t.length);break}}const o=[];if(r){const e=r.split("|"),n=e.map((e=>I[e]||e));t.forEach((e=>{o.push(e.concat(n))}))}return o}const ie=new Map,le=new Map,ue=new WeakMap,fe=new Map;function pe(e){e.rootMeta.modified=!0;const t=e=>{e&&!e.modified&&(e.modified=!0,t(e.parentMeta))};t(e)}function de(e,t,n){const{ver:r,parentMeta:o=null,immutBase:a,compareVer:s,apiCtx:i,hasOnOperate:l}=n,u=G(t);let f=n.sourceId,p=[],d=[],y=[],h=[],m=[],v=[];const g=Z(e);let k=0,M=null;if(o){f=o.sourceId,M=o.copy,k=function(e,t){const n=me(e,t);return n?n.level+1:1}(M,i);y=o.selfType===c?o.keyPath.concat(e):o.arrKeyPath,p=function(e,t,n){const r=[t],o=he(e,n);if(o&&o.level>0){const{keyPath:e}=o;return[...e,t]}return r}(M,e,i),d=ne(p);let t=[];if(o.arrKeyPath.length){const e=Oe(f,te(o.arrKeyPath,!0));t=ce(p,e)}if(!t.length){const{keyStrPathStr:e}=o;t=Oe(f,e?`${e}|${g}`:g)}if(t.length>1){const{copy:e}=o.rootMeta,{val:n}=ae(e,p),r=[];let a=!1;const s=[];t.forEach(((t,o)=>{const{val:c}=ae(e,t);if(!a){const n=t.slice(0,t.length-1),{val:r}=ae(e,n);Array.isArray(r)&&(a=!0)}c===n?(v.push(t),m.push(ne(t)),s.push(t)):r.push(o)})),a&&(h=s),r.forEach((e=>t.splice(e,1)))}else o.keyPaths.length>0?o.keyPaths.forEach((t=>{const n=t.concat(e);v.push(n),m.push(ne(n))})):(v=[p],m=[d])}!y.length&&h.length&&(y=h[0]),y.length&&!h.length&&h.push(y);const P=o?`${o.keyStrPathStr}|${g}`:g,b={id:S(E,"MID_"),sourceId:f,rootMeta:null,parentMeta:o,parent:M,selfType:u,self:t,copy:null,key:e,keyStr:g,keyPath:p,keyStrPath:d,keyStrPathStr:P,keyPaths:v,keyStrPaths:m,arrKeyPath:y,arrKeyPaths:h,level:k,proxyVal:null,proxyItems:null,modified:!1,scopes:[],isImmutBase:a,isDel:!1,isArrOrderChanged:!1,newNodeStats:{},newNodeMap:new Map,newNodes:[],ver:r,compareVer:s,revoke:z,hasOnOperate:l,execOnOperate:z};return b.rootMeta=0===k?b:o.rootMeta,b}function ye(e){if(!e)return!1;const t=ke(e);return!!t&&!t.isImmutBase}function he(e,t){return t.metaMap.get(e)}function me(e,t){return e?t?t.metaMap.get(e)||null:Pe(e)||null:null}function ve(e){return e&&Pe(e)||null}function ge(e){return e&&e[t]||""}function ke(e){return Pe(e)||null}function Me(e,t){const n=ke(e),r=ke(t);if(!n&&!r)return!Object.is(e,t);const{self:o,modified:a,compareVer:s,ver:c,level:i}=n||{self:e,modified:!1,compareVer:!1,ver:"0",level:0},{self:l,modified:u,compareVer:f,ver:p,level:d}=r||{self:t,modified:!1,compareVer:!1,ver:"0",level:0};return o!==l||(!(!s&&!f||0!==i&&0!==d||c===p)||(a||u))}function Pe(e){return e[o]}function be(e,t,n){t.copy=e.copy,t.self=e.self,t.parentMeta[n]=e.self}function xe(e){return ue.get(e)||S(C,"SR_")}function Oe(e,t){const n=function(e){return ie.get(e)}(e);return n&&n[t]||[]}function Ve(e,t){const{sourceId:n,keyPaths:r}=e;t.forEach((e=>function(e,t,n){let r=ie.get(e);r||(r={},ie.set(e,r)),r[t]=n}(n,e,r)));const o=le.get(n)||[],a=r.map((e=>te(e,!0)));let s=!1;e:for(const e of o)for(const t of e){const n=te(t,!0);if(a.includes(n)){const t=e.map((e=>te(e,!0)));r.forEach(((n,r)=>{t.includes(a[r])||e.push(n)})),s=!0;break e}}s||o.push(r),le.set(n,o)}function Se(e,t,n){let r=null;if(!(n&&n.parentMeta!==t))return r;const o=n.keyPath,a=t.keyPath.concat(e),s=ne(o),c=ne(a),i=s.join("|"),l=c.join("|");if(i!==l){re(n,a,c),Ve(n,[i,l]);const o=n.modified;let s=e,u=n,f=t;do{f.copy[s]=u.copy,f.modified=o,s=f.key,u=f,f=f.parentMeta}while(f);r=n.proxyVal}return r}function we(e,t){const{metaMap:n}=t,r=new Map;t.newNodeMap.forEach((e=>{const{node:n,parent:o,key:a}=e,s=r.get(n);if(s)return void(o[a]=s);const c=e;!function(e,t,n,r){const o=[],a=(e,t,n)=>{U(e)||o.includes(e)||(o.push(e),r(e,t,n),Array.isArray(e)&&e.forEach(((t,n)=>{a(t,e,n)})),K(e)&&e.forEach(((t,n)=>{a(t,e,n)})),F(e)&&Object.keys(e).forEach((t=>{a(e[t],e,t)})))};a(e,t,n)}(n,o,a,((e,n,r)=>{const o=me(e,t);if(o){const{modified:e,copy:t,self:a}=o,s=e?t:a;n[r]=s}})),c.target=o[a],r.set(n,c.target)})),e.scopes.forEach((e=>{const{modified:t,copy:r,parentMeta:o,key:i,self:l,revoke:u,proxyVal:f,isDel:p}=e,d=()=>{n.delete(l),n.delete(f),u()};if(!r||!o)return d();const y=t?r:l,h=o.copy,m=o.selfType;return m===a?(h.set(i,y),d()):m===s?(h.delete(f),h.add(y),d()):m===c?(function(e,t,n){const{copy:r,isArrOrderChanged:o}=e,{targetNode:a,key:s}=n;if(o){const e=r.findIndex((e=>e===t.copy||e===t.proxyVal));e>=0&&(r[e]=a)}else r[s]=a}(o,e,{targetNode:y,key:i}),d()):!0!==p?(h[i]=y,d()):void 0})),e.scopes.length=0}function Ee(e,t){const n=(r=e.sourceId,le.get(r)||[]);var r;let o=-1;const a=[],s=[];for(const r of n){o+=1;let n=null,c=null;const i=[];for(const t of r){const{val:r}=ae(e.proxyVal,t),o=ve(r);o&&(o.modified&&!n&&(n=o),c=o,i.push(o.self))}if(i[0]===i[1]){if(n)for(const e of r)se(t,e,n.copy);else if(c)for(const e of r)se(t,e,c.self)}else a.push(o),r.forEach((e=>s.push(te(e))))}a.length&&function(e,t,n){const r=ie.get(e);r&&n.forEach((e=>Reflect.deleteProperty(r,e)));const o=(le.get(e)||[]).filter(((e,n)=>!t.includes(n)));le.set(e,o)}(e.sourceId,a,s)}function je(e){e.rootMeta.scopes.push(e)}function Ce(e,t,n){const{traps:r,immutBase:a,apiCtx:s,autoRevoke:c}=n,i=de(e,t,n),l=Y(t,n);i.copy=l;const u=Object.assign(Object.assign({},r),{get:(e,t)=>o===t?i:r.get(e,t)});if(a){const e=new Proxy(l,u);i.proxyVal=e,i.revoke=z}else{const e=Proxy.revocable(l,u);i.proxyVal=e.proxy,i.revoke=c?e.revoke:z}return s.metaMap.set(l,i),s.metaMap.set(i.proxyVal,i),s.metaMap.set(i.self,i),i}function Ae(e,t){const{key:n,parentMeta:o,parent:i,parentType:l,apiCtx:u}=t,f=(e,n)=>{const p=n||"";if(U(e)||!e)return e;if(!o)throw new Error("[[ createMeta ]]: meta should not be null");if(!W(e)){if(o.newNodeStats[p]||e[r])return e;let n=he(e,u);return n||(n=Ce(p,e,t),je(n),o.selfType===a?i.set(p,n.copy):i[p]=n.copy),n.proxyVal}if(!function(e,t){return e===c||(b[e]||[]).includes(t)}(l,p))return e;if(o.proxyItems)return e;let d=[];if(l===s){const e=new Set;i.forEach((t=>e.add(f(t)))),Te(e,o,{dataType:s,apiCtx:u}),d=e,o.copy=d}else if(l===a){const e=new Map;i.forEach(((t,n)=>e.set(n,f(t,n)))),Te(e,o,{dataType:a,apiCtx:u}),d=e,o.copy=d}else l===c&&"sort"!==p&&(o.copy=o.copy||i.slice(),d=o.proxyVal);return o.proxyItems=d,e};return f(e,n)}function Ie(e,t){if(!F(e))return e;const n=he(e,t);return n?n.copy:e}function Te(e,t,n){const{dataType:r,apiCtx:o}=n,c=e.delete.bind(e),i=e.clear.bind(e);if(e.delete=function(...e){return pe(t),c(...e)},e.clear=function(...e){return pe(t),i(...e)},r===s){const n=e.add.bind(e);e.add=function(...e){return pe(t),n(...e)}}if(r===a){const n=e.set.bind(e),r=e.get.bind(e);e.set=function(...e){if(pe(t),t.hasOnOperate){const n=e[1];t.rootMeta.execOnOperate("set",e[0],{mayProxyVal:n,value:n,parentMeta:t})}return n(...e)},e.get=function(...e){const n=r(...e);if(t.hasOnOperate){const r=me(n,o),a=r?r.copy||r.self:n;t.rootMeta.execOnOperate("get",e[0],{mayProxyVal:n,value:a,parentMeta:t,isChanged:!1})}return n}}}function De(e,t){const n=e.keyPath.slice();n.push(t);return n.join("|")}function Ne(e,t){const{op:n,key:r,value:o,calledBy:i,parentType:l,parentMeta:u,apiCtx:f,isValueDraft:p,mayNewNode:d}=t,y=Ie(o,f);if(!u)return void(e[r]=y);const{self:h,copy:P}=u;!function(e){const{calledBy:t,parentMeta:n,op:r,parentType:o}=e;(["deleteProperty","set"].includes(t)||"get"===t&&(o===s&&g.includes(r)||o===c&&m.includes(r)||o===a&&v.includes(r)))&&pe(n)}({calledBy:i,parentMeta:u,op:n,key:r,parentType:l});const b=M[l]||[];if(W(o)&&b.includes(n))return"slice"===n?h.slice:(k.includes(n)&&(u.isArrOrderChanged=!0),P?l===s||l===a?P[n].bind(P):P[n]:h[n].bind(h));if(!P)return y;const x=P[r],S=()=>{const e=me(x,f);e&&(e.isDel=!0)};if(V===n){const e=me(o,f);if(e){const{keyPaths:t}=e;1===t.length?e.isDel=!0:function(e){const{keyPaths:t,keyStrPaths:n,keyStrPath:r}=e,o=ee(n,r);n.splice(o,1),t.splice(o,1),e.keyPath=t[0],e.keyStrPath=n[0]}(e)}else S();return U(P[r])||f.newNodeMap.delete(De(u,r)),void delete P[r]}O===n&&d&&(p||U(y)||(u.newNodeStats[r]=!0,f.newNodeMap.set(De(u,r),{parent:P,node:y,key:r,target:null}))),P[r]=y,S(),(()=>{const e=me(o,f);e&&e.isDel&&(e.isDel=!1,e.key=r,e.keyPath=u.keyPath.concat([r]),e.level=u.level+1,e.parent=u.copy,e.parentMeta=u)})()}function Be(e){if(U(e))return e;if(Array.isArray(e)&&e.length>0)return e.forEach(Be),Object.freeze(e);if($(e)){const t=e;t.add=()=>t,t.delete=()=>!1,t.clear=z;for(const e of t.values())Object.freeze(e);return Object.freeze(e)}if(K(e)){const t=e;t.set=()=>t,t.delete=()=>!1,t.clear=z;for(const e of t.values())Object.freeze(e);return Object.freeze(e)}return Object.getOwnPropertyNames(e).forEach((t=>{Be(e[t])})),Object.freeze(e)}const Re={};["length","constructor","asymmetricMatch","nodeType","size"].forEach((e=>Re[e]=1));const _e={[c]:1,[s]:1,[a]:1},ze=new Map;function Fe(e){var r,o,a,s,u,f,p;const d=e||{},y=d.onOperate,h=!!y,m=d.customKeys||[],v=null!==(r=d[n])&&void 0!==r&&r,g=null!==(o=d.readOnly)&&void 0!==o&&o,k=d.disableWarn,b=null!==(a=d.compareVer)&&void 0!==a&&a,E=null!==(s=d.autoFreeze)&&void 0!==s?s:T.autoFreeze,j=null!==(u=d.disableProxy)&&void 0!==u&&u;let C="",A=!1;const I={metaMap:new Map,newNodeMap:new Map,metaVer:C};j||(C=S(w,"MV_"),I.metaVer=C,fe.set(C,I));const D=null!==(f=d.autoRevoke)&&void 0!==f?f:T.autoRevoke,N=null===(p=d.silenceSetTrapErr)||void 0===p||p,B=(e,t)=>(console.warn(`${e} failed, cuase draft root has been finised! key:`,t),N),_=()=>(k||console.warn("can not mutate state at readOnly mode!"),!0),z=(e,t,n)=>{const{mayProxyVal:r,parentMeta:o,value:a,isCustom:s=!1}=n;let c=!1;const i=e!==x;let l=i?a:r;if(!y)return{isChanged:c,replacedValue:l};const u=o||{},{selfType:f="",keyPath:p=[],copy:d,self:h,modified:m,proxyVal:g,arrKeyPath:k=[],keyPaths:b=[],keyStrPaths:O=[],arrKeyPaths:V=[]}=u;let S=!1;if(void 0!==n.isChanged)c=n.isChanged;else{if((M[f]||[]).includes(t)){S=!0;c=(P[f]||[]).includes(t)}else if(i){const e=m?d:h;c=!o||e[t]!==a}}let w=!1;return y({immutBase:v,parent:h,parentType:f,parentProxy:g,op:e,replaceValue:e=>{w=!0,l=e},getReplaced:()=>({isReplaced:w,replacedValue:l}),isBuiltInFnKey:S,isChanged:c,isCustom:s,key:t,keyPath:p,keyPaths:b,keyStrPaths:O,fullKeyPath:p.concat(t),arrKeyPath:k,arrKeyPaths:V,value:a,proxyValue:r}),{replacedValue:l,isChanged:c}},K=(()=>{let e=!0;const n={get:(e,r)=>{if(t===r)return C;const o=e[r];if(i.includes(r)){if(W(o)){if(Symbol.iterator===r&&Array.isArray(e)){let t=0;const r=()=>({next:()=>{const r=e.length;if(0===r)return{done:!0,value:void 0};const o=t===r,a=o?void 0:n.get(e,String(t));return t++,{done:o,value:a}},[Symbol.iterator]:()=>r});return r}return o.bind(e)}return o}if("__proto__"===r||"toJSON"===r&&!R(e,r))return o;let a=o;const s=he(e,I),u=Se(r,s,me(a,I));if(u)return u;if(m.includes(r)){return z(x,r,{parentMeta:s,mayProxyVal:a,value:o,isChanged:!1,isCustom:!0}).replacedValue}const f=null==s?void 0:s.selfType;if(_e[f]&&Re[r])return"length"!==r&&"size"!==r||z(x,r,{parentMeta:s,mayProxyVal:a,value:o}),s.copy[r];if(a=Ae(o,{key:r,compareVer:b,parentMeta:s,parentType:f,ver:C,traps:n,parent:e,immutBase:v,readOnly:g,apiCtx:I,hasOnOperate:h,autoRevoke:D}),f===c&&X(r)){return z(x,r,{parentMeta:s,mayProxyVal:a,value:o}).replacedValue}if(l[f]){a=Ne(e,{op:r,key:r,value:o,metaVer:C,calledBy:x,parentType:f,parentMeta:s,apiCtx:I});return z(x,r,{parentMeta:s,mayProxyVal:a,value:o}).replacedValue}return z(x,r,{parentMeta:s,mayProxyVal:a,value:o}).replacedValue},set:(t,n,r)=>{if(A)return B(O,n);let o=!0;const a=he(t,I);let s=!1,i=r;if(ye(r))if(s=!0,u=C,F(l=r)&&ge(l)!==u)e=!1;else{if(Ie(r,I)===t[n])return!0;const e=he(r,I);Se(n,a,e);re(e,a.keyPath.concat(n))}else if(H(r,C)){const{proxyVal:e,self:t}=a.rootMeta,s=Pe(r),{isGetted:c,val:l}=function(e,t){let n,r=!1;const o=t.length-1;for(let a=0;a<=o;a++){const o=t[a],{isGetted:s,val:c}=ae(e,o);if(s){n=c,r=!0;break}}return{isGetted:r,val:n}}(e,s.keyPaths);if(!c)return((e,t)=>(console.warn(`${e} failed, cuase the value is an expired limu proxy data! key:`,t),N))(O,n);const u=Pe(l);be(s,u,n);const f=a.keyPath.concat(n);u.keyPaths.forEach((t=>{const{isGetted:r,val:o}=ae(e,t);if(r){const e=Pe(o);be(s,e,n)}})),re(u,f),function(e,t,n){const r=t.length-1;for(let o=0;o<=r;o++)se(e,t[o],n)}(t,u.keyPaths,u.self),o=1===u.keyPaths.length,I.metaMap.set(u.copy,u),i=l}var l,u;if(g)return z(O,n,{parentMeta:a,isChanged:!1,value:i}),_();if(a&&a.selfType===c){if(a.copy&&a.__callSet&&X(n)){return i=z(O,n,{parentMeta:a,value:i}).replacedValue,a.copy[n]=i,!0}a.__callSet=!0}let f=!1;if(y){const e=z(O,n,{parentMeta:a,value:i});i=e.replacedValue,f=e.isChanged}else{f=(a.modified?a.copy:a.self)[n]!==i}return f&&Ne(t,{parentMeta:a,key:n,value:i,metaVer:C,calledBy:O,apiCtx:I,isValueDraft:s,mayNewNode:o}),!0},deleteProperty:(e,t)=>{if(A)return B(V,t);const n=he(e,I),r=e[t];return g?(z(V,t,{parentMeta:n,isChanged:!1,value:r}),_()):(z(V,t,{parentMeta:n,isChanged:!0,value:r}),Ne(e,{parentMeta:n,op:V,key:t,value:"",metaVer:C,calledBy:"deleteProperty",apiCtx:I}),!0)},apply:function(e,t,n){return e.apply(t,n)}};return{createDraft:e=>{if(U(e))throw new Error("base state can not be primitive");if(j)return ze.set(e,K.finishDraft),e;let t=e;const r=d.sourceId||xe(e),o=he(e,I);if(o){if(v&&o.isImmutBase)return o.proxyVal;t=o.self}const a=Ce("",t,{ver:C,traps:n,immutBase:v,readOnly:g,compareVer:b,apiCtx:I,hasOnOperate:h,autoRevoke:D,sourceId:r});return je(a),a.execOnOperate=z,ze.set(a.proxyVal,K.finishDraft),a.proxyVal},finishDraft:(t,n)=>{if(j)return ze.delete(t),t;const r=he(t,I);if(r.isImmutBase&&!n)return t;let o=function(e,t){const{self:n,copy:r,modified:o}=e;let a=n;return r&&o&&(a=e.copy),Ee(e,a),we(e,t),a}(r,I);var a,s;return E&&e&&(o=Be(o)),fe.delete(C),ze.delete(t),a=o,s=r.sourceId,ue.set(a,s),A=!0,o}}})();return K}const Ke=ye,$e=Me,We=function(e,t,n=!0){const r=n?Me:Object.is;return!((e,t)=>{for(let n in e)if(!(n in t))return!0;for(let n in t)if(r(e[n],t[n]))return!0;return!1})(e,t)},Ge={has:R,noop:z,isObject:F,isMap:K,isSet:$,isFn:W,isPrimitive:U,isPromiseFn:J,isPromiseResult:L,isSymbol:q,isMardedRaw:function(e){var t;return!!e&&(null!==(t=e[r])&&void 0!==t&&t)},canBeNum:X,isDraft:Ke,isDiff:$e,shallowCompare:We,getDraftMeta:ve,getDataType:G};function Ue(e){if(!W(e))throw new Error("produce callback is not a function")}const Je="Not a Limu root draft";function Le(e){const t=ze.get(e);if(!t){if(!ge(e))throw new Error(Je);const t=ke(e);if(0!==(null==t?void 0:t.level))throw new Error(Je);throw new Error("Draft has been finished!")}return t}function Xe(e,t){return Fe(t).createDraft(e)}function qe(e){return Le(e)(e)}function He(e,t,n){Ue(t);const r=Xe(e,n),o=t(r);return function(e,t){if(J(e)||L(t))throw new Error("produce callback can not be a promise function or result")}(t,o),qe(r)}const Qe=function(e,t,n){if(!t||!W(t)){const n=e,r=t;return Ue(e),e=>He(e,n,r)}return He(e,t,n)},Ye=Be;const Ze=function(e){if(!e)return e;const t=ve(e);return t?t.self:e},et=function(e){return!e||U(e)||(e[r]=!0),e},tt=function(e){if(!e)return e;const t=ve(e);return t?Q(t.copy||t.self):e};e.VER="4.1.1",e.createDraft=Xe,e.current=tt,e.deepCopy=function(e){return Q(e)},e.deepFreeze=Ye,e.finishDraft=qe,e.finishImmut=function(e){return Le(e)(e,!0)},e.getAutoFreeze=function(){return T.autoFreeze},e.immut=function(e,t){return Fe(Object.assign(Object.assign({},t||{}),{readOnly:!0,[n]:!0})).createDraft(e)},e.isDiff=$e,e.isDraft=Ke,e.limuUtils=Ge,e.markRaw=et,e.original=Ze,e.produce=Qe,e.setAutoFreeze=function(e){T.autoFreeze=e},e.shallowCompare=We,Object.defineProperty(e,"__esModule",{value:!0})}));