@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/README.md CHANGED
@@ -101,7 +101,7 @@ Best for modern applications. Clean imports, zero global pollution.
101
101
  ```tsx
102
102
  import { gstate } from '@biglogic/rgs'
103
103
 
104
- // Create store and hook in one line
104
+ // gstate CREATES a custom hook - it is NOT imported!
105
105
  const useCounter = gstate({ count: 0 })
106
106
 
107
107
  // In your component
@@ -114,7 +114,7 @@ Best for shared state across the entire application.
114
114
 
115
115
  ```tsx
116
116
  // 1. Initialize once
117
- import { initState } from '@biglogic/rgs'
117
+ import { initState, useStore } from '@biglogic/rgs'
118
118
  initState({ namespace: 'app' })
119
119
 
120
120
  // 2. Use anywhere
@@ -164,6 +164,32 @@ store.compute('fullName', ['firstName', 'lastName'],
164
164
  const [fullName] = store('fullName') // "John Doe"
165
165
  ```
166
166
 
167
+ ### Error Handling with onError
168
+
169
+ Handle errors gracefully with the `onError` callback - perfect for production apps:
170
+
171
+ ```tsx
172
+ const store = gstate({ data: null }, {
173
+ onError: (error, context) => {
174
+ console.error(`Error in ${context.operation}:`, error.message)
175
+ // Send to error tracking service (Sentry, etc.)
176
+ }
177
+ })
178
+ ```
179
+
180
+ ### Size Limits (maxObjectSize & maxTotalSize)
181
+
182
+ Protect your app from memory issues with automatic size warnings:
183
+
184
+ ```tsx
185
+ const store = gstate({ data: {} }, {
186
+ // Warn if single value exceeds 5MB (default)
187
+ maxObjectSize: 5 * 1024 * 1024,
188
+ // Warn if total store exceeds 50MB (default)
189
+ maxTotalSize: 50 * 1024 * 1024
190
+ })
191
+ ```
192
+
167
193
  ---
168
194
 
169
195
  ## Multiple Stores
package/SECURITY.md CHANGED
@@ -1,3 +1,13 @@
1
1
  # Security
2
2
 
3
+ React Globo State (RGS) implements enterprise-grade security including AES-256-GCM encryption, RBAC, and internal XSS sanitization as a secondary defense layer.
4
+
5
+ ## Reporting a Vulnerability
6
+
3
7
  Please email [@passariello](https://github.com/passariello) or see <https://dario.passariello.ca/contact/> if you have a potential security vulnerability to report.
8
+
9
+ ## Recent Hardening (v2.9.5)
10
+
11
+ - Improved XSS sanitization patterns to block `data:`, `vbscript:`, and complex HTML tag combinations.
12
+ - Implemented removal of HTML entity obfuscation.
13
+ - Enhanced deep cloning to support `Map`/`Set` and circular references.
package/advanced.js CHANGED
@@ -1 +1 @@
1
- var Lt=Object.defineProperty;var At=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Jt=(e,t)=>{for(var r in t)Lt(e,r,{get:t[r],enumerable:!0})};var Wt=At((Or,Nt)=>{"use strict";var ht=Object.defineProperty,Xt=Object.getOwnPropertyDescriptor,Zt=Object.getOwnPropertyNames,Yt=Object.prototype.hasOwnProperty,er=(e,t)=>{for(var r in t)ht(e,r,{get:t[r],enumerable:!0})},tr=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Zt(t))!Yt.call(e,s)&&s!==r&&ht(e,s,{get:()=>t[s],enumerable:!(n=Xt(t,s))||n.enumerable});return e},rr=e=>tr(ht({},"__esModule",{value:!0}),e),Rt={};er(Rt,{Immer:()=>Vt,applyPatches:()=>Cr,castDraft:()=>_r,castImmutable:()=>Pr,createDraft:()=>Er,current:()=>Ut,enableArrayMethods:()=>Sr,enableMapSet:()=>mr,enablePatches:()=>yr,finishDraft:()=>Mr,freeze:()=>Ke,immerable:()=>se,isDraft:()=>L,isDraftable:()=>K,nothing:()=>Fe,original:()=>or,produce:()=>wr,produceWithPatches:()=>br,setAutoFreeze:()=>vr,setUseStrictIteration:()=>xr,setUseStrictShallowCopy:()=>Ar});Nt.exports=rr(Rt);var Fe=Symbol.for("immer-nothing"),se=Symbol.for("immer-draftable"),E=Symbol.for("immer-state");function T(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var F=Object,re=F.getPrototypeOf,ge="constructor",be="prototype",ut="configurable",ze="enumerable",De="writable",he="value",L=e=>!!e&&!!e[E];function K(e){return e?It(e)||ve(e)||!!e[se]||!!e[ge]?.[se]||Ae(e)||xe(e):!1}var nr=F[be][ge].toString(),Ct=new WeakMap;function It(e){if(!e||!ie(e))return!1;let t=re(e);if(t===null||t===F[be])return!0;let r=F.hasOwnProperty.call(t,ge)&&t[ge];if(r===Object)return!0;if(!te(r))return!1;let n=Ct.get(r);return n===void 0&&(n=Function.toString.call(r),Ct.set(r,n)),n===nr}function or(e){return L(e)||T(15,e),e[E].t}function ae(e,t,r=!0){ne(e)===0?(r?Reflect.ownKeys(e):F.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,s)=>t(s,n,e))}function ne(e){let t=e[E];return t?t.r:ve(e)?1:Ae(e)?2:xe(e)?3:0}var pe=(e,t,r=ne(e))=>r===2?e.has(t):F[be].hasOwnProperty.call(e,t),X=(e,t,r=ne(e))=>r===2?e.get(t):e[t],je=(e,t,r,n=ne(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function sr(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var ve=Array.isArray,Ae=e=>e instanceof Map,xe=e=>e instanceof Set,ie=e=>typeof e=="object",te=e=>typeof e=="function",lt=e=>typeof e=="boolean";function ir(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Ot=e=>ie(e)?e?.[E]:null,z=e=>e.e||e.t,ar=e=>{let t=Ot(e);return t?t.e??t.t:e},yt=e=>e.s?e.e:e.t;function ft(e,t){if(Ae(e))return new Map(e);if(xe(e))return new Set(e);if(ve(e))return Array[be].slice.call(e);let r=It(e);if(t===!0||t==="class_only"&&!r){let n=F.getOwnPropertyDescriptors(e);delete n[E];let s=Reflect.ownKeys(n);for(let l=0;l<s.length;l++){let g=s[l],x=n[g];x[De]===!1&&(x[De]=!0,x[ut]=!0),(x.get||x.set)&&(n[g]={[ut]:!0,[De]:!0,[ze]:x[ze],[he]:e[g]})}return F.create(re(e),n)}else{let n=re(e);if(n!==null&&r)return{...e};let s=F.create(n);return F.assign(s,e)}}function Ke(e,t=!1){return Be(e)||L(e)||!K(e)||(ne(e)>1&&F.defineProperties(e,{set:Oe,add:Oe,clear:Oe,delete:Oe}),F.freeze(e),t&&ae(e,(r,n)=>{Ke(n,!0)},!1)),e}function lr(){T(2)}var Oe={[he]:lr};function Be(e){return e===null||!ie(e)?!0:F.isFrozen(e)}var ye="MapSet",Te="Patches",pt="ArrayMethods",Ve={};function oe(e){let t=Ve[e];return t||T(0,e),t}var Et=e=>!!Ve[e];function mt(e,t){Ve[e]||(Ve[e]=t)}var me,Ue=()=>me,cr=(e,t)=>({o:[],i:e,l:t,F:!0,m:0,P:new Set,T:new Set,I:Et(ye)?oe(ye):void 0,E:Et(pt)?oe(pt):void 0});function Mt(e,t){t&&(e.x=oe(Te),e.y=[],e.d=[],e.C=t)}function dt(e){gt(e),e.o.forEach(ur),e.o=null}function gt(e){e===me&&(me=e.i)}var _t=e=>me=cr(me,e);function ur(e){let t=e[E];t.r===0||t.r===1?t.b():t.g=!0}function Pt(e,t){t.m=t.o.length;let r=t.o[0];if(e!==void 0&&e!==r){r[E].s&&(dt(t),T(4)),K(e)&&(e=kt(t,e));let{x:n}=t;n&&n.M(r[E].t,e,t)}else e=kt(t,r);return fr(t,e,!0),dt(t),t.y&&t.C(t.y,t.d),e!==Fe?e:void 0}function kt(e,t){if(Be(t))return t;let r=t[E];if(!r)return Ne(t,e.P,e);if(!Le(r,e))return t;if(!r.s)return r.t;if(!r.u){let{f:n}=r;if(n)for(;n.length>0;)n.pop()(e);jt(r,e)}return r.e}function fr(e,t,r=!1){!e.i&&e.l.h&&e.F&&Ke(t,r)}function Dt(e){e.u=!0,e.a.m--}var Le=(e,t)=>e.a===t,pr=[];function zt(e,t,r,n){let s=z(e),l=e.r;if(n!==void 0&&X(s,n,l)===t){je(s,n,r,l);return}if(!e.D){let x=e.D=new Map;ae(s,(v,a)=>{if(L(a)){let u=x.get(a)||[];u.push(v),x.set(a,u)}})}let g=e.D.get(t)??pr;for(let x of g)je(s,x,r,l)}function dr(e,t,r){e.f.push(function(n){let s=t;if(!s||!Le(s,n))return;n.I?.fixSetContents(s);let l=yt(s);zt(e,s.c??s,l,r),jt(s,n)})}function jt(e,t){if(e.s&&!e.u&&(e.r===3||e.r===1&&e.R||(e.n?.size??0)>0)){let{x:r}=t;if(r){let n=r.getPath(e);n&&r.O(e,n,t)}Dt(e)}}function $e(e,t,r){let{a:n}=e;if(L(r)){let s=r[E];Le(s,n)&&s.f.push(function(){de(e);let l=yt(s);zt(e,r,l,t)})}else K(r)&&e.f.push(function(){let s=z(e);e.r===3?s.has(r)&&Ne(r,n.P,n):X(s,t,e.r)===r&&n.o.length>1&&(e.n.get(t)??!1)===!0&&e.e&&Ne(X(e.e,t,e.r),n.P,n)})}function Ne(e,t,r){return!r.l.h&&r.m<1||L(e)||t.has(e)||!K(e)||Be(e)||(t.add(e),ae(e,(n,s)=>{if(L(s)){let l=s[E];if(Le(l,r)){let g=yt(l);je(e,n,g,e.r),Dt(l)}}else K(s)&&Ne(s,t,r)})),e}function gr(e,t){let r=ve(e),n={r:r?1:0,a:t?t.a:Ue(),s:!1,u:!1,n:void 0,i:t,t:e,c:null,e:null,b:null,S:!1,f:void 0},s=n,l=We;r&&(s=[n],l=Se);let{revoke:g,proxy:x}=Proxy.revocable(s,l);return n.c=x,n.b=g,[x,n]}var We={get(e,t){if(t===E)return e;let r=e.a.E,n=e.r===1&&typeof t=="string";if(n&&r?.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);let s=z(e);if(!pe(s,t,e.r))return hr(e,s,t);let l=s[t];if(e.u||!K(l)||n&&e.operationMethod&&r?.isMutatingArrayMethod(e.operationMethod)&&ir(t))return l;if(l===ct(e.t,t)){de(e);let g=e.r===1?+t:t,x=we(e.a,l,e,g);return e.e[g]=x}return l},has(e,t){return t in z(e)},ownKeys(e){return Reflect.ownKeys(z(e))},set(e,t,r){let n=Tt(z(e),t);if(n?.set)return n.set.call(e.c,r),!0;if(!e.s){let s=ct(z(e),t),l=s?.[E];if(l&&l.t===r)return e.e[t]=r,e.n.set(t,!1),!0;if(sr(r,s)&&(r!==void 0||pe(e.t,t,e.r)))return!0;de(e),H(e)}return e.e[t]===r&&(r!==void 0||t in e.e)||Number.isNaN(r)&&Number.isNaN(e.e[t])||(e.e[t]=r,e.n.set(t,!0),$e(e,t,r)),!0},deleteProperty(e,t){return de(e),ct(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 r=z(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[De]:!0,[ut]:e.r!==1||t!=="length",[ze]:n[ze],[he]:r[t]}},defineProperty(){T(11)},getPrototypeOf(e){return re(e.t)},setPrototypeOf(){T(12)}},Se={};for(let e in We){let t=We[e];Se[e]=function(){let r=arguments;return r[0]=r[0][0],t.apply(this,r)}}Se.deleteProperty=function(e,t){return Se.set.call(this,e,t,void 0)};Se.set=function(e,t,r){return We.set.call(this,e[0],t,r,e[0])};function ct(e,t){let r=e[E];return(r?z(r):e)[t]}function hr(e,t,r){let n=Tt(t,r);return n?he in n?n[he]:n.get?.call(e.c):void 0}function Tt(e,t){if(!(t in e))return;let r=re(e);for(;r;){let n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=re(r)}}function H(e){e.s||(e.s=!0,e.i&&H(e.i))}function de(e){e.e||(e.n=new Map,e.e=ft(e.t,e.a.l.A))}var Vt=class{constructor(e){this.h=!0,this.A=!1,this._=!1,this.produce=(t,r,n)=>{if(te(t)&&!te(r)){let l=r;r=t;let g=this;return function(x=l,...v){return g.produce(x,a=>r.call(this,a,...v))}}te(r)||T(6),n!==void 0&&!te(n)&&T(7);let s;if(K(t)){let l=_t(this),g=we(l,t,void 0),x=!0;try{s=r(g),x=!1}finally{x?dt(l):gt(l)}return Mt(l,n),Pt(s,l)}else if(!t||!ie(t)){if(s=r(t),s===void 0&&(s=t),s===Fe&&(s=void 0),this.h&&Ke(s,!0),n){let l=[],g=[];oe(Te).M(t,s,{y:l,d:g}),n(l,g)}return s}else T(1,t)},this.produceWithPatches=(t,r)=>{if(te(t))return(l,...g)=>this.produceWithPatches(l,x=>t(x,...g));let n,s;return[this.produce(t,r,(l,g)=>{n=l,s=g}),n,s]},lt(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),lt(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),lt(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){K(e)||T(8),L(e)&&(e=Ut(e));let t=_t(this),r=we(t,e,void 0);return r[E].S=!0,gt(t),r}finishDraft(e,t){let r=e&&e[E];(!r||!r.S)&&T(9);let{a:n}=r;return Mt(n,t),Pt(void 0,n)}setAutoFreeze(e){this.h=e}setUseStrictShallowCopy(e){this.A=e}setUseStrictIteration(e){this._=e}shouldUseStrictIteration(){return this._}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){let s=t[r];if(s.path.length===0&&s.op==="replace"){e=s.value;break}}r>-1&&(t=t.slice(r+1));let n=oe(Te).N;return L(e)?n(e,t):this.produce(e,s=>n(s,t))}};function we(e,t,r,n){let[s,l]=Ae(t)?oe(ye).w(t,r):xe(t)?oe(ye).V(t,r):gr(t,r);return(r?.a??Ue()).o.push(s),l.f=r?.f??[],l.p=n,r&&n!==void 0?dr(r,l,n):l.f.push(function(g){g.I?.fixSetContents(l);let{x}=g;l.s&&x&&x.O(l,[],g)}),s}function Ut(e){return L(e)||T(10,e),$t(e)}function $t(e){if(!K(e)||Be(e))return e;let t=e[E],r,n=!0;if(t){if(!t.s)return t.t;t.u=!0,r=ft(e,t.a.l.A),n=t.a.l.shouldUseStrictIteration()}else r=ft(e,!0);return ae(r,(s,l)=>{je(r,s,$t(l))},n),t&&(t.u=!1),r}function yr(){function e(p,S=[]){if(p.p!==void 0){let C=p.i.e??p.i.t,m=Ot(X(C,p.p)),R=X(C,p.p);if(R===void 0||R!==p.c&&R!==p.t&&R!==p.e||m!=null&&m.t!==p.t)return null;let I=p.i.r===3,A;if(I){let i=p.i;A=Array.from(i.o.keys()).indexOf(p.p)}else A=p.p;if(!(I&&C.size>A||pe(C,A)))return null;S.push(A)}if(p.i)return e(p.i,S);S.reverse();try{t(p.e,S)}catch{return null}return S}function t(p,S){let C=p;for(let m=0;m<S.length-1;m++){let R=S[m];if(C=X(C,R),!ie(C)||C===null)throw new Error(`Cannot resolve path at '${S.join("/")}'`)}return C}let r="replace",n="add",s="remove";function l(p,S,C){if(p.a.T.has(p))return;p.a.T.add(p);let{y:m,d:R}=C;switch(p.r){case 0:case 2:return x(p,S,m,R);case 1:return g(p,S,m,R);case 3:return v(p,S,m,R)}}function g(p,S,C,m){let{t:R,n:I}=p,A=p.e;A.length<R.length&&([R,A]=[A,R],[C,m]=[m,C]);let i=p.R===!0;for(let d=0;d<R.length;d++){let h=A[d],w=R[d];if((i||I?.get(d.toString()))&&h!==w){let _=h?.[E];if(_&&_.s)continue;let j=S.concat([d]);C.push({op:r,path:j,value:D(h)}),m.push({op:r,path:j,value:D(w)})}}for(let d=R.length;d<A.length;d++){let h=S.concat([d]);C.push({op:n,path:h,value:D(A[d])})}for(let d=A.length-1;R.length<=d;--d){let h=S.concat([d]);m.push({op:s,path:h})}}function x(p,S,C,m){let{t:R,e:I,r:A}=p;ae(p.n,(i,d)=>{let h=X(R,i,A),w=X(I,i,A),_=d?pe(R,i)?r:n:s;if(h===w&&_===r)return;let j=S.concat(i);C.push(_===s?{op:_,path:j}:{op:_,path:j,value:D(w)}),m.push(_===n?{op:s,path:j}:_===s?{op:n,path:j,value:D(h)}:{op:r,path:j,value:D(h)})})}function v(p,S,C,m){let{t:R,e:I}=p,A=0;R.forEach(i=>{if(!I.has(i)){let d=S.concat([A]);C.push({op:s,path:d,value:i}),m.unshift({op:n,path:d,value:i})}A++}),A=0,I.forEach(i=>{if(!R.has(i)){let d=S.concat([A]);C.push({op:n,path:d,value:i}),m.unshift({op:s,path:d,value:i})}A++})}function a(p,S,C){let{y:m,d:R}=C;m.push({op:r,path:[],value:S===Fe?void 0:S}),R.push({op:r,path:[],value:p})}function u(p,S){return S.forEach(C=>{let{path:m,op:R}=C,I=p;for(let h=0;h<m.length-1;h++){let w=ne(I),_=m[h];typeof _!="string"&&typeof _!="number"&&(_=""+_),(w===0||w===1)&&(_==="__proto__"||_===ge)&&T(19),te(I)&&_===be&&T(19),I=X(I,_),ie(I)||T(18,m.join("/"))}let A=ne(I),i=M(C.value),d=m[m.length-1];switch(R){case r:switch(A){case 2:return I.set(d,i);case 3:T(16);default:return I[d]=i}case n:switch(A){case 1:return d==="-"?I.push(i):I.splice(d,0,i);case 2:return I.set(d,i);case 3:return I.add(i);default:return I[d]=i}case s:switch(A){case 1:return I.splice(d,1);case 2:return I.delete(d);case 3:return I.delete(C.value);default:return delete I[d]}default:T(17,R)}}),p}function M(p){if(!K(p))return p;if(ve(p))return p.map(M);if(Ae(p))return new Map(Array.from(p.entries()).map(([C,m])=>[C,M(m)]));if(xe(p))return new Set(Array.from(p).map(M));let S=Object.create(re(p));for(let C in p)S[C]=M(p[C]);return pe(p,se)&&(S[se]=p[se]),S}function D(p){return L(p)?M(p):p}mt(Te,{N:u,O:l,M:a,getPath:e})}function mr(){class e extends Map{constructor(a,u){super(),this[E]={r:2,i:u,a:u?u.a:Ue(),s:!1,u:!1,e:void 0,n:void 0,t:a,c:this,S:!1,g:!1,f:[]}}get size(){return z(this[E]).size}has(a){return z(this[E]).has(a)}set(a,u){let M=this[E];return g(M),(!z(M).has(a)||z(M).get(a)!==u)&&(r(M),H(M),M.n.set(a,!0),M.e.set(a,u),M.n.set(a,!0),$e(M,a,u)),this}delete(a){if(!this.has(a))return!1;let u=this[E];return g(u),r(u),H(u),u.t.has(a)?u.n.set(a,!1):u.n.delete(a),u.e.delete(a),!0}clear(){let a=this[E];g(a),z(a).size&&(r(a),H(a),a.n=new Map,ae(a.t,u=>{a.n.set(u,!1)}),a.e.clear())}forEach(a,u){let M=this[E];z(M).forEach((D,p,S)=>{a.call(u,this.get(p),p,this)})}get(a){let u=this[E];g(u);let M=z(u).get(a);if(u.u||!K(M)||M!==u.t.get(a))return M;let D=we(u.a,M,u,a);return r(u),u.e.set(a,D),D}keys(){return z(this[E]).keys()}values(){let a=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let u=a.next();return u.done?u:{done:!1,value:this.get(u.value)}}}}entries(){let a=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let u=a.next();if(u.done)return u;let M=this.get(u.value);return{done:!1,value:[u.value,M]}}}}[Symbol.iterator](){return this.entries()}}function t(v,a){let u=new e(v,a);return[u,u[E]]}function r(v){v.e||(v.n=new Map,v.e=new Map(v.t))}class n extends Set{constructor(a,u){super(),this[E]={r:3,i:u,a:u?u.a:Ue(),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 z(this[E]).size}has(a){let u=this[E];return g(u),u.e?!!(u.e.has(a)||u.o.has(a)&&u.e.has(u.o.get(a))):u.t.has(a)}add(a){let u=this[E];return g(u),this.has(a)||(l(u),H(u),u.e.add(a),$e(u,a,a)),this}delete(a){if(!this.has(a))return!1;let u=this[E];return g(u),l(u),H(u),u.e.delete(a)||(u.o.has(a)?u.e.delete(u.o.get(a)):!1)}clear(){let a=this[E];g(a),z(a).size&&(l(a),H(a),a.e.clear())}values(){let a=this[E];return g(a),l(a),a.e.values()}entries(){let a=this[E];return g(a),l(a),a.e.entries()}keys(){return this.values()}[Symbol.iterator](){return this.values()}forEach(a,u){let M=this.values(),D=M.next();for(;!D.done;)a.call(u,D.value,D.value,this),D=M.next()}}function s(v,a){let u=new n(v,a);return[u,u[E]]}function l(v){v.e||(v.e=new Set,v.t.forEach(a=>{if(K(a)){let u=we(v.a,a,v,a);v.o.set(a,u),v.e.add(u)}else v.e.add(a)}))}function g(v){v.g&&T(3,JSON.stringify(z(v)))}function x(v){if(v.r===3&&v.e){let a=new Set(v.e);v.e.clear(),a.forEach(u=>{v.e.add(ar(u))})}}mt(ye,{w:t,V:s,fixSetContents:x})}function Sr(){let e=new Set(["shift","unshift"]),t=new Set(["push","pop"]),r=new Set([...t,...e]),n=new Set(["reverse","sort"]),s=new Set([...r,...n,"splice"]),l=new Set(["find","findLast"]),g=new Set(["filter","slice","concat","flat",...l,"findIndex","findLastIndex","some","every","indexOf","lastIndexOf","includes","join","toString","toLocaleString"]);function x(i){return s.has(i)}function v(i){return g.has(i)}function a(i){return x(i)||v(i)}function u(i,d){i.operationMethod=d}function M(i){i.operationMethod=void 0}function D(i,d,h=!0){de(i);let w=d();return H(i),h&&i.n.set("length",!0),w}function p(i){i.R=!0}function S(i,d){return i<0?Math.max(d+i,0):Math.min(i,d)}function C(i,d,h){for(let w=0;w<h.length;w++){let _=d+w;i.n.set(_,!0),$e(i,_,h[w])}}function m(i,d,h){return D(i,()=>{let w=i.e.length,_=i.e[d](...h);return e.has(d)&&p(i),d==="push"&&h.length>0?C(i,w,h):d==="unshift"&&h.length>0&&C(i,0,h),r.has(d)?_:i.c})}function R(i,d,h){return D(i,()=>(i.e[d](...h),p(i),i.c),!1)}function I(i,d){return function(...h){let w=d;u(i,w);try{if(x(w)){if(r.has(w))return m(i,w,h);if(n.has(w))return R(i,w,h);if(w==="splice"){let _=D(i,()=>i.e.splice(...h));if(p(i),h.length>2){let j=S(h[0]??0,i.e.length);C(i,j,h.slice(2))}return _}}else return A(i,w,h)}finally{M(i)}}}function A(i,d,h){let w=z(i);if(d==="filter"){let _=h[0],j=[];for(let N=0;N<w.length;N++)_(w[N],N,w)&&j.push(i.c[N]);return j}if(l.has(d)){let _=h[0],j=d==="find",N=j?1:-1,J=j?0:w.length-1;for(let W=J;W>=0&&W<w.length;W+=N)if(_(w[W],W,w))return i.c[W];return}if(d==="slice"){let _=h[0]??0,j=h[1]??w.length,N=S(_,w.length),J=S(j,w.length),W=[];for(let Z=N;Z<J;Z++)W.push(i.c[Z]);return W}return w[d](...h)}mt(pt,{createMethodInterceptor:I,isArrayOperationMethod:a,isMutatingArrayMethod:x})}var $=new Vt,wr=$.produce,br=$.produceWithPatches.bind($),vr=$.setAutoFreeze.bind($),Ar=$.setUseStrictShallowCopy.bind($),xr=$.setUseStrictIteration.bind($),Cr=$.applyPatches.bind($),Er=$.createDraft.bind($),Mr=$.finishDraft.bind($),_r=e=>e,Pr=e=>e});var Kt=At((zr,Ft)=>{"use strict";Ft.exports=Wt()});var at={};Jt(at,{addAccessRule:()=>Re,decrypt:()=>Ye,deleteUserData:()=>it,encrypt:()=>Ze,exportKey:()=>Ht,exportUserData:()=>st,generateEncryptionKey:()=>Gt,getConsents:()=>ot,hasConsent:()=>rt,hasPermission:()=>fe,importKey:()=>qt,isAuditActive:()=>et,isCryptoAvailable:()=>xt,logAudit:()=>ue,recordConsent:()=>Ie,revokeConsent:()=>nt,sanitizeValue:()=>ce,setAuditLogger:()=>Qt,validateKey:()=>tt});var xt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Gt=async()=>{if(!xt)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))}},qt=async(e,t)=>{let r=Uint8Array.from(atob(e),l=>l.charCodeAt(0)),n=Uint8Array.from(atob(t),l=>l.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:n}},Ze=async(e,t)=>{let r=new TextEncoder,n=r.encode(JSON.stringify(e)),s=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),l=new Uint8Array(t.iv.length+s.byteLength);return l.set(t.iv),l.set(new Uint8Array(s),t.iv.length),btoa(String.fromCharCode(...l))},Ye=async(e,t)=>{let r=Uint8Array.from(atob(e),g=>g.charCodeAt(0)),n=r.slice(0,12),s=r.slice(12),l=await crypto.subtle.decrypt({name:"AES-GCM",iv:n},t.key,s);return JSON.parse(new TextDecoder().decode(l))},ke=null,Qt=e=>{ke=e},et=()=>ke!==null,ue=e=>{ke&&ke(e)},Re=(e,t,r)=>{e.set(t instanceof RegExp?t.source:t,r)},fe=(e,t,r,n)=>{if(e.size===0)return!0;for(let[s,l]of e){let g;if(typeof s=="function")g=s(t,n);else try{g=new RegExp(s).test(t)}catch{continue}if(g)return l.includes(r)||l.includes("admin")}return!1},ce=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[r,n]of Object.entries(e))t[r]=ce(n);return t}return Array.isArray(e)?e.map(t=>ce(t)):e},tt=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,Ie=(e,t,r,n)=>{let s={id:crypto.randomUUID(),purpose:r,granted:n,timestamp:Date.now()},l=e.get(t)||[];return l.push(s),e.set(t,l),ue({timestamp:Date.now(),action:"set",key:`consent:${r}`,userId:t,success:!0}),s},rt=(e,t,r)=>{let n=e.get(t);if(!n)return!1;for(let s=n.length-1;s>=0;s--){let l=n[s];if(l&&l.purpose===r)return l.granted}return!1},nt=(e,t,r)=>Ie(e,t,r,!1),ot=(e,t)=>e.get(t)||[],st=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),it=(e,t)=>{let r=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:r}};var St=null,Ce=null,kr=()=>{if(!St)try{let e=Kt();St=e.produce,Ce=e.freeze}catch(e){throw console.error("[gState] Immer not installed. Run: npm install immer"),e}},He={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,r)=>e.set(t,r),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},Je=e=>{if(e===null||typeof e!="object")return e;if(typeof structuredClone=="function")try{return structuredClone(e)}catch{}let t=new WeakMap,r=n=>{if(n===null||typeof n!="object")return n;if(t.has(n))return t.get(n);if(n instanceof Date)return new Date(n.getTime());if(n instanceof RegExp)return new RegExp(n.source,n.flags);let s=Array.isArray(n)?[]:Object.create(Object.getPrototypeOf(n));if(t.set(n,s),Array.isArray(n))for(let l=0;l<n.length;l++)s[l]=r(n[l]);else for(let l of Object.keys(n))s[l]=r(n[l]);return s};return r(e)},Ge=(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 s=0;s<e.length;s++)if(!Ge(e[s],t[s]))return!1;return!0}let r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let s of r)if(!n.includes(s)||!Ge(e[s],t[s]))return!1;return!0},qe=e=>{let t=new Map,r=new Map,n=new Map,s=new Set,l=new Map,g=new Set,x=new Map,v=new Map,a=new Map,u=new Map,M=new Map,D=new Map,p=new Map,S=new Map,C=e?.namespace||"gstate",m=e?.silent??!1,R=e?.debounceTime??150,I=e?.version??0,A=e?.storage||He.local(),i=e?.onError,d=e?.maxObjectSize??5*1024*1024,h=e?.maxTotalSize??50*1024*1024,w=e?.encryptionKey??null,_=e?.validateInput??!0,j=e?.auditEnabled??!0,N=e?.userId,J=e?.immer??!0;J&&kr(),e?.accessRules&&e.accessRules.forEach(o=>Re(p,o.pattern,o.permissions));let W=!1,Z=!1,Ee=!1,G=0,Qe=null,Me,Bt=new Promise(o=>{Me=o}),Xe=o=>{if(o==null)return 0;let c=0,f=[o],y=new WeakSet;for(;f.length>0;){let P=f.pop();if(typeof P=="boolean")c+=4;else if(typeof P=="number")c+=8;else if(typeof P=="string")c+=P.length*2;else if(typeof P=="object"&&P!==null){let b=P;if(y.has(b))continue;if(y.add(b),Array.isArray(b))for(let k=0;k<b.length;k++)f.push(b[k]);else for(let k of Object.keys(b))c+=k.length*2,f.push(b[k])}}return c},_e=()=>`${C}_`,Y=(o,c)=>{u.forEach(f=>{if(f.hooks?.[o])try{f.hooks[o](c)}catch(y){let P=y instanceof Error?y:new Error(String(y));i?i(P,{operation:`plugin:${f.name}:${o}`,key:c.key}):m||console.error(`[gState] Plugin "${f.name}" error:`,y)}})},q=(o,c,f,y)=>{j&&et()&&ue&&ue({timestamp:Date.now(),action:o,key:c,userId:N,success:f,error:y})},le=o=>{if(o&&(a.get(o)?.forEach(c=>wt(c)),x.get(o)?.forEach(c=>{try{c(U.get(o))}catch(f){let y=f instanceof Error?f:new Error(String(f));i?i(y,{operation:"watcher",key:o}):m||console.error(`[gState] Watcher error for "${o}":`,f)}}),l.get(o)?.forEach(c=>{try{c()}catch(f){let y=f instanceof Error?f:new Error(String(f));i?i(y,{operation:"keyListener",key:o}):m||console.error(`[gState] Listener error for "${o}":`,f)}})),W){Z=!0;return}s.forEach(c=>{try{c()}catch(f){let y=f instanceof Error?f:new Error(String(f));i?i(y,{operation:"listener"}):m||console.error("[gState] Global listener error:",f)}})},wt=o=>{let c=v.get(o),f=new Set;if(!c)return;let y=b=>(f.add(b),U.get(b)),P=c.selector(y);c.deps.forEach(b=>{if(!f.has(b)){let k=a.get(b);k&&(k.delete(o),k.size===0&&a.delete(b))}}),f.forEach(b=>{c.deps.has(b)||(a.has(b)||a.set(b,new Set),a.get(b).add(o))}),c.deps=f,Ge(c.lastValue,P)||(c.lastValue=J&&P!==null&&typeof P=="object"?Ce(Je(P),!0):P,r.set(o,(r.get(o)||0)+1),le(o))},bt=async()=>{if(!A)return;let o=Array.from(M.entries());M.clear();for(let[c,f]of o)try{let y=f.value,P=f.options.encoded||f.options.secure;if(f.options.encrypted){if(!w)throw new Error(`Encryption key missing for "${c}"`);y=await Ze(f.value,w)}else P?y=btoa(JSON.stringify(f.value)):typeof f.value=="object"&&f.value!==null&&(y=JSON.stringify(f.value));A.setItem(`${_e()}${c}`,JSON.stringify({v:r.get(c)||1,t:Date.now(),e:f.options.ttl?Date.now()+f.options.ttl:null,d:y,_sys_v:I,_enc:f.options.encrypted?!0:void 0,_b64:P?!0:void 0})),q("set",c,!0)}catch(y){let P=y instanceof Error?y:new Error(String(y));i?i(P,{operation:"persist",key:c}):m||console.error("[gState] Persist failed:",P)}},ee={},U={_setSilently:(o,c)=>{let f=n.get(o)||0,y=J&&c!==null&&typeof c=="object"?Ce(Je(c),!0):c,P=Xe(y);G=G-f+P,n.set(o,P),t.set(o,y),r.set(o,(r.get(o)||0)+1)},_registerMethod:(o,c,f)=>{if(f!==void 0){let b=o,k=c;ee[b]||(ee[b]={}),ee[b][k]=f;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let y=o,P=c;ee.core||(ee.core={}),ee.core[y]=P},set:(o,c,f={})=>{let y=t.get(o),P=J&&typeof c=="function"?St(y,c):c;if(_&&!tt(o))return m||console.warn(`[gState] Invalid key: ${o}`),!1;if(!fe(p,o,"write",N))return q("set",o,!1,"RBAC Denied"),m||console.error(`[gState] RBAC Denied for "${o}"`),!1;let b=_?ce(P):P,k=n.get(o)||0;Y("onBeforeSet",{key:o,value:b,store:U,version:r.get(o)||0});let B=J&&b!==null&&typeof b=="object"?Ce(Je(b),!0):b;if(!Ge(y,B)){let O=d>0||h>0?Xe(B):0;if(d>0&&O>d){let V=new Error(`Object size (${O} bytes) exceeds maxObjectSize (${d} bytes)`);i?i(V,{operation:"set",key:o}):m||console.warn(`[gState] ${V.message} for "${o}"`)}if(h>0){let V=G-k+O;if(V>h){let Pe=new Error(`Total store size (${V} bytes) exceeds limit (${h} bytes)`);i?i(Pe,{operation:"set"}):m||console.warn(`[gState] ${Pe.message}`)}}G=G-k+O,n.set(o,O),t.set(o,B),r.set(o,(r.get(o)||0)+1);let Q=!!(f.persist||e?.persistByDefault||e?.persistence||f.encrypted||f.encoded||f.secure||f.ttl);return Q&&(M.set(o,{value:B,options:{...f,persist:Q}}),Qe&&clearTimeout(Qe),Qe=setTimeout(bt,R)),Y("onSet",{key:o,value:B,store:U,version:r.get(o)}),q("set",o,!0),le(o),!0}return!1},get:o=>{if(!fe(p,o,"read",N))return q("get",o,!1,"RBAC Denied"),null;let c=t.get(o);return Y("onGet",{store:U,key:o,value:c}),q("get",o,!0),c},compute:(o,c)=>{try{return v.has(o)||(v.set(o,{selector:c,lastValue:null,deps:new Set}),wt(o)),v.get(o).lastValue}catch(f){let y=f instanceof Error?f:new Error(String(f));return i?i(y,{operation:"compute",key:o}):m||console.error(`[gState] Compute error for "${o}":`,f),null}},watch:(o,c)=>{x.has(o)||x.set(o,new Set);let f=x.get(o);return f.add(c),()=>{f.delete(c),f.size===0&&x.delete(o)}},remove:o=>{if(!fe(p,o,"delete",N))return q("delete",o,!1,"RBAC Denied"),!1;let c=t.get(o),f=t.delete(o);return f&&(G-=n.get(o)||0,n.delete(o),Y("onRemove",{store:U,key:o,value:c})),r.set(o,(r.get(o)||0)+1),A&&A.removeItem(`${_e()}${o}`),q("delete",o,!0),le(o),f},delete:o=>U.remove(o),deleteAll:()=>{if(Array.from(t.keys()).forEach(o=>U.remove(o)),A){let o=_e();for(let c=0;c<(A.length||0);c++){let f=A.key(c);f?.startsWith(o)&&(A.removeItem(f),c--)}}return G=0,n.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:o=>{g.add(o)},transaction:o=>{W=!0,Y("onTransaction",{store:U,key:"START"});try{o()}finally{W=!1,Y("onTransaction",{store:U,key:"END"}),Z&&(Z=!1,le())}},destroy:()=>{typeof window<"u"&&window.removeEventListener("beforeunload",vt),Y("onDestroy",{store:U}),s.clear(),l.clear(),x.clear(),v.clear(),a.clear(),u.clear(),t.clear(),n.clear(),G=0,p.clear(),S.clear()},_addPlugin:o=>{try{u.set(o.name,o),o.hooks?.onInstall?.({store:U})}catch(c){let f=c instanceof Error?c:new Error(String(c));i?i(f,{operation:"plugin:install",key:o.name}):m||console.error(`[gState] Failed to install plugin "${o.name}":`,c)}},_removePlugin:o=>{u.delete(o)},_subscribe:(o,c)=>{if(c){l.has(c)||l.set(c,new Set);let f=l.get(c);return f.add(o),()=>{f.delete(o),f.size===0&&l.delete(c)}}return s.add(o),()=>s.delete(o)},_getVersion:o=>r.get(o)??0,addAccessRule:(o,c)=>Re(p,o,c),hasPermission:(o,c,f)=>{if(p.size===0)return!0;for(let[y,P]of p){let b;if(typeof y=="function")b=y(o,f);else try{let k=D.get(y);k||(k=new RegExp(y),D.set(y,k)),b=k.test(o)}catch{continue}if(b)return P.includes(c)||P.includes("admin")}return!1},recordConsent:(o,c,f)=>Ie(S,o,c,f),hasConsent:(o,c)=>rt(S,o,c),getConsents:o=>ot(S,o),revokeConsent:(o,c)=>nt(S,o,c),exportUserData:o=>st(S,o),deleteUserData:o=>it(S,o),get plugins(){return ee},get isReady(){return Ee},whenReady:()=>Bt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(o=>{let c=U[o];c&&U._registerMethod("security",o,c)});let vt=()=>{M.size>0&&bt()};return typeof window<"u"&&window.addEventListener("beforeunload",vt),A?(async()=>{try{let c={},f=_e(),y=0;for(let b=0;b<(A.length||0);b++){let k=A.key(b);if(!k||!k.startsWith(f))continue;let B=A.getItem(k);if(B)try{let O=JSON.parse(B),Q=k.substring(f.length);if(y=Math.max(y,O._sys_v!==void 0?O._sys_v:O.v||0),O.e&&Date.now()>O.e){A.removeItem(k),b--;continue}let V=O.d;if(O._enc&&w)V=await Ye(V,w);else if(typeof V=="string"){if(O._b64)try{V=JSON.parse(atob(V))}catch{}else if(V.startsWith("{")||V.startsWith("["))try{V=JSON.parse(V)}catch{}}c[Q]=V,q("hydrate",Q,!0)}catch(O){q("hydrate",k,!1,String(O));let Q=O instanceof Error?O:new Error(String(O));i?i(Q,{operation:"hydration",key:k}):m||console.error(`[gState] Hydration failed for "${k}":`,O)}}let P=y<I&&e?.migrate?e.migrate(c,y):c;Object.entries(P).forEach(([b,k])=>{let B=J&&k!==null&&typeof k=="object"?Ce(Je(k),!0):k,O=Xe(B),Q=n.get(b)||0;G=G-Q+O,n.set(b,O),t.set(b,B),r.set(b,1)}),Ee=!0,Me(),le()}catch(c){Ee=!0,Me();let f=c instanceof Error?c:new Error(String(c));i?i(f,{operation:"hydration"}):m||console.error("[gState] Hydration failed:",f)}})():(Ee=!0,Me()),U};var Vr=(e,t)=>qe({...t,storage:e}),Ur=e=>qe({...e,storage:He.memory()}),$r=e=>{let t=He.session();return t?qe({...e,storage:t}):null};export{at as Security,He as StorageAdapters,Ur as createMemoryStore,$r as createSessionStore,qe as createStore,Vr as createStoreWithStorage};
1
+ var Kt=Object.defineProperty;var vt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Bt=(e,t)=>{for(var r in t)Kt(e,r,{get:t[r],enumerable:!0})};var Wt=vt((Dr,$t)=>{"use strict";var ht=Object.defineProperty,Qt=Object.getOwnPropertyDescriptor,Zt=Object.getOwnPropertyNames,Yt=Object.prototype.hasOwnProperty,er=(e,t)=>{for(var r in t)ht(e,r,{get:t[r],enumerable:!0})},tr=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Zt(t))!Yt.call(e,s)&&s!==r&&ht(e,s,{get:()=>t[s],enumerable:!(n=Qt(t,s))||n.enumerable});return e},rr=e=>tr(ht({},"__esModule",{value:!0}),e),Rt={};er(Rt,{Immer:()=>Tt,applyPatches:()=>Mr,castDraft:()=>_r,castImmutable:()=>Pr,createDraft:()=>Ar,current:()=>Ut,enableArrayMethods:()=>mr,enableMapSet:()=>Sr,enablePatches:()=>yr,finishDraft:()=>xr,freeze:()=>Le,immerable:()=>se,isDraft:()=>K,isDraftable:()=>L,nothing:()=>Fe,original:()=>or,produce:()=>wr,produceWithPatches:()=>br,setAutoFreeze:()=>Er,setUseStrictIteration:()=>Cr,setUseStrictShallowCopy:()=>vr});$t.exports=rr(Rt);var Fe=Symbol.for("immer-nothing"),se=Symbol.for("immer-draftable"),A=Symbol.for("immer-state");function V(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var F=Object,re=F.getPrototypeOf,he="constructor",Ee="prototype",ut="configurable",je="enumerable",Ie="writable",ye="value",K=e=>!!e&&!!e[A];function L(e){return e?kt(e)||ve(e)||!!e[se]||!!e[he]?.[se]||Ce(e)||Me(e):!1}var nr=F[Ee][he].toString(),Mt=new WeakMap;function kt(e){if(!e||!ie(e))return!1;let t=re(e);if(t===null||t===F[Ee])return!0;let r=F.hasOwnProperty.call(t,he)&&t[he];if(r===Object)return!0;if(!te(r))return!1;let n=Mt.get(r);return n===void 0&&(n=Function.toString.call(r),Mt.set(r,n)),n===nr}function or(e){return K(e)||V(15,e),e[A].t}function ae(e,t,r=!0){ne(e)===0?(r?Reflect.ownKeys(e):F.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,s)=>t(s,n,e))}function ne(e){let t=e[A];return t?t.r:ve(e)?1:Ce(e)?2:Me(e)?3:0}var de=(e,t,r=ne(e))=>r===2?e.has(t):F[Ee].hasOwnProperty.call(e,t),Q=(e,t,r=ne(e))=>r===2?e.get(t):e[t],ze=(e,t,r,n=ne(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function sr(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var ve=Array.isArray,Ce=e=>e instanceof Map,Me=e=>e instanceof Set,ie=e=>typeof e=="object",te=e=>typeof e=="function",lt=e=>typeof e=="boolean";function ir(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Dt=e=>ie(e)?e?.[A]:null,j=e=>e.e||e.t,ar=e=>{let t=Dt(e);return t?t.e??t.t:e},yt=e=>e.s?e.e:e.t;function ft(e,t){if(Ce(e))return new Map(e);if(Me(e))return new Set(e);if(ve(e))return Array[Ee].slice.call(e);let r=kt(e);if(t===!0||t==="class_only"&&!r){let n=F.getOwnPropertyDescriptors(e);delete n[A];let s=Reflect.ownKeys(n);for(let c=0;c<s.length;c++){let g=s[c],b=n[g];b[Ie]===!1&&(b[Ie]=!0,b[ut]=!0),(b.get||b.set)&&(n[g]={[ut]:!0,[Ie]:!0,[je]:b[je],[ye]:e[g]})}return F.create(re(e),n)}else{let n=re(e);if(n!==null&&r)return{...e};let s=F.create(n);return F.assign(s,e)}}function Le(e,t=!1){return Je(e)||K(e)||!L(e)||(ne(e)>1&&F.defineProperties(e,{set:De,add:De,clear:De,delete:De}),F.freeze(e),t&&ae(e,(r,n)=>{Le(n,!0)},!1)),e}function lr(){V(2)}var De={[ye]:lr};function Je(e){return e===null||!ie(e)?!0:F.isFrozen(e)}var Se="MapSet",Ve="Patches",pt="ArrayMethods",Te={};function oe(e){let t=Te[e];return t||V(0,e),t}var At=e=>!!Te[e];function St(e,t){Te[e]||(Te[e]=t)}var me,Ue=()=>me,cr=(e,t)=>({o:[],i:e,l:t,F:!0,m:0,P:new Set,T:new Set,I:At(Se)?oe(Se):void 0,E:At(pt)?oe(pt):void 0});function xt(e,t){t&&(e.x=oe(Ve),e.y=[],e.d=[],e.C=t)}function dt(e){gt(e),e.o.forEach(ur),e.o=null}function gt(e){e===me&&(me=e.i)}var _t=e=>me=cr(me,e);function ur(e){let t=e[A];t.r===0||t.r===1?t.b():t.g=!0}function Pt(e,t){t.m=t.o.length;let r=t.o[0];if(e!==void 0&&e!==r){r[A].s&&(dt(t),V(4)),L(e)&&(e=Ot(t,e));let{x:n}=t;n&&n.M(r[A].t,e,t)}else e=Ot(t,r);return fr(t,e,!0),dt(t),t.y&&t.C(t.y,t.d),e!==Fe?e:void 0}function Ot(e,t){if(Je(t))return t;let r=t[A];if(!r)return $e(t,e.P,e);if(!Ke(r,e))return t;if(!r.s)return r.t;if(!r.u){let{f:n}=r;if(n)for(;n.length>0;)n.pop()(e);zt(r,e)}return r.e}function fr(e,t,r=!1){!e.i&&e.l.h&&e.F&&Le(t,r)}function It(e){e.u=!0,e.a.m--}var Ke=(e,t)=>e.a===t,pr=[];function jt(e,t,r,n){let s=j(e),c=e.r;if(n!==void 0&&Q(s,n,c)===t){ze(s,n,r,c);return}if(!e.D){let b=e.D=new Map;ae(s,(w,l)=>{if(K(l)){let f=b.get(l)||[];f.push(w),b.set(l,f)}})}let g=e.D.get(t)??pr;for(let b of g)ze(s,b,r,c)}function dr(e,t,r){e.f.push(function(n){let s=t;if(!s||!Ke(s,n))return;n.I?.fixSetContents(s);let c=yt(s);jt(e,s.c??s,c,r),zt(s,n)})}function zt(e,t){if(e.s&&!e.u&&(e.r===3||e.r===1&&e.R||(e.n?.size??0)>0)){let{x:r}=t;if(r){let n=r.getPath(e);n&&r.O(e,n,t)}It(e)}}function Ne(e,t,r){let{a:n}=e;if(K(r)){let s=r[A];Ke(s,n)&&s.f.push(function(){ge(e);let c=yt(s);jt(e,r,c,t)})}else L(r)&&e.f.push(function(){let s=j(e);e.r===3?s.has(r)&&$e(r,n.P,n):Q(s,t,e.r)===r&&n.o.length>1&&(e.n.get(t)??!1)===!0&&e.e&&$e(Q(e.e,t,e.r),n.P,n)})}function $e(e,t,r){return!r.l.h&&r.m<1||K(e)||t.has(e)||!L(e)||Je(e)||(t.add(e),ae(e,(n,s)=>{if(K(s)){let c=s[A];if(Ke(c,r)){let g=yt(c);ze(e,n,g,e.r),It(c)}}else L(s)&&$e(s,t,r)})),e}function gr(e,t){let r=ve(e),n={r:r?1:0,a:t?t.a:Ue(),s:!1,u:!1,n:void 0,i:t,t:e,c:null,e:null,b:null,S:!1,f:void 0},s=n,c=We;r&&(s=[n],c=we);let{revoke:g,proxy:b}=Proxy.revocable(s,c);return n.c=b,n.b=g,[b,n]}var We={get(e,t){if(t===A)return e;let r=e.a.E,n=e.r===1&&typeof t=="string";if(n&&r?.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);let s=j(e);if(!de(s,t,e.r))return hr(e,s,t);let c=s[t];if(e.u||!L(c)||n&&e.operationMethod&&r?.isMutatingArrayMethod(e.operationMethod)&&ir(t))return c;if(c===ct(e.t,t)){ge(e);let g=e.r===1?+t:t,b=be(e.a,c,e,g);return e.e[g]=b}return c},has(e,t){return t in j(e)},ownKeys(e){return Reflect.ownKeys(j(e))},set(e,t,r){let n=Vt(j(e),t);if(n?.set)return n.set.call(e.c,r),!0;if(!e.s){let s=ct(j(e),t),c=s?.[A];if(c&&c.t===r)return e.e[t]=r,e.n.set(t,!1),!0;if(sr(r,s)&&(r!==void 0||de(e.t,t,e.r)))return!0;ge(e),q(e)}return e.e[t]===r&&(r!==void 0||t in e.e)||Number.isNaN(r)&&Number.isNaN(e.e[t])||(e.e[t]=r,e.n.set(t,!0),Ne(e,t,r)),!0},deleteProperty(e,t){return ge(e),ct(e.t,t)!==void 0||t in e.t?(e.n.set(t,!1),q(e)):e.n.delete(t),e.e&&delete e.e[t],!0},getOwnPropertyDescriptor(e,t){let r=j(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[Ie]:!0,[ut]:e.r!==1||t!=="length",[je]:n[je],[ye]:r[t]}},defineProperty(){V(11)},getPrototypeOf(e){return re(e.t)},setPrototypeOf(){V(12)}},we={};for(let e in We){let t=We[e];we[e]=function(){let r=arguments;return r[0]=r[0][0],t.apply(this,r)}}we.deleteProperty=function(e,t){return we.set.call(this,e,t,void 0)};we.set=function(e,t,r){return We.set.call(this,e[0],t,r,e[0])};function ct(e,t){let r=e[A];return(r?j(r):e)[t]}function hr(e,t,r){let n=Vt(t,r);return n?ye in n?n[ye]:n.get?.call(e.c):void 0}function Vt(e,t){if(!(t in e))return;let r=re(e);for(;r;){let n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=re(r)}}function q(e){e.s||(e.s=!0,e.i&&q(e.i))}function ge(e){e.e||(e.n=new Map,e.e=ft(e.t,e.a.l.A))}var Tt=class{constructor(e){this.h=!0,this.A=!1,this._=!1,this.produce=(t,r,n)=>{if(te(t)&&!te(r)){let c=r;r=t;let g=this;return function(b=c,...w){return g.produce(b,l=>r.call(this,l,...w))}}te(r)||V(6),n!==void 0&&!te(n)&&V(7);let s;if(L(t)){let c=_t(this),g=be(c,t,void 0),b=!0;try{s=r(g),b=!1}finally{b?dt(c):gt(c)}return xt(c,n),Pt(s,c)}else if(!t||!ie(t)){if(s=r(t),s===void 0&&(s=t),s===Fe&&(s=void 0),this.h&&Le(s,!0),n){let c=[],g=[];oe(Ve).M(t,s,{y:c,d:g}),n(c,g)}return s}else V(1,t)},this.produceWithPatches=(t,r)=>{if(te(t))return(c,...g)=>this.produceWithPatches(c,b=>t(b,...g));let n,s;return[this.produce(t,r,(c,g)=>{n=c,s=g}),n,s]},lt(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),lt(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),lt(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){L(e)||V(8),K(e)&&(e=Ut(e));let t=_t(this),r=be(t,e,void 0);return r[A].S=!0,gt(t),r}finishDraft(e,t){let r=e&&e[A];(!r||!r.S)&&V(9);let{a:n}=r;return xt(n,t),Pt(void 0,n)}setAutoFreeze(e){this.h=e}setUseStrictShallowCopy(e){this.A=e}setUseStrictIteration(e){this._=e}shouldUseStrictIteration(){return this._}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){let s=t[r];if(s.path.length===0&&s.op==="replace"){e=s.value;break}}r>-1&&(t=t.slice(r+1));let n=oe(Ve).N;return K(e)?n(e,t):this.produce(e,s=>n(s,t))}};function be(e,t,r,n){let[s,c]=Ce(t)?oe(Se).w(t,r):Me(t)?oe(Se).V(t,r):gr(t,r);return(r?.a??Ue()).o.push(s),c.f=r?.f??[],c.p=n,r&&n!==void 0?dr(r,c,n):c.f.push(function(g){g.I?.fixSetContents(c);let{x:b}=g;c.s&&b&&b.O(c,[],g)}),s}function Ut(e){return K(e)||V(10,e),Nt(e)}function Nt(e){if(!L(e)||Je(e))return e;let t=e[A],r,n=!0;if(t){if(!t.s)return t.t;t.u=!0,r=ft(e,t.a.l.A),n=t.a.l.shouldUseStrictIteration()}else r=ft(e,!0);return ae(r,(s,c)=>{ze(r,s,Nt(c))},n),t&&(t.u=!1),r}function yr(){function e(p,E=[]){if(p.p!==void 0){let M=p.i.e??p.i.t,y=Dt(Q(M,p.p)),R=Q(M,p.p);if(R===void 0||R!==p.c&&R!==p.t&&R!==p.e||y!=null&&y.t!==p.t)return null;let k=p.i.r===3,v;if(k){let i=p.i;v=Array.from(i.o.keys()).indexOf(p.p)}else v=p.p;if(!(k&&M.size>v||de(M,v)))return null;E.push(v)}if(p.i)return e(p.i,E);E.reverse();try{t(p.e,E)}catch{return null}return E}function t(p,E){let M=p;for(let y=0;y<E.length-1;y++){let R=E[y];if(M=Q(M,R),!ie(M)||M===null)throw new Error(`Cannot resolve path at '${E.join("/")}'`)}return M}let r="replace",n="add",s="remove";function c(p,E,M){if(p.a.T.has(p))return;p.a.T.add(p);let{y,d:R}=M;switch(p.r){case 0:case 2:return b(p,E,y,R);case 1:return g(p,E,y,R);case 3:return w(p,E,y,R)}}function g(p,E,M,y){let{t:R,n:k}=p,v=p.e;v.length<R.length&&([R,v]=[v,R],[M,y]=[y,M]);let i=p.R===!0;for(let d=0;d<R.length;d++){let S=v[d],C=R[d];if((i||k?.get(d.toString()))&&S!==C){let P=S?.[A];if(P&&P.s)continue;let z=E.concat([d]);M.push({op:r,path:z,value:I(S)}),y.push({op:r,path:z,value:I(C)})}}for(let d=R.length;d<v.length;d++){let S=E.concat([d]);M.push({op:n,path:S,value:I(v[d])})}for(let d=v.length-1;R.length<=d;--d){let S=E.concat([d]);y.push({op:s,path:S})}}function b(p,E,M,y){let{t:R,e:k,r:v}=p;ae(p.n,(i,d)=>{let S=Q(R,i,v),C=Q(k,i,v),P=d?de(R,i)?r:n:s;if(S===C&&P===r)return;let z=E.concat(i);M.push(P===s?{op:P,path:z}:{op:P,path:z,value:I(C)}),y.push(P===n?{op:s,path:z}:P===s?{op:n,path:z,value:I(S)}:{op:r,path:z,value:I(S)})})}function w(p,E,M,y){let{t:R,e:k}=p,v=0;R.forEach(i=>{if(!k.has(i)){let d=E.concat([v]);M.push({op:s,path:d,value:i}),y.unshift({op:n,path:d,value:i})}v++}),v=0,k.forEach(i=>{if(!R.has(i)){let d=E.concat([v]);M.push({op:n,path:d,value:i}),y.unshift({op:s,path:d,value:i})}v++})}function l(p,E,M){let{y,d:R}=M;y.push({op:r,path:[],value:E===Fe?void 0:E}),R.push({op:r,path:[],value:p})}function f(p,E){return E.forEach(M=>{let{path:y,op:R}=M,k=p;for(let S=0;S<y.length-1;S++){let C=ne(k),P=y[S];typeof P!="string"&&typeof P!="number"&&(P=""+P),(C===0||C===1)&&(P==="__proto__"||P===he)&&V(19),te(k)&&P===Ee&&V(19),k=Q(k,P),ie(k)||V(18,y.join("/"))}let v=ne(k),i=_(M.value),d=y[y.length-1];switch(R){case r:switch(v){case 2:return k.set(d,i);case 3:V(16);default:return k[d]=i}case n:switch(v){case 1:return d==="-"?k.push(i):k.splice(d,0,i);case 2:return k.set(d,i);case 3:return k.add(i);default:return k[d]=i}case s:switch(v){case 1:return k.splice(d,1);case 2:return k.delete(d);case 3:return k.delete(M.value);default:return delete k[d]}default:V(17,R)}}),p}function _(p){if(!L(p))return p;if(ve(p))return p.map(_);if(Ce(p))return new Map(Array.from(p.entries()).map(([M,y])=>[M,_(y)]));if(Me(p))return new Set(Array.from(p).map(_));let E=Object.create(re(p));for(let M in p)E[M]=_(p[M]);return de(p,se)&&(E[se]=p[se]),E}function I(p){return K(p)?_(p):p}St(Ve,{N:f,O:c,M:l,getPath:e})}function Sr(){class e extends Map{constructor(l,f){super(),this[A]={r:2,i:f,a:f?f.a:Ue(),s:!1,u:!1,e:void 0,n:void 0,t:l,c:this,S:!1,g:!1,f:[]}}get size(){return j(this[A]).size}has(l){return j(this[A]).has(l)}set(l,f){let _=this[A];return g(_),(!j(_).has(l)||j(_).get(l)!==f)&&(r(_),q(_),_.n.set(l,!0),_.e.set(l,f),_.n.set(l,!0),Ne(_,l,f)),this}delete(l){if(!this.has(l))return!1;let f=this[A];return g(f),r(f),q(f),f.t.has(l)?f.n.set(l,!1):f.n.delete(l),f.e.delete(l),!0}clear(){let l=this[A];g(l),j(l).size&&(r(l),q(l),l.n=new Map,ae(l.t,f=>{l.n.set(f,!1)}),l.e.clear())}forEach(l,f){let _=this[A];j(_).forEach((I,p,E)=>{l.call(f,this.get(p),p,this)})}get(l){let f=this[A];g(f);let _=j(f).get(l);if(f.u||!L(_)||_!==f.t.get(l))return _;let I=be(f.a,_,f,l);return r(f),f.e.set(l,I),I}keys(){return j(this[A]).keys()}values(){let l=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let f=l.next();return f.done?f:{done:!1,value:this.get(f.value)}}}}entries(){let l=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let f=l.next();if(f.done)return f;let _=this.get(f.value);return{done:!1,value:[f.value,_]}}}}[Symbol.iterator](){return this.entries()}}function t(w,l){let f=new e(w,l);return[f,f[A]]}function r(w){w.e||(w.n=new Map,w.e=new Map(w.t))}class n extends Set{constructor(l,f){super(),this[A]={r:3,i:f,a:f?f.a:Ue(),s:!1,u:!1,e:void 0,t:l,c:this,o:new Map,g:!1,S:!1,n:void 0,f:[]}}get size(){return j(this[A]).size}has(l){let f=this[A];return g(f),f.e?!!(f.e.has(l)||f.o.has(l)&&f.e.has(f.o.get(l))):f.t.has(l)}add(l){let f=this[A];return g(f),this.has(l)||(c(f),q(f),f.e.add(l),Ne(f,l,l)),this}delete(l){if(!this.has(l))return!1;let f=this[A];return g(f),c(f),q(f),f.e.delete(l)||(f.o.has(l)?f.e.delete(f.o.get(l)):!1)}clear(){let l=this[A];g(l),j(l).size&&(c(l),q(l),l.e.clear())}values(){let l=this[A];return g(l),c(l),l.e.values()}entries(){let l=this[A];return g(l),c(l),l.e.entries()}keys(){return this.values()}[Symbol.iterator](){return this.values()}forEach(l,f){let _=this.values(),I=_.next();for(;!I.done;)l.call(f,I.value,I.value,this),I=_.next()}}function s(w,l){let f=new n(w,l);return[f,f[A]]}function c(w){w.e||(w.e=new Set,w.t.forEach(l=>{if(L(l)){let f=be(w.a,l,w,l);w.o.set(l,f),w.e.add(f)}else w.e.add(l)}))}function g(w){w.g&&V(3,JSON.stringify(j(w)))}function b(w){if(w.r===3&&w.e){let l=new Set(w.e);w.e.clear(),l.forEach(f=>{w.e.add(ar(f))})}}St(Se,{w:t,V:s,fixSetContents:b})}function mr(){let e=new Set(["shift","unshift"]),t=new Set(["push","pop"]),r=new Set([...t,...e]),n=new Set(["reverse","sort"]),s=new Set([...r,...n,"splice"]),c=new Set(["find","findLast"]),g=new Set(["filter","slice","concat","flat",...c,"findIndex","findLastIndex","some","every","indexOf","lastIndexOf","includes","join","toString","toLocaleString"]);function b(i){return s.has(i)}function w(i){return g.has(i)}function l(i){return b(i)||w(i)}function f(i,d){i.operationMethod=d}function _(i){i.operationMethod=void 0}function I(i,d,S=!0){ge(i);let C=d();return q(i),S&&i.n.set("length",!0),C}function p(i){i.R=!0}function E(i,d){return i<0?Math.max(d+i,0):Math.min(i,d)}function M(i,d,S){for(let C=0;C<S.length;C++){let P=d+C;i.n.set(P,!0),Ne(i,P,S[C])}}function y(i,d,S){return I(i,()=>{let C=i.e.length,P=i.e[d](...S);return e.has(d)&&p(i),d==="push"&&S.length>0?M(i,C,S):d==="unshift"&&S.length>0&&M(i,0,S),r.has(d)?P:i.c})}function R(i,d,S){return I(i,()=>(i.e[d](...S),p(i),i.c),!1)}function k(i,d){return function(...S){let C=d;f(i,C);try{if(b(C)){if(r.has(C))return y(i,C,S);if(n.has(C))return R(i,C,S);if(C==="splice"){let P=I(i,()=>i.e.splice(...S));if(p(i),S.length>2){let z=E(S[0]??0,i.e.length);M(i,z,S.slice(2))}return P}}else return v(i,C,S)}finally{_(i)}}}function v(i,d,S){let C=j(i);if(d==="filter"){let P=S[0],z=[];for(let U=0;U<C.length;U++)P(C[U],U,C)&&z.push(i.c[U]);return z}if(c.has(d)){let P=S[0],z=d==="find",U=z?1:-1,B=z?0:C.length-1;for(let W=B;W>=0&&W<C.length;W+=U)if(P(C[W],W,C))return i.c[W];return}if(d==="slice"){let P=S[0]??0,z=S[1]??C.length,U=E(P,C.length),B=E(z,C.length),W=[];for(let Z=U;Z<B;Z++)W.push(i.c[Z]);return W}return C[d](...S)}St(pt,{createMethodInterceptor:k,isArrayOperationMethod:l,isMutatingArrayMethod:b})}var $=new Tt,wr=$.produce,br=$.produceWithPatches.bind($),Er=$.setAutoFreeze.bind($),vr=$.setUseStrictShallowCopy.bind($),Cr=$.setUseStrictIteration.bind($),Mr=$.applyPatches.bind($),Ar=$.createDraft.bind($),xr=$.finishDraft.bind($),_r=e=>e,Pr=e=>e});var Lt=vt((jr,Ft)=>{"use strict";Ft.exports=Wt()});var at={};Bt(at,{addAccessRule:()=>Re,decrypt:()=>Ye,deleteUserData:()=>it,encrypt:()=>Ze,exportKey:()=>Ht,exportUserData:()=>st,generateEncryptionKey:()=>Gt,getConsents:()=>ot,hasConsent:()=>rt,hasPermission:()=>pe,importKey:()=>qt,isAuditActive:()=>et,isCryptoAvailable:()=>Ct,logAudit:()=>fe,recordConsent:()=>ke,revokeConsent:()=>nt,sanitizeValue:()=>ue,setAuditLogger:()=>Xt,validateKey:()=>tt});var Ct=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Gt=async()=>{if(!Ct)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))}},qt=async(e,t)=>{let r=Uint8Array.from(atob(e),c=>c.charCodeAt(0)),n=Uint8Array.from(atob(t),c=>c.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:n}},Ze=async(e,t)=>{let r=new TextEncoder,n=r.encode(JSON.stringify(e)),s=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),c=new Uint8Array(t.iv.length+s.byteLength);return c.set(t.iv),c.set(new Uint8Array(s),t.iv.length),btoa(String.fromCharCode(...c))},Ye=async(e,t)=>{let r=Uint8Array.from(atob(e),g=>g.charCodeAt(0)),n=r.slice(0,12),s=r.slice(12),c=await crypto.subtle.decrypt({name:"AES-GCM",iv:n},t.key,s);return JSON.parse(new TextDecoder().decode(c))},Oe=null,Xt=e=>{Oe=e},et=()=>Oe!==null,fe=e=>{Oe&&Oe(e)},Re=(e,t,r)=>{e.set(t instanceof RegExp?t.source:t,r)},pe=(e,t,r,n)=>{if(e.size===0)return!0;for(let[s,c]of e){let g;if(typeof s=="function")g=s(t,n);else try{g=new RegExp(s).test(t)}catch{continue}if(g)return c.includes(r)||c.includes("admin")}return!1},ue=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[r,n]of Object.entries(e))t[r]=ue(n);return t}return e}return Array.isArray(e)?e.map(t=>ue(t)):e},tt=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,ke=(e,t,r,n)=>{let s={id:crypto.randomUUID(),purpose:r,granted:n,timestamp:Date.now()},c=e.get(t)||[];return c.push(s),e.set(t,c),fe({timestamp:Date.now(),action:"set",key:`consent:${r}`,userId:t,success:!0}),s},rt=(e,t,r)=>{let n=e.get(t);if(!n)return!1;for(let s=n.length-1;s>=0;s--){let c=n[s];if(c&&c.purpose===r)return c.granted}return!1},nt=(e,t,r)=>ke(e,t,r,!1),ot=(e,t)=>e.get(t)||[],st=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),it=(e,t)=>{let r=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:r}};var mt=null,Ae=null,Or=()=>{if(!mt)try{let e=Lt();mt=e.produce,Ae=e.freeze}catch(e){throw console.error("[gState] Immer not installed. Run: npm install immer"),e}},He={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,r)=>e.set(t,r),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},Be=e=>{if(e===null||typeof e!="object")return e;if(typeof structuredClone=="function")try{return structuredClone(e)}catch{}let t=new WeakMap,r=n=>{if(n===null||typeof n!="object"||typeof n=="function")return n;if(t.has(n))return t.get(n);if(n instanceof Date)return new Date(n.getTime());if(n instanceof RegExp)return new RegExp(n.source,n.flags);if(n instanceof Map){let g=new Map;return t.set(n,g),n.forEach((b,w)=>g.set(r(w),r(b))),g}if(n instanceof Set){let g=new Set;return t.set(n,g),n.forEach(b=>g.add(r(b))),g}let s=Array.isArray(n)?[]:Object.create(Object.getPrototypeOf(n));t.set(n,s);let c=[...Object.keys(n),...Object.getOwnPropertySymbols(n)];for(let g of c)s[g]=r(n[g]);return s};return r(e)},Ge=(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 s=0;s<e.length;s++)if(!Ge(e[s],t[s]))return!1;return!0}let r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let s of r)if(!n.includes(s)||!Ge(e[s],t[s]))return!1;return!0},qe=e=>{let t=new Map,r=new Map,n=new Map,s=new Set,c=new Map,g=new Set,b=new Map,w=new Map,l=new Map,f=new Map,_=new Map,I=new Map,p=new Map,E=new Map,M=e?.namespace||"gstate",y=e?.silent??!1,R=e?.debounceTime??150,k=e?.version??0,v=e?.storage||He.local(),i=e?.onError,d=e?.maxObjectSize??5*1024*1024,S=e?.maxTotalSize??50*1024*1024,C=e?.encryptionKey??null,P=e?.validateInput??!0,z=e?.auditEnabled??!0,U=e?.userId,B=e?.immer??!0;B&&Or(),e?.accessRules&&e.accessRules.forEach(o=>Re(p,o.pattern,o.permissions));let W=!1,Z=!1,xe=!1,G=0,Xe=null,_e,Jt=new Promise(o=>{_e=o}),Qe=o=>{if(o==null)return 0;let a=0,u=[o],h=new WeakSet;for(;u.length>0;){let x=u.pop();if(typeof x=="boolean")a+=4;else if(typeof x=="number")a+=8;else if(typeof x=="string")a+=x.length*2;else if(typeof x=="object"&&x!==null){let m=x;if(h.has(m))continue;if(h.add(m),Array.isArray(m))for(let O=0;O<m.length;O++)u.push(m[O]);else for(let O of Object.keys(m))a+=O.length*2,u.push(m[O])}}return a},le=()=>`${M}_`,Y=(o,a)=>{f.forEach(u=>{if(u.hooks?.[o])try{u.hooks[o](a)}catch(h){let x=h instanceof Error?h:new Error(String(h));i?i(x,{operation:`plugin:${u.name}:${o}`,key:a.key}):y||console.error(`[gState] Plugin "${u.name}" error:`,h)}})},H=(o,a,u,h)=>{z&&et()&&fe&&fe({timestamp:Date.now(),action:o,key:a,userId:U,success:u,error:h})},ce=o=>{if(o&&(l.get(o)?.forEach(a=>wt(a)),b.get(o)?.forEach(a=>{try{a(N.get(o))}catch(u){let h=u instanceof Error?u:new Error(String(u));i?i(h,{operation:"watcher",key:o}):y||console.error(`[gState] Watcher error for "${o}":`,u)}}),c.get(o)?.forEach(a=>{try{a()}catch(u){let h=u instanceof Error?u:new Error(String(u));i?i(h,{operation:"keyListener",key:o}):y||console.error(`[gState] Listener error for "${o}":`,u)}})),W){Z=!0;return}s.forEach(a=>{try{a()}catch(u){let h=u instanceof Error?u:new Error(String(u));i?i(h,{operation:"listener"}):y||console.error("[gState] Global listener error:",u)}})},wt=o=>{let a=w.get(o),u=new Set;if(!a)return;let h=m=>(u.add(m),w.has(m)?w.get(m).lastValue:N.get(m)),x=a.selector(h);a.deps.forEach(m=>{if(!u.has(m)){let O=l.get(m);O&&(O.delete(o),O.size===0&&l.delete(m))}}),u.forEach(m=>{a.deps.has(m)||(l.has(m)||l.set(m,new Set),l.get(m).add(o))}),a.deps=u,Ge(a.lastValue,x)||(a.lastValue=B&&x!==null&&typeof x=="object"?Ae(Be(x),!0):x,r.set(o,(r.get(o)||0)+1),ce(o))},bt=async()=>{if(!v)return;try{let a={};t.forEach((x,m)=>{a[m]=x});let u=a,h=e?.encoded;h?u=btoa(JSON.stringify(a)):u=JSON.stringify(a),v.setItem(le().replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:u,_sys_v:k,_b64:h?!0:void 0})),H("set","FULL_STATE",!0)}catch(a){let u=a instanceof Error?a:new Error(String(a));i?i(u,{operation:"persist",key:"FULL_STATE"}):y||console.error("[gState] Persist failed:",u)}let o=Array.from(_.entries());_.clear();for(let[a,u]of o)try{let h=u.value,x=u.options.encoded||u.options.secure;if(u.options.encrypted){if(!C)throw new Error(`Encryption key missing for "${a}"`);h=await Ze(u.value,C)}else x?h=btoa(JSON.stringify(u.value)):typeof u.value=="object"&&u.value!==null&&(h=JSON.stringify(u.value));v.setItem(`${le()}${a}`,JSON.stringify({v:r.get(a)||1,t:Date.now(),e:u.options.ttl?Date.now()+u.options.ttl:null,d:h,_sys_v:k,_enc:u.options.encrypted?!0:void 0,_b64:x?!0:void 0})),H("set",a,!0)}catch(h){let x=h instanceof Error?h:new Error(String(h));i?i(x,{operation:"persist",key:a}):y||console.error("[gState] Persist failed:",x)}},ee={},N={_setSilently:(o,a)=>{let u=n.get(o)||0,h=B&&a!==null&&typeof a=="object"?Ae(Be(a),!0):a,x=Qe(h);G=G-u+x,n.set(o,x),t.set(o,h),r.set(o,(r.get(o)||0)+1)},_registerMethod:(o,a,u)=>{if(u!==void 0){let m=o,O=a;ee[m]||(ee[m]={}),ee[m][O]=u;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let h=o,x=a;ee.core||(ee.core={}),ee.core[h]=x},set:(o,a,u={})=>{let h=t.get(o),x=B&&typeof a=="function"?mt(h,a):a;if(P&&!tt(o))return y||console.warn(`[gState] Invalid key: ${o}`),!1;if(!pe(p,o,"write",U))return H("set",o,!1,"RBAC Denied"),y||console.error(`[gState] RBAC Denied for "${o}"`),!1;let m=P?ue(x):x,O=n.get(o)||0;Y("onBeforeSet",{key:o,value:m,store:N,version:r.get(o)||0});let J=B&&m!==null&&typeof m=="object"?Ae(Be(m),!0):m;if(!Ge(h,J)){let D=d>0||S>0?Qe(J):0;if(d>0&&D>d){let T=new Error(`Object size (${D} bytes) exceeds maxObjectSize (${d} bytes)`);i?i(T,{operation:"set",key:o}):y||console.warn(`[gState] ${T.message} for "${o}"`)}if(S>0){let T=G-O+D;if(T>S){let Pe=new Error(`Total store size (${T} bytes) exceeds limit (${S} bytes)`);i?i(Pe,{operation:"set"}):y||console.warn(`[gState] ${Pe.message}`)}}G=G-O+D,n.set(o,D),t.set(o,J),r.set(o,(r.get(o)||0)+1);let X=u.persist===!0;return X&&(_.set(o,{value:J,options:{...u,persist:X,encoded:u.encoded||e?.encoded}}),Xe&&clearTimeout(Xe),Xe=setTimeout(bt,R)),Y("onSet",{key:o,value:J,store:N,version:r.get(o)}),H("set",o,!0),ce(o),!0}return!1},get:o=>{if(!pe(p,o,"read",U))return H("get",o,!1,"RBAC Denied"),null;let a=t.get(o);return Y("onGet",{store:N,key:o,value:a}),H("get",o,!0),a},compute:(o,a)=>{try{return w.has(o)||(w.set(o,{selector:a,lastValue:null,deps:new Set}),wt(o)),w.get(o).lastValue}catch(u){let h=u instanceof Error?u:new Error(String(u));return i?i(h,{operation:"compute",key:o}):y||console.error(`[gState] Compute error for "${o}":`,u),null}},watch:(o,a)=>{b.has(o)||b.set(o,new Set);let u=b.get(o);return u.add(a),()=>{u.delete(a),u.size===0&&b.delete(o)}},remove:o=>{if(!pe(p,o,"delete",U))return H("delete",o,!1,"RBAC Denied"),!1;let a=t.get(o),u=t.delete(o);return u&&(G-=n.get(o)||0,n.delete(o),Y("onRemove",{store:N,key:o,value:a})),r.set(o,(r.get(o)||0)+1),v&&v.removeItem(`${le()}${o}`),H("delete",o,!0),ce(o),u},delete:o=>N.remove(o),deleteAll:()=>{if(Array.from(t.keys()).forEach(o=>N.remove(o)),v){let o=le();for(let a=0;a<(v.length||0);a++){let u=v.key(a);u?.startsWith(o)&&(v.removeItem(u),a--)}}return G=0,n.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:o=>{g.add(o)},transaction:o=>{W=!0,Y("onTransaction",{store:N,key:"START"});try{o()}finally{W=!1,Y("onTransaction",{store:N,key:"END"}),Z&&(Z=!1,ce())}},destroy:()=>{typeof window<"u"&&window.removeEventListener("beforeunload",Et),Y("onDestroy",{store:N}),s.clear(),c.clear(),b.clear(),w.clear(),l.clear(),f.clear(),t.clear(),n.clear(),G=0,p.clear(),E.clear()},_addPlugin:o=>{try{f.set(o.name,o),o.hooks?.onInstall?.({store:N})}catch(a){let u=a instanceof Error?a:new Error(String(a));i?i(u,{operation:"plugin:install",key:o.name}):y||console.error(`[gState] Failed to install plugin "${o.name}":`,a)}},_removePlugin:o=>{f.delete(o)},_subscribe:(o,a)=>{if(a){c.has(a)||c.set(a,new Set);let u=c.get(a);return u.add(o),()=>{u.delete(o),u.size===0&&c.delete(a)}}return s.add(o),()=>s.delete(o)},_getVersion:o=>r.get(o)??0,addAccessRule:(o,a)=>Re(p,o,a),hasPermission:(o,a,u)=>{if(p.size===0)return!0;for(let[h,x]of p){let m;if(typeof h=="function")m=h(o,u);else try{let O=I.get(h);O||(O=new RegExp(h),I.set(h,O)),m=O.test(o)}catch{continue}if(m)return x.includes(a)||x.includes("admin")}return!1},recordConsent:(o,a,u)=>ke(E,o,a,u),hasConsent:(o,a)=>rt(E,o,a),getConsents:o=>ot(E,o),revokeConsent:(o,a)=>nt(E,o,a),exportUserData:o=>st(E,o),deleteUserData:o=>it(E,o),get plugins(){return ee},get isReady(){return xe},get namespace(){return M},get userId(){return U},whenReady:()=>Jt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(o=>{let a=N[o];a&&N._registerMethod("security",o,a)});let Et=()=>{_.size>0&&bt()};return typeof window<"u"&&window.addEventListener("beforeunload",Et),v?(async()=>{try{let a={},u=le(),h=0;for(let m=0;m<(v.length||0);m++){let O=v.key(m);if(!O||!O.startsWith(u))continue;let J=v.getItem(O);if(J)try{let D=JSON.parse(J),X=O.substring(u.length);if(h=Math.max(h,D._sys_v!==void 0?D._sys_v:D.v||0),D.e&&Date.now()>D.e){v.removeItem(O),m--;continue}let T=D.d;if(D._enc&&C)T=await Ye(T,C);else if(typeof T=="string"){if(D._b64)try{T=JSON.parse(atob(T))}catch{}else if(T.startsWith("{")||T.startsWith("["))try{T=JSON.parse(T)}catch{}}a[X]=T,H("hydrate",X,!0)}catch(D){H("hydrate",O,!1,String(D));let X=D instanceof Error?D:new Error(String(D));i?i(X,{operation:"hydration",key:O}):y||console.error(`[gState] Hydration failed for "${O}":`,D)}}let x=h<k&&e?.migrate?e.migrate(a,h):a;Object.entries(x).forEach(([m,O])=>{let J=B&&O!==null&&typeof O=="object"?Ae(Be(O),!0):O,D=Qe(J),X=n.get(m)||0;G=G-X+D,n.set(m,D),t.set(m,J),r.set(m,1)}),xe=!0,_e(),ce()}catch(a){xe=!0,_e();let u=a instanceof Error?a:new Error(String(a));i?i(u,{operation:"hydration"}):y||console.error("[gState] Hydration failed:",u)}})():(xe=!0,_e()),N};var Tr=(e,t)=>qe({...t,storage:e}),Ur=e=>qe({...e,storage:He.memory()}),Nr=e=>{let t=He.session();return t?qe({...e,storage:t}):null};export{at as Security,He as StorageAdapters,Ur as createMemoryStore,Nr as createSessionStore,qe as createStore,Tr as createStoreWithStorage};
package/core/types.d.ts CHANGED
@@ -73,6 +73,8 @@ export interface IStore<S extends Record<string, unknown> = Record<string, unkno
73
73
  deletedConsents: number;
74
74
  };
75
75
  readonly isReady: boolean;
76
+ readonly namespace: string;
77
+ readonly userId?: string;
76
78
  whenReady(): Promise<void>;
77
79
  readonly plugins: GStatePlugins;
78
80
  }
@@ -104,6 +106,7 @@ export interface StoreConfig<S extends Record<string, unknown> = Record<string,
104
106
  migrate?: (oldState: Record<string, unknown>, oldVersion: number) => S;
105
107
  persistByDefault?: boolean;
106
108
  persistence?: boolean;
109
+ persist?: boolean;
107
110
  onError?: (error: Error, context: {
108
111
  operation: string;
109
112
  key?: string;
@@ -114,6 +117,7 @@ export interface StoreConfig<S extends Record<string, unknown> = Record<string,
114
117
  auditEnabled?: boolean;
115
118
  userId?: string;
116
119
  validateInput?: boolean;
120
+ encoded?: boolean;
117
121
  accessRules?: Array<{
118
122
  pattern: string | ((key: string, userId?: string) => boolean);
119
123
  permissions: Permission[];
@@ -0,0 +1,41 @@
1
+ # 🌌 RGS Examples & Best Practices
2
+
3
+ This folder contains functional and reusable examples of **React Globo State (RGS)** implementation.
4
+
5
+ ## 🏁 Overview: FE vs BE Recommendations
6
+
7
+ | Example | Recommendation | Primary Use Case |
8
+ | :--- | :--- | :--- |
9
+ | **[Basic Counter](./basic-counter)** | **FE Only** | Local component state, UI toggles. |
10
+ | **[Global Theme](./global-theme)** | **FE Only** | Dark mode, Layout settings, Persistence. |
11
+ | **[Persistent Cart](./persistent-cart)** | **FE Preferred** | Shopping carts, Drafts, Offline-first apps. |
12
+ | **[Secure Auth](./secure-auth)** | **FE / BE** | Session management, Tokens, User metadata. |
13
+ | **[Undo/Redo Editor](./undo-redo-editor)** | **FE Only** | Rich text editors, Canvas tools, Form history. |
14
+ | **[RBAC Dashboard](./rbac-dashboard)** | **BE / Admin FE** | Permission-based UI, Secure Admin panels. |
15
+ | **[Async Data Fetch](./async-data-fetch)** | **FE Only** | API integration, Data hydration. |
16
+ | **[Security Practices](./security-best-practices)** | **BE / Core FE** | Encryption, Audit logs, GDPR compliance. |
17
+ | **[Big Data (IndexedDB)](./big-data-indexeddb)** | **FE Specific** | High-volume storage (GBs), Large payloads. |
18
+ | **[Stress Tests](./stress-tests)** | **Validation** | Performance benchmarking & profiling. |
19
+
20
+ ---
21
+
22
+ ## 🛡️ Security Guidelines
23
+
24
+ ### 1. Sensitive Data Handling
25
+ **CRITICAL:** Never hardcode actual sensitive data (Credit Cards, Passwords, API Keys) in your JavaScript/TypeScript files.
26
+ - **Frontend:** Collect from secure `<input type="password">` and pass to RGS at runtime.
27
+ - **Backend:** Retrieve from environment variables (`process.env`) or Secret Managers.
28
+
29
+ ### 2. Encryption
30
+ For PII (Personally Identifiable Information), always use the `encryptionKey` option in `StoreConfig`.
31
+ RGS will use the Web Crypto API (or Node Crypto) to perform **AES-256-GCM** encryption before writing to storage.
32
+
33
+ ### 3. XSS Defense
34
+ Enable `validateInput: true` in your store configuration to automatically sanitize strings. This is vital for any user-generated content displayed in the DOM.
35
+
36
+ ### 4. High-Volume Storage (IndexedDB)
37
+ If your application needs to store more than 10MB (the typical localStorage limit), use the **IndexedDB Plugin**. It allows storing Gigabytes of data asynchronously without blocking the main UI thread.
38
+
39
+ ## 🛠️ Testing Environment
40
+ All examples are validated using Jest in a `jsdom` environment.
41
+ Refer to `tests/jest/tests/examples_v.test.ts` for automated verify suites.
@@ -0,0 +1,12 @@
1
+ interface User {
2
+ id: number;
3
+ name: string;
4
+ email: string;
5
+ }
6
+ export declare const fetchUser: (args?: {
7
+ id: string;
8
+ }) => Promise<User>;
9
+ export declare const useUser: import("../../advanced").IStore<Record<string, import("../../core/types").AsyncState<User>>> & {
10
+ execute: () => Promise<void>;
11
+ };
12
+ export {};
@@ -0,0 +1,31 @@
1
+ import { createAsyncStore } from '../../index'
2
+
3
+ /**
4
+ * Async Data Loader Utility
5
+ * RECOMMENDED FOR: Frontend (FE)
6
+ */
7
+
8
+ interface User {
9
+ id: number
10
+ name: string
11
+ email: string
12
+ }
13
+
14
+ // Fixed: The fetcher should accept the same arguments passed to .execute() or .run()
15
+ export const fetchUser = async (args?: { id: string }) => {
16
+ if (!args?.id) throw new Error('ID is required')
17
+ const response = await fetch(`https://jsonplaceholder.typicode.com/users/${args.id}`)
18
+ if (!response.ok) throw new Error('User not found')
19
+ return response.json() as Promise<User>
20
+ }
21
+
22
+ export const useUser = createAsyncStore<User>(fetchUser as any, {
23
+ key: 'userData'
24
+ })
25
+
26
+ /**
27
+ * Usage in component:
28
+ *
29
+ * const [state, actions] = useUser()
30
+ * useEffect(() => { actions.execute({ id: '1' }) }, [])
31
+ */
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const CounterComponent: React.FC;
@@ -0,0 +1,22 @@
1
+ import React from 'react'
2
+ import { useCounter, increment, decrement } from './CounterStore'
3
+
4
+ /**
5
+ * Counter Component
6
+ * Demonstrates the "Magnetar" pattern where the store IS the hook.
7
+ */
8
+ export const CounterComponent: React.FC = () => {
9
+ // Subscribe to specific keys for fine-grained re-renders
10
+ const [count] = useCounter('count')
11
+ const [lastUpdated] = useCounter('lastUpdated')
12
+
13
+ return (
14
+ <div style={{ padding: '20px', border: '1px solid #ccc' }}>
15
+ <h2>Counter: {String(count)}</h2>
16
+ <p><small>Last updated: {String(lastUpdated)}</small></p>
17
+ <button onClick={increment}>+</button>
18
+ <button onClick={decrement}>-</button>
19
+ <button onClick={() => useCounter.set('count', 0)}>Reset</button>
20
+ </div>
21
+ )
22
+ }
@@ -0,0 +1,7 @@
1
+ export interface CounterState extends Record<string, unknown> {
2
+ count: number;
3
+ lastUpdated: string;
4
+ }
5
+ export declare const useCounter: import("../../advanced").IStore<CounterState> & (<K extends keyof CounterState>(key: K) => readonly [CounterState[K] | undefined, (val: CounterState[K] | ((draft: CounterState[K]) => CounterState[K]), options?: unknown) => boolean]);
6
+ export declare const increment: () => void;
7
+ export declare const decrement: () => void;
@@ -0,0 +1,27 @@
1
+ import { gstate } from '../../index'
2
+
3
+ export interface CounterState extends Record<string, unknown> {
4
+ count: number
5
+ lastUpdated: string
6
+ }
7
+
8
+ /**
9
+ * Basic Counter Store
10
+ * RECOMMENDED FOR: Frontend (FE)
11
+ */
12
+ export const useCounter = gstate<CounterState>({
13
+ count: 0,
14
+ lastUpdated: new Date().toISOString()
15
+ })
16
+
17
+ export const increment = () => {
18
+ const current = useCounter.get('count') || 0
19
+ useCounter.set('count', current + 1)
20
+ useCounter.set('lastUpdated', new Date().toISOString())
21
+ }
22
+
23
+ export const decrement = () => {
24
+ const current = useCounter.get('count') || 0
25
+ useCounter.set('count', current - 1)
26
+ useCounter.set('lastUpdated', new Date().toISOString())
27
+ }
@@ -0,0 +1,10 @@
1
+ export interface BigDataState extends Record<string, unknown> {
2
+ largeCollection: any[];
3
+ metaInfo: {
4
+ totalItems: number;
5
+ lastSync: number;
6
+ };
7
+ }
8
+ export declare const useBigData: import("../../advanced").IStore<BigDataState> & (<K extends keyof BigDataState>(key: K) => readonly [BigDataState[K] | undefined, (val: BigDataState[K] | ((draft: BigDataState[K]) => BigDataState[K]), options?: unknown) => boolean]);
9
+ export declare const populateData: (count?: number) => void;
10
+ export declare const clearBigData: () => Promise<void>;
@@ -0,0 +1,60 @@
1
+ import { gstate } from '../../index'
2
+ import { indexedDBPlugin } from '../../plugins/official/indexeddb.plugin'
3
+
4
+ /**
5
+ * Big Data Store using IndexedDB
6
+ * RECOMMENDED FOR: Frontend (FE)
7
+ *
8
+ * Demonstrates how to handle massive datasets (GBs) that would exceed
9
+ * the standard 5MB-10MB limit of localStorage.
10
+ */
11
+
12
+ export interface BigDataState extends Record<string, unknown> {
13
+ largeCollection: any[]
14
+ metaInfo: { totalItems: number, lastSync: number }
15
+ }
16
+
17
+ const initialState: BigDataState = {
18
+ largeCollection: [],
19
+ metaInfo: { totalItems: 0, lastSync: Date.now() }
20
+ }
21
+
22
+ // 1. Define the store
23
+ export const useBigData = gstate<BigDataState>(initialState, {
24
+ namespace: 'big-data-vault',
25
+ persist: false // Disable standard persistence to use IndexedDB exclusively
26
+ })
27
+
28
+ // 2. Add the IndexedDB Plugin
29
+ useBigData._addPlugin(indexedDBPlugin({
30
+ dbName: 'UserLargeStorage',
31
+ storeName: 'appStates'
32
+ }))
33
+
34
+ /**
35
+ * Action to simulate adding a large amount of data.
36
+ */
37
+ export const populateData = (count: number = 1000) => {
38
+ const data: Array<{ id: string, payload: string, timestamp: number }> = []
39
+ for (let i = 0; i < count; i++) {
40
+ data.push({
41
+ id: `item_${i}`,
42
+ payload: 'X'.repeat(1024), // 1KB per item
43
+ timestamp: Date.now()
44
+ })
45
+ }
46
+
47
+ useBigData.transaction(() => {
48
+ useBigData.set('largeCollection', data)
49
+ useBigData.set('metaInfo', { totalItems: count, lastSync: Date.now() })
50
+ })
51
+ }
52
+
53
+ /**
54
+ * Clear the database
55
+ */
56
+ export const clearBigData = async () => {
57
+ // Access plugin methods registered on the store
58
+ await (useBigData as any).plugins.indexedDB.clear()
59
+ useBigData.set('largeCollection', [])
60
+ }
@@ -0,0 +1,7 @@
1
+ export interface ThemeState extends Record<string, unknown> {
2
+ mode: 'light' | 'dark';
3
+ accent: string;
4
+ }
5
+ export declare const useTheme: import("../../advanced").IStore<ThemeState> & (<K extends keyof ThemeState>(key: K) => readonly [ThemeState[K] | undefined, (val: ThemeState[K] | ((draft: ThemeState[K]) => ThemeState[K]), options?: unknown) => boolean]);
6
+ export declare const initTheme: () => import("../../advanced").IStore<ThemeState> & (<K extends keyof ThemeState>(key: K) => readonly [ThemeState[K] | undefined, (val: ThemeState[K] | ((draft: ThemeState[K]) => ThemeState[K]), options?: unknown) => boolean]);
7
+ export declare const toggleTheme: () => void;
@@ -0,0 +1,32 @@
1
+ import { gstate, getStore } from '../../index'
2
+
3
+ // Define the shape of our theme state
4
+ export interface ThemeState extends Record<string, unknown> {
5
+ mode: 'light' | 'dark'
6
+ accent: string
7
+ }
8
+
9
+ /**
10
+ * Global Theme Manager
11
+ * RECOMMENDED FOR: Frontend (FE)
12
+ *
13
+ * Demonstrates global state using a dedicated store instance.
14
+ */
15
+ export const useTheme = gstate<ThemeState>({
16
+ mode: 'light',
17
+ accent: '#007bff'
18
+ }, {
19
+ namespace: 'theme-store',
20
+ persist: true
21
+ })
22
+
23
+ /**
24
+ * Helper to initialize the theme (useful for SSR or specific init logic)
25
+ */
26
+ export const initTheme = () => useTheme
27
+
28
+ // Reusable action to toggle theme
29
+ export const toggleTheme = () => {
30
+ const current = useTheme.get('mode')
31
+ useTheme.set('mode', current === 'light' ? 'dark' : 'light')
32
+ }
@@ -0,0 +1,19 @@
1
+ export interface AppState extends Record<string, unknown> {
2
+ userProfile: {
3
+ name: string;
4
+ preferences: any;
5
+ };
6
+ projects: Array<{
7
+ id: string;
8
+ content: string;
9
+ }>;
10
+ }
11
+ export declare const useHybridStore: import("../../advanced").IStore<AppState> & (<K extends keyof AppState>(key: K) => readonly [AppState[K] | undefined, (val: AppState[K] | ((draft: AppState[K]) => AppState[K]), options?: unknown) => boolean]);
12
+ export declare const syncNow: () => Promise<void>;
13
+ export declare const getSyncReport: () => {
14
+ lastSync: string;
15
+ count: any;
16
+ errors: any;
17
+ averageKeysPerSync: number;
18
+ };
19
+ export declare const updateName: (newName: string) => void;
@@ -0,0 +1,78 @@
1
+ import { gstate } from '../../index'
2
+ import { indexedDBPlugin } from '../../plugins/official/indexeddb.plugin'
3
+ import { cloudSyncPlugin, createMongoAdapter } from '../../plugins/official/cloud-sync.plugin'
4
+
5
+ /**
6
+ * Hybrid Cloud Sync Store
7
+ * RECOMMENDED FOR: Frontend (FE) with Cloud Backup
8
+ *
9
+ * Demonstrates a multi-layer storage strategy:
10
+ * 1. Cache: Memory (fast)
11
+ * 2. Persistent Local: IndexedDB (large capacity)
12
+ * 3. remote: MongoDB Cloud (On-demand/Scheduled backup)
13
+ */
14
+
15
+ export interface AppState extends Record<string, unknown> {
16
+ userProfile: { name: string; preferences: any }
17
+ projects: Array<{ id: string; content: string }>
18
+ }
19
+
20
+ const initialState: AppState = {
21
+ userProfile: { name: 'Dario', preferences: { theme: 'dark' } },
22
+ projects: []
23
+ }
24
+
25
+ // 1. Initialize the store
26
+ export const useHybridStore = gstate<AppState>(initialState, {
27
+ namespace: 'hybrid-app-vault',
28
+ persist: false // We use plugins for persistence
29
+ })
30
+
31
+ // 2. Add IndexedDB for local persistence (up to GBs)
32
+ useHybridStore._addPlugin(indexedDBPlugin({
33
+ dbName: 'LocalCacheDB'
34
+ }))
35
+
36
+ // 3. Add Cloud Sync for remote backup
37
+ // Configured to automatically sync every 5 minutes (300000ms)
38
+ useHybridStore._addPlugin(cloudSyncPlugin({
39
+ adapter: createMongoAdapter('https://api.mongodb.com/v1', 'YOUR_SECRET_API_KEY'),
40
+ autoSyncInterval: 300000,
41
+ onSync: (stats) => {
42
+ console.info(`[CloudSync] Success! Keys: ${stats.totalKeysSynced}, Total Bytes: ${stats.totalBytesSynced}`)
43
+ }
44
+ }))
45
+
46
+ /**
47
+ * Manual Trigger for Cloud Sync
48
+ */
49
+ export const syncNow = async () => {
50
+ const result = await (useHybridStore as any).plugins.cloudSync.sync()
51
+ if (result.status === 'success') {
52
+ alert(`Sync completed! ${result.stats.totalKeysSynced} items pushed to cloud.`)
53
+ } else if (result.status === 'no-change') {
54
+ console.log('No new changes to sync.')
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Get synchronization diagnostics
60
+ */
61
+ export const getSyncReport = () => {
62
+ const stats = (useHybridStore as any).plugins.cloudSync.getStats()
63
+ return {
64
+ lastSync: stats.lastSyncTimestamp ? new Date(stats.lastSyncTimestamp).toLocaleString() : 'Never',
65
+ count: stats.syncCount,
66
+ errors: stats.errors,
67
+ averageKeysPerSync: stats.syncCount > 0 ? stats.totalKeysSynced / stats.syncCount : 0
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Action to update profile
73
+ */
74
+ export const updateName = (newName: string) => {
75
+ useHybridStore.set('userProfile', (draft) => {
76
+ draft.name = newName
77
+ })
78
+ }
@@ -0,0 +1,13 @@
1
+ export interface CartItem {
2
+ id: string;
3
+ name: string;
4
+ price: number;
5
+ quantity: number;
6
+ }
7
+ export interface CartState extends Record<string, unknown> {
8
+ items: CartItem[];
9
+ coupon: string | null;
10
+ }
11
+ export declare const useCart: import("../../advanced").IStore<CartState> & (<K extends keyof CartState>(key: K) => readonly [CartState[K] | undefined, (val: CartState[K] | ((draft: CartState[K]) => CartState[K]), options?: unknown) => boolean]);
12
+ export declare const addToCart: (product: Omit<CartItem, "quantity">) => void;
13
+ export declare const getCartTotal: () => number;