@biglogic/rgs 2.9.2 → 2.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +28 -2
  2. package/SECURITY.md +10 -0
  3. package/advanced.js +1 -1
  4. package/core/types.d.ts +4 -0
  5. package/examples/README.md +41 -0
  6. package/examples/async-data-fetch/UserLoader.d.ts +12 -0
  7. package/examples/async-data-fetch/UserLoader.ts +31 -0
  8. package/examples/basic-counter/CounterComponent.d.ts +2 -0
  9. package/examples/basic-counter/CounterComponent.tsx +22 -0
  10. package/examples/basic-counter/CounterStore.d.ts +7 -0
  11. package/examples/basic-counter/CounterStore.ts +27 -0
  12. package/examples/big-data-indexeddb/BigDataStore.d.ts +10 -0
  13. package/examples/big-data-indexeddb/BigDataStore.ts +60 -0
  14. package/examples/global-theme/ThemeManager.d.ts +7 -0
  15. package/examples/global-theme/ThemeManager.ts +32 -0
  16. package/examples/hybrid-cloud-sync/HybridStore.d.ts +19 -0
  17. package/examples/hybrid-cloud-sync/HybridStore.ts +78 -0
  18. package/examples/persistent-cart/CartStore.d.ts +13 -0
  19. package/examples/persistent-cart/CartStore.ts +48 -0
  20. package/examples/rbac-dashboard/DashboardStore.d.ts +47 -0
  21. package/examples/rbac-dashboard/DashboardStore.ts +46 -0
  22. package/examples/secure-auth/AuthStore.d.ts +14 -0
  23. package/examples/secure-auth/AuthStore.ts +36 -0
  24. package/examples/security-best-practices/SecurityStore.d.ts +21 -0
  25. package/examples/security-best-practices/SecurityStore.ts +73 -0
  26. package/examples/stress-tests/StressStore.d.ts +41 -0
  27. package/examples/stress-tests/StressStore.ts +61 -0
  28. package/examples/undo-redo-editor/EditorStore.d.ts +9 -0
  29. package/examples/undo-redo-editor/EditorStore.ts +29 -0
  30. package/index.d.ts +2 -2
  31. package/index.js +1 -1
  32. package/markdown/SUMMARY.md +4 -0
  33. package/markdown/api.md +40 -1
  34. package/markdown/chapters/02-getting-started.md +1 -1
  35. package/markdown/chapters/03-the-magnetar-way.md +10 -3
  36. package/markdown/chapters/04-persistence-and-safety.md +46 -5
  37. package/markdown/chapters/05-plugins-and-extensibility.md +24 -8
  38. package/markdown/chapters/06-case-studies.md +69 -69
  39. package/markdown/chapters/08-migration-guide.md +49 -2
  40. package/markdown/chapters/09-security-architecture.md +40 -0
  41. package/package.json +9 -4
  42. package/plugins/index.d.ts +2 -0
  43. package/plugins/official/cloud-sync.plugin.d.ts +22 -0
  44. package/plugins/official/indexeddb.plugin.d.ts +7 -0
package/index.js CHANGED
@@ -1 +1 @@
1
- var vn=Object.create;var kt=Object.defineProperty;var bn=Object.getOwnPropertyDescriptor;var _n=Object.getOwnPropertyNames;var En=Object.getPrototypeOf,Rn=Object.prototype.hasOwnProperty;var ze=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var xn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of _n(t))!Rn.call(e,o)&&o!==n&&kt(e,o,{get:()=>t[o],enumerable:!(r=bn(t,o))||r.enumerable});return e};var Pn=(e,t,n)=>(n=e!=null?vn(En(e)):{},xn(t||!e||!e.__esModule?kt(n,"default",{value:e,enumerable:!0}):n,e));var nn=ze((Wr,tn)=>{"use strict";var ht=Object.defineProperty,In=Object.getOwnPropertyDescriptor,On=Object.getOwnPropertyNames,Dn=Object.prototype.hasOwnProperty,jn=(e,t)=>{for(var n in t)ht(e,n,{get:t[n],enumerable:!0})},$n=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of On(t))!Dn.call(e,o)&&o!==n&&ht(e,o,{get:()=>t[o],enumerable:!(r=In(t,o))||r.enumerable});return e},zn=e=>$n(ht({},"__esModule",{value:!0}),e),Yt={};jn(Yt,{Immer:()=>Qt,applyPatches:()=>sr,castDraft:()=>ur,castImmutable:()=>lr,createDraft:()=>ir,current:()=>Zt,enableArrayMethods:()=>Zn,enableMapSet:()=>Qn,enablePatches:()=>Xn,finishDraft:()=>ar,freeze:()=>Xe,immerable:()=>ce,isDraft:()=>q,isDraftable:()=>Y,nothing:()=>Fe,original:()=>Nn,produce:()=>er,produceWithPatches:()=>tr,setAutoFreeze:()=>nr,setUseStrictIteration:()=>or,setUseStrictShallowCopy:()=>rr});tn.exports=zn(Yt);var Fe=Symbol.for("immer-nothing"),ce=Symbol.for("immer-draftable"),P=Symbol.for("immer-state");function U(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var K=Object,ae=K.getPrototypeOf,be="constructor",Ce="prototype",ct="configurable",Le="enumerable",He="writable",_e="value",q=e=>!!e&&!!e[P];function Y(e){return e?Bt(e)||Ae(e)||!!e[ce]||!!e[be]?.[ce]||ke(e)||Te(e):!1}var Un=K[Ce][be].toString(),Nt=new WeakMap;function Bt(e){if(!e||!fe(e))return!1;let t=ae(e);if(t===null||t===K[Ce])return!0;let n=K.hasOwnProperty.call(t,be)&&t[be];if(n===Object)return!0;if(!ie(n))return!1;let r=Nt.get(n);return r===void 0&&(r=Function.toString.call(n),Nt.set(n,r)),r===Un}function Nn(e){return q(e)||U(15,e),e[P].t}function pe(e,t,n=!0){ue(e)===0?(n?Reflect.ownKeys(e):K.keys(e)).forEach(r=>{t(r,e[r],e)}):e.forEach((r,o)=>t(o,r,e))}function ue(e){let t=e[P];return t?t.r:Ae(e)?1:ke(e)?2:Te(e)?3:0}var we=(e,t,n=ue(e))=>n===2?e.has(t):K[Ce].hasOwnProperty.call(e,t),ee=(e,t,n=ue(e))=>n===2?e.get(t):e[t],We=(e,t,n,r=ue(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Vn(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Ae=Array.isArray,ke=e=>e instanceof Map,Te=e=>e instanceof Set,fe=e=>typeof e=="object",ie=e=>typeof e=="function",ut=e=>typeof e=="boolean";function Hn(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Gt=e=>fe(e)?e?.[P]:null,$=e=>e.e||e.t,Ln=e=>{let t=Gt(e);return t?t.e??t.t:e},yt=e=>e.s?e.e:e.t;function ft(e,t){if(ke(e))return new Map(e);if(Te(e))return new Set(e);if(Ae(e))return Array[Ce].slice.call(e);let n=Bt(e);if(t===!0||t==="class_only"&&!n){let r=K.getOwnPropertyDescriptors(e);delete r[P];let o=Reflect.ownKeys(r);for(let s=0;s<o.length;s++){let l=o[s],h=r[l];h[He]===!1&&(h[He]=!0,h[ct]=!0),(h.get||h.set)&&(r[l]={[ct]:!0,[He]:!0,[Le]:h[Le],[_e]:e[l]})}return K.create(ae(e),r)}else{let r=ae(e);if(r!==null&&n)return{...e};let o=K.create(r);return K.assign(o,e)}}function Xe(e,t=!1){return Qe(e)||q(e)||!Y(e)||(ue(e)>1&&K.defineProperties(e,{set:Ve,add:Ve,clear:Ve,delete:Ve}),K.freeze(e),t&&pe(e,(n,r)=>{Xe(r,!0)},!1)),e}function Wn(){U(2)}var Ve={[_e]:Wn};function Qe(e){return e===null||!fe(e)?!0:K.isFrozen(e)}var Ee="MapSet",Ke="Patches",pt="ArrayMethods",Ye={};function le(e){let t=Ye[e];return t||U(0,e),t}var Vt=e=>!!Ye[e];function mt(e,t){Ye[e]||(Ye[e]=t)}var Re,Be=()=>Re,Kn=(e,t)=>({o:[],i:e,l:t,F:!0,m:0,P:new Set,T:new Set,I:Vt(Ee)?le(Ee):void 0,E:Vt(pt)?le(pt):void 0});function Ht(e,t){t&&(e.x=le(Ke),e.y=[],e.d=[],e.C=t)}function dt(e){gt(e),e.o.forEach(Yn),e.o=null}function gt(e){e===Re&&(Re=e.i)}var Lt=e=>Re=Kn(Re,e);function Yn(e){let t=e[P];t.r===0||t.r===1?t.b():t.g=!0}function Wt(e,t){t.m=t.o.length;let n=t.o[0];if(e!==void 0&&e!==n){n[P].s&&(dt(t),U(4)),Y(e)&&(e=Kt(t,e));let{x:r}=t;r&&r.M(n[P].t,e,t)}else e=Kt(t,n);return Bn(t,e,!0),dt(t),t.y&&t.C(t.y,t.d),e!==Fe?e:void 0}function Kt(e,t){if(Qe(t))return t;let n=t[P];if(!n)return qe(t,e.P,e);if(!Ze(n,e))return t;if(!n.s)return n.t;if(!n.u){let{f:r}=n;if(r)for(;r.length>0;)r.pop()(e);Ft(n,e)}return n.e}function Bn(e,t,n=!1){!e.i&&e.l.h&&e.F&&Xe(t,n)}function qt(e){e.u=!0,e.a.m--}var Ze=(e,t)=>e.a===t,Gn=[];function Jt(e,t,n,r){let o=$(e),s=e.r;if(r!==void 0&&ee(o,r,s)===t){We(o,r,n,s);return}if(!e.D){let h=e.D=new Map;pe(o,(g,a)=>{if(q(a)){let f=h.get(a)||[];f.push(g),h.set(a,f)}})}let l=e.D.get(t)??Gn;for(let h of l)We(o,h,n,s)}function qn(e,t,n){e.f.push(function(r){let o=t;if(!o||!Ze(o,r))return;r.I?.fixSetContents(o);let s=yt(o);Jt(e,o.c??o,s,n),Ft(o,r)})}function Ft(e,t){if(e.s&&!e.u&&(e.r===3||e.r===1&&e.R||(e.n?.size??0)>0)){let{x:n}=t;if(n){let r=n.getPath(e);r&&n.O(e,r,t)}qt(e)}}function Ge(e,t,n){let{a:r}=e;if(q(n)){let o=n[P];Ze(o,r)&&o.f.push(function(){ve(e);let s=yt(o);Jt(e,n,s,t)})}else Y(n)&&e.f.push(function(){let o=$(e);e.r===3?o.has(n)&&qe(n,r.P,r):ee(o,t,e.r)===n&&r.o.length>1&&(e.n.get(t)??!1)===!0&&e.e&&qe(ee(e.e,t,e.r),r.P,r)})}function qe(e,t,n){return!n.l.h&&n.m<1||q(e)||t.has(e)||!Y(e)||Qe(e)||(t.add(e),pe(e,(r,o)=>{if(q(o)){let s=o[P];if(Ze(s,n)){let l=yt(s);We(e,r,l,e.r),qt(s)}}else Y(o)&&qe(o,t,n)})),e}function Jn(e,t){let n=Ae(e),r={r:n?1:0,a:t?t.a:Be(),s:!1,u:!1,n:void 0,i:t,t:e,c:null,e:null,b:null,S:!1,f:void 0},o=r,s=Je;n&&(o=[r],s=xe);let{revoke:l,proxy:h}=Proxy.revocable(o,s);return r.c=h,r.b=l,[h,r]}var Je={get(e,t){if(t===P)return e;let n=e.a.E,r=e.r===1&&typeof t=="string";if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let o=$(e);if(!we(o,t,e.r))return Fn(e,o,t);let s=o[t];if(e.u||!Y(s)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Hn(t))return s;if(s===lt(e.t,t)){ve(e);let l=e.r===1?+t:t,h=Pe(e.a,s,e,l);return e.e[l]=h}return s},has(e,t){return t in $(e)},ownKeys(e){return Reflect.ownKeys($(e))},set(e,t,n){let r=Xt($(e),t);if(r?.set)return r.set.call(e.c,n),!0;if(!e.s){let o=lt($(e),t),s=o?.[P];if(s&&s.t===n)return e.e[t]=n,e.n.set(t,!1),!0;if(Vn(n,o)&&(n!==void 0||we(e.t,t,e.r)))return!0;ve(e),X(e)}return e.e[t]===n&&(n!==void 0||t in e.e)||Number.isNaN(n)&&Number.isNaN(e.e[t])||(e.e[t]=n,e.n.set(t,!0),Ge(e,t,n)),!0},deleteProperty(e,t){return ve(e),lt(e.t,t)!==void 0||t in e.t?(e.n.set(t,!1),X(e)):e.n.delete(t),e.e&&delete e.e[t],!0},getOwnPropertyDescriptor(e,t){let n=$(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[He]:!0,[ct]:e.r!==1||t!=="length",[Le]:r[Le],[_e]:n[t]}},defineProperty(){U(11)},getPrototypeOf(e){return ae(e.t)},setPrototypeOf(){U(12)}},xe={};for(let e in Je){let t=Je[e];xe[e]=function(){let n=arguments;return n[0]=n[0][0],t.apply(this,n)}}xe.deleteProperty=function(e,t){return xe.set.call(this,e,t,void 0)};xe.set=function(e,t,n){return Je.set.call(this,e[0],t,n,e[0])};function lt(e,t){let n=e[P];return(n?$(n):e)[t]}function Fn(e,t,n){let r=Xt(t,n);return r?_e in r?r[_e]:r.get?.call(e.c):void 0}function Xt(e,t){if(!(t in e))return;let n=ae(e);for(;n;){let r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=ae(n)}}function X(e){e.s||(e.s=!0,e.i&&X(e.i))}function ve(e){e.e||(e.n=new Map,e.e=ft(e.t,e.a.l.A))}var Qt=class{constructor(e){this.h=!0,this.A=!1,this._=!1,this.produce=(t,n,r)=>{if(ie(t)&&!ie(n)){let s=n;n=t;let l=this;return function(h=s,...g){return l.produce(h,a=>n.call(this,a,...g))}}ie(n)||U(6),r!==void 0&&!ie(r)&&U(7);let o;if(Y(t)){let s=Lt(this),l=Pe(s,t,void 0),h=!0;try{o=n(l),h=!1}finally{h?dt(s):gt(s)}return Ht(s,r),Wt(o,s)}else if(!t||!fe(t)){if(o=n(t),o===void 0&&(o=t),o===Fe&&(o=void 0),this.h&&Xe(o,!0),r){let s=[],l=[];le(Ke).M(t,o,{y:s,d:l}),r(s,l)}return o}else U(1,t)},this.produceWithPatches=(t,n)=>{if(ie(t))return(s,...l)=>this.produceWithPatches(s,h=>t(h,...l));let r,o;return[this.produce(t,n,(s,l)=>{r=s,o=l}),r,o]},ut(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),ut(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),ut(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){Y(e)||U(8),q(e)&&(e=Zt(e));let t=Lt(this),n=Pe(t,e,void 0);return n[P].S=!0,gt(t),n}finishDraft(e,t){let n=e&&e[P];(!n||!n.S)&&U(9);let{a:r}=n;return Ht(r,t),Wt(void 0,r)}setAutoFreeze(e){this.h=e}setUseStrictShallowCopy(e){this.A=e}setUseStrictIteration(e){this._=e}shouldUseStrictIteration(){return this._}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let o=t[n];if(o.path.length===0&&o.op==="replace"){e=o.value;break}}n>-1&&(t=t.slice(n+1));let r=le(Ke).N;return q(e)?r(e,t):this.produce(e,o=>r(o,t))}};function Pe(e,t,n,r){let[o,s]=ke(t)?le(Ee).w(t,n):Te(t)?le(Ee).V(t,n):Jn(t,n);return(n?.a??Be()).o.push(o),s.f=n?.f??[],s.p=r,n&&r!==void 0?qn(n,s,r):s.f.push(function(l){l.I?.fixSetContents(s);let{x:h}=l;s.s&&h&&h.O(s,[],l)}),o}function Zt(e){return q(e)||U(10,e),en(e)}function en(e){if(!Y(e)||Qe(e))return e;let t=e[P],n,r=!0;if(t){if(!t.s)return t.t;t.u=!0,n=ft(e,t.a.l.A),r=t.a.l.shouldUseStrictIteration()}else n=ft(e,!0);return pe(n,(o,s)=>{We(n,o,en(s))},r),t&&(t.u=!1),n}function Xn(){function e(d,v=[]){if(d.p!==void 0){let x=d.i.e??d.i.t,w=Gt(ee(x,d.p)),M=ee(x,d.p);if(M===void 0||M!==d.c&&M!==d.t&&M!==d.e||w!=null&&w.t!==d.t)return null;let I=d.i.r===3,R;if(I){let u=d.i;R=Array.from(u.o.keys()).indexOf(d.p)}else R=d.p;if(!(I&&x.size>R||we(x,R)))return null;v.push(R)}if(d.i)return e(d.i,v);v.reverse();try{t(d.e,v)}catch{return null}return v}function t(d,v){let x=d;for(let w=0;w<v.length-1;w++){let M=v[w];if(x=ee(x,M),!fe(x)||x===null)throw new Error(`Cannot resolve path at '${v.join("/")}'`)}return x}let n="replace",r="add",o="remove";function s(d,v,x){if(d.a.T.has(d))return;d.a.T.add(d);let{y:w,d:M}=x;switch(d.r){case 0:case 2:return h(d,v,w,M);case 1:return l(d,v,w,M);case 3:return g(d,v,w,M)}}function l(d,v,x,w){let{t:M,n:I}=d,R=d.e;R.length<M.length&&([M,R]=[R,M],[x,w]=[w,x]);let u=d.R===!0;for(let y=0;y<M.length;y++){let m=R[y],b=M[y];if((u||I?.get(y.toString()))&&m!==b){let A=m?.[P];if(A&&A.s)continue;let z=v.concat([y]);x.push({op:n,path:z,value:D(m)}),w.push({op:n,path:z,value:D(b)})}}for(let y=M.length;y<R.length;y++){let m=v.concat([y]);x.push({op:r,path:m,value:D(R[y])})}for(let y=R.length-1;M.length<=y;--y){let m=v.concat([y]);w.push({op:o,path:m})}}function h(d,v,x,w){let{t:M,e:I,r:R}=d;pe(d.n,(u,y)=>{let m=ee(M,u,R),b=ee(I,u,R),A=y?we(M,u)?n:r:o;if(m===b&&A===n)return;let z=v.concat(u);x.push(A===o?{op:A,path:z}:{op:A,path:z,value:D(b)}),w.push(A===r?{op:o,path:z}:A===o?{op:r,path:z,value:D(m)}:{op:n,path:z,value:D(m)})})}function g(d,v,x,w){let{t:M,e:I}=d,R=0;M.forEach(u=>{if(!I.has(u)){let y=v.concat([R]);x.push({op:o,path:y,value:u}),w.unshift({op:r,path:y,value:u})}R++}),R=0,I.forEach(u=>{if(!M.has(u)){let y=v.concat([R]);x.push({op:r,path:y,value:u}),w.unshift({op:o,path:y,value:u})}R++})}function a(d,v,x){let{y:w,d:M}=x;w.push({op:n,path:[],value:v===Fe?void 0:v}),M.push({op:n,path:[],value:d})}function f(d,v){return v.forEach(x=>{let{path:w,op:M}=x,I=d;for(let m=0;m<w.length-1;m++){let b=ue(I),A=w[m];typeof A!="string"&&typeof A!="number"&&(A=""+A),(b===0||b===1)&&(A==="__proto__"||A===be)&&U(19),ie(I)&&A===Ce&&U(19),I=ee(I,A),fe(I)||U(18,w.join("/"))}let R=ue(I),u=C(x.value),y=w[w.length-1];switch(M){case n:switch(R){case 2:return I.set(y,u);case 3:U(16);default:return I[y]=u}case r:switch(R){case 1:return y==="-"?I.push(u):I.splice(y,0,u);case 2:return I.set(y,u);case 3:return I.add(u);default:return I[y]=u}case o:switch(R){case 1:return I.splice(y,1);case 2:return I.delete(y);case 3:return I.delete(x.value);default:return delete I[y]}default:U(17,M)}}),d}function C(d){if(!Y(d))return d;if(Ae(d))return d.map(C);if(ke(d))return new Map(Array.from(d.entries()).map(([x,w])=>[x,C(w)]));if(Te(d))return new Set(Array.from(d).map(C));let v=Object.create(ae(d));for(let x in d)v[x]=C(d[x]);return we(d,ce)&&(v[ce]=d[ce]),v}function D(d){return q(d)?C(d):d}mt(Ke,{N:f,O:s,M:a,getPath:e})}function Qn(){class e extends Map{constructor(a,f){super(),this[P]={r:2,i:f,a:f?f.a:Be(),s:!1,u:!1,e:void 0,n:void 0,t:a,c:this,S:!1,g:!1,f:[]}}get size(){return $(this[P]).size}has(a){return $(this[P]).has(a)}set(a,f){let C=this[P];return l(C),(!$(C).has(a)||$(C).get(a)!==f)&&(n(C),X(C),C.n.set(a,!0),C.e.set(a,f),C.n.set(a,!0),Ge(C,a,f)),this}delete(a){if(!this.has(a))return!1;let f=this[P];return l(f),n(f),X(f),f.t.has(a)?f.n.set(a,!1):f.n.delete(a),f.e.delete(a),!0}clear(){let a=this[P];l(a),$(a).size&&(n(a),X(a),a.n=new Map,pe(a.t,f=>{a.n.set(f,!1)}),a.e.clear())}forEach(a,f){let C=this[P];$(C).forEach((D,d,v)=>{a.call(f,this.get(d),d,this)})}get(a){let f=this[P];l(f);let C=$(f).get(a);if(f.u||!Y(C)||C!==f.t.get(a))return C;let D=Pe(f.a,C,f,a);return n(f),f.e.set(a,D),D}keys(){return $(this[P]).keys()}values(){let a=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let f=a.next();return f.done?f:{done:!1,value:this.get(f.value)}}}}entries(){let a=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let f=a.next();if(f.done)return f;let C=this.get(f.value);return{done:!1,value:[f.value,C]}}}}[Symbol.iterator](){return this.entries()}}function t(g,a){let f=new e(g,a);return[f,f[P]]}function n(g){g.e||(g.n=new Map,g.e=new Map(g.t))}class r extends Set{constructor(a,f){super(),this[P]={r:3,i:f,a:f?f.a:Be(),s:!1,u:!1,e:void 0,t:a,c:this,o:new Map,g:!1,S:!1,n:void 0,f:[]}}get size(){return $(this[P]).size}has(a){let f=this[P];return l(f),f.e?!!(f.e.has(a)||f.o.has(a)&&f.e.has(f.o.get(a))):f.t.has(a)}add(a){let f=this[P];return l(f),this.has(a)||(s(f),X(f),f.e.add(a),Ge(f,a,a)),this}delete(a){if(!this.has(a))return!1;let f=this[P];return l(f),s(f),X(f),f.e.delete(a)||(f.o.has(a)?f.e.delete(f.o.get(a)):!1)}clear(){let a=this[P];l(a),$(a).size&&(s(a),X(a),a.e.clear())}values(){let a=this[P];return l(a),s(a),a.e.values()}entries(){let a=this[P];return l(a),s(a),a.e.entries()}keys(){return this.values()}[Symbol.iterator](){return this.values()}forEach(a,f){let C=this.values(),D=C.next();for(;!D.done;)a.call(f,D.value,D.value,this),D=C.next()}}function o(g,a){let f=new r(g,a);return[f,f[P]]}function s(g){g.e||(g.e=new Set,g.t.forEach(a=>{if(Y(a)){let f=Pe(g.a,a,g,a);g.o.set(a,f),g.e.add(f)}else g.e.add(a)}))}function l(g){g.g&&U(3,JSON.stringify($(g)))}function h(g){if(g.r===3&&g.e){let a=new Set(g.e);g.e.clear(),a.forEach(f=>{g.e.add(Ln(f))})}}mt(Ee,{w:t,V:o,fixSetContents:h})}function Zn(){let e=new Set(["shift","unshift"]),t=new Set(["push","pop"]),n=new Set([...t,...e]),r=new Set(["reverse","sort"]),o=new Set([...n,...r,"splice"]),s=new Set(["find","findLast"]),l=new Set(["filter","slice","concat","flat",...s,"findIndex","findLastIndex","some","every","indexOf","lastIndexOf","includes","join","toString","toLocaleString"]);function h(u){return o.has(u)}function g(u){return l.has(u)}function a(u){return h(u)||g(u)}function f(u,y){u.operationMethod=y}function C(u){u.operationMethod=void 0}function D(u,y,m=!0){ve(u);let b=y();return X(u),m&&u.n.set("length",!0),b}function d(u){u.R=!0}function v(u,y){return u<0?Math.max(y+u,0):Math.min(u,y)}function x(u,y,m){for(let b=0;b<m.length;b++){let A=y+b;u.n.set(A,!0),Ge(u,A,m[b])}}function w(u,y,m){return D(u,()=>{let b=u.e.length,A=u.e[y](...m);return e.has(y)&&d(u),y==="push"&&m.length>0?x(u,b,m):y==="unshift"&&m.length>0&&x(u,0,m),n.has(y)?A:u.c})}function M(u,y,m){return D(u,()=>(u.e[y](...m),d(u),u.c),!1)}function I(u,y){return function(...m){let b=y;f(u,b);try{if(h(b)){if(n.has(b))return w(u,b,m);if(r.has(b))return M(u,b,m);if(b==="splice"){let A=D(u,()=>u.e.splice(...m));if(d(u),m.length>2){let z=v(m[0]??0,u.e.length);x(u,z,m.slice(2))}return A}}else return R(u,b,m)}finally{C(u)}}}function R(u,y,m){let b=$(u);if(y==="filter"){let A=m[0],z=[];for(let L=0;L<b.length;L++)A(b[L],L,b)&&z.push(u.c[L]);return z}if(s.has(y)){let A=m[0],z=y==="find",L=z?1:-1,J=z?0:b.length-1;for(let W=J;W>=0&&W<b.length;W+=L)if(A(b[W],W,b))return u.c[W];return}if(y==="slice"){let A=m[0]??0,z=m[1]??b.length,L=v(A,b.length),J=v(z,b.length),W=[];for(let re=L;re<J;re++)W.push(u.c[re]);return W}return b[y](...m)}mt(pt,{createMethodInterceptor:I,isArrayOperationMethod:a,isMutatingArrayMethod:h})}var H=new Qt,er=H.produce,tr=H.produceWithPatches.bind(H),nr=H.setAutoFreeze.bind(H),rr=H.setUseStrictShallowCopy.bind(H),or=H.setUseStrictIteration.bind(H),sr=H.applyPatches.bind(H),ir=H.createDraft.bind(H),ar=H.finishDraft.bind(H),ur=e=>e,lr=e=>e});var on=ze((Yr,rn)=>{"use strict";rn.exports=nn()});var yn=ze(E=>{"use strict";var bt=Symbol.for("react.transitional.element"),pr=Symbol.for("react.portal"),dr=Symbol.for("react.fragment"),gr=Symbol.for("react.strict_mode"),hr=Symbol.for("react.profiler"),yr=Symbol.for("react.consumer"),mr=Symbol.for("react.context"),Sr=Symbol.for("react.forward_ref"),wr=Symbol.for("react.suspense"),vr=Symbol.for("react.memo"),cn=Symbol.for("react.lazy"),br=Symbol.for("react.activity"),sn=Symbol.iterator;function _r(e){return e===null||typeof e!="object"?null:(e=sn&&e[sn]||e["@@iterator"],typeof e=="function"?e:null)}var fn={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},pn=Object.assign,dn={};function he(e,t,n){this.props=e,this.context=t,this.refs=dn,this.updater=n||fn}he.prototype.isReactComponent={};he.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};he.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function gn(){}gn.prototype=he.prototype;function _t(e,t,n){this.props=e,this.context=t,this.refs=dn,this.updater=n||fn}var Et=_t.prototype=new gn;Et.constructor=_t;pn(Et,he.prototype);Et.isPureReactComponent=!0;var an=Array.isArray;function vt(){}var O={H:null,A:null,T:null,S:null},hn=Object.prototype.hasOwnProperty;function Rt(e,t,n){var r=n.ref;return{$$typeof:bt,type:e,key:t,ref:r!==void 0?r:null,props:n}}function Er(e,t){return Rt(e.type,t,e.props)}function xt(e){return typeof e=="object"&&e!==null&&e.$$typeof===bt}function Rr(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(n){return t[n]})}var un=/\/+/g;function wt(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Rr(""+e.key):t.toString(36)}function xr(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch(typeof e.status=="string"?e.then(vt,vt):(e.status="pending",e.then(function(t){e.status==="pending"&&(e.status="fulfilled",e.value=t)},function(t){e.status==="pending"&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}function ge(e,t,n,r,o){var s=typeof e;(s==="undefined"||s==="boolean")&&(e=null);var l=!1;if(e===null)l=!0;else switch(s){case"bigint":case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case bt:case pr:l=!0;break;case cn:return l=e._init,ge(l(e._payload),t,n,r,o)}}if(l)return o=o(e),l=r===""?"."+wt(e,0):r,an(o)?(n="",l!=null&&(n=l.replace(un,"$&/")+"/"),ge(o,t,n,"",function(a){return a})):o!=null&&(xt(o)&&(o=Er(o,n+(o.key==null||e&&e.key===o.key?"":(""+o.key).replace(un,"$&/")+"/")+l)),t.push(o)),1;l=0;var h=r===""?".":r+":";if(an(e))for(var g=0;g<e.length;g++)r=e[g],s=h+wt(r,g),l+=ge(r,t,n,s,o);else if(g=_r(e),typeof g=="function")for(e=g.call(e),g=0;!(r=e.next()).done;)r=r.value,s=h+wt(r,g++),l+=ge(r,t,n,s,o);else if(s==="object"){if(typeof e.then=="function")return ge(xr(e),t,n,r,o);throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.")}return l}function nt(e,t,n){if(e==null)return e;var r=[],o=0;return ge(e,r,"","",function(s){return t.call(n,s,o++)}),r}function Pr(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(n){(e._status===0||e._status===-1)&&(e._status=1,e._result=n)},function(n){(e._status===0||e._status===-1)&&(e._status=2,e._result=n)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var ln=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)},Cr={map:nt,forEach:function(e,t,n){nt(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return nt(e,function(){t++}),t},toArray:function(e){return nt(e,function(t){return t})||[]},only:function(e){if(!xt(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};E.Activity=br;E.Children=Cr;E.Component=he;E.Fragment=dr;E.Profiler=hr;E.PureComponent=_t;E.StrictMode=gr;E.Suspense=wr;E.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=O;E.__COMPILER_RUNTIME={__proto__:null,c:function(e){return O.H.useMemoCache(e)}};E.cache=function(e){return function(){return e.apply(null,arguments)}};E.cacheSignal=function(){return null};E.cloneElement=function(e,t,n){if(e==null)throw Error("The argument must be a React element, but you passed "+e+".");var r=pn({},e.props),o=e.key;if(t!=null)for(s in t.key!==void 0&&(o=""+t.key),t)!hn.call(t,s)||s==="key"||s==="__self"||s==="__source"||s==="ref"&&t.ref===void 0||(r[s]=t[s]);var s=arguments.length-2;if(s===1)r.children=n;else if(1<s){for(var l=Array(s),h=0;h<s;h++)l[h]=arguments[h+2];r.children=l}return Rt(e.type,o,r)};E.createContext=function(e){return e={$$typeof:mr,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:yr,_context:e},e};E.createElement=function(e,t,n){var r,o={},s=null;if(t!=null)for(r in t.key!==void 0&&(s=""+t.key),t)hn.call(t,r)&&r!=="key"&&r!=="__self"&&r!=="__source"&&(o[r]=t[r]);var l=arguments.length-2;if(l===1)o.children=n;else if(1<l){for(var h=Array(l),g=0;g<l;g++)h[g]=arguments[g+2];o.children=h}if(e&&e.defaultProps)for(r in l=e.defaultProps,l)o[r]===void 0&&(o[r]=l[r]);return Rt(e,s,o)};E.createRef=function(){return{current:null}};E.forwardRef=function(e){return{$$typeof:Sr,render:e}};E.isValidElement=xt;E.lazy=function(e){return{$$typeof:cn,_payload:{_status:-1,_result:e},_init:Pr}};E.memo=function(e,t){return{$$typeof:vr,type:e,compare:t===void 0?null:t}};E.startTransition=function(e){var t=O.T,n={};O.T=n;try{var r=e(),o=O.S;o!==null&&o(n,r),typeof r=="object"&&r!==null&&typeof r.then=="function"&&r.then(vt,ln)}catch(s){ln(s)}finally{t!==null&&n.types!==null&&(t.types=n.types),O.T=t}};E.unstable_useCacheRefresh=function(){return O.H.useCacheRefresh()};E.use=function(e){return O.H.use(e)};E.useActionState=function(e,t,n){return O.H.useActionState(e,t,n)};E.useCallback=function(e,t){return O.H.useCallback(e,t)};E.useContext=function(e){return O.H.useContext(e)};E.useDebugValue=function(){};E.useDeferredValue=function(e,t){return O.H.useDeferredValue(e,t)};E.useEffect=function(e,t){return O.H.useEffect(e,t)};E.useEffectEvent=function(e){return O.H.useEffectEvent(e)};E.useId=function(){return O.H.useId()};E.useImperativeHandle=function(e,t,n){return O.H.useImperativeHandle(e,t,n)};E.useInsertionEffect=function(e,t){return O.H.useInsertionEffect(e,t)};E.useLayoutEffect=function(e,t){return O.H.useLayoutEffect(e,t)};E.useMemo=function(e,t){return O.H.useMemo(e,t)};E.useOptimistic=function(e,t){return O.H.useOptimistic(e,t)};E.useReducer=function(e,t,n){return O.H.useReducer(e,t,n)};E.useRef=function(e){return O.H.useRef(e)};E.useState=function(e){return O.H.useState(e)};E.useSyncExternalStore=function(e,t,n){return O.H.useSyncExternalStore(e,t,n)};E.useTransition=function(){return O.H.useTransition()};E.version="19.2.4"});var Sn=ze((qr,mn)=>{"use strict";mn.exports=yn()});var Tt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Cn=async()=>{if(!Tt)throw new Error("Web Crypto API not available");let e=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),t=crypto.getRandomValues(new Uint8Array(12));return{key:e,iv:t}},An=async e=>{let t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},kn=async(e,t)=>{let n=Uint8Array.from(atob(e),s=>s.charCodeAt(0)),r=Uint8Array.from(atob(t),s=>s.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},Mt=async(e,t)=>{let n=new TextEncoder,r=n.encode(JSON.stringify(e)),o=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,r),s=new Uint8Array(t.iv.length+o.byteLength);return s.set(t.iv),s.set(new Uint8Array(o),t.iv.length),btoa(String.fromCharCode(...s))},It=async(e,t)=>{let n=Uint8Array.from(atob(e),l=>l.charCodeAt(0)),r=n.slice(0,12),o=n.slice(12),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,o);return JSON.parse(new TextDecoder().decode(s))},Ue=null,Tn=e=>{Ue=e},Ot=()=>Ue!==null,Se=e=>{Ue&&Ue(e)},st=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},Ne=(e,t,n,r)=>{if(e.size===0)return!0;for(let[o,s]of e){let l;if(typeof o=="function")l=o(t,r);else try{l=new RegExp(o).test(t)}catch{continue}if(l)return s.includes(n)||s.includes("admin")}return!1},me=e=>{if(typeof e=="string")return e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,"").replace(/javascript:/gi,"[REMOVED]").replace(/on\w+\s*=/gi,"[REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"").replace(/<foreignObject\b[^<]*(?:(?!<\/foreignObject>)<[^<]*)*<\/foreignObject>/gi,"").replace(/<math\b[^<]*(?:(?!<\/math>)<[^<]*)*<\/math>/gi,"").replace(/<\?php\b[^<]*(?:(?!<\?php>)<[^<]*)*<\?php>/gi,"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"&#x27;").replace(/`/g,"&#x60;");if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=me(r);return t}return Array.isArray(e)?e.map(t=>me(t)):e},it=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,at=(e,t,n,r)=>{let o={id:crypto.randomUUID(),purpose:n,granted:r,timestamp:Date.now()},s=e.get(t)||[];return s.push(o),e.set(t,s),Se({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),o},Dt=(e,t,n)=>{let r=e.get(t);if(!r)return!1;for(let o=r.length-1;o>=0;o--){let s=r[o];if(s&&s.purpose===n)return s.granted}return!1},jt=(e,t,n)=>at(e,t,n,!1),$t=(e,t)=>e.get(t)||[],zt=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),Ut=(e,t)=>{let n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}};var St=null,Me=null,cr=()=>{if(!St)try{let e=on();St=e.produce,Me=e.freeze}catch(e){throw console.error("[gState] Immer not installed. Run: npm install immer"),e}},fr={local:()=>typeof window<"u"?window.localStorage:null,session:()=>typeof window<"u"?window.sessionStorage:null,memory:()=>{let e=new Map;return{getItem:t=>e.get(t)||null,setItem:(t,n)=>e.set(t,n),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},et=e=>{if(e===null||typeof e!="object")return e;if(typeof structuredClone=="function")try{return structuredClone(e)}catch{}let t=new WeakMap,n=r=>{if(r===null||typeof r!="object")return r;if(t.has(r))return t.get(r);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r.source,r.flags);let o=Array.isArray(r)?[]:Object.create(Object.getPrototypeOf(r));if(t.set(r,o),Array.isArray(r))for(let s=0;s<r.length;s++)o[s]=n(r[s]);else for(let s of Object.keys(r))o[s]=n(r[s]);return o};return n(e)},tt=(e,t)=>{if(e===t)return!0;if(e===null||t===null||typeof e!="object"||typeof t!="object")return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let o=0;o<e.length;o++)if(!tt(e[o],t[o]))return!1;return!0}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let o of n)if(!r.includes(o)||!tt(e[o],t[o]))return!1;return!0},de=e=>{let t=new Map,n=new Map,r=new Map,o=new Set,s=new Map,l=new Set,h=new Map,g=new Map,a=new Map,f=new Map,C=new Map,D=new Map,d=new Map,v=new Map,x=e?.namespace||"gstate",w=e?.silent??!1,M=e?.debounceTime??150,I=e?.version??0,R=e?.storage||fr.local(),u=e?.onError,y=e?.maxObjectSize??5*1024*1024,m=e?.maxTotalSize??50*1024*1024,b=e?.encryptionKey??null,A=e?.validateInput??!0,z=e?.auditEnabled??!0,L=e?.userId,J=e?.immer??!0;J&&cr(),e?.accessRules&&e.accessRules.forEach(i=>st(d,i.pattern,i.permissions));let W=!1,re=!1,Oe=!1,F=0,rt=null,De,wn=new Promise(i=>{De=i}),ot=i=>{if(i==null)return 0;let c=0,p=[i],S=new WeakSet;for(;p.length>0;){let k=p.pop();if(typeof k=="boolean")c+=4;else if(typeof k=="number")c+=8;else if(typeof k=="string")c+=k.length*2;else if(typeof k=="object"&&k!==null){let _=k;if(S.has(_))continue;if(S.add(_),Array.isArray(_))for(let T=0;T<_.length;T++)p.push(_[T]);else for(let T of Object.keys(_))c+=T.length*2,p.push(_[T])}}return c},je=()=>`${x}_`,oe=(i,c)=>{f.forEach(p=>{if(p.hooks?.[i])try{p.hooks[i](c)}catch(S){let k=S instanceof Error?S:new Error(String(S));u?u(k,{operation:`plugin:${p.name}:${i}`,key:c.key}):w||console.error(`[gState] Plugin "${p.name}" error:`,S)}})},Q=(i,c,p,S)=>{z&&Ot()&&Se&&Se({timestamp:Date.now(),action:i,key:c,userId:L,success:p,error:S})},ye=i=>{if(i&&(a.get(i)?.forEach(c=>Pt(c)),h.get(i)?.forEach(c=>{try{c(V.get(i))}catch(p){let S=p instanceof Error?p:new Error(String(p));u?u(S,{operation:"watcher",key:i}):w||console.error(`[gState] Watcher error for "${i}":`,p)}}),s.get(i)?.forEach(c=>{try{c()}catch(p){let S=p instanceof Error?p:new Error(String(p));u?u(S,{operation:"keyListener",key:i}):w||console.error(`[gState] Listener error for "${i}":`,p)}})),W){re=!0;return}o.forEach(c=>{try{c()}catch(p){let S=p instanceof Error?p:new Error(String(p));u?u(S,{operation:"listener"}):w||console.error("[gState] Global listener error:",p)}})},Pt=i=>{let c=g.get(i),p=new Set;if(!c)return;let S=_=>(p.add(_),V.get(_)),k=c.selector(S);c.deps.forEach(_=>{if(!p.has(_)){let T=a.get(_);T&&(T.delete(i),T.size===0&&a.delete(_))}}),p.forEach(_=>{c.deps.has(_)||(a.has(_)||a.set(_,new Set),a.get(_).add(i))}),c.deps=p,tt(c.lastValue,k)||(c.lastValue=J&&k!==null&&typeof k=="object"?Me(et(k),!0):k,n.set(i,(n.get(i)||0)+1),ye(i))},Ct=async()=>{if(!R)return;let i=Array.from(C.entries());C.clear();for(let[c,p]of i)try{let S=p.value,k=p.options.encoded||p.options.secure;if(p.options.encrypted){if(!b)throw new Error(`Encryption key missing for "${c}"`);S=await Mt(p.value,b)}else k?S=btoa(JSON.stringify(p.value)):typeof p.value=="object"&&p.value!==null&&(S=JSON.stringify(p.value));R.setItem(`${je()}${c}`,JSON.stringify({v:n.get(c)||1,t:Date.now(),e:p.options.ttl?Date.now()+p.options.ttl:null,d:S,_sys_v:I,_enc:p.options.encrypted?!0:void 0,_b64:k?!0:void 0})),Q("set",c,!0)}catch(S){let k=S instanceof Error?S:new Error(String(S));u?u(k,{operation:"persist",key:c}):w||console.error("[gState] Persist failed:",k)}},se={},V={_setSilently:(i,c)=>{let p=r.get(i)||0,S=J&&c!==null&&typeof c=="object"?Me(et(c),!0):c,k=ot(S);F=F-p+k,r.set(i,k),t.set(i,S),n.set(i,(n.get(i)||0)+1)},_registerMethod:(i,c,p)=>{if(p!==void 0){let _=i,T=c;se[_]||(se[_]={}),se[_][T]=p;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let S=i,k=c;se.core||(se.core={}),se.core[S]=k},set:(i,c,p={})=>{let S=t.get(i),k=J&&typeof c=="function"?St(S,c):c;if(A&&!it(i))return w||console.warn(`[gState] Invalid key: ${i}`),!1;if(!Ne(d,i,"write",L))return Q("set",i,!1,"RBAC Denied"),w||console.error(`[gState] RBAC Denied for "${i}"`),!1;let _=A?me(k):k,T=r.get(i)||0;oe("onBeforeSet",{key:i,value:_,store:V,version:n.get(i)||0});let G=J&&_!==null&&typeof _=="object"?Me(et(_),!0):_;if(!tt(S,G)){let j=y>0||m>0?ot(G):0;if(y>0&&j>y){let N=new Error(`Object size (${j} bytes) exceeds maxObjectSize (${y} bytes)`);u?u(N,{operation:"set",key:i}):w||console.warn(`[gState] ${N.message} for "${i}"`)}if(m>0){let N=F-T+j;if(N>m){let $e=new Error(`Total store size (${N} bytes) exceeds limit (${m} bytes)`);u?u($e,{operation:"set"}):w||console.warn(`[gState] ${$e.message}`)}}F=F-T+j,r.set(i,j),t.set(i,G),n.set(i,(n.get(i)||0)+1);let Z=!!(p.persist||e?.persistByDefault||e?.persistence||p.encrypted||p.encoded||p.secure||p.ttl);return Z&&(C.set(i,{value:G,options:{...p,persist:Z}}),rt&&clearTimeout(rt),rt=setTimeout(Ct,M)),oe("onSet",{key:i,value:G,store:V,version:n.get(i)}),Q("set",i,!0),ye(i),!0}return!1},get:i=>{if(!Ne(d,i,"read",L))return Q("get",i,!1,"RBAC Denied"),null;let c=t.get(i);return oe("onGet",{store:V,key:i,value:c}),Q("get",i,!0),c},compute:(i,c)=>{try{return g.has(i)||(g.set(i,{selector:c,lastValue:null,deps:new Set}),Pt(i)),g.get(i).lastValue}catch(p){let S=p instanceof Error?p:new Error(String(p));return u?u(S,{operation:"compute",key:i}):w||console.error(`[gState] Compute error for "${i}":`,p),null}},watch:(i,c)=>{h.has(i)||h.set(i,new Set);let p=h.get(i);return p.add(c),()=>{p.delete(c),p.size===0&&h.delete(i)}},remove:i=>{if(!Ne(d,i,"delete",L))return Q("delete",i,!1,"RBAC Denied"),!1;let c=t.get(i),p=t.delete(i);return p&&(F-=r.get(i)||0,r.delete(i),oe("onRemove",{store:V,key:i,value:c})),n.set(i,(n.get(i)||0)+1),R&&R.removeItem(`${je()}${i}`),Q("delete",i,!0),ye(i),p},delete:i=>V.remove(i),deleteAll:()=>{if(Array.from(t.keys()).forEach(i=>V.remove(i)),R){let i=je();for(let c=0;c<(R.length||0);c++){let p=R.key(c);p?.startsWith(i)&&(R.removeItem(p),c--)}}return F=0,r.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:i=>{l.add(i)},transaction:i=>{W=!0,oe("onTransaction",{store:V,key:"START"});try{i()}finally{W=!1,oe("onTransaction",{store:V,key:"END"}),re&&(re=!1,ye())}},destroy:()=>{typeof window<"u"&&window.removeEventListener("beforeunload",At),oe("onDestroy",{store:V}),o.clear(),s.clear(),h.clear(),g.clear(),a.clear(),f.clear(),t.clear(),r.clear(),F=0,d.clear(),v.clear()},_addPlugin:i=>{try{f.set(i.name,i),i.hooks?.onInstall?.({store:V})}catch(c){let p=c instanceof Error?c:new Error(String(c));u?u(p,{operation:"plugin:install",key:i.name}):w||console.error(`[gState] Failed to install plugin "${i.name}":`,c)}},_removePlugin:i=>{f.delete(i)},_subscribe:(i,c)=>{if(c){s.has(c)||s.set(c,new Set);let p=s.get(c);return p.add(i),()=>{p.delete(i),p.size===0&&s.delete(c)}}return o.add(i),()=>o.delete(i)},_getVersion:i=>n.get(i)??0,addAccessRule:(i,c)=>st(d,i,c),hasPermission:(i,c,p)=>{if(d.size===0)return!0;for(let[S,k]of d){let _;if(typeof S=="function")_=S(i,p);else try{let T=D.get(S);T||(T=new RegExp(S),D.set(S,T)),_=T.test(i)}catch{continue}if(_)return k.includes(c)||k.includes("admin")}return!1},recordConsent:(i,c,p)=>at(v,i,c,p),hasConsent:(i,c)=>Dt(v,i,c),getConsents:i=>$t(v,i),revokeConsent:(i,c)=>jt(v,i,c),exportUserData:i=>zt(v,i),deleteUserData:i=>Ut(v,i),get plugins(){return se},get isReady(){return Oe},whenReady:()=>wn};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(i=>{let c=V[i];c&&V._registerMethod("security",i,c)});let At=()=>{C.size>0&&Ct()};return typeof window<"u"&&window.addEventListener("beforeunload",At),R?(async()=>{try{let c={},p=je(),S=0;for(let _=0;_<(R.length||0);_++){let T=R.key(_);if(!T||!T.startsWith(p))continue;let G=R.getItem(T);if(G)try{let j=JSON.parse(G),Z=T.substring(p.length);if(S=Math.max(S,j._sys_v!==void 0?j._sys_v:j.v||0),j.e&&Date.now()>j.e){R.removeItem(T),_--;continue}let N=j.d;if(j._enc&&b)N=await It(N,b);else if(typeof N=="string"){if(j._b64)try{N=JSON.parse(atob(N))}catch{}else if(N.startsWith("{")||N.startsWith("["))try{N=JSON.parse(N)}catch{}}c[Z]=N,Q("hydrate",Z,!0)}catch(j){Q("hydrate",T,!1,String(j));let Z=j instanceof Error?j:new Error(String(j));u?u(Z,{operation:"hydration",key:T}):w||console.error(`[gState] Hydration failed for "${T}":`,j)}}let k=S<I&&e?.migrate?e.migrate(c,S):c;Object.entries(k).forEach(([_,T])=>{let G=J&&T!==null&&typeof T=="object"?Me(et(T),!0):T,j=ot(G),Z=r.get(_)||0;F=F-Z+j,r.set(_,j),t.set(_,G),n.set(_,1)}),Oe=!0,De(),ye()}catch(c){Oe=!0,De();let p=c instanceof Error?c:new Error(String(c));u?u(p,{operation:"hydration"}):w||console.error("[gState] Hydration failed:",p)}})():(Oe=!0,De()),V};var B=Pn(Sn(),1);var ne=null,Ar=e=>{ne&&!e?.namespace&&(e?.silent||console.warn("[gState] Store already exists. Pass a unique namespace to create additional stores."));let t=de(e);return ne=t,t},kr=()=>{ne&&(ne.destroy(),ne=null)},Tr=e=>{let t=e||ne,n=(0,B.useMemo)(()=>r=>t?t._subscribe(r):()=>{},[t]);return(0,B.useSyncExternalStore)(n,()=>t?t.isReady:!1,()=>!0)},te=()=>ne;var Ie=(e,t)=>{let n=(0,B.useMemo)(()=>t||ne,[t]),r=(0,B.useMemo)(()=>({set:()=>(console.warn("[gState] Store not initialized. Call initState() or pass a store instance."),!1),get:()=>null,remove:()=>!1,delete:()=>!1,deleteAll:()=>!1,list:()=>({}),compute:()=>null,watch:()=>()=>{},use:()=>{},transaction:()=>{},destroy:()=>{},_subscribe:()=>()=>{},_setSilently:()=>{},_registerMethod:()=>{},_addPlugin:()=>{},_removePlugin:()=>{},_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return new Proxy({},{get:(g,a)=>new Proxy({},{get:(f,C)=>(...D)=>(console.warn(`[gState] Ghost store: Cannot call store.plugins.${String(a)}.${String(C)}() - store not initialized. Call initState() first or pass a store instance to useStore().`),null)})})}}),[]),o=n||r;(0,B.useMemo)(()=>{!n&&!t&&console.warn("[gState] Using ghost store - no store initialized. Call initState() or pass a store instance.")},[n,t]);let s=(0,B.useMemo)(()=>g=>o._subscribe(g,e),[o,e]),l=(0,B.useSyncExternalStore)(s,()=>o.get(e)??void 0,()=>{}),h=(0,B.useMemo)(()=>(g,a)=>o.set(e,g,a),[o,e]);return(0,B.useDebugValue)(l,g=>`${e}: ${JSON.stringify(g)}`),[l,h]};var Mr=(e,t)=>{let n=t?.key||"async_data",r=t?.store||de({namespace:`async_${n}`,silent:!0});return r.get(n)==null&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null}),Object.assign(r,{execute:async()=>{let s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{let l=await e(),h=r.get(n);r.set(n,{...h||{data:null,loading:!1,error:null,updatedAt:null},data:l,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(l){let h=r.get(n);r.set(n,{...h||{data:null,loading:!1,error:null,updatedAt:null},error:l instanceof Error?l:new Error(String(l)),loading:!1})}}})};var Ir=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",((t,n)=>e.set(t,n)))}}});var Or=e=>{let t=[],n=-1,r=!1,o=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:s})=>{t.push(s.list()),n=0,s._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;let l=t[n];return l?(Object.entries(l).forEach(([h,g])=>{s._setSilently(h,g)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;let l=t[n];return l?(Object.entries(l).forEach(([h,g])=>{s._setSilently(h,g)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","canUndo",()=>n>0),s._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:s})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(s.list()),t.length>o?t.shift():n++)}}}};var Dr=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;let r=e[t];if(r){let o=r(n);if(o!==!0)throw new Error(`[Schema Error] Validation failed for key "${t}": ${o===!1?"Invalid type":o}`)}}}});var jr=e=>{let r=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!r?.connect)return{name:"gstate-devtools-noop",hooks:{}};let o=null;return{name:"gstate-devtools",hooks:{onInstall:({store:s})=>{o=r.connect({name:e?.name||"Magnetar Store"}),o.init(s.list())},onSet:({key:s,store:l})=>{!s||!o||o.send(`SET_${s.toUpperCase()}`,l.list())},onRemove:({key:s,store:l})=>{!s||!o||o.send(`REMOVE_${s.toUpperCase()}`,l.list())}}}};var $r=()=>{let e=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:t})=>{t._registerMethod("snapshot","takeSnapshot",(n=>{e.set(n,t.list())})),t._registerMethod("snapshot","restoreSnapshot",(n=>{let r=e.get(n);return r?(t.transaction(()=>{Object.entries(r).forEach(([o,s])=>{t.set(o,s)})}),!0):!1})),t._registerMethod("snapshot","listSnapshots",(()=>Array.from(e.keys()))),t._registerMethod("snapshot","deleteSnapshot",(n=>e.delete(n))),t._registerMethod("snapshot","clearSnapshots",(()=>e.clear()))}}}};var zr=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;let o=e[t];if(o){let s=o(n)}}}});var Ur=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(!e.keys||e.keys.includes(t))&&e.provider({key:t,value:n,action:"SET"})},onRemove:({key:t})=>{t&&(!e.keys||e.keys.includes(t))&&e.provider({key:t,value:null,action:"REMOVE"})}}});var Nr=e=>{let t=new BroadcastChannel(e?.channelName||"gstate_sync"),n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:r})=>{t.onmessage=o=>{let{key:s,value:l,action:h}=o.data;s&&(n=!0,h==="REMOVE"?r.remove(s):r.set(s,l),n=!1)}},onSet:({key:r,value:o})=>{!r||n||t.postMessage({key:r,value:o,action:"SET"})},onRemove:({key:r})=>{!r||n||t.postMessage({key:r,action:"REMOVE"})},onDestroy:()=>{t.close()}}}};var Vr=()=>({name:"gstate-debug-noop",hooks:{}});var uo=e=>({name:"gstate-logger",hooks:{onSet:({key:t,value:n,version:r})=>{let o=new Date().toLocaleTimeString(),s=`[gState] SET: ${t} (v${r}) @ ${o}`;e?.collapsed?console.groupCollapsed(s):console.group(s),console.info("%c Value:","color: #4CAF50; font-weight: bold;",n),console.groupEnd()},onRemove:({key:t})=>{console.warn(`[gState] REMOVED: ${t}`)},onTransaction:({key:t})=>{t==="START"?console.group("\u2500\u2500 TRANSACTION START \u2500\u2500"):console.groupEnd()}}});var Eo=(e,t)=>{let r=de(typeof t=="string"?{namespace:t}:t);return e&&Object.entries(e).forEach(([s,l])=>{r._setSilently(s,l)}),Object.assign(s=>Ie(s,r),r)};var Ro=(e,t)=>te()?.addAccessRule(e,t),xo=(e,t,n)=>te()?.hasPermission(e,t,n)??!0,Po=(e,t,n)=>{let r=te();if(!r)throw new Error("[gState] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},Co=(e,t)=>te()?.hasConsent(e,t)??!1,Ao=e=>te()?.getConsents(e)??[],ko=(e,t)=>te()?.revokeConsent(e,t),To=e=>{let t=te();if(!t)throw new Error("[gState] exportUserData failed: No store found.");return t.exportUserData(e)},Mo=e=>{let t=te();if(!t)throw new Error("[gState] deleteUserData failed: No store found.");return t.deleteUserData(e)},Io=()=>{},Oo=()=>{};export{Ro as addAccessRule,Ur as analyticsPlugin,Io as clearAccessRules,Oo as clearAllConsents,Mr as createAsyncStore,de as createStore,Vr as debugPlugin,Mo as deleteUserData,kr as destroyState,jr as devToolsPlugin,An as exportKey,To as exportUserData,Cn as generateEncryptionKey,Ao as getConsents,Eo as gstate,zr as guardPlugin,Co as hasConsent,xo as hasPermission,Ir as immerPlugin,kn as importKey,Ar as initState,Tt as isCryptoAvailable,Se as logAudit,uo as loggerPlugin,Po as recordConsent,ko as revokeConsent,me as sanitizeValue,Dr as schemaPlugin,Tn as setAuditLogger,$r as snapshotPlugin,Nr as syncPlugin,Or as undoRedoPlugin,Ie as useGState,Tr as useIsStoreReady,Ie as useSimpleState,Ie as useStore,it as validateKey};
1
+ var ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ft=ht((tr,Bt)=>{"use strict";var lt=Object.defineProperty,Yt=Object.getOwnPropertyDescriptor,en=Object.getOwnPropertyNames,tn=Object.prototype.hasOwnProperty,nn=(e,t)=>{for(var n in t)lt(e,n,{get:t[n],enumerable:!0})},rn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of en(t))!tn.call(e,o)&&o!==n&&lt(e,o,{get:()=>t[o],enumerable:!(r=Yt(t,o))||r.enumerable});return e},on=e=>rn(lt({},"__esModule",{value:!0}),e),Ot={};nn(Ot,{Immer:()=>$t,applyPatches:()=>kn,castDraft:()=>Mn,castImmutable:()=>In,createDraft:()=>An,current:()=>Ut,enableArrayMethods:()=>vn,enableMapSet:()=>bn,enablePatches:()=>wn,finishDraft:()=>Rn,freeze:()=>Je,immerable:()=>ae,isDraft:()=>L,isDraftable:()=>F,nothing:()=>Le,original:()=>an,produce:()=>xn,produceWithPatches:()=>En,setAutoFreeze:()=>Pn,setUseStrictIteration:()=>Cn,setUseStrictShallowCopy:()=>_n});Bt.exports=on(Ot);var Le=Symbol.for("immer-nothing"),ae=Symbol.for("immer-draftable"),C=Symbol.for("immer-state");function V(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var B=Object,oe=B.getPrototypeOf,me="constructor",Pe="prototype",ot="configurable",ze="enumerable",Ve="writable",we="value",L=e=>!!e&&!!e[C];function F(e){return e?Dt(e)||_e(e)||!!e[ae]||!!e[me]?.[ae]||Ce(e)||ke(e):!1}var sn=B[Pe][me].toString(),Ct=new WeakMap;function Dt(e){if(!e||!ce(e))return!1;let t=oe(e);if(t===null||t===B[Pe])return!0;let n=B.hasOwnProperty.call(t,me)&&t[me];if(n===Object)return!0;if(!re(n))return!1;let r=Ct.get(n);return r===void 0&&(r=Function.toString.call(n),Ct.set(n,r)),r===sn}function an(e){return L(e)||V(15,e),e[C].t}function le(e,t,n=!0){se(e)===0?(n?Reflect.ownKeys(e):B.keys(e)).forEach(r=>{t(r,e[r],e)}):e.forEach((r,o)=>t(o,r,e))}function se(e){let t=e[C];return t?t.r:_e(e)?1:Ce(e)?2:ke(e)?3:0}var he=(e,t,n=se(e))=>n===2?e.has(t):B[Pe].hasOwnProperty.call(e,t),Z=(e,t,n=se(e))=>n===2?e.get(t):e[t],Ne=(e,t,n,r=se(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function cn(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var _e=Array.isArray,Ce=e=>e instanceof Map,ke=e=>e instanceof Set,ce=e=>typeof e=="object",re=e=>typeof e=="function",nt=e=>typeof e=="boolean";function ln(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Tt=e=>ce(e)?e?.[C]:null,T=e=>e.e||e.t,un=e=>{let t=Tt(e);return t?t.e??t.t:e},ut=e=>e.s?e.e:e.t;function st(e,t){if(Ce(e))return new Map(e);if(ke(e))return new Set(e);if(_e(e))return Array[Pe].slice.call(e);let n=Dt(e);if(t===!0||t==="class_only"&&!n){let r=B.getOwnPropertyDescriptors(e);delete r[C];let o=Reflect.ownKeys(r);for(let s=0;s<o.length;s++){let d=o[s],S=r[d];S[Ve]===!1&&(S[Ve]=!0,S[ot]=!0),(S.get||S.set)&&(r[d]={[ot]:!0,[Ve]:!0,[ze]:S[ze],[we]:e[d]})}return B.create(oe(e),r)}else{let r=oe(e);if(r!==null&&n)return{...e};let o=B.create(r);return B.assign(o,e)}}function Je(e,t=!1){return qe(e)||L(e)||!F(e)||(se(e)>1&&B.defineProperties(e,{set:je,add:je,clear:je,delete:je}),B.freeze(e),t&&le(e,(n,r)=>{Je(r,!0)},!1)),e}function fn(){V(2)}var je={[we]:fn};function qe(e){return e===null||!ce(e)?!0:B.isFrozen(e)}var be="MapSet",$e="Patches",it="ArrayMethods",Ue={};function ie(e){let t=Ue[e];return t||V(0,e),t}var kt=e=>!!Ue[e];function ft(e,t){Ue[e]||(Ue[e]=t)}var ve,Ke=()=>ve,dn=(e,t)=>({o:[],i:e,l:t,F:!0,m:0,P:new Set,T:new Set,I:kt(be)?ie(be):void 0,E:kt(it)?ie(it):void 0});function At(e,t){t&&(e.x=ie($e),e.y=[],e.d=[],e.C=t)}function at(e){ct(e),e.o.forEach(pn),e.o=null}function ct(e){e===ve&&(ve=e.i)}var Rt=e=>ve=dn(ve,e);function pn(e){let t=e[C];t.r===0||t.r===1?t.b():t.g=!0}function Mt(e,t){t.m=t.o.length;let n=t.o[0];if(e!==void 0&&e!==n){n[C].s&&(at(t),V(4)),F(e)&&(e=It(t,e));let{x:r}=t;r&&r.M(n[C].t,e,t)}else e=It(t,n);return gn(t,e,!0),at(t),t.y&&t.C(t.y,t.d),e!==Le?e:void 0}function It(e,t){if(qe(t))return t;let n=t[C];if(!n)return Fe(t,e.P,e);if(!Ge(n,e))return t;if(!n.s)return n.t;if(!n.u){let{f:r}=n;if(r)for(;r.length>0;)r.pop()(e);zt(n,e)}return n.e}function gn(e,t,n=!1){!e.i&&e.l.h&&e.F&&Je(t,n)}function jt(e){e.u=!0,e.a.m--}var Ge=(e,t)=>e.a===t,yn=[];function Vt(e,t,n,r){let o=T(e),s=e.r;if(r!==void 0&&Z(o,r,s)===t){Ne(o,r,n,s);return}if(!e.D){let S=e.D=new Map;le(o,(g,a)=>{if(L(a)){let c=S.get(a)||[];c.push(g),S.set(a,c)}})}let d=e.D.get(t)??yn;for(let S of d)Ne(o,S,n,s)}function hn(e,t,n){e.f.push(function(r){let o=t;if(!o||!Ge(o,r))return;r.I?.fixSetContents(o);let s=ut(o);Vt(e,o.c??o,s,n),zt(o,r)})}function zt(e,t){if(e.s&&!e.u&&(e.r===3||e.r===1&&e.R||(e.n?.size??0)>0)){let{x:n}=t;if(n){let r=n.getPath(e);r&&n.O(e,r,t)}jt(e)}}function Be(e,t,n){let{a:r}=e;if(L(n)){let o=n[C];Ge(o,r)&&o.f.push(function(){Se(e);let s=ut(o);Vt(e,n,s,t)})}else F(n)&&e.f.push(function(){let o=T(e);e.r===3?o.has(n)&&Fe(n,r.P,r):Z(o,t,e.r)===n&&r.o.length>1&&(e.n.get(t)??!1)===!0&&e.e&&Fe(Z(e.e,t,e.r),r.P,r)})}function Fe(e,t,n){return!n.l.h&&n.m<1||L(e)||t.has(e)||!F(e)||qe(e)||(t.add(e),le(e,(r,o)=>{if(L(o)){let s=o[C];if(Ge(s,n)){let d=ut(s);Ne(e,r,d,e.r),jt(s)}}else F(o)&&Fe(o,t,n)})),e}function Sn(e,t){let n=_e(e),r={r:n?1:0,a:t?t.a:Ke(),s:!1,u:!1,n:void 0,i:t,t:e,c:null,e:null,b:null,S:!1,f:void 0},o=r,s=We;n&&(o=[r],s=xe);let{revoke:d,proxy:S}=Proxy.revocable(o,s);return r.c=S,r.b=d,[S,r]}var We={get(e,t){if(t===C)return e;let n=e.a.E,r=e.r===1&&typeof t=="string";if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let o=T(e);if(!he(o,t,e.r))return mn(e,o,t);let s=o[t];if(e.u||!F(s)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&ln(t))return s;if(s===rt(e.t,t)){Se(e);let d=e.r===1?+t:t,S=Ee(e.a,s,e,d);return e.e[d]=S}return s},has(e,t){return t in T(e)},ownKeys(e){return Reflect.ownKeys(T(e))},set(e,t,n){let r=Nt(T(e),t);if(r?.set)return r.set.call(e.c,n),!0;if(!e.s){let o=rt(T(e),t),s=o?.[C];if(s&&s.t===n)return e.e[t]=n,e.n.set(t,!1),!0;if(cn(n,o)&&(n!==void 0||he(e.t,t,e.r)))return!0;Se(e),H(e)}return e.e[t]===n&&(n!==void 0||t in e.e)||Number.isNaN(n)&&Number.isNaN(e.e[t])||(e.e[t]=n,e.n.set(t,!0),Be(e,t,n)),!0},deleteProperty(e,t){return Se(e),rt(e.t,t)!==void 0||t in e.t?(e.n.set(t,!1),H(e)):e.n.delete(t),e.e&&delete e.e[t],!0},getOwnPropertyDescriptor(e,t){let n=T(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[Ve]:!0,[ot]:e.r!==1||t!=="length",[ze]:r[ze],[we]:n[t]}},defineProperty(){V(11)},getPrototypeOf(e){return oe(e.t)},setPrototypeOf(){V(12)}},xe={};for(let e in We){let t=We[e];xe[e]=function(){let n=arguments;return n[0]=n[0][0],t.apply(this,n)}}xe.deleteProperty=function(e,t){return xe.set.call(this,e,t,void 0)};xe.set=function(e,t,n){return We.set.call(this,e[0],t,n,e[0])};function rt(e,t){let n=e[C];return(n?T(n):e)[t]}function mn(e,t,n){let r=Nt(t,n);return r?we in r?r[we]:r.get?.call(e.c):void 0}function Nt(e,t){if(!(t in e))return;let n=oe(e);for(;n;){let r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=oe(n)}}function H(e){e.s||(e.s=!0,e.i&&H(e.i))}function Se(e){e.e||(e.n=new Map,e.e=st(e.t,e.a.l.A))}var $t=class{constructor(e){this.h=!0,this.A=!1,this._=!1,this.produce=(t,n,r)=>{if(re(t)&&!re(n)){let s=n;n=t;let d=this;return function(S=s,...g){return d.produce(S,a=>n.call(this,a,...g))}}re(n)||V(6),r!==void 0&&!re(r)&&V(7);let o;if(F(t)){let s=Rt(this),d=Ee(s,t,void 0),S=!0;try{o=n(d),S=!1}finally{S?at(s):ct(s)}return At(s,r),Mt(o,s)}else if(!t||!ce(t)){if(o=n(t),o===void 0&&(o=t),o===Le&&(o=void 0),this.h&&Je(o,!0),r){let s=[],d=[];ie($e).M(t,o,{y:s,d}),r(s,d)}return o}else V(1,t)},this.produceWithPatches=(t,n)=>{if(re(t))return(s,...d)=>this.produceWithPatches(s,S=>t(S,...d));let r,o;return[this.produce(t,n,(s,d)=>{r=s,o=d}),r,o]},nt(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),nt(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),nt(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){F(e)||V(8),L(e)&&(e=Ut(e));let t=Rt(this),n=Ee(t,e,void 0);return n[C].S=!0,ct(t),n}finishDraft(e,t){let n=e&&e[C];(!n||!n.S)&&V(9);let{a:r}=n;return At(r,t),Mt(void 0,r)}setAutoFreeze(e){this.h=e}setUseStrictShallowCopy(e){this.A=e}setUseStrictIteration(e){this._=e}shouldUseStrictIteration(){return this._}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let o=t[n];if(o.path.length===0&&o.op==="replace"){e=o.value;break}}n>-1&&(t=t.slice(n+1));let r=ie($e).N;return L(e)?r(e,t):this.produce(e,o=>r(o,t))}};function Ee(e,t,n,r){let[o,s]=Ce(t)?ie(be).w(t,n):ke(t)?ie(be).V(t,n):Sn(t,n);return(n?.a??Ke()).o.push(o),s.f=n?.f??[],s.p=r,n&&r!==void 0?hn(n,s,r):s.f.push(function(d){d.I?.fixSetContents(s);let{x:S}=d;s.s&&S&&S.O(s,[],d)}),o}function Ut(e){return L(e)||V(10,e),Kt(e)}function Kt(e){if(!F(e)||qe(e))return e;let t=e[C],n,r=!0;if(t){if(!t.s)return t.t;t.u=!0,n=st(e,t.a.l.A),r=t.a.l.shouldUseStrictIteration()}else n=st(e,!0);return le(n,(o,s)=>{Ne(n,o,Kt(s))},r),t&&(t.u=!1),n}function wn(){function e(f,b=[]){if(f.p!==void 0){let w=f.i.e??f.i.t,m=Tt(Z(w,f.p)),k=Z(w,f.p);if(k===void 0||k!==f.c&&k!==f.t&&k!==f.e||m!=null&&m.t!==f.t)return null;let M=f.i.r===3,P;if(M){let l=f.i;P=Array.from(l.o.keys()).indexOf(f.p)}else P=f.p;if(!(M&&w.size>P||he(w,P)))return null;b.push(P)}if(f.i)return e(f.i,b);b.reverse();try{t(f.e,b)}catch{return null}return b}function t(f,b){let w=f;for(let m=0;m<b.length-1;m++){let k=b[m];if(w=Z(w,k),!ce(w)||w===null)throw new Error(`Cannot resolve path at '${b.join("/")}'`)}return w}let n="replace",r="add",o="remove";function s(f,b,w){if(f.a.T.has(f))return;f.a.T.add(f);let{y:m,d:k}=w;switch(f.r){case 0:case 2:return S(f,b,m,k);case 1:return d(f,b,m,k);case 3:return g(f,b,m,k)}}function d(f,b,w,m){let{t:k,n:M}=f,P=f.e;P.length<k.length&&([k,P]=[P,k],[w,m]=[m,w]);let l=f.R===!0;for(let h=0;h<k.length;h++){let x=P[h],_=k[h];if((l||M?.get(h.toString()))&&x!==_){let I=x?.[C];if(I&&I.s)continue;let j=b.concat([h]);w.push({op:n,path:j,value:R(x)}),m.push({op:n,path:j,value:R(_)})}}for(let h=k.length;h<P.length;h++){let x=b.concat([h]);w.push({op:r,path:x,value:R(P[h])})}for(let h=P.length-1;k.length<=h;--h){let x=b.concat([h]);m.push({op:o,path:x})}}function S(f,b,w,m){let{t:k,e:M,r:P}=f;le(f.n,(l,h)=>{let x=Z(k,l,P),_=Z(M,l,P),I=h?he(k,l)?n:r:o;if(x===_&&I===n)return;let j=b.concat(l);w.push(I===o?{op:I,path:j}:{op:I,path:j,value:R(_)}),m.push(I===r?{op:o,path:j}:I===o?{op:r,path:j,value:R(x)}:{op:n,path:j,value:R(x)})})}function g(f,b,w,m){let{t:k,e:M}=f,P=0;k.forEach(l=>{if(!M.has(l)){let h=b.concat([P]);w.push({op:o,path:h,value:l}),m.unshift({op:r,path:h,value:l})}P++}),P=0,M.forEach(l=>{if(!k.has(l)){let h=b.concat([P]);w.push({op:r,path:h,value:l}),m.unshift({op:o,path:h,value:l})}P++})}function a(f,b,w){let{y:m,d:k}=w;m.push({op:n,path:[],value:b===Le?void 0:b}),k.push({op:n,path:[],value:f})}function c(f,b){return b.forEach(w=>{let{path:m,op:k}=w,M=f;for(let x=0;x<m.length-1;x++){let _=se(M),I=m[x];typeof I!="string"&&typeof I!="number"&&(I=""+I),(_===0||_===1)&&(I==="__proto__"||I===me)&&V(19),re(M)&&I===Pe&&V(19),M=Z(M,I),ce(M)||V(18,m.join("/"))}let P=se(M),l=y(w.value),h=m[m.length-1];switch(k){case n:switch(P){case 2:return M.set(h,l);case 3:V(16);default:return M[h]=l}case r:switch(P){case 1:return h==="-"?M.push(l):M.splice(h,0,l);case 2:return M.set(h,l);case 3:return M.add(l);default:return M[h]=l}case o:switch(P){case 1:return M.splice(h,1);case 2:return M.delete(h);case 3:return M.delete(w.value);default:return delete M[h]}default:V(17,k)}}),f}function y(f){if(!F(f))return f;if(_e(f))return f.map(y);if(Ce(f))return new Map(Array.from(f.entries()).map(([w,m])=>[w,y(m)]));if(ke(f))return new Set(Array.from(f).map(y));let b=Object.create(oe(f));for(let w in f)b[w]=y(f[w]);return he(f,ae)&&(b[ae]=f[ae]),b}function R(f){return L(f)?y(f):f}ft($e,{N:c,O:s,M:a,getPath:e})}function bn(){class e extends Map{constructor(a,c){super(),this[C]={r:2,i:c,a:c?c.a:Ke(),s:!1,u:!1,e:void 0,n:void 0,t:a,c:this,S:!1,g:!1,f:[]}}get size(){return T(this[C]).size}has(a){return T(this[C]).has(a)}set(a,c){let y=this[C];return d(y),(!T(y).has(a)||T(y).get(a)!==c)&&(n(y),H(y),y.n.set(a,!0),y.e.set(a,c),y.n.set(a,!0),Be(y,a,c)),this}delete(a){if(!this.has(a))return!1;let c=this[C];return d(c),n(c),H(c),c.t.has(a)?c.n.set(a,!1):c.n.delete(a),c.e.delete(a),!0}clear(){let a=this[C];d(a),T(a).size&&(n(a),H(a),a.n=new Map,le(a.t,c=>{a.n.set(c,!1)}),a.e.clear())}forEach(a,c){let y=this[C];T(y).forEach((R,f,b)=>{a.call(c,this.get(f),f,this)})}get(a){let c=this[C];d(c);let y=T(c).get(a);if(c.u||!F(y)||y!==c.t.get(a))return y;let R=Ee(c.a,y,c,a);return n(c),c.e.set(a,R),R}keys(){return T(this[C]).keys()}values(){let a=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let c=a.next();return c.done?c:{done:!1,value:this.get(c.value)}}}}entries(){let a=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let c=a.next();if(c.done)return c;let y=this.get(c.value);return{done:!1,value:[c.value,y]}}}}[Symbol.iterator](){return this.entries()}}function t(g,a){let c=new e(g,a);return[c,c[C]]}function n(g){g.e||(g.n=new Map,g.e=new Map(g.t))}class r extends Set{constructor(a,c){super(),this[C]={r:3,i:c,a:c?c.a:Ke(),s:!1,u:!1,e:void 0,t:a,c:this,o:new Map,g:!1,S:!1,n:void 0,f:[]}}get size(){return T(this[C]).size}has(a){let c=this[C];return d(c),c.e?!!(c.e.has(a)||c.o.has(a)&&c.e.has(c.o.get(a))):c.t.has(a)}add(a){let c=this[C];return d(c),this.has(a)||(s(c),H(c),c.e.add(a),Be(c,a,a)),this}delete(a){if(!this.has(a))return!1;let c=this[C];return d(c),s(c),H(c),c.e.delete(a)||(c.o.has(a)?c.e.delete(c.o.get(a)):!1)}clear(){let a=this[C];d(a),T(a).size&&(s(a),H(a),a.e.clear())}values(){let a=this[C];return d(a),s(a),a.e.values()}entries(){let a=this[C];return d(a),s(a),a.e.entries()}keys(){return this.values()}[Symbol.iterator](){return this.values()}forEach(a,c){let y=this.values(),R=y.next();for(;!R.done;)a.call(c,R.value,R.value,this),R=y.next()}}function o(g,a){let c=new r(g,a);return[c,c[C]]}function s(g){g.e||(g.e=new Set,g.t.forEach(a=>{if(F(a)){let c=Ee(g.a,a,g,a);g.o.set(a,c),g.e.add(c)}else g.e.add(a)}))}function d(g){g.g&&V(3,JSON.stringify(T(g)))}function S(g){if(g.r===3&&g.e){let a=new Set(g.e);g.e.clear(),a.forEach(c=>{g.e.add(un(c))})}}ft(be,{w:t,V:o,fixSetContents:S})}function vn(){let e=new Set(["shift","unshift"]),t=new Set(["push","pop"]),n=new Set([...t,...e]),r=new Set(["reverse","sort"]),o=new Set([...n,...r,"splice"]),s=new Set(["find","findLast"]),d=new Set(["filter","slice","concat","flat",...s,"findIndex","findLastIndex","some","every","indexOf","lastIndexOf","includes","join","toString","toLocaleString"]);function S(l){return o.has(l)}function g(l){return d.has(l)}function a(l){return S(l)||g(l)}function c(l,h){l.operationMethod=h}function y(l){l.operationMethod=void 0}function R(l,h,x=!0){Se(l);let _=h();return H(l),x&&l.n.set("length",!0),_}function f(l){l.R=!0}function b(l,h){return l<0?Math.max(h+l,0):Math.min(l,h)}function w(l,h,x){for(let _=0;_<x.length;_++){let I=h+_;l.n.set(I,!0),Be(l,I,x[_])}}function m(l,h,x){return R(l,()=>{let _=l.e.length,I=l.e[h](...x);return e.has(h)&&f(l),h==="push"&&x.length>0?w(l,_,x):h==="unshift"&&x.length>0&&w(l,0,x),n.has(h)?I:l.c})}function k(l,h,x){return R(l,()=>(l.e[h](...x),f(l),l.c),!1)}function M(l,h){return function(...x){let _=h;c(l,_);try{if(S(_)){if(n.has(_))return m(l,_,x);if(r.has(_))return k(l,_,x);if(_==="splice"){let I=R(l,()=>l.e.splice(...x));if(f(l),x.length>2){let j=b(x[0]??0,l.e.length);w(l,j,x.slice(2))}return I}}else return P(l,_,x)}finally{y(l)}}}function P(l,h,x){let _=T(l);if(h==="filter"){let I=x[0],j=[];for(let N=0;N<_.length;N++)I(_[N],N,_)&&j.push(l.c[N]);return j}if(s.has(h)){let I=x[0],j=h==="find",N=j?1:-1,J=j?0:_.length-1;for(let K=J;K>=0&&K<_.length;K+=N)if(I(_[K],K,_))return l.c[K];return}if(h==="slice"){let I=x[0]??0,j=x[1]??_.length,N=b(I,_.length),J=b(j,_.length),K=[];for(let ee=N;ee<J;ee++)K.push(l.c[ee]);return K}return _[h](...x)}ft(it,{createMethodInterceptor:M,isArrayOperationMethod:a,isMutatingArrayMethod:S})}var U=new $t,xn=U.produce,En=U.produceWithPatches.bind(U),Pn=U.setAutoFreeze.bind(U),_n=U.setUseStrictShallowCopy.bind(U),Cn=U.setUseStrictIteration.bind(U),kn=U.applyPatches.bind(U),An=U.createDraft.bind(U),Rn=U.finishDraft.bind(U),Mn=e=>e,In=e=>e});var Lt=ht((rr,Wt)=>{"use strict";Wt.exports=Ft()});var St=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Gt=async()=>{if(!St)throw new Error("Web Crypto API not available");let e=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),t=crypto.getRandomValues(new Uint8Array(12));return{key:e,iv:t}},Ht=async e=>{let t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},Xt=async(e,t)=>{let n=Uint8Array.from(atob(e),s=>s.charCodeAt(0)),r=Uint8Array.from(atob(t),s=>s.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},mt=async(e,t)=>{let n=new TextEncoder,r=n.encode(JSON.stringify(e)),o=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,r),s=new Uint8Array(t.iv.length+o.byteLength);return s.set(t.iv),s.set(new Uint8Array(o),t.iv.length),btoa(String.fromCharCode(...s))},wt=async(e,t)=>{let n=Uint8Array.from(atob(e),d=>d.charCodeAt(0)),r=n.slice(0,12),o=n.slice(12),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,o);return JSON.parse(new TextDecoder().decode(s))},De=null,Qt=e=>{De=e},bt=()=>De!==null,ye=e=>{De&&De(e)},Ye=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},Te=(e,t,n,r)=>{if(e.size===0)return!0;for(let[o,s]of e){let d;if(typeof o=="function")d=o(t,r);else try{d=new RegExp(o).test(t)}catch{continue}if(d)return s.includes(n)||s.includes("admin")}return!1},ge=e=>{if(typeof e=="string")return e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,"[SEC-REMOVED]").replace(/javascript:/gi,"[SEC-REMOVED]").replace(/data:text\/html/gi,"[SEC-REMOVED]").replace(/vbscript:/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]").replace(/&#[xX]?[0-9a-fA-F]+;?/g,"");if(e&&typeof e=="object"&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){let t={};for(let[n,r]of Object.entries(e))t[n]=ge(r);return t}return e}return Array.isArray(e)?e.map(t=>ge(t)):e},et=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,tt=(e,t,n,r)=>{let o={id:crypto.randomUUID(),purpose:n,granted:r,timestamp:Date.now()},s=e.get(t)||[];return s.push(o),e.set(t,s),ye({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),o},vt=(e,t,n)=>{let r=e.get(t);if(!r)return!1;for(let o=r.length-1;o>=0;o--){let s=r[o];if(s&&s.purpose===n)return s.granted}return!1},xt=(e,t,n)=>tt(e,t,n,!1),Et=(e,t)=>e.get(t)||[],Pt=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),_t=(e,t)=>{let n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}};var dt=null,Ae=null,On=()=>{if(!dt)try{let e=Lt();dt=e.produce,Ae=e.freeze}catch(e){throw console.error("[gState] Immer not installed. Run: npm install immer"),e}},Dn={local:()=>typeof window<"u"?window.localStorage:null,session:()=>typeof window<"u"?window.sessionStorage:null,memory:()=>{let e=new Map;return{getItem:t=>e.get(t)||null,setItem:(t,n)=>e.set(t,n),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},He=e=>{if(e===null||typeof e!="object")return e;if(typeof structuredClone=="function")try{return structuredClone(e)}catch{}let t=new WeakMap,n=r=>{if(r===null||typeof r!="object"||typeof r=="function")return r;if(t.has(r))return t.get(r);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r.source,r.flags);if(r instanceof Map){let d=new Map;return t.set(r,d),r.forEach((S,g)=>d.set(n(g),n(S))),d}if(r instanceof Set){let d=new Set;return t.set(r,d),r.forEach(S=>d.add(n(S))),d}let o=Array.isArray(r)?[]:Object.create(Object.getPrototypeOf(r));t.set(r,o);let s=[...Object.keys(r),...Object.getOwnPropertySymbols(r)];for(let d of s)o[d]=n(r[d]);return o};return n(e)},Xe=(e,t)=>{if(e===t)return!0;if(e===null||t===null||typeof e!="object"||typeof t!="object")return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let o=0;o<e.length;o++)if(!Xe(e[o],t[o]))return!1;return!0}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let o of n)if(!r.includes(o)||!Xe(e[o],t[o]))return!1;return!0},ue=e=>{let t=new Map,n=new Map,r=new Map,o=new Set,s=new Map,d=new Set,S=new Map,g=new Map,a=new Map,c=new Map,y=new Map,R=new Map,f=new Map,b=new Map,w=e?.namespace||"gstate",m=e?.silent??!1,k=e?.debounceTime??150,M=e?.version??0,P=e?.storage||Dn.local(),l=e?.onError,h=e?.maxObjectSize??5*1024*1024,x=e?.maxTotalSize??50*1024*1024,_=e?.encryptionKey??null,I=e?.validateInput??!0,j=e?.auditEnabled??!0,N=e?.userId,J=e?.immer??!0;J&&On(),e?.accessRules&&e.accessRules.forEach(i=>Ye(f,i.pattern,i.permissions));let K=!1,ee=!1,Me=!1,q=0,Qe=null,Ie,qt=new Promise(i=>{Ie=i}),Ze=i=>{if(i==null)return 0;let u=0,p=[i],v=new WeakSet;for(;p.length>0;){let A=p.pop();if(typeof A=="boolean")u+=4;else if(typeof A=="number")u+=8;else if(typeof A=="string")u+=A.length*2;else if(typeof A=="object"&&A!==null){let E=A;if(v.has(E))continue;if(v.add(E),Array.isArray(E))for(let O=0;O<E.length;O++)p.push(E[O]);else for(let O of Object.keys(E))u+=O.length*2,p.push(E[O])}}return u},de=()=>`${w}_`,te=(i,u)=>{c.forEach(p=>{if(p.hooks?.[i])try{p.hooks[i](u)}catch(v){let A=v instanceof Error?v:new Error(String(v));l?l(A,{operation:`plugin:${p.name}:${i}`,key:u.key}):m||console.error(`[gState] Plugin "${p.name}" error:`,v)}})},G=(i,u,p,v)=>{j&&bt()&&ye&&ye({timestamp:Date.now(),action:i,key:u,userId:N,success:p,error:v})},pe=i=>{if(i&&(a.get(i)?.forEach(u=>pt(u)),S.get(i)?.forEach(u=>{try{u($.get(i))}catch(p){let v=p instanceof Error?p:new Error(String(p));l?l(v,{operation:"watcher",key:i}):m||console.error(`[gState] Watcher error for "${i}":`,p)}}),s.get(i)?.forEach(u=>{try{u()}catch(p){let v=p instanceof Error?p:new Error(String(p));l?l(v,{operation:"keyListener",key:i}):m||console.error(`[gState] Listener error for "${i}":`,p)}})),K){ee=!0;return}o.forEach(u=>{try{u()}catch(p){let v=p instanceof Error?p:new Error(String(p));l?l(v,{operation:"listener"}):m||console.error("[gState] Global listener error:",p)}})},pt=i=>{let u=g.get(i),p=new Set;if(!u)return;let v=E=>(p.add(E),g.has(E)?g.get(E).lastValue:$.get(E)),A=u.selector(v);u.deps.forEach(E=>{if(!p.has(E)){let O=a.get(E);O&&(O.delete(i),O.size===0&&a.delete(E))}}),p.forEach(E=>{u.deps.has(E)||(a.has(E)||a.set(E,new Set),a.get(E).add(i))}),u.deps=p,Xe(u.lastValue,A)||(u.lastValue=J&&A!==null&&typeof A=="object"?Ae(He(A),!0):A,n.set(i,(n.get(i)||0)+1),pe(i))},gt=async()=>{if(!P)return;try{let u={};t.forEach((A,E)=>{u[E]=A});let p=u,v=e?.encoded;v?p=btoa(JSON.stringify(u)):p=JSON.stringify(u),P.setItem(de().replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:p,_sys_v:M,_b64:v?!0:void 0})),G("set","FULL_STATE",!0)}catch(u){let p=u instanceof Error?u:new Error(String(u));l?l(p,{operation:"persist",key:"FULL_STATE"}):m||console.error("[gState] Persist failed:",p)}let i=Array.from(y.entries());y.clear();for(let[u,p]of i)try{let v=p.value,A=p.options.encoded||p.options.secure;if(p.options.encrypted){if(!_)throw new Error(`Encryption key missing for "${u}"`);v=await mt(p.value,_)}else A?v=btoa(JSON.stringify(p.value)):typeof p.value=="object"&&p.value!==null&&(v=JSON.stringify(p.value));P.setItem(`${de()}${u}`,JSON.stringify({v:n.get(u)||1,t:Date.now(),e:p.options.ttl?Date.now()+p.options.ttl:null,d:v,_sys_v:M,_enc:p.options.encrypted?!0:void 0,_b64:A?!0:void 0})),G("set",u,!0)}catch(v){let A=v instanceof Error?v:new Error(String(v));l?l(A,{operation:"persist",key:u}):m||console.error("[gState] Persist failed:",A)}},ne={},$={_setSilently:(i,u)=>{let p=r.get(i)||0,v=J&&u!==null&&typeof u=="object"?Ae(He(u),!0):u,A=Ze(v);q=q-p+A,r.set(i,A),t.set(i,v),n.set(i,(n.get(i)||0)+1)},_registerMethod:(i,u,p)=>{if(p!==void 0){let E=i,O=u;ne[E]||(ne[E]={}),ne[E][O]=p;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let v=i,A=u;ne.core||(ne.core={}),ne.core[v]=A},set:(i,u,p={})=>{let v=t.get(i),A=J&&typeof u=="function"?dt(v,u):u;if(I&&!et(i))return m||console.warn(`[gState] Invalid key: ${i}`),!1;if(!Te(f,i,"write",N))return G("set",i,!1,"RBAC Denied"),m||console.error(`[gState] RBAC Denied for "${i}"`),!1;let E=I?ge(A):A,O=r.get(i)||0;te("onBeforeSet",{key:i,value:E,store:$,version:n.get(i)||0});let W=J&&E!==null&&typeof E=="object"?Ae(He(E),!0):E;if(!Xe(v,W)){let D=h>0||x>0?Ze(W):0;if(h>0&&D>h){let z=new Error(`Object size (${D} bytes) exceeds maxObjectSize (${h} bytes)`);l?l(z,{operation:"set",key:i}):m||console.warn(`[gState] ${z.message} for "${i}"`)}if(x>0){let z=q-O+D;if(z>x){let Oe=new Error(`Total store size (${z} bytes) exceeds limit (${x} bytes)`);l?l(Oe,{operation:"set"}):m||console.warn(`[gState] ${Oe.message}`)}}q=q-O+D,r.set(i,D),t.set(i,W),n.set(i,(n.get(i)||0)+1);let Q=p.persist===!0;return Q&&(y.set(i,{value:W,options:{...p,persist:Q,encoded:p.encoded||e?.encoded}}),Qe&&clearTimeout(Qe),Qe=setTimeout(gt,k)),te("onSet",{key:i,value:W,store:$,version:n.get(i)}),G("set",i,!0),pe(i),!0}return!1},get:i=>{if(!Te(f,i,"read",N))return G("get",i,!1,"RBAC Denied"),null;let u=t.get(i);return te("onGet",{store:$,key:i,value:u}),G("get",i,!0),u},compute:(i,u)=>{try{return g.has(i)||(g.set(i,{selector:u,lastValue:null,deps:new Set}),pt(i)),g.get(i).lastValue}catch(p){let v=p instanceof Error?p:new Error(String(p));return l?l(v,{operation:"compute",key:i}):m||console.error(`[gState] Compute error for "${i}":`,p),null}},watch:(i,u)=>{S.has(i)||S.set(i,new Set);let p=S.get(i);return p.add(u),()=>{p.delete(u),p.size===0&&S.delete(i)}},remove:i=>{if(!Te(f,i,"delete",N))return G("delete",i,!1,"RBAC Denied"),!1;let u=t.get(i),p=t.delete(i);return p&&(q-=r.get(i)||0,r.delete(i),te("onRemove",{store:$,key:i,value:u})),n.set(i,(n.get(i)||0)+1),P&&P.removeItem(`${de()}${i}`),G("delete",i,!0),pe(i),p},delete:i=>$.remove(i),deleteAll:()=>{if(Array.from(t.keys()).forEach(i=>$.remove(i)),P){let i=de();for(let u=0;u<(P.length||0);u++){let p=P.key(u);p?.startsWith(i)&&(P.removeItem(p),u--)}}return q=0,r.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:i=>{d.add(i)},transaction:i=>{K=!0,te("onTransaction",{store:$,key:"START"});try{i()}finally{K=!1,te("onTransaction",{store:$,key:"END"}),ee&&(ee=!1,pe())}},destroy:()=>{typeof window<"u"&&window.removeEventListener("beforeunload",yt),te("onDestroy",{store:$}),o.clear(),s.clear(),S.clear(),g.clear(),a.clear(),c.clear(),t.clear(),r.clear(),q=0,f.clear(),b.clear()},_addPlugin:i=>{try{c.set(i.name,i),i.hooks?.onInstall?.({store:$})}catch(u){let p=u instanceof Error?u:new Error(String(u));l?l(p,{operation:"plugin:install",key:i.name}):m||console.error(`[gState] Failed to install plugin "${i.name}":`,u)}},_removePlugin:i=>{c.delete(i)},_subscribe:(i,u)=>{if(u){s.has(u)||s.set(u,new Set);let p=s.get(u);return p.add(i),()=>{p.delete(i),p.size===0&&s.delete(u)}}return o.add(i),()=>o.delete(i)},_getVersion:i=>n.get(i)??0,addAccessRule:(i,u)=>Ye(f,i,u),hasPermission:(i,u,p)=>{if(f.size===0)return!0;for(let[v,A]of f){let E;if(typeof v=="function")E=v(i,p);else try{let O=R.get(v);O||(O=new RegExp(v),R.set(v,O)),E=O.test(i)}catch{continue}if(E)return A.includes(u)||A.includes("admin")}return!1},recordConsent:(i,u,p)=>tt(b,i,u,p),hasConsent:(i,u)=>vt(b,i,u),getConsents:i=>Et(b,i),revokeConsent:(i,u)=>xt(b,i,u),exportUserData:i=>Pt(b,i),deleteUserData:i=>_t(b,i),get plugins(){return ne},get isReady(){return Me},get namespace(){return w},get userId(){return N},whenReady:()=>qt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(i=>{let u=$[i];u&&$._registerMethod("security",i,u)});let yt=()=>{y.size>0&&gt()};return typeof window<"u"&&window.addEventListener("beforeunload",yt),P?(async()=>{try{let u={},p=de(),v=0;for(let E=0;E<(P.length||0);E++){let O=P.key(E);if(!O||!O.startsWith(p))continue;let W=P.getItem(O);if(W)try{let D=JSON.parse(W),Q=O.substring(p.length);if(v=Math.max(v,D._sys_v!==void 0?D._sys_v:D.v||0),D.e&&Date.now()>D.e){P.removeItem(O),E--;continue}let z=D.d;if(D._enc&&_)z=await wt(z,_);else if(typeof z=="string"){if(D._b64)try{z=JSON.parse(atob(z))}catch{}else if(z.startsWith("{")||z.startsWith("["))try{z=JSON.parse(z)}catch{}}u[Q]=z,G("hydrate",Q,!0)}catch(D){G("hydrate",O,!1,String(D));let Q=D instanceof Error?D:new Error(String(D));l?l(Q,{operation:"hydration",key:O}):m||console.error(`[gState] Hydration failed for "${O}":`,D)}}let A=v<M&&e?.migrate?e.migrate(u,v):u;Object.entries(A).forEach(([E,O])=>{let W=J&&O!==null&&typeof O=="object"?Ae(He(O),!0):O,D=Ze(W),Q=r.get(E)||0;q=q-Q+D,r.set(E,D),t.set(E,W),n.set(E,1)}),Me=!0,Ie(),pe()}catch(u){Me=!0,Ie();let p=u instanceof Error?u:new Error(String(u));l?l(p,{operation:"hydration"}):m||console.error("[gState] Hydration failed:",p)}})():(Me=!0,Ie()),$};import{useSyncExternalStore as Jt,useDebugValue as Tn,useMemo as fe}from"react";var Y=null,jn=e=>{Y&&!e?.namespace&&(e?.silent||console.warn("[gState] Store already exists. Pass a unique namespace to create additional stores."));let t=ue(e);return Y=t,t},Vn=()=>{Y&&(Y.destroy(),Y=null)},zn=e=>{let t=e||Y,n=fe(()=>r=>t?t._subscribe(r):()=>{},[t]);return Jt(n,()=>t?t.isReady:!1,()=>!0)},X=()=>Y;var Re=(e,t)=>{let n=fe(()=>t||Y,[t]),r=fe(()=>({set:()=>(console.warn("[gState] Store not initialized. Call initState() or pass a store instance."),!1),get:()=>null,remove:()=>!1,delete:()=>!1,deleteAll:()=>!1,list:()=>({}),compute:()=>null,watch:()=>()=>{},use:()=>{},transaction:()=>{},destroy:()=>{},_subscribe:()=>()=>{},_setSilently:()=>{},_registerMethod:()=>{},_addPlugin:()=>{},_removePlugin:()=>{},_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return new Proxy({},{get:(g,a)=>new Proxy({},{get:(c,y)=>(...R)=>(console.warn(`[gState] Ghost store: Cannot call store.plugins.${String(a)}.${String(y)}() - store not initialized. Call initState() first or pass a store instance to useStore().`),null)})})}}),[]),o=n||r;fe(()=>{!n&&!t&&console.warn("[gState] Using ghost store - no store initialized. Call initState() or pass a store instance.")},[n,t]);let s=fe(()=>g=>o._subscribe(g,e),[o,e]),d=Jt(s,()=>o.get(e)??void 0,()=>{}),S=fe(()=>(g,a)=>o.set(e,g,a),[o,e]);return Tn(d,g=>`${e}: ${JSON.stringify(g)}`),[d,S]};var Nn=(e,t)=>{let n=t?.key||"async_data",r=t?.store||ue({namespace:`async_${n}`,silent:!0});return r.get(n)==null&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null}),Object.assign(r,{execute:async()=>{let s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{let d=await e(),S=r.get(n);r.set(n,{...S||{data:null,loading:!1,error:null,updatedAt:null},data:d,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(d){let S=r.get(n);r.set(n,{...S||{data:null,loading:!1,error:null,updatedAt:null},error:d instanceof Error?d:new Error(String(d)),loading:!1})}}})};var $n=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",((t,n)=>e.set(t,n)))}}});var Un=e=>{let t=[],n=-1,r=!1,o=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:s})=>{t.push(s.list()),n=0,s._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;let d=t[n];return d?(Object.entries(d).forEach(([S,g])=>{s._setSilently(S,g)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;let d=t[n];return d?(Object.entries(d).forEach(([S,g])=>{s._setSilently(S,g)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","canUndo",()=>n>0),s._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:s})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(s.list()),t.length>o?t.shift():n++)}}}};var Kn=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;let r=e[t];if(r){let o=r(n);if(o!==!0)throw new Error(`[Schema Error] Validation failed for key "${t}": ${o===!1?"Invalid type":o}`)}}}});var Bn=e=>{let r=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!r?.connect)return{name:"gstate-devtools-noop",hooks:{}};let o=null;return{name:"gstate-devtools",hooks:{onInstall:({store:s})=>{o=r.connect({name:e?.name||"Magnetar Store"}),o.init(s.list())},onSet:({key:s,store:d})=>{!s||!o||o.send(`SET_${s.toUpperCase()}`,d.list())},onRemove:({key:s,store:d})=>{!s||!o||o.send(`REMOVE_${s.toUpperCase()}`,d.list())}}}};var Fn=()=>{let e=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:t})=>{t._registerMethod("snapshot","takeSnapshot",(n=>{e.set(n,t.list())})),t._registerMethod("snapshot","restoreSnapshot",(n=>{let r=e.get(n);return r?(t.transaction(()=>{Object.entries(r).forEach(([o,s])=>{t.set(o,s)})}),!0):!1})),t._registerMethod("snapshot","listSnapshots",(()=>Array.from(e.keys()))),t._registerMethod("snapshot","deleteSnapshot",(n=>e.delete(n))),t._registerMethod("snapshot","clearSnapshots",(()=>e.clear()))}}}};var Wn=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;let o=e[t];if(o){let s=o(n)}}}});var Ln=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(!e.keys||e.keys.includes(t))&&e.provider({key:t,value:n,action:"SET"})},onRemove:({key:t})=>{t&&(!e.keys||e.keys.includes(t))&&e.provider({key:t,value:null,action:"REMOVE"})}}});var Jn=e=>{let t=new BroadcastChannel(e?.channelName||"gstate_sync"),n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:r})=>{t.onmessage=o=>{let{key:s,value:d,action:S}=o.data;s&&(n=!0,S==="REMOVE"?r.remove(s):r.set(s,d),n=!1)}},onSet:({key:r,value:o})=>{!r||n||t.postMessage({key:r,value:o,action:"SET"})},onRemove:({key:r})=>{!r||n||t.postMessage({key:r,action:"REMOVE"})},onDestroy:()=>{t.close()}}}};var qn=()=>({name:"gstate-debug-noop",hooks:{}});var Gn=(e={})=>{let t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1,o=null,s=()=>new Promise((a,c)=>{if(o)return a(o);let y=indexedDB.open(t,r);y.onerror=()=>c(y.error),y.onsuccess=()=>{o=y.result,a(o)},y.onupgradeneeded=R=>{let f=R.target.result;f.objectStoreNames.contains(n)||f.createObjectStore(n)}}),d=async(a,c)=>{let y=await s();return new Promise((R,f)=>{let m=y.transaction(n,"readwrite").objectStore(n).put(c,a);m.onsuccess=()=>R(),m.onerror=()=>f(m.error)})},S=async a=>{let c=await s();return new Promise((y,R)=>{let w=c.transaction(n,"readonly").objectStore(n).get(a);w.onsuccess=()=>y(w.result),w.onerror=()=>R(w.error)})},g=async a=>{let c=await s();return new Promise((y,R)=>{let w=c.transaction(n,"readwrite").objectStore(n).delete(a);w.onsuccess=()=>y(),w.onerror=()=>R(w.error)})};return{name:"indexedDB",hooks:{onInstall:({store:a})=>{a._registerMethod("indexedDB","clear",async()=>{(await s()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:a})=>{let f=(await s()).transaction(n,"readonly").objectStore(n).getAllKeys();f.onsuccess=async()=>{let b=f.result,w=a.namespace+"_";for(let m of b)if(m.startsWith(w)){let k=await S(m);if(k){let M=m.substring(w.length);a._setSilently(M,k.d)}}}},onSet:async({key:a,value:c,store:y})=>{if(!a)return;let R=y.namespace+"_",f={d:c,t:Date.now(),v:y._getVersion?.(a)||1};await d(`${R}${a}`,f)},onRemove:async({key:a,store:c})=>{if(!a)return;let y=c.namespace+"_";await g(`${y}${a}`)}}}};var Hn=e=>{let{adapter:t,autoSyncInterval:n}=e,r=new Map,o={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0},s=null;return{name:"cloudSync",hooks:{onInstall:({store:d})=>{d._registerMethod("cloudSync","sync",async()=>{let S=performance.now(),g={},a=0;try{let c=d.list(),y=Object.keys(c);for(let f of y){let b=d._getVersion?.(f)||0,w=r.get(f)||0;if(b>w){let m=c[f];g[f]=m,a+=JSON.stringify(m).length,r.set(f,b)}}if(Object.keys(g).length===0)return{status:"no-change",stats:o};if(await t.save(g))return o.lastSyncTimestamp=Date.now(),o.totalKeysSynced+=Object.keys(g).length,o.totalBytesSynced+=a,o.syncCount++,o.lastDuration=performance.now()-S,e.onSync&&e.onSync(o),{status:"success",stats:o};throw new Error(`Adapter ${t.name} failed to save.`)}catch(c){return o.errors++,console.error(`[gState] Cloud Sync Failed (${t.name}):`,c),{status:"error",error:String(c),stats:o}}}),d._registerMethod("cloudSync","getStats",()=>o),n&&n>0&&(s=setInterval(()=>{d.plugins.cloudSync.sync()},n))},onDestroy:()=>{s&&clearInterval(s)}}}},Xn=(e,t)=>({name:"MongoDB-Atlas",save:async n=>(await fetch(`${e}/action/updateOne`,{method:"POST",headers:{"Content-Type":"application/json","api-key":t},body:JSON.stringify({dataSource:"Cluster0",database:"rgs_cloud",collection:"user_states",filter:{id:"global_state"},update:{$set:{data:n,updatedAt:Date.now()}},upsert:!0})})).ok}),Qn=(e,t)=>({name:"Firebase-Firestore",save:async n=>{try{return console.log("[Mock] Firestore Syncing:",n),!0}catch{return!1}}}),Zn=(e,t)=>({name:"SQL-REST-API",save:async n=>(await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(n)})).ok});var vr=e=>({name:"gstate-logger",hooks:{onSet:({key:t,value:n,version:r})=>{let o=new Date().toLocaleTimeString(),s=`[gState] SET: ${t} (v${r}) @ ${o}`;e?.collapsed?console.groupCollapsed(s):console.group(s),console.info("%c Value:","color: #4CAF50; font-weight: bold;",n),console.groupEnd()},onRemove:({key:t})=>{console.warn(`[gState] REMOVED: ${t}`)},onTransaction:({key:t})=>{t==="START"?console.group("\u2500\u2500 TRANSACTION START \u2500\u2500"):console.groupEnd()}}});var zr=(e,t)=>{let n=typeof t=="string"?{namespace:t}:t,r=e,o=n?.namespace;if(typeof window<"u"&&o)try{let g=localStorage.getItem(o);g&&(r=JSON.parse(atob(g)))}catch{}let s=ue(n);return r&&Object.entries(r).forEach(([g,a])=>{s._setSilently(g,a)}),typeof window<"u"&&n?.persist&&o&&s._subscribe(()=>{try{let g={},a=s.list();Object.keys(a).forEach(c=>{let y=c.toLowerCase();y.includes("token")||y.includes("password")||y.includes("secret")||y.includes("key")||(g[c]=s.get(c))}),localStorage.setItem(o,btoa(JSON.stringify(g)))}catch{}}),Object.assign(g=>Re(g,s),s)};var Nr=(e,t)=>X()?.addAccessRule(e,t),$r=(e,t,n)=>X()?.hasPermission(e,t,n)??!0,Ur=(e,t,n)=>{let r=X();if(!r)throw new Error("[gState] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},Kr=(e,t)=>X()?.hasConsent(e,t)??!1,Br=e=>X()?.getConsents(e)??[],Fr=(e,t)=>X()?.revokeConsent(e,t),Wr=e=>{let t=X();if(!t)throw new Error("[gState] exportUserData failed: No store found.");return t.exportUserData(e)},Lr=e=>{let t=X();if(!t)throw new Error("[gState] deleteUserData failed: No store found.");return t.deleteUserData(e)},Jr=()=>{},qr=()=>{};export{Nr as addAccessRule,Ln as analyticsPlugin,Jr as clearAccessRules,qr as clearAllConsents,Hn as cloudSyncPlugin,Nn as createAsyncStore,Qn as createFirestoreAdapter,Xn as createMongoAdapter,Zn as createSqlRestAdapter,ue as createStore,qn as debugPlugin,Lr as deleteUserData,Vn as destroyState,Bn as devToolsPlugin,Ht as exportKey,Wr as exportUserData,Gt as generateEncryptionKey,Br as getConsents,X as getStore,zr as gstate,Wn as guardPlugin,Kr as hasConsent,$r as hasPermission,$n as immerPlugin,Xt as importKey,Gn as indexedDBPlugin,jn as initState,St as isCryptoAvailable,ye as logAudit,vr as loggerPlugin,Ur as recordConsent,Fr as revokeConsent,ge as sanitizeValue,Kn as schemaPlugin,Qt as setAuditLogger,Fn as snapshotPlugin,Jn as syncPlugin,Un as undoRedoPlugin,Re as useGState,zn as useIsStoreReady,Re as useSimpleState,Re as useStore,et as validateKey};
@@ -41,6 +41,10 @@ This documentation is written for everyone: from **easy setup** for those who ju
41
41
  - Upgrading to latest version (Enterprise Isolation)
42
42
  - Upgrading to previous version (`secure` → `encoded`)
43
43
 
44
+ - **[Security Architecture & Hardening](chapters/09-security-architecture.md)**
45
+ - Advanced XSS prevention and deep cloning reliability.
46
+ - AES-256-GCM and RBAC.
47
+
44
48
  ---
45
49
 
46
50
  ## Reference
package/markdown/api.md CHANGED
@@ -26,7 +26,10 @@ function initState<S extends Record<string, unknown>>(
26
26
  const store = initState({
27
27
  namespace: 'myApp',
28
28
  version: 1,
29
- persist: true
29
+ persist: true,
30
+ onError: (error, context) => {
31
+ console.error(`Error in ${context.operation}:`, error.message)
32
+ }
30
33
  })
31
34
  ```
32
35
 
@@ -63,6 +66,18 @@ function createStore<S extends Record<string, unknown>>(
63
66
 
64
67
  ---
65
68
 
69
+ ### `getStore`
70
+
71
+ Retrieves the currently active default store instance. Useful for accessing the store outside of React components or in utility functions.
72
+
73
+ ```typescript
74
+ function getStore(): IStore<Record<string, unknown>> | null
75
+ ```
76
+
77
+ **Returns:** The active `IStore` or `null` if no store was initialized via `initState`.
78
+
79
+ ---
80
+
66
81
  ## Store Interface (`IStore`)
67
82
 
68
83
  ### State Operations
@@ -110,6 +125,26 @@ store.list(): Record<string, unknown>
110
125
 
111
126
  ---
112
127
 
128
+ ### Metadata Properties
129
+
130
+ #### `namespace`
131
+
132
+ The unique namespace of the store (read-only).
133
+
134
+ ```typescript
135
+ store.namespace: string
136
+ ```
137
+
138
+ #### `userId`
139
+
140
+ The current user ID associated with the store for RBAC and audit logs (read-only).
141
+
142
+ ```typescript
143
+ store.userId?: string
144
+ ```
145
+
146
+ ---
147
+
113
148
  ### Computed Values
114
149
 
115
150
  #### `compute`
@@ -129,6 +164,8 @@ const fullName = store.compute('fullName', (get) => {
129
164
  })
130
165
  ```
131
166
 
167
+ > **Note:** RGS supports **nested computed dependencies**. A computed value can reactively depend on other computed values in the same store.
168
+
132
169
  ---
133
170
 
134
171
  ### Watching Changes
@@ -218,6 +255,8 @@ Access plugin methods via `store.plugins`:
218
255
  store.plugins.undoRedo.undo()
219
256
  store.plugins.undoRedo.redo()
220
257
  store.plugins.counter.increment()
258
+ store.plugins.cloudSync.sync()
259
+ store.plugins.cloudSync.getStats()
221
260
  ```
222
261
 
223
262
  ---
@@ -15,7 +15,7 @@ npm install rgs
15
15
  In your main entry file (e.g., `main.tsx` or `App.tsx`), wake up the engine once.
16
16
 
17
17
  ```typescript
18
- import { initState } from '@biglogic/rgs';
18
+ import { initState, useStore } from '@biglogic/rgs';
19
19
 
20
20
  // Initialize with optional settings
21
21
  initState({
@@ -12,11 +12,18 @@ Let's create a User Profile module.
12
12
  import { gstate } from '@biglogic/rgs';
13
13
 
14
14
  // 1. Define the state and create everything in ONE shot
15
+ // Pass a string namespace to enable automatic persistence to localStorage
15
16
  export const useUser = gstate({
16
17
  name: 'Guest',
17
18
  isLogged: false,
18
19
  preferences: { theme: 'dark', lang: 'en' }
19
- }, 'user_module'); // Optional namespace for persistence
20
+ }, 'user_module'); // Auto-persists to localStorage (excludes sensitive fields)
21
+
22
+ // Or use an object config for more control:
23
+ export const useUserNoPersist = gstate({
24
+ name: 'Guest',
25
+ isLogged: false
26
+ }, { namespace: 'user_module', autoPersist: false }); // No persistence
20
27
 
21
28
  // 2. Use it anywhere
22
29
  function ProfileHeader() {
@@ -30,8 +37,8 @@ function ProfileHeader() {
30
37
  ## 💎 Why Magnetar Rocks
31
38
 
32
39
  1. **Inferred Types**: No need to define `<string>`. TypeScript looks at the initial value you passed to `gstate` and figures it out.
33
- 2. **Auto-Namespace**: If you enable persistence, Magnetar uses the name you gave it (`user_module`) to isolate data in the local database.
34
- 3. **Store Methods Included**: The object returned by `gstate` is not just a hook. It's the store itself!
40
+ 2. **Auto-Persistence**: When you pass a string namespace, RGS automatically persists to localStorage (excluding sensitive fields like tokens, passwords, secrets).
41
+ 3. **Security**: Sensitive fields (containing 'token', 'password', 'secret', 'key') are automatically excluded from persistence.
35
42
 
36
43
  ```typescript
37
44
  // You can access the store OUTSIDE components!
@@ -9,10 +9,33 @@ When you initialize RGS or a Magnetar, you can enable persistence. But it's not
9
9
  ```typescript
10
10
  initState({
11
11
  persist: true,
12
- storage: 'local' // or 'session' or a custom adapter
12
+ storage: 'local' // or 'session', or a custom adapter
13
13
  });
14
14
  ```
15
15
 
16
+ ### Advanced Storage: Beyond 5MB
17
+
18
+ For applications that need to store massive amounts of data (Gigabytes), standard `localStorage` is not enough. RGS provides official plugins for advanced scenarios:
19
+
20
+ | Technology | Capacity | Purpose | Plugin |
21
+ | :--- | :--- | :--- | :--- |
22
+ | **LocalStorage** | ~5MB | Basic UI settings, small profiles. | Core (Native) |
23
+ | **IndexedDB** | GBs | Offline-first apps, large datasets, logs. | `indexedDBPlugin` |
24
+ | **Cloud Sync** | Unlimited | Remote backup, cross-device sync. | `cloudSyncPlugin` |
25
+
26
+ ---
27
+
28
+ ## ☁️ Hybrid Persistence: The "Cloud-Cloud" Strategy
29
+
30
+ RGS allows you to combine local power with cloud safety. You can store your active data in **IndexedDB** for speed and capacity, while automatically backing it up to a remote database (MongoDB, Firebase, SQL) using the **Cloud Sync Plugin**.
31
+
32
+ ### Why use Cloud Sync?
33
+ - **Differential Updates**: Safely sends only what was changed since the last sync.
34
+ - **Scheduled or On-Demand**: Sync every 5 minutes automatically, or triggered by a "Save to Cloud" button.
35
+ - **Diagnostics**: Track how much data you are syncing and detect errors before they reach the user.
36
+
37
+ ---
38
+
16
39
  ### What happens under the hood?
17
40
 
18
41
  ```mermaid
@@ -72,13 +95,31 @@ If anyone tries to `set('price', -50)`, RGS will block the operation and warn yo
72
95
 
73
96
  ---
74
97
 
98
+ ## ⚠️ Size Limits: maxObjectSize & maxTotalSize
99
+
100
+ Protect your app from memory issues with automatic size warnings:
101
+
102
+ ```typescript
103
+ const store = initState({
104
+ // Warn if single value exceeds 5MB (default: 5MB)
105
+ maxObjectSize: 5 * 1024 * 1024,
106
+ // Warn if total store exceeds 50MB (default: 50MB)
107
+ maxTotalSize: 50 * 1024 * 1024
108
+ });
109
+
110
+ // Setting a value that exceeds the limit will trigger a warning
111
+ store.set('largeData', bigObject); // Warns if > maxObjectSize
112
+ ```
113
+
114
+ ---
115
+
75
116
  ## 💡 Case Study: The Cart that Never Lost an Item
76
117
 
77
- **Challenge**: User adds products, closes the browser, comes back after two days. The cart must still be there.
118
+ **Challenge**: User adds products, closes the browser, comes back after two days. The cart must still be there, and synced with their account on other devices.
78
119
  **RGS Solution**:
79
120
 
80
- 1. Enable `persist: true` in the cart store.
81
- 2. Use `createAsyncStore` (Chapter 5) to sync local data with the remote database as soon as a connection is available.
82
- 3. Result? 5-star UX.
121
+ 1. Enable `indexedDBPlugin` for robust local storage (handles thousands of items).
122
+ 2. Use `cloudSyncPlugin` to bridge the local state with your company's MongoDB Atlas or Firebase.
123
+ 3. Result? 5-star UX with full data durability and cross-device sync.
83
124
 
84
125
  **Next step:** [Ecosystem and Plugins: Extending the Power](05-plugins-and-extensibility.md)
@@ -4,12 +4,14 @@ RGS is not a closed box. It's a modular engine that you can extend to cover ever
4
4
 
5
5
  ## 🔌 Available Plugins
6
6
 
7
- RGS includes 8 official plugins:
7
+ RGS includes 11 official plugins:
8
8
 
9
9
  | Plugin | Purpose | Import |
10
10
  |--------|---------|--------|
11
11
  | `devToolsPlugin` | Redux DevTools integration | `rgs` |
12
12
  | `debugPlugin` | Console debug access (DEV only) | `rgs` |
13
+ | `indexedDBPlugin` | GB-scale Local Storage | `rgs/advanced` |
14
+ | `cloudSyncPlugin` | Remote Cloud Backup/Sync | `rgs/advanced` |
13
15
  | `syncPlugin` | Cross-tab synchronization | `rgs/advanced` |
14
16
  | `immerPlugin` | Immer for mutable-style updates | `rgs` |
15
17
  | `snapshotPlugin` | Save/restore state snapshots | `rgs` |
@@ -62,7 +64,21 @@ import { syncPlugin } from 'rgs/advanced';
62
64
  store._addPlugin(syncPlugin({ channelName: 'my_app_sync' }));
63
65
  ```
64
66
 
65
- ## 🕐 3. TTL (Time To Live): Expiring Data
67
+ ## 🔐 3. Encode Option: Base64 Encoding
68
+
69
+ Use the `encoded` option for simple base64 encoding (not encryption, just obfuscation):
70
+
71
+ ```typescript
72
+ // Per-value encoding
73
+ store.set('token', 'secret-value', { persist: true, encoded: true })
74
+
75
+ // Or global encoding for all persisted values
76
+ const store = initState({ encoded: true })
77
+ ```
78
+
79
+ > **Note:** Use `encryptionKey` with AES-256-GCM for real security. The `encoded` option is just simple obfuscation.
80
+
81
+ ## 🕐 4. TTL (Time To Live): Expiring Data
66
82
 
67
83
  Use the `ttl` option in persist to make data expire automatically:
68
84
 
@@ -73,7 +89,7 @@ store.set('session_token', tokenValue, {
73
89
  });
74
90
  ```
75
91
 
76
- ## 🎲 4. Undo/Redo: History Management
92
+ ## 🎲 5. Undo/Redo: History Management
77
93
 
78
94
  ```typescript
79
95
  import { undoRedoPlugin } from '@biglogic/rgs';
@@ -87,7 +103,7 @@ store.canUndo(); // boolean
87
103
  store.canRedo(); // boolean
88
104
  ```
89
105
 
90
- ## 📸 5. Snapshots: Save & Restore State
106
+ ## 📸 6. Snapshots: Save & Restore State
91
107
 
92
108
  ```typescript
93
109
  import { snapshotPlugin } from '@biglogic/rgs';
@@ -108,7 +124,7 @@ store.deleteSnapshot('backup_1');
108
124
  store.clearSnapshots();
109
125
  ```
110
126
 
111
- ## 🛡️ 6. Guard: Pre-Set Transformation
127
+ ## 🛡️ 7. Guard: Pre-Set Transformation
112
128
 
113
129
  Transform values before they hit the store:
114
130
 
@@ -120,7 +136,7 @@ store._addPlugin(guardPlugin({
120
136
  }));
121
137
  ```
122
138
 
123
- ## ✅ 7. Schema: Validation
139
+ ## ✅ 8. Schema: Validation
124
140
 
125
141
  Validate values before setting:
126
142
 
@@ -135,7 +151,7 @@ store._addPlugin(schemaPlugin({
135
151
  }));
136
152
  ```
137
153
 
138
- ## 📊 8. Analytics: Track Changes
154
+ ## 📊 9. Analytics: Track Changes
139
155
 
140
156
  ```typescript
141
157
  import { analyticsPlugin } from '@biglogic/rgs';
@@ -149,7 +165,7 @@ store._addPlugin(analyticsPlugin({
149
165
  }));
150
166
  ```
151
167
 
152
- ## 🔄 9. Immer Integration
168
+ ## 🔄 10. Immer Integration
153
169
 
154
170
  ```typescript
155
171
  import { immerPlugin } from '@biglogic/rgs';