@biglogic/rgs 3.0.1 → 3.2.0
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.
- package/README.md +14 -0
- package/advanced.js +1 -1
- package/index.js +1 -1
- package/package.json +26 -28
- package/rgs-extension.vsix +0 -0
- package/examples/README.md +0 -41
- package/examples/async-data-fetch/UserLoader.d.ts +0 -12
- package/examples/async-data-fetch/UserLoader.ts +0 -30
- package/examples/basic-counter/CounterComponent.d.ts +0 -2
- package/examples/basic-counter/CounterComponent.tsx +0 -22
- package/examples/basic-counter/CounterStore.d.ts +0 -7
- package/examples/basic-counter/CounterStore.ts +0 -25
- package/examples/big-data-indexeddb/BigDataStore.d.ts +0 -10
- package/examples/big-data-indexeddb/BigDataStore.ts +0 -60
- package/examples/global-theme/ThemeManager.d.ts +0 -7
- package/examples/global-theme/ThemeManager.ts +0 -32
- package/examples/hybrid-cloud-sync/HybridStore.d.ts +0 -19
- package/examples/hybrid-cloud-sync/HybridStore.ts +0 -78
- package/examples/persistent-cart/CartStore.d.ts +0 -13
- package/examples/persistent-cart/CartStore.ts +0 -41
- package/examples/rbac-dashboard/DashboardStore.d.ts +0 -47
- package/examples/rbac-dashboard/DashboardStore.ts +0 -46
- package/examples/secure-auth/AuthStore.d.ts +0 -14
- package/examples/secure-auth/AuthStore.ts +0 -36
- package/examples/security-best-practices/SecurityStore.d.ts +0 -22
- package/examples/security-best-practices/SecurityStore.ts +0 -75
- package/examples/stress-tests/StressStore.d.ts +0 -41
- package/examples/stress-tests/StressStore.ts +0 -61
- package/examples/super-easy/EasyStore.d.ts +0 -44
- package/examples/super-easy/EasyStore.ts +0 -61
- package/examples/undo-redo-editor/EditorStore.d.ts +0 -9
- package/examples/undo-redo-editor/EditorStore.ts +0 -28
- package/markdown/SUMMARY.md +0 -59
- package/markdown/api.md +0 -381
- package/markdown/chapters/01-philosophy.md +0 -54
- package/markdown/chapters/02-getting-started.md +0 -68
- package/markdown/chapters/03-the-magnetar-way.md +0 -69
- package/markdown/chapters/04-persistence-and-safety.md +0 -125
- package/markdown/chapters/05-plugin-sdk.md +0 -290
- package/markdown/chapters/05-plugins-and-extensibility.md +0 -190
- package/markdown/chapters/06-case-studies.md +0 -69
- package/markdown/chapters/07-faq.md +0 -53
- package/markdown/chapters/08-migration-guide.md +0 -253
- package/markdown/chapters/09-security-architecture.md +0 -40
package/README.md
CHANGED
|
@@ -47,6 +47,20 @@ We took the simplicity of **React Globo State (RGS)** and fused it with the arch
|
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
50
|
+
### Installation?
|
|
51
|
+
|
|
52
|
+
```shell
|
|
53
|
+
npm install @biglogic/rgs
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### Examples and guide
|
|
59
|
+
|
|
60
|
+
**[github.com/BigLogic-ca/rgs](https://github.com/BigLogic-ca/rgs)**
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
50
64
|
## 🏗️ Architecture
|
|
51
65
|
|
|
52
66
|
```mermaid
|
package/advanced.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var It=Object.defineProperty;var zt=(e,t)=>{for(var r in t)It(e,r,{get:t[r],enumerable:!0})};var mt=Symbol.for("immer-nothing"),ut=Symbol.for("immer-draftable"),b=Symbol.for("immer-state");function v(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var M=Object,W=M.getPrototypeOf,de="constructor",me="prototype",Ne="configurable",pe="enumerable",le="writable",q="value",z=e=>!!e&&!!e[b];function D(e){return e?St(e)||we(e)||!!e[ut]||!!e[de]?.[ut]||be(e)||Ee(e):!1}var Tt=M[me][de].toString(),lt=new WeakMap;function St(e){if(!e||!Ge(e))return!1;let t=W(e);if(t===null||t===M[me])return!0;let r=M.hasOwnProperty.call(t,de)&&t[de];if(r===Object)return!0;if(!L(r))return!1;let n=lt.get(r);return n===void 0&&(n=Function.toString.call(r),lt.set(r,n)),n===Tt}function Se(e,t,r=!0){Y(e)===0?(r?Reflect.ownKeys(e):M.keys(e)).forEach(s=>{t(s,e[s],e)}):e.forEach((n,s)=>t(s,n,e))}function Y(e){let t=e[b];return t?t.type_:we(e)?1:be(e)?2:Ee(e)?3:0}var ft=(e,t,r=Y(e))=>r===2?e.has(t):M[me].hasOwnProperty.call(e,t),Fe=(e,t,r=Y(e))=>r===2?e.get(t):e[t],_e=(e,t,r,n=Y(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function Vt(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var we=Array.isArray,be=e=>e instanceof Map,Ee=e=>e instanceof Set,Ge=e=>typeof e=="object",L=e=>typeof e=="function",Te=e=>typeof e=="boolean";function Nt(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var k=e=>e.copy_||e.base_;var He=e=>e.modified_?e.copy_:e.base_;function Ue(e,t){if(be(e))return new Map(e);if(Ee(e))return new Set(e);if(we(e))return Array[me].slice.call(e);let r=St(e);if(t===!0||t==="class_only"&&!r){let n=M.getOwnPropertyDescriptors(e);delete n[b];let s=Reflect.ownKeys(n);for(let a=0;a<s.length;a++){let f=s[a],_=n[f];_[le]===!1&&(_[le]=!0,_[Ne]=!0),(_.get||_.set)&&(n[f]={[Ne]:!0,[le]:!0,[pe]:_[pe],[q]:e[f]})}return M.create(W(e),n)}else{let n=W(e);if(n!==null&&r)return{...e};let s=M.create(n);return M.assign(s,e)}}function T(e,t=!1){return Ce(e)||z(e)||!D(e)||(Y(e)>1&&M.defineProperties(e,{set:ue,add:ue,clear:ue,delete:ue}),M.freeze(e),t&&Se(e,(r,n)=>{T(n,!0)},!1)),e}function Ft(){v(2)}var ue={[q]:Ft};function Ce(e){return e===null||!Ge(e)?!0:M.isFrozen(e)}var ge="MapSet",je="Patches",dt="ArrayMethods",wt={};function j(e){let t=wt[e];return t||v(0,e),t}var pt=e=>!!wt[e];var Q,bt=()=>Q,Ut=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:pt(ge)?j(ge):void 0,arrayMethodsPlugin_:pt(dt)?j(dt):void 0});function _t(e,t){t&&(e.patchPlugin_=j(je),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function $e(e){Le(e),e.drafts_.forEach(jt),e.drafts_=null}function Le(e){e===Q&&(Q=e.parent_)}var gt=e=>Q=Ut(Q,e);function jt(e){let t=e[b];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function ht(e,t){t.unfinalizedDrafts_=t.drafts_.length;let r=t.drafts_[0];if(e!==void 0&&e!==r){r[b].modified_&&($e(t),v(4)),D(e)&&(e=yt(t,e));let{patchPlugin_:s}=t;s&&s.generateReplacementPatches_(r[b].base_,e,t)}else e=yt(t,r);return $t(t,e,!0),$e(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==mt?e:void 0}function yt(e,t){if(Ce(t))return t;let r=t[b];if(!r)return he(t,e.handledSet_,e);if(!Pe(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){let{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);Pt(r,e)}return r.copy_}function $t(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&T(t,r)}function Et(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Pe=(e,t)=>e.scope_===t,Lt=[];function Ct(e,t,r,n){let s=k(e),a=e.type_;if(n!==void 0&&Fe(s,n,a)===t){_e(s,n,r,a);return}if(!e.draftLocations_){let _=e.draftLocations_=new Map;Se(s,(y,S)=>{if(z(S)){let x=_.get(S)||[];x.push(y),_.set(S,x)}})}let f=e.draftLocations_.get(t)??Lt;for(let _ of f)_e(s,_,r,a)}function Wt(e,t,r){e.callbacks_.push(function(s){let a=t;if(!a||!Pe(a,s))return;s.mapSetPlugin_?.fixSetContents(a);let f=He(a);Ct(e,a.draft_??a,f,r),Pt(a,s)})}function Pt(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let s=n.getPath(e);s&&n.generatePatches_(e,s,t)}Et(e)}}function Bt(e,t,r){let{scope_:n}=e;if(z(r)){let s=r[b];Pe(s,n)&&s.callbacks_.push(function(){fe(e);let f=He(s);Ct(e,r,f,t)})}else D(r)&&e.callbacks_.push(function(){let a=k(e);e.type_===3?a.has(r)&&he(r,n.handledSet_,n):Fe(a,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&he(Fe(e.copy_,t,e.type_),n.handledSet_,n)})}function he(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||z(e)||t.has(e)||!D(e)||Ce(e)||(t.add(e),Se(e,(n,s)=>{if(z(s)){let a=s[b];if(Pe(a,r)){let f=He(a);_e(e,n,f,e.type_),Et(a)}}else D(s)&&he(s,t,r)})),e}function Gt(e,t){let r=we(e),n={type_:r?1:0,scope_:t?t.scope_:bt(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},s=n,a=ye;r&&(s=[n],a=X);let{revoke:f,proxy:_}=Proxy.revocable(s,a);return n.draft_=_,n.revoke_=f,[_,n]}var ye={get(e,t){if(t===b)return e;let r=e.scope_.arrayMethodsPlugin_,n=e.type_===1&&typeof t=="string";if(n&&r?.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);let s=k(e);if(!ft(s,t,e.type_))return Ht(e,s,t);let a=s[t];if(e.finalized_||!D(a)||n&&e.operationMethod&&r?.isMutatingArrayMethod(e.operationMethod)&&Nt(t))return a;if(a===Ve(e.base_,t)){fe(e);let f=e.type_===1?+t:t,_=Be(e.scope_,a,e,f);return e.copy_[f]=_}return a},has(e,t){return t in k(e)},ownKeys(e){return Reflect.ownKeys(k(e))},set(e,t,r){let n=Mt(k(e),t);if(n?.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){let s=Ve(k(e),t),a=s?.[b];if(a&&a.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(Vt(r,s)&&(r!==void 0||ft(e.base_,t,e.type_)))return!0;fe(e),We(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),Bt(e,t,r)),!0},deleteProperty(e,t){return fe(e),Ve(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),We(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let r=k(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[le]:!0,[Ne]:e.type_!==1||t!=="length",[pe]:n[pe],[q]:r[t]}},defineProperty(){v(11)},getPrototypeOf(e){return W(e.base_)},setPrototypeOf(){v(12)}},X={};for(let e in ye){let t=ye[e];X[e]=function(){let r=arguments;return r[0]=r[0][0],t.apply(this,r)}}X.deleteProperty=function(e,t){return X.set.call(this,e,t,void 0)};X.set=function(e,t,r){return ye.set.call(this,e[0],t,r,e[0])};function Ve(e,t){let r=e[b];return(r?k(r):e)[t]}function Ht(e,t,r){let n=Mt(t,r);return n?q in n?n[q]:n.get?.call(e.draft_):void 0}function Mt(e,t){if(!(t in e))return;let r=W(e);for(;r;){let n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=W(r)}}function We(e){e.modified_||(e.modified_=!0,e.parent_&&We(e.parent_))}function fe(e){e.copy_||(e.assigned_=new Map,e.copy_=Ue(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Jt=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,r,n)=>{if(L(t)&&!L(r)){let a=r;r=t;let f=this;return function(y=a,...S){return f.produce(y,x=>r.call(this,x,...S))}}L(r)||v(6),n!==void 0&&!L(n)&&v(7);let s;if(D(t)){let a=gt(this),f=Be(a,t,void 0),_=!0;try{s=r(f),_=!1}finally{_?$e(a):Le(a)}return _t(a,n),ht(s,a)}else if(!t||!Ge(t)){if(s=r(t),s===void 0&&(s=t),s===mt&&(s=void 0),this.autoFreeze_&&T(s,!0),n){let a=[],f=[];j(je).generateReplacementPatches_(t,s,{patches_:a,inversePatches_:f}),n(a,f)}return s}else v(1,t)},this.produceWithPatches=(t,r)=>{if(L(t))return(f,..._)=>this.produceWithPatches(f,y=>t(y,..._));let n,s;return[this.produce(t,r,(f,_)=>{n=f,s=_}),n,s]},Te(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Te(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Te(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){D(e)||v(8),z(e)&&(e=Kt(e));let t=gt(this),r=Be(t,e,void 0);return r[b].isManual_=!0,Le(t),r}finishDraft(e,t){let r=e&&e[b];(!r||!r.isManual_)&&v(9);let{scope_:n}=r;return _t(n,t),ht(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}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=j(je).applyPatches_;return z(e)?n(e,t):this.produce(e,s=>n(s,t))}};function Be(e,t,r,n){let[s,a]=be(t)?j(ge).proxyMap_(t,r):Ee(t)?j(ge).proxySet_(t,r):Gt(t,r);return(r?.scope_??bt()).drafts_.push(s),a.callbacks_=r?.callbacks_??[],a.key_=n,r&&n!==void 0?Wt(r,a,n):a.callbacks_.push(function(y){y.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:S}=y;a.modified_&&S&&S.generatePatches_(a,[],y)}),s}function Kt(e){return z(e)||v(10,e),At(e)}function At(e){if(!D(e)||Ce(e))return e;let t=e[b],r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Ue(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Ue(e,!0);return Se(r,(s,a)=>{_e(r,s,At(a))},n),t&&(t.finalized_=!1),r}var qt=new Jt,vt=qt.produce;var rt={};zt(rt,{addAccessRule:()=>Ae,decrypt:()=>Ke,deleteUserData:()=>tt,encrypt:()=>Je,exportKey:()=>Xt,exportUserData:()=>et,generateEncryptionKey:()=>Qt,getConsents:()=>Ze,hasConsent:()=>Xe,hasPermission:()=>te,importKey:()=>Yt,isAuditActive:()=>qe,isCryptoAvailable:()=>xt,logAudit:()=>ee,recordConsent:()=>ve,revokeConsent:()=>Ye,sanitizeValue:()=>Z,setAuditLogger:()=>Zt,validateKey:()=>Qe});var xt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Qt=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}},Xt=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))}},Yt=async(e,t)=>{let r=Uint8Array.from(atob(e),a=>a.charCodeAt(0)),n=Uint8Array.from(atob(t),a=>a.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:n}},Je=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),a=new Uint8Array(t.iv.length+s.byteLength);return a.set(t.iv),a.set(new Uint8Array(s),t.iv.length),btoa(String.fromCharCode(...a))},Ke=async(e,t)=>{let r=Uint8Array.from(atob(e),f=>f.charCodeAt(0)),n=r.slice(0,12),s=r.slice(12),a=await crypto.subtle.decrypt({name:"AES-GCM",iv:n},t.key,s);return JSON.parse(new TextDecoder().decode(a))},Me=null,Zt=e=>{Me=e},qe=()=>Me!==null,ee=e=>{Me&&Me(e)},Ae=(e,t,r)=>{e.set(t instanceof RegExp?t.source:t,r)},te=(e,t,r,n)=>{if(e.size===0)return!0;for(let[s,a]of e){let f;if(typeof s=="function")f=s(t,n);else try{f=new RegExp(s).test(t)}catch{continue}if(f)return a.includes(r)||a.includes("admin")}return!1},Z=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]=Z(n);return t}return e}return Array.isArray(e)?e.map(t=>Z(t)):e},Qe=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,ve=(e,t,r,n)=>{let s={id:crypto.randomUUID(),purpose:r,granted:n,timestamp:Date.now()},a=e.get(t)||[];return a.push(s),e.set(t,a),ee({timestamp:Date.now(),action:"set",key:`consent:${r}`,userId:t,success:!0}),s},Xe=(e,t,r)=>{let n=e.get(t);if(!n)return!1;for(let s=n.length-1;s>=0;s--){let a=n[s];if(a&&a.purpose===r)return a.granted}return!1},Ye=(e,t,r)=>ve(e,t,r,!1),Ze=(e,t)=>e.get(t)||[],et=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),tt=(e,t)=>{let r=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:r}};var ne=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 f=new Map;return t.set(n,f),n.forEach((_,y)=>f.set(r(y),r(_))),f}if(n instanceof Set){let f=new Set;return t.set(n,f),n.forEach(_=>f.add(r(_))),f}let s=Array.isArray(n)?[]:Object.create(Object.getPrototypeOf(n));t.set(n,s);let a=[...Object.keys(n),...Object.getOwnPropertySymbols(n)];for(let f of a)s[f]=r(n[f]);return s};return r(e)},re=(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(!re(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=0;s<r.length;s++){let a=r[s];if(!(a in t)||!re(e[a],t[a]))return!1}return!0};var xe={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}}}},Oe=e=>{let t=new Map,r=new Map,n=new Map,s=new Set,a=new Map,f=new Set,_=new Map,y=new Map,S=new Map,x=new Map,B=new Map,Re=new Map,I=new Map,V=new Map,nt=e?.namespace||"gstate",E=e?.silent??!1,Ot=e?.debounceTime??150,ke=e?.version??0,C=e?.storage||xe.local(),g=e?.onError,oe=e?.maxObjectSize??5*1024*1024,se=e?.maxTotalSize??50*1024*1024,ie=e?.encryptionKey??null,ot=e?.validateInput??!0,Rt=e?.auditEnabled??!0,G=e?.userId,H=e?.immer??!0,kt=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(o=>Ae(I,o.pattern,o.permissions));let De=!1,Ie=!1,ae=!1,O=0,$=null,ce,Dt=new Promise(o=>{ce=o}),ze=o=>{if(o==null)return 0;let i=typeof o;if(i==="boolean")return 4;if(i==="number")return 8;if(i==="string")return o.length*2;if(i!=="object")return 0;let c=0,l=[o],p=new WeakSet;for(;l.length>0;){let u=l.pop();if(typeof u=="boolean")c+=4;else if(typeof u=="number")c+=8;else if(typeof u=="string")c+=u.length*2;else if(typeof u=="object"&&u!==null){let d=u;if(p.has(d))continue;if(p.add(d),Array.isArray(d))for(let h=0;h<d.length;h++)l.push(d[h]);else for(let h of Object.keys(d))c+=h.length*2,l.push(d[h])}}return c},J=()=>`${nt}_`,N=(o,i)=>{if(x.size!==0)for(let c of x.values()){let l=c.hooks?.[o];if(l)try{l(i)}catch(p){let u=p instanceof Error?p:new Error(String(p));g?g(u,{operation:`plugin:${c.name}:${o}`,key:i.key}):E||console.error(`[gState] Plugin "${c.name}" error:`,p)}}},R=(o,i,c,l)=>{Rt&&qe()&&ee&&ee({timestamp:Date.now(),action:o,key:i,userId:G,success:c,error:l})},K=o=>{if(o){let i=S.get(o);if(i)for(let p of i)st(p);let c=_.get(o);if(c){let p=w.get(o);for(let u of c)try{u(p)}catch(d){let h=d instanceof Error?d:new Error(String(d));g?g(h,{operation:"watcher",key:o}):E||console.error(`[gState] Watcher error for "${o}":`,d)}}let l=a.get(o);if(l)for(let p of l)try{p()}catch(u){let d=u instanceof Error?u:new Error(String(u));g?g(d,{operation:"keyListener",key:o}):E||console.error(`[gState] Listener error for "${o}":`,u)}}if(De){Ie=!0;return}for(let i of s)try{i()}catch(c){let l=c instanceof Error?c:new Error(String(c));g?g(l,{operation:"listener"}):E||console.error("[gState] Global listener error: ",c)}},st=o=>{let i=y.get(o),c=new Set;if(!i)return;let l=u=>(c.add(u),y.has(u)?y.get(u).lastValue:w.get(u)),p=i.selector(l);i.deps.forEach(u=>{if(!c.has(u)){let d=S.get(u);d&&(d.delete(o),d.size===0&&S.delete(u))}}),c.forEach(u=>{i.deps.has(u)||(S.has(u)||S.set(u,new Set),S.get(u).add(o))}),i.deps=c,re(i.lastValue,p)||(i.lastValue=H&&p!==null&&typeof p=="object"?T(ne(p),!0):p,r.set(o,(r.get(o)||0)+1),K(o))},it=async()=>{if(!C)return;try{let i={};t.forEach((p,u)=>{i[u]=p});let c,l=e?.encoded;l?c=btoa(JSON.stringify(i)):c=JSON.stringify(i),C.setItem(J().replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:c,_sys_v:ke,_b64:l?!0:void 0})),R("set","FULL_STATE",!0)}catch(i){let c=i instanceof Error?i:new Error(String(i));g?g(c,{operation:"persist",key:"FULL_STATE"}):E||console.error("[gState] Persist failed: ",c)}let o=Array.from(B.entries());B.clear();for(let[i,c]of o)try{let l=c.value,p=c.options.encoded||c.options.secure;if(c.options.encrypted){if(!ie)throw new Error(`Encryption key missing for "${i}"`);l=await Je(c.value,ie)}else p?l=btoa(JSON.stringify(c.value)):typeof c.value=="object"&&c.value!==null&&(l=JSON.stringify(c.value));C.setItem(`${J()}${i} `,JSON.stringify({v:r.get(i)||1,t:Date.now(),e:c.options.ttl?Date.now()+c.options.ttl:null,d:l,_sys_v:ke,_enc:c.options.encrypted?!0:void 0,_b64:p?!0:void 0})),R("set",i,!0)}catch(l){let p=l instanceof Error?l:new Error(String(l));g?g(p,{operation:"persist",key:i}):E||console.error("[gState] Persist failed: ",p)}},F={},w={_setSilently:(o,i)=>{let c=n.get(o)||0,l=H&&i!==null&&typeof i=="object"?T(ne(i),!0):i,p=ze(l);O=O-c+p,n.set(o,p),t.set(o,l),r.set(o,(r.get(o)||0)+1)},_registerMethod:(o,i,c)=>{if(c!==void 0){let u=o,d=i;F[u]||(F[u]={}),F[u][d]=c;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let l=o,p=i;F.core||(F.core={}),F.core[l]=p},set:(o,i,c={})=>{let l=t.get(o),p=H&&typeof i=="function"?vt(l,i):i;if(ot&&!Qe(o))return E||console.warn(`[gState] Invalid key: ${o}`),!1;if(!te(I,o,"write",G))return R("set",o,!1,"RBAC Denied"),E||console.error(`[gState] RBAC Denied for "${o}"`),!1;let u=ot?Z(p):p,d=n.get(o)||0;N("onBeforeSet",{key:o,value:u,store:w,version:r.get(o)||0});let h=H&&u!==null&&typeof u=="object"?T(ne(u),!0):u;if(!re(l,h)){let A=oe>0||se>0?ze(h):0;if(oe>0&&A>oe){let U=new Error(`Object size (${A} bytes) exceeds maxObjectSize (${oe} bytes)`);g?g(U,{operation:"set",key:o}):E||console.warn(`[gState] ${U.message} for "${o}"`)}if(se>0){let U=O-d+A;if(U>se){let ct=new Error(`Total store size (${U} bytes) exceeds limit (${se} bytes)`);g?g(ct,{operation:"set"}):E||console.warn(`[gState] ${ct.message}`)}}O=O-d+A,n.set(o,A),t.set(o,h),r.set(o,(r.get(o)||0)+1);let P=c.persist??kt;return P&&(B.set(o,{value:h,options:{...c,persist:P,encoded:c.encoded||e?.encoded}}),$&&clearTimeout($),$=setTimeout(it,Ot)),N("onSet",{key:o,value:h,store:w,version:r.get(o)}),R("set",o,!0),K(o),!0}return!1},get:o=>{if(!te(I,o,"read",G))return R("get",o,!1,"RBAC Denied"),null;let i=t.get(o);return N("onGet",{store:w,key:o,value:i}),R("get",o,!0),i},compute:(o,i)=>{try{return y.has(o)||(y.set(o,{selector:i,lastValue:null,deps:new Set}),st(o)),y.get(o).lastValue}catch(c){let l=c instanceof Error?c:new Error(String(c));return g?g(l,{operation:"compute",key:o}):E||console.error(`[gState] Compute error for "${o}": `,c),null}},watch:(o,i)=>{_.has(o)||_.set(o,new Set);let c=_.get(o);return c.add(i),()=>{c.delete(i),c.size===0&&_.delete(o)}},remove:o=>{if(!te(I,o,"delete",G))return R("delete",o,!1,"RBAC Denied"),!1;let i=t.get(o),c=t.delete(o);return c&&(O-=n.get(o)||0,n.delete(o),N("onRemove",{store:w,key:o,value:i})),r.set(o,(r.get(o)||0)+1),C&&C.removeItem(`${J()}${o} `),R("delete",o,!0),K(o),c},delete:o=>w.remove(o),deleteAll:()=>{if(Array.from(t.keys()).forEach(o=>w.remove(o)),C){let o=J();for(let i=0;i<(C.length||0);i++){let c=C.key(i);c?.startsWith(o)&&(C.removeItem(c),i--)}}return O=0,n.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:o=>{f.add(o)},transaction:o=>{De=!0,N("onTransaction",{store:w,key:"START"});try{o()}finally{De=!1,N("onTransaction",{store:w,key:"END"}),Ie&&(Ie=!1,K())}},destroy:()=>{$&&(clearTimeout($),$=null),B.clear(),typeof window<"u"&&window.removeEventListener("beforeunload",at),N("onDestroy",{store:w}),s.clear(),a.clear(),_.clear(),y.clear(),S.clear(),x.clear(),t.clear(),n.clear(),O=0,I.clear(),V.clear(),r.clear(),Re.clear(),f.clear()},_addPlugin:o=>{try{x.set(o.name,o),o.hooks?.onInstall?.({store:w})}catch(i){let c=i instanceof Error?i:new Error(String(i));g?g(c,{operation:"plugin:install",key:o.name}):E||console.error(`[gState] Failed to install plugin "${o.name}": `,i)}},_removePlugin:o=>{x.delete(o)},_subscribe:(o,i)=>{if(i){a.has(i)||a.set(i,new Set);let c=a.get(i);return c.add(o),()=>{c.delete(o),c.size===0&&a.delete(i)}}return s.add(o),()=>s.delete(o)},_getVersion:o=>r.get(o)??0,addAccessRule:(o,i)=>Ae(I,o,i),hasPermission:(o,i,c)=>{if(I.size===0)return!0;for(let[l,p]of I){let u;if(typeof l=="function")u=l(o,c);else try{let d=Re.get(l);d||(d=new RegExp(l),Re.set(l,d)),u=d.test(o)}catch{continue}if(u)return p.includes(i)||p.includes("admin")}return!1},recordConsent:(o,i,c)=>ve(V,o,i,c),hasConsent:(o,i)=>Xe(V,o,i),getConsents:o=>Ze(V,o),revokeConsent:(o,i)=>Ye(V,o,i),exportUserData:o=>et(V,o),deleteUserData:o=>tt(V,o),get plugins(){return F},get isReady(){return ae},get namespace(){return nt},get userId(){return G},whenReady:()=>Dt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(o=>{let i=w[o];i&&w._registerMethod("security",o,i)});let at=()=>{B.size>0&&it()};return typeof window<"u"&&window.addEventListener("beforeunload",at),C?(async()=>{try{let i={},c=J(),l=0;for(let u=0;u<(C.length||0);u++){let d=C.key(u);if(!d||!d.startsWith(c))continue;let h=C.getItem(d);if(h)try{let m=JSON.parse(h),A=d.substring(c.length);if(l=Math.max(l,m._sys_v!==void 0?m._sys_v:m.v||0),m.e&&Date.now()>m.e){C.removeItem(d),u--;continue}let P=m.d;if(m._enc&&ie)P=await Ke(P,ie);else if(typeof P=="string"){if(m._b64)try{P=JSON.parse(atob(P))}catch{}else if(P.startsWith("{")||P.startsWith("["))try{P=JSON.parse(P)}catch{}}i[A]=P,R("hydrate",A,!0)}catch(m){R("hydrate",d,!1,String(m));let A=m instanceof Error?m:new Error(String(m));g?g(A,{operation:"hydration",key:d}):E||console.error(`[gState] Hydration failed for "${d}": `,m)}}let p=l<ke&&e?.migrate?e.migrate(i,l):i;Object.entries(p).forEach(([u,d])=>{let h=H&&d!==null&&typeof d=="object"?T(ne(d),!0):d,m=ze(h),A=n.get(u)||0;O=O-A+m,n.set(u,m),t.set(u,h),r.set(u,1)}),ae=!0,ce(),K()}catch(i){ae=!0,ce();let c=i instanceof Error?i:new Error(String(i));g?g(c,{operation:"hydration"}):E||console.error("[gState] Hydration failed: ",c)}})():(ae=!0,ce()),w};var ur=(e,t)=>Oe({...t,storage:e}),lr=e=>Oe({...e,storage:xe.memory()}),fr=e=>{let t=xe.session();return t?Oe({...e,storage:t}):null};export{rt as Security,xe as StorageAdapters,lr as createMemoryStore,fr as createSessionStore,Oe as createStore,ur as createStoreWithStorage};
|
|
1
|
+
var It=Object.defineProperty;var zt=(e,t)=>{for(var r in t)It(e,r,{get:t[r],enumerable:!0})};var mt=Symbol.for("immer-nothing"),ut=Symbol.for("immer-draftable"),b=Symbol.for("immer-state");function v(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var M=Object,W=M.getPrototypeOf,de="constructor",me="prototype",Ne="configurable",pe="enumerable",fe="writable",q="value",z=e=>!!e&&!!e[b];function D(e){return e?St(e)||we(e)||!!e[ut]||!!e[de]?.[ut]||be(e)||Ee(e):!1}var Tt=M[me][de].toString(),ft=new WeakMap;function St(e){if(!e||!Ge(e))return!1;let t=W(e);if(t===null||t===M[me])return!0;let r=M.hasOwnProperty.call(t,de)&&t[de];if(r===Object)return!0;if(!L(r))return!1;let n=ft.get(r);return n===void 0&&(n=Function.toString.call(r),ft.set(r,n)),n===Tt}function Se(e,t,r=!0){Y(e)===0?(r?Reflect.ownKeys(e):M.keys(e)).forEach(s=>{t(s,e[s],e)}):e.forEach((n,s)=>t(s,n,e))}function Y(e){let t=e[b];return t?t.type_:we(e)?1:be(e)?2:Ee(e)?3:0}var lt=(e,t,r=Y(e))=>r===2?e.has(t):M[me].hasOwnProperty.call(e,t),Fe=(e,t,r=Y(e))=>r===2?e.get(t):e[t],_e=(e,t,r,n=Y(e))=>{n===2?e.set(t,r):n===3?e.add(r):e[t]=r};function Vt(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var we=Array.isArray,be=e=>e instanceof Map,Ee=e=>e instanceof Set,Ge=e=>typeof e=="object",L=e=>typeof e=="function",Te=e=>typeof e=="boolean";function Nt(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var k=e=>e.copy_||e.base_;var He=e=>e.modified_?e.copy_:e.base_;function Ue(e,t){if(be(e))return new Map(e);if(Ee(e))return new Set(e);if(we(e))return Array[me].slice.call(e);let r=St(e);if(t===!0||t==="class_only"&&!r){let n=M.getOwnPropertyDescriptors(e);delete n[b];let s=Reflect.ownKeys(n);for(let i=0;i<s.length;i++){let d=s[i],_=n[d];_[fe]===!1&&(_[fe]=!0,_[Ne]=!0),(_.get||_.set)&&(n[d]={[Ne]:!0,[fe]:!0,[pe]:_[pe],[q]:e[d]})}return M.create(W(e),n)}else{let n=W(e);if(n!==null&&r)return{...e};let s=M.create(n);return M.assign(s,e)}}function T(e,t=!1){return Ce(e)||z(e)||!D(e)||(Y(e)>1&&M.defineProperties(e,{set:ue,add:ue,clear:ue,delete:ue}),M.freeze(e),t&&Se(e,(r,n)=>{T(n,!0)},!1)),e}function Ft(){v(2)}var ue={[q]:Ft};function Ce(e){return e===null||!Ge(e)?!0:M.isFrozen(e)}var he="MapSet",je="Patches",dt="ArrayMethods",wt={};function j(e){let t=wt[e];return t||v(0,e),t}var pt=e=>!!wt[e];var Q,bt=()=>Q,Ut=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:pt(he)?j(he):void 0,arrayMethodsPlugin_:pt(dt)?j(dt):void 0});function _t(e,t){t&&(e.patchPlugin_=j(je),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function $e(e){Le(e),e.drafts_.forEach(jt),e.drafts_=null}function Le(e){e===Q&&(Q=e.parent_)}var ht=e=>Q=Ut(Q,e);function jt(e){let t=e[b];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function gt(e,t){t.unfinalizedDrafts_=t.drafts_.length;let r=t.drafts_[0];if(e!==void 0&&e!==r){r[b].modified_&&($e(t),v(4)),D(e)&&(e=yt(t,e));let{patchPlugin_:s}=t;s&&s.generateReplacementPatches_(r[b].base_,e,t)}else e=yt(t,r);return $t(t,e,!0),$e(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==mt?e:void 0}function yt(e,t){if(Ce(t))return t;let r=t[b];if(!r)return ge(t,e.handledSet_,e);if(!Pe(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){let{callbacks_:n}=r;if(n)for(;n.length>0;)n.pop()(e);Pt(r,e)}return r.copy_}function $t(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&T(t,r)}function Et(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Pe=(e,t)=>e.scope_===t,Lt=[];function Ct(e,t,r,n){let s=k(e),i=e.type_;if(n!==void 0&&Fe(s,n,i)===t){_e(s,n,r,i);return}if(!e.draftLocations_){let _=e.draftLocations_=new Map;Se(s,(y,S)=>{if(z(S)){let x=_.get(S)||[];x.push(y),_.set(S,x)}})}let d=e.draftLocations_.get(t)??Lt;for(let _ of d)_e(s,_,r,i)}function Wt(e,t,r){e.callbacks_.push(function(s){let i=t;if(!i||!Pe(i,s))return;s.mapSetPlugin_?.fixSetContents(i);let d=He(i);Ct(e,i.draft_??i,d,r),Pt(i,s)})}function Pt(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let s=n.getPath(e);s&&n.generatePatches_(e,s,t)}Et(e)}}function Bt(e,t,r){let{scope_:n}=e;if(z(r)){let s=r[b];Pe(s,n)&&s.callbacks_.push(function(){le(e);let d=He(s);Ct(e,r,d,t)})}else D(r)&&e.callbacks_.push(function(){let i=k(e);e.type_===3?i.has(r)&&ge(r,n.handledSet_,n):Fe(i,t,e.type_)===r&&n.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&ge(Fe(e.copy_,t,e.type_),n.handledSet_,n)})}function ge(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||z(e)||t.has(e)||!D(e)||Ce(e)||(t.add(e),Se(e,(n,s)=>{if(z(s)){let i=s[b];if(Pe(i,r)){let d=He(i);_e(e,n,d,e.type_),Et(i)}}else D(s)&&ge(s,t,r)})),e}function Gt(e,t){let r=we(e),n={type_:r?1:0,scope_:t?t.scope_:bt(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},s=n,i=ye;r&&(s=[n],i=X);let{revoke:d,proxy:_}=Proxy.revocable(s,i);return n.draft_=_,n.revoke_=d,[_,n]}var ye={get(e,t){if(t===b)return e;let r=e.scope_.arrayMethodsPlugin_,n=e.type_===1&&typeof t=="string";if(n&&r?.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);let s=k(e);if(!lt(s,t,e.type_))return Ht(e,s,t);let i=s[t];if(e.finalized_||!D(i)||n&&e.operationMethod&&r?.isMutatingArrayMethod(e.operationMethod)&&Nt(t))return i;if(i===Ve(e.base_,t)){le(e);let d=e.type_===1?+t:t,_=Be(e.scope_,i,e,d);return e.copy_[d]=_}return i},has(e,t){return t in k(e)},ownKeys(e){return Reflect.ownKeys(k(e))},set(e,t,r){let n=Mt(k(e),t);if(n?.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){let s=Ve(k(e),t),i=s?.[b];if(i&&i.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(Vt(r,s)&&(r!==void 0||lt(e.base_,t,e.type_)))return!0;le(e),We(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),Bt(e,t,r)),!0},deleteProperty(e,t){return le(e),Ve(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),We(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let r=k(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{[fe]:!0,[Ne]:e.type_!==1||t!=="length",[pe]:n[pe],[q]:r[t]}},defineProperty(){v(11)},getPrototypeOf(e){return W(e.base_)},setPrototypeOf(){v(12)}},X={};for(let e in ye){let t=ye[e];X[e]=function(){let r=arguments;return r[0]=r[0][0],t.apply(this,r)}}X.deleteProperty=function(e,t){return X.set.call(this,e,t,void 0)};X.set=function(e,t,r){return ye.set.call(this,e[0],t,r,e[0])};function Ve(e,t){let r=e[b];return(r?k(r):e)[t]}function Ht(e,t,r){let n=Mt(t,r);return n?q in n?n[q]:n.get?.call(e.draft_):void 0}function Mt(e,t){if(!(t in e))return;let r=W(e);for(;r;){let n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=W(r)}}function We(e){e.modified_||(e.modified_=!0,e.parent_&&We(e.parent_))}function le(e){e.copy_||(e.assigned_=new Map,e.copy_=Ue(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Jt=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,r,n)=>{if(L(t)&&!L(r)){let i=r;r=t;let d=this;return function(y=i,...S){return d.produce(y,x=>r.call(this,x,...S))}}L(r)||v(6),n!==void 0&&!L(n)&&v(7);let s;if(D(t)){let i=ht(this),d=Be(i,t,void 0),_=!0;try{s=r(d),_=!1}finally{_?$e(i):Le(i)}return _t(i,n),gt(s,i)}else if(!t||!Ge(t)){if(s=r(t),s===void 0&&(s=t),s===mt&&(s=void 0),this.autoFreeze_&&T(s,!0),n){let i=[],d=[];j(je).generateReplacementPatches_(t,s,{patches_:i,inversePatches_:d}),n(i,d)}return s}else v(1,t)},this.produceWithPatches=(t,r)=>{if(L(t))return(d,..._)=>this.produceWithPatches(d,y=>t(y,..._));let n,s;return[this.produce(t,r,(d,_)=>{n=d,s=_}),n,s]},Te(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Te(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Te(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){D(e)||v(8),z(e)&&(e=Kt(e));let t=ht(this),r=Be(t,e,void 0);return r[b].isManual_=!0,Le(t),r}finishDraft(e,t){let r=e&&e[b];(!r||!r.isManual_)&&v(9);let{scope_:n}=r;return _t(n,t),gt(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}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=j(je).applyPatches_;return z(e)?n(e,t):this.produce(e,s=>n(s,t))}};function Be(e,t,r,n){let[s,i]=be(t)?j(he).proxyMap_(t,r):Ee(t)?j(he).proxySet_(t,r):Gt(t,r);return(r?.scope_??bt()).drafts_.push(s),i.callbacks_=r?.callbacks_??[],i.key_=n,r&&n!==void 0?Wt(r,i,n):i.callbacks_.push(function(y){y.mapSetPlugin_?.fixSetContents(i);let{patchPlugin_:S}=y;i.modified_&&S&&S.generatePatches_(i,[],y)}),s}function Kt(e){return z(e)||v(10,e),At(e)}function At(e){if(!D(e)||Ce(e))return e;let t=e[b],r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Ue(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Ue(e,!0);return Se(r,(s,i)=>{_e(r,s,At(i))},n),t&&(t.finalized_=!1),r}var qt=new Jt,vt=qt.produce;var rt={};zt(rt,{addAccessRule:()=>Ae,decrypt:()=>Ke,deleteUserData:()=>tt,encrypt:()=>Je,exportKey:()=>Xt,exportUserData:()=>et,generateEncryptionKey:()=>Qt,getConsents:()=>Ze,hasConsent:()=>Xe,hasPermission:()=>te,importKey:()=>Yt,isAuditActive:()=>qe,isCryptoAvailable:()=>xt,logAudit:()=>ee,recordConsent:()=>ve,revokeConsent:()=>Ye,sanitizeValue:()=>Z,setAuditLogger:()=>Zt,validateKey:()=>Qe});var xt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Qt=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}},Xt=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))}},Yt=async(e,t)=>{let r=Uint8Array.from(atob(e),i=>i.charCodeAt(0)),n=Uint8Array.from(atob(t),i=>i.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:n}},Je=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),i=new Uint8Array(t.iv.length+s.byteLength);return i.set(t.iv),i.set(new Uint8Array(s),t.iv.length),btoa(String.fromCharCode(...i))},Ke=async(e,t)=>{let r=Uint8Array.from(atob(e),d=>d.charCodeAt(0)),n=r.slice(0,12),s=r.slice(12),i=await crypto.subtle.decrypt({name:"AES-GCM",iv:n},t.key,s);return JSON.parse(new TextDecoder().decode(i))},Me=null,Zt=e=>{Me=e},qe=()=>Me!==null,ee=e=>{Me&&Me(e)},Ae=(e,t,r)=>{e.set(t instanceof RegExp?t.source:t,r)},te=(e,t,r,n)=>{if(e.size===0)return!0;for(let[s,i]of e){let d;if(typeof s=="function")d=s(t,n);else try{d=new RegExp(s).test(t)}catch{continue}if(d)return i.includes(r)||i.includes("admin")}return!1},Z=e=>{if(typeof e=="string"){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,n=>{let s=n.match(/&#x([0-9a-fA-F]+);?/i);if(s&&s[1])return String.fromCharCode(parseInt(s[1],16));let i=n.match(/&#([0-9]+);?/);return i&&i[1]?String.fromCharCode(parseInt(i[1],10)):""});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/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]")}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]=Z(n);return t}return e}return Array.isArray(e)?e.map(t=>Z(t)):e},Qe=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,ve=(e,t,r,n)=>{let s={id:crypto.randomUUID(),purpose:r,granted:n,timestamp:Date.now()},i=e.get(t)||[];return i.push(s),e.set(t,i),ee({timestamp:Date.now(),action:"set",key:`consent:${r}`,userId:t,success:!0}),s},Xe=(e,t,r)=>{let n=e.get(t);if(!n)return!1;for(let s=n.length-1;s>=0;s--){let i=n[s];if(i&&i.purpose===r)return i.granted}return!1},Ye=(e,t,r)=>ve(e,t,r,!1),Ze=(e,t)=>e.get(t)||[],et=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),tt=(e,t)=>{let r=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:r}};var ne=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 d=new Map;return t.set(n,d),n.forEach((_,y)=>d.set(r(y),r(_))),d}if(n instanceof Set){let d=new Set;return t.set(n,d),n.forEach(_=>d.add(r(_))),d}let s=Array.isArray(n)?[]:Object.create(Object.getPrototypeOf(n));t.set(n,s);let i=[...Object.keys(n),...Object.getOwnPropertySymbols(n)];for(let d of i)s[d]=r(n[d]);return s};return r(e)},re=(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(!re(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=0;s<r.length;s++){let i=r[s];if(!(i in t)||!re(e[i],t[i]))return!1}return!0};var xe={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}}}},Oe=e=>{let t=new Map,r=new Map,n=new Map,s=new Set,i=new Map,d=new Set,_=new Map,y=new Map,S=new Map,x=new Map,B=new Map,Re=new Map,I=new Map,V=new Map,nt=e?.namespace||"gstate",E=e?.silent??!1,Ot=e?.debounceTime??150,ke=e?.version??0,C=e?.storage||xe.local(),h=e?.onError,oe=e?.maxObjectSize??5*1024*1024,se=e?.maxTotalSize??50*1024*1024,ie=e?.encryptionKey??null,ot=e?.validateInput??!0,Rt=e?.auditEnabled??!0,G=e?.userId,H=e?.immer??!0,kt=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(o=>Ae(I,o.pattern,o.permissions));let De=!1,Ie=!1,ae=!1,O=0,$=null,ce,Dt=new Promise(o=>{ce=o}),ze=o=>{if(o==null)return 0;let a=typeof o;if(a==="boolean")return 4;if(a==="number")return 8;if(a==="string")return o.length*2;if(a!=="object")return 0;let c=0,f=[o],p=new WeakSet;for(;f.length>0;){let u=f.pop();if(typeof u=="boolean")c+=4;else if(typeof u=="number")c+=8;else if(typeof u=="string")c+=u.length*2;else if(typeof u=="object"&&u!==null){let l=u;if(p.has(l))continue;if(p.add(l),Array.isArray(l))for(let g=0;g<l.length;g++)f.push(l[g]);else for(let g of Object.keys(l))c+=g.length*2,f.push(l[g])}}return c},J=()=>`${nt}_`,N=(o,a)=>{if(x.size!==0)for(let c of x.values()){let f=c.hooks?.[o];if(f)try{f(a)}catch(p){let u=p instanceof Error?p:new Error(String(p));h?h(u,{operation:`plugin:${c.name}:${o}`,key:a.key}):E||console.error(`[gState] Plugin "${c.name}" error:`,p)}}},R=(o,a,c,f)=>{Rt&&qe()&&ee&&ee({timestamp:Date.now(),action:o,key:a,userId:G,success:c,error:f})},K=o=>{if(o){let a=S.get(o);if(a)for(let p of a)st(p);let c=_.get(o);if(c){let p=w.get(o);for(let u of c)try{u(p)}catch(l){let g=l instanceof Error?l:new Error(String(l));h?h(g,{operation:"watcher",key:o}):E||console.error(`[gState] Watcher error for "${o}":`,l)}}let f=i.get(o);if(f)for(let p of f)try{p()}catch(u){let l=u instanceof Error?u:new Error(String(u));h?h(l,{operation:"keyListener",key:o}):E||console.error(`[gState] Listener error for "${o}":`,u)}}if(De){Ie=!0;return}for(let a of s)try{a()}catch(c){let f=c instanceof Error?c:new Error(String(c));h?h(f,{operation:"listener"}):E||console.error("[gState] Global listener error: ",c)}},st=o=>{let a=y.get(o),c=new Set;if(!a)return;let f=u=>(c.add(u),y.has(u)?y.get(u).lastValue:w.get(u)),p=a.selector(f);a.deps.forEach(u=>{if(!c.has(u)){let l=S.get(u);l&&(l.delete(o),l.size===0&&S.delete(u))}}),c.forEach(u=>{a.deps.has(u)||(S.has(u)||S.set(u,new Set),S.get(u).add(o))}),a.deps=c,re(a.lastValue,p)||(a.lastValue=H&&p!==null&&typeof p=="object"?T(ne(p),!0):p,r.set(o,(r.get(o)||0)+1),K(o))},it=async()=>{if(!C)return;try{let a={};t.forEach((p,u)=>{a[u]=p});let c,f=e?.encoded;f?c=btoa(JSON.stringify(a)):c=JSON.stringify(a),C.setItem(J().replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:c,_sys_v:ke,_b64:f?!0:void 0})),R("set","FULL_STATE",!0)}catch(a){let c=a instanceof Error?a:new Error(String(a));h?h(c,{operation:"persist",key:"FULL_STATE"}):E||console.error("[gState] Persist failed: ",c)}let o=Array.from(B.entries());B.clear();for(let[a,c]of o)try{let f=c.value,p=c.options.encoded||c.options.secure;if(c.options.encrypted){if(!ie)throw new Error(`Encryption key missing for "${a}"`);f=await Je(c.value,ie)}else p?f=btoa(JSON.stringify(c.value)):typeof c.value=="object"&&c.value!==null&&(f=JSON.stringify(c.value));C.setItem(`${J()}${a}`,JSON.stringify({v:r.get(a)||1,t:Date.now(),e:c.options.ttl?Date.now()+c.options.ttl:null,d:f,_sys_v:ke,_enc:c.options.encrypted?!0:void 0,_b64:p?!0:void 0})),R("set",a,!0)}catch(f){let p=f instanceof Error?f:new Error(String(f));h?h(p,{operation:"persist",key:a}):E||console.error("[gState] Persist failed: ",p)}},F={},w={_setSilently:(o,a)=>{let c=n.get(o)||0,f=H&&a!==null&&typeof a=="object"?T(ne(a),!0):a,p=ze(f);O=O-c+p,n.set(o,p),t.set(o,f),r.set(o,(r.get(o)||0)+1)},_registerMethod:(o,a,c)=>{let f=l=>l==="__proto__"||l==="constructor"||l==="prototype";if(c!==void 0){let l=o,g=a;if(f(l)||f(g)){console.warn("[gState] Refusing to register method with unsafe key:",l,g);return}F[l]||(F[l]={}),F[l][g]=c;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let p=o,u=a;F.core||(F.core={}),F.core[p]=u},set:(o,a,c={})=>{let f=t.get(o),p=H&&typeof a=="function"?vt(f,a):a;if(ot&&!Qe(o))return E||console.warn(`[gState] Invalid key: ${o}`),!1;if(!te(I,o,"write",G))return R("set",o,!1,"RBAC Denied"),E||console.error(`[gState] RBAC Denied for "${o}"`),!1;let u=ot?Z(p):p,l=n.get(o)||0;N("onBeforeSet",{key:o,value:u,store:w,version:r.get(o)||0});let g=H&&u!==null&&typeof u=="object"?T(ne(u),!0):u;if(!re(f,g)){let A=oe>0||se>0?ze(g):0;if(oe>0&&A>oe){let U=new Error(`Object size (${A} bytes) exceeds maxObjectSize (${oe} bytes)`);h?h(U,{operation:"set",key:o}):E||console.warn(`[gState] ${U.message} for "${o}"`)}if(se>0){let U=O-l+A;if(U>se){let ct=new Error(`Total store size (${U} bytes) exceeds limit (${se} bytes)`);h?h(ct,{operation:"set"}):E||console.warn(`[gState] ${ct.message}`)}}O=O-l+A,n.set(o,A),t.set(o,g),r.set(o,(r.get(o)||0)+1);let P=c.persist??kt;return P&&(B.set(o,{value:g,options:{...c,persist:P,encoded:c.encoded||e?.encoded}}),$&&clearTimeout($),$=setTimeout(it,Ot)),N("onSet",{key:o,value:g,store:w,version:r.get(o)}),R("set",o,!0),K(o),!0}return!1},get:o=>{if(!te(I,o,"read",G))return R("get",o,!1,"RBAC Denied"),null;let a=t.get(o);return N("onGet",{store:w,key:o,value:a}),R("get",o,!0),a},compute:(o,a)=>{try{return y.has(o)||(y.set(o,{selector:a,lastValue:null,deps:new Set}),st(o)),y.get(o).lastValue}catch(c){let f=c instanceof Error?c:new Error(String(c));return h?h(f,{operation:"compute",key:o}):E||console.error(`[gState] Compute error for "${o}": `,c),null}},watch:(o,a)=>{_.has(o)||_.set(o,new Set);let c=_.get(o);return c.add(a),()=>{c.delete(a),c.size===0&&_.delete(o)}},remove:o=>{if(!te(I,o,"delete",G))return R("delete",o,!1,"RBAC Denied"),!1;let a=t.get(o),c=t.delete(o);return c&&(O-=n.get(o)||0,n.delete(o),N("onRemove",{store:w,key:o,value:a})),r.set(o,(r.get(o)||0)+1),C&&C.removeItem(`${J()}${o} `),R("delete",o,!0),K(o),c},delete:o=>w.remove(o),deleteAll:()=>{if(Array.from(t.keys()).forEach(o=>w.remove(o)),C){let o=J();for(let a=0;a<(C.length||0);a++){let c=C.key(a);c?.startsWith(o)&&(C.removeItem(c),a--)}}return O=0,n.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:o=>{d.add(o)},transaction:o=>{De=!0,N("onTransaction",{store:w,key:"START"});try{o()}finally{De=!1,N("onTransaction",{store:w,key:"END"}),Ie&&(Ie=!1,K())}},destroy:()=>{$&&(clearTimeout($),$=null),B.clear(),typeof window<"u"&&window.removeEventListener("beforeunload",at),N("onDestroy",{store:w}),s.clear(),i.clear(),_.clear(),y.clear(),S.clear(),x.clear(),t.clear(),n.clear(),O=0,I.clear(),V.clear(),r.clear(),Re.clear(),d.clear()},_addPlugin:o=>{try{x.set(o.name,o),o.hooks?.onInstall?.({store:w})}catch(a){let c=a instanceof Error?a:new Error(String(a));h?h(c,{operation:"plugin:install",key:o.name}):E||console.error(`[gState] Failed to install plugin "${o.name}": `,a)}},_removePlugin:o=>{x.delete(o)},_subscribe:(o,a)=>{if(a){i.has(a)||i.set(a,new Set);let c=i.get(a);return c.add(o),()=>{c.delete(o),c.size===0&&i.delete(a)}}return s.add(o),()=>s.delete(o)},_getVersion:o=>r.get(o)??0,addAccessRule:(o,a)=>Ae(I,o,a),hasPermission:(o,a,c)=>{if(I.size===0)return!0;for(let[f,p]of I){let u;if(typeof f=="function")u=f(o,c);else try{let l=Re.get(f);l||(l=new RegExp(f),Re.set(f,l)),u=l.test(o)}catch{continue}if(u)return p.includes(a)||p.includes("admin")}return!1},recordConsent:(o,a,c)=>ve(V,o,a,c),hasConsent:(o,a)=>Xe(V,o,a),getConsents:o=>Ze(V,o),revokeConsent:(o,a)=>Ye(V,o,a),exportUserData:o=>et(V,o),deleteUserData:o=>tt(V,o),get plugins(){return F},get isReady(){return ae},get namespace(){return nt},get userId(){return G},whenReady:()=>Dt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(o=>{let a=w[o];a&&w._registerMethod("security",o,a)});let at=()=>{B.size>0&&it()};return typeof window<"u"&&window.addEventListener("beforeunload",at),C?(async()=>{try{let a={},c=J(),f=0;for(let u=0;u<(C.length||0);u++){let l=C.key(u);if(!l||!l.startsWith(c))continue;let g=C.getItem(l);if(g)try{let m=JSON.parse(g),A=l.substring(c.length);if(f=Math.max(f,m._sys_v!==void 0?m._sys_v:m.v||0),m.e&&Date.now()>m.e){C.removeItem(l),u--;continue}let P=m.d;if(m._enc&&ie)P=await Ke(P,ie);else if(typeof P=="string"){if(m._b64)try{P=JSON.parse(atob(P))}catch{}else if(P.startsWith("{")||P.startsWith("["))try{P=JSON.parse(P)}catch{}}a[A]=P,R("hydrate",A,!0)}catch(m){R("hydrate",l,!1,String(m));let A=m instanceof Error?m:new Error(String(m));h?h(A,{operation:"hydration",key:l}):E||console.error(`[gState] Hydration failed for "${l}": `,m)}}let p=f<ke&&e?.migrate?e.migrate(a,f):a;Object.entries(p).forEach(([u,l])=>{let g=H&&l!==null&&typeof l=="object"?T(ne(l),!0):l,m=ze(g),A=n.get(u)||0;O=O-A+m,n.set(u,m),t.set(u,g),r.set(u,1)}),ae=!0,ce(),K()}catch(a){ae=!0,ce();let c=a instanceof Error?a:new Error(String(a));h?h(c,{operation:"hydration"}):E||console.error("[gState] Hydration failed: ",c)}})():(ae=!0,ce()),w};var ur=(e,t)=>Oe({...t,storage:e}),fr=e=>Oe({...e,storage:xe.memory()}),lr=e=>{let t=xe.session();return t?Oe({...e,storage:t}):null};export{rt as Security,xe as StorageAdapters,fr as createMemoryStore,lr as createSessionStore,Oe as createStore,ur as createStoreWithStorage};
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var pt=Symbol.for("immer-nothing"),ot=Symbol.for("immer-draftable"),R=Symbol.for("immer-state");function O(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var M=Object,H=M.getPrototypeOf,we="constructor",ke="prototype",je="configurable",be="enumerable",me="writable",te="value",$=e=>!!e&&!!e[R];function U(e){return e?gt(e)||Re(e)||!!e[ot]||!!e[we]?.[ot]||Ae(e)||Ie(e):!1}var Vt=M[ke][we].toString(),st=new WeakMap;function gt(e){if(!e||!He(e))return!1;let t=H(e);if(t===null||t===M[ke])return!0;let n=M.hasOwnProperty.call(t,we)&&t[we];if(n===Object)return!0;if(!J(n))return!1;let r=st.get(n);return r===void 0&&(r=Function.toString.call(n),st.set(n,r)),r===Vt}function Ce(e,t,n=!0){oe(e)===0?(n?Reflect.ownKeys(e):M.keys(e)).forEach(o=>{t(o,e[o],e)}):e.forEach((r,o)=>t(o,r,e))}function oe(e){let t=e[R];return t?t.type_:Re(e)?1:Ae(e)?2:Ie(e)?3:0}var it=(e,t,n=oe(e))=>n===2?e.has(t):M[ke].hasOwnProperty.call(e,t),Fe=(e,t,n=oe(e))=>n===2?e.get(t):e[t],Ee=(e,t,n,r=oe(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Nt(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Re=Array.isArray,Ae=e=>e instanceof Map,Ie=e=>e instanceof Set,He=e=>typeof e=="object",J=e=>typeof e=="function",Ue=e=>typeof e=="boolean";function Ut(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var N=e=>e.copy_||e.base_;var qe=e=>e.modified_?e.copy_:e.base_;function Be(e,t){if(Ae(e))return new Map(e);if(Ie(e))return new Set(e);if(Re(e))return Array[ke].slice.call(e);let n=gt(e);if(t===!0||t==="class_only"&&!n){let r=M.getOwnPropertyDescriptors(e);delete r[R];let o=Reflect.ownKeys(r);for(let i=0;i<o.length;i++){let u=o[i],f=r[u];f[me]===!1&&(f[me]=!0,f[je]=!0),(f.get||f.set)&&(r[u]={[je]:!0,[me]:!0,[be]:f[be],[te]:e[u]})}return M.create(H(e),r)}else{let r=H(e);if(r!==null&&n)return{...e};let o=M.create(r);return M.assign(o,e)}}function j(e,t=!1){return Me(e)||$(e)||!U(e)||(oe(e)>1&&M.defineProperties(e,{set:Se,add:Se,clear:Se,delete:Se}),M.freeze(e),t&&Ce(e,(n,r)=>{j(r,!0)},!1)),e}function $t(){O(2)}var Se={[te]:$t};function Me(e){return e===null||!He(e)?!0:M.isFrozen(e)}var xe="MapSet",Le="Patches",at="ArrayMethods",yt={};function W(e){let t=yt[e];return t||O(0,e),t}var ct=e=>!!yt[e];var ne,ht=()=>ne,jt=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:ct(xe)?W(xe):void 0,arrayMethodsPlugin_:ct(at)?W(at):void 0});function ut(e,t){t&&(e.patchPlugin_=W(Le),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Ke(e){We(e),e.drafts_.forEach(Ft),e.drafts_=null}function We(e){e===ne&&(ne=e.parent_)}var lt=e=>ne=jt(ne,e);function Ft(e){let t=e[R];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function ft(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[R].modified_&&(Ke(t),O(4)),U(e)&&(e=dt(t,e));let{patchPlugin_:o}=t;o&&o.generateReplacementPatches_(n[R].base_,e,t)}else e=dt(t,n);return Bt(t,e,!0),Ke(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==pt?e:void 0}function dt(e,t){if(Me(t))return t;let n=t[R];if(!n)return Pe(t,e.handledSet_,e);if(!De(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:r}=n;if(r)for(;r.length>0;)r.pop()(e);_t(n,e)}return n.copy_}function Bt(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&j(t,n)}function St(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var De=(e,t)=>e.scope_===t,Lt=[];function mt(e,t,n,r){let o=N(e),i=e.type_;if(r!==void 0&&Fe(o,r,i)===t){Ee(o,r,n,i);return}if(!e.draftLocations_){let f=e.draftLocations_=new Map;Ce(o,(p,g)=>{if($(g)){let S=f.get(g)||[];S.push(p),f.set(g,S)}})}let u=e.draftLocations_.get(t)??Lt;for(let f of u)Ee(o,f,n,i)}function Kt(e,t,n){e.callbacks_.push(function(o){let i=t;if(!i||!De(i,o))return;o.mapSetPlugin_?.fixSetContents(i);let u=qe(i);mt(e,i.draft_??i,u,n),_t(i,o)})}function _t(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:r}=t;if(r){let o=r.getPath(e);o&&r.generatePatches_(e,o,t)}St(e)}}function Wt(e,t,n){let{scope_:r}=e;if($(n)){let o=n[R];De(o,r)&&o.callbacks_.push(function(){_e(e);let u=qe(o);mt(e,n,u,t)})}else U(n)&&e.callbacks_.push(function(){let i=N(e);e.type_===3?i.has(n)&&Pe(n,r.handledSet_,r):Fe(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&Pe(Fe(e.copy_,t,e.type_),r.handledSet_,r)})}function Pe(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||$(e)||t.has(e)||!U(e)||Me(e)||(t.add(e),Ce(e,(r,o)=>{if($(o)){let i=o[R];if(De(i,n)){let u=qe(i);Ee(e,r,u,e.type_),St(i)}}else U(o)&&Pe(o,t,n)})),e}function Gt(e,t){let n=Re(e),r={type_:n?1:0,scope_:t?t.scope_:ht(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},o=r,i=ve;n&&(o=[r],i=re);let{revoke:u,proxy:f}=Proxy.revocable(o,i);return r.draft_=f,r.revoke_=u,[f,r]}var ve={get(e,t){if(t===R)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t=="string";if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let o=N(e);if(!it(o,t,e.type_))return Jt(e,o,t);let i=o[t];if(e.finalized_||!U(i)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Ut(t))return i;if(i===$e(e.base_,t)){_e(e);let u=e.type_===1?+t:t,f=Je(e.scope_,i,e,u);return e.copy_[u]=f}return i},has(e,t){return t in N(e)},ownKeys(e){return Reflect.ownKeys(N(e))},set(e,t,n){let r=wt(N(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let o=$e(N(e),t),i=o?.[R];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(Nt(n,o)&&(n!==void 0||it(e.base_,t,e.type_)))return!0;_e(e),Ge(e)}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),Wt(e,t,n)),!0},deleteProperty(e,t){return _e(e),$e(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Ge(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=N(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[me]:!0,[je]:e.type_!==1||t!=="length",[be]:r[be],[te]:n[t]}},defineProperty(){O(11)},getPrototypeOf(e){return H(e.base_)},setPrototypeOf(){O(12)}},re={};for(let e in ve){let t=ve[e];re[e]=function(){let n=arguments;return n[0]=n[0][0],t.apply(this,n)}}re.deleteProperty=function(e,t){return re.set.call(this,e,t,void 0)};re.set=function(e,t,n){return ve.set.call(this,e[0],t,n,e[0])};function $e(e,t){let n=e[R];return(n?N(n):e)[t]}function Jt(e,t,n){let r=wt(t,n);return r?te in r?r[te]:r.get?.call(e.draft_):void 0}function wt(e,t){if(!(t in e))return;let n=H(e);for(;n;){let r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=H(n)}}function Ge(e){e.modified_||(e.modified_=!0,e.parent_&&Ge(e.parent_))}function _e(e){e.copy_||(e.assigned_=new Map,e.copy_=Be(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Ht=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,n,r)=>{if(J(t)&&!J(n)){let i=n;n=t;let u=this;return function(p=i,...g){return u.produce(p,S=>n.call(this,S,...g))}}J(n)||O(6),r!==void 0&&!J(r)&&O(7);let o;if(U(t)){let i=lt(this),u=Je(i,t,void 0),f=!0;try{o=n(u),f=!1}finally{f?Ke(i):We(i)}return ut(i,r),ft(o,i)}else if(!t||!He(t)){if(o=n(t),o===void 0&&(o=t),o===pt&&(o=void 0),this.autoFreeze_&&j(o,!0),r){let i=[],u=[];W(Le).generateReplacementPatches_(t,o,{patches_:i,inversePatches_:u}),r(i,u)}return o}else O(1,t)},this.produceWithPatches=(t,n)=>{if(J(t))return(u,...f)=>this.produceWithPatches(u,p=>t(p,...f));let r,o;return[this.produce(t,n,(u,f)=>{r=u,o=f}),r,o]},Ue(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Ue(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Ue(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){U(e)||O(8),$(e)&&(e=qt(e));let t=lt(this),n=Je(t,e,void 0);return n[R].isManual_=!0,We(t),n}finishDraft(e,t){let n=e&&e[R];(!n||!n.isManual_)&&O(9);let{scope_:r}=n;return ut(r,t),ft(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}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=W(Le).applyPatches_;return $(e)?r(e,t):this.produce(e,o=>r(o,t))}};function Je(e,t,n,r){let[o,i]=Ae(t)?W(xe).proxyMap_(t,n):Ie(t)?W(xe).proxySet_(t,n):Gt(t,n);return(n?.scope_??ht()).drafts_.push(o),i.callbacks_=n?.callbacks_??[],i.key_=r,n&&r!==void 0?Kt(n,i,r):i.callbacks_.push(function(p){p.mapSetPlugin_?.fixSetContents(i);let{patchPlugin_:g}=p;i.modified_&&g&&g.generatePatches_(i,[],p)}),o}function qt(e){return $(e)||O(10,e),bt(e)}function bt(e){if(!U(e)||Me(e))return e;let t=e[R],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Be(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Be(e,!0);return Ce(n,(o,i)=>{Ee(n,o,bt(i))},r),t&&(t.finalized_=!1),n}var Xt=new Ht,Et=Xt.produce;var xt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Qt=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}},Yt=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))}},Zt=async(e,t)=>{let n=Uint8Array.from(atob(e),i=>i.charCodeAt(0)),r=Uint8Array.from(atob(t),i=>i.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},Pt=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),i=new Uint8Array(t.iv.length+o.byteLength);return i.set(t.iv),i.set(new Uint8Array(o),t.iv.length),btoa(String.fromCharCode(...i))},vt=async(e,t)=>{let n=Uint8Array.from(atob(e),u=>u.charCodeAt(0)),r=n.slice(0,12),o=n.slice(12),i=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,o);return JSON.parse(new TextDecoder().decode(i))},Oe=null,en=e=>{Oe=e},kt=()=>Oe!==null,ie=e=>{Oe&&Oe(e)},Xe=(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,i]of e){let u;if(typeof o=="function")u=o(t,r);else try{u=new RegExp(o).test(t)}catch{continue}if(u)return i.includes(n)||i.includes("admin")}return!1},se=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]=se(r);return t}return e}return Array.isArray(e)?e.map(t=>se(t)):e},Qe=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,Ye=(e,t,n,r)=>{let o={id:crypto.randomUUID(),purpose:n,granted:r,timestamp:Date.now()},i=e.get(t)||[];return i.push(o),e.set(t,i),ie({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),o},Ct=(e,t,n)=>{let r=e.get(t);if(!r)return!1;for(let o=r.length-1;o>=0;o--){let i=r[o];if(i&&i.purpose===n)return i.granted}return!1},Rt=(e,t,n)=>Ye(e,t,n,!1),At=(e,t)=>e.get(t)||[],It=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),Mt=(e,t)=>{let n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}};var ce=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 u=new Map;return t.set(r,u),r.forEach((f,p)=>u.set(n(p),n(f))),u}if(r instanceof Set){let u=new Set;return t.set(r,u),r.forEach(f=>u.add(n(f))),u}let o=Array.isArray(r)?[]:Object.create(Object.getPrototypeOf(r));t.set(r,o);let i=[...Object.keys(r),...Object.getOwnPropertySymbols(r)];for(let u of i)o[u]=n(r[u]);return o};return n(e)},ae=(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(!ae(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=0;o<n.length;o++){let i=n[o];if(!(i in t)||!ae(e[i],t[i]))return!1}return!0};var nn={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}}}},q=e=>{let t=new Map,n=new Map,r=new Map,o=new Set,i=new Map,u=new Set,f=new Map,p=new Map,g=new Map,S=new Map,m=new Map,v=new Map,_=new Map,k=new Map,P=e?.namespace||"gstate",w=e?.silent??!1,fe=e?.debounceTime??150,X=e?.version??0,A=e?.storage||nn.local(),b=e?.onError,de=e?.maxObjectSize??5*1024*1024,pe=e?.maxTotalSize??50*1024*1024,ge=e?.encryptionKey??null,Ze=e?.validateInput??!0,Ot=e?.auditEnabled??!0,Q=e?.userId,Y=e?.immer??!0,Tt=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(s=>Xe(_,s.pattern,s.permissions));let ze=!1,Ve=!1,ye=!1,T=0,G=null,he,zt=new Promise(s=>{he=s}),Ne=s=>{if(s==null)return 0;let a=typeof s;if(a==="boolean")return 4;if(a==="number")return 8;if(a==="string")return s.length*2;if(a!=="object")return 0;let c=0,d=[s],h=new WeakSet;for(;d.length>0;){let l=d.pop();if(typeof l=="boolean")c+=4;else if(typeof l=="number")c+=8;else if(typeof l=="string")c+=l.length*2;else if(typeof l=="object"&&l!==null){let y=l;if(h.has(y))continue;if(h.add(y),Array.isArray(y))for(let E=0;E<y.length;E++)d.push(y[E]);else for(let E of Object.keys(y))c+=E.length*2,d.push(y[E])}}return c},Z=()=>`${P}_`,B=(s,a)=>{if(S.size!==0)for(let c of S.values()){let d=c.hooks?.[s];if(d)try{d(a)}catch(h){let l=h instanceof Error?h:new Error(String(h));b?b(l,{operation:`plugin:${c.name}:${s}`,key:a.key}):w||console.error(`[gState] Plugin "${c.name}" error:`,h)}}},z=(s,a,c,d)=>{Ot&&kt()&&ie&&ie({timestamp:Date.now(),action:s,key:a,userId:Q,success:c,error:d})},ee=s=>{if(s){let a=g.get(s);if(a)for(let h of a)et(h);let c=f.get(s);if(c){let h=C.get(s);for(let l of c)try{l(h)}catch(y){let E=y instanceof Error?y:new Error(String(y));b?b(E,{operation:"watcher",key:s}):w||console.error(`[gState] Watcher error for "${s}":`,y)}}let d=i.get(s);if(d)for(let h of d)try{h()}catch(l){let y=l instanceof Error?l:new Error(String(l));b?b(y,{operation:"keyListener",key:s}):w||console.error(`[gState] Listener error for "${s}":`,l)}}if(ze){Ve=!0;return}for(let a of o)try{a()}catch(c){let d=c instanceof Error?c:new Error(String(c));b?b(d,{operation:"listener"}):w||console.error("[gState] Global listener error: ",c)}},et=s=>{let a=p.get(s),c=new Set;if(!a)return;let d=l=>(c.add(l),p.has(l)?p.get(l).lastValue:C.get(l)),h=a.selector(d);a.deps.forEach(l=>{if(!c.has(l)){let y=g.get(l);y&&(y.delete(s),y.size===0&&g.delete(l))}}),c.forEach(l=>{a.deps.has(l)||(g.has(l)||g.set(l,new Set),g.get(l).add(s))}),a.deps=c,ae(a.lastValue,h)||(a.lastValue=Y&&h!==null&&typeof h=="object"?j(ce(h),!0):h,n.set(s,(n.get(s)||0)+1),ee(s))},tt=async()=>{if(!A)return;try{let a={};t.forEach((h,l)=>{a[l]=h});let c,d=e?.encoded;d?c=btoa(JSON.stringify(a)):c=JSON.stringify(a),A.setItem(Z().replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:c,_sys_v:X,_b64:d?!0:void 0})),z("set","FULL_STATE",!0)}catch(a){let c=a instanceof Error?a:new Error(String(a));b?b(c,{operation:"persist",key:"FULL_STATE"}):w||console.error("[gState] Persist failed: ",c)}let s=Array.from(m.entries());m.clear();for(let[a,c]of s)try{let d=c.value,h=c.options.encoded||c.options.secure;if(c.options.encrypted){if(!ge)throw new Error(`Encryption key missing for "${a}"`);d=await Pt(c.value,ge)}else h?d=btoa(JSON.stringify(c.value)):typeof c.value=="object"&&c.value!==null&&(d=JSON.stringify(c.value));A.setItem(`${Z()}${a} `,JSON.stringify({v:n.get(a)||1,t:Date.now(),e:c.options.ttl?Date.now()+c.options.ttl:null,d,_sys_v:X,_enc:c.options.encrypted?!0:void 0,_b64:h?!0:void 0})),z("set",a,!0)}catch(d){let h=d instanceof Error?d:new Error(String(d));b?b(h,{operation:"persist",key:a}):w||console.error("[gState] Persist failed: ",h)}},L={},C={_setSilently:(s,a)=>{let c=r.get(s)||0,d=Y&&a!==null&&typeof a=="object"?j(ce(a),!0):a,h=Ne(d);T=T-c+h,r.set(s,h),t.set(s,d),n.set(s,(n.get(s)||0)+1)},_registerMethod:(s,a,c)=>{if(c!==void 0){let l=s,y=a;L[l]||(L[l]={}),L[l][y]=c;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let d=s,h=a;L.core||(L.core={}),L.core[d]=h},set:(s,a,c={})=>{let d=t.get(s),h=Y&&typeof a=="function"?Et(d,a):a;if(Ze&&!Qe(s))return w||console.warn(`[gState] Invalid key: ${s}`),!1;if(!Te(_,s,"write",Q))return z("set",s,!1,"RBAC Denied"),w||console.error(`[gState] RBAC Denied for "${s}"`),!1;let l=Ze?se(h):h,y=r.get(s)||0;B("onBeforeSet",{key:s,value:l,store:C,version:n.get(s)||0});let E=Y&&l!==null&&typeof l=="object"?j(ce(l),!0):l;if(!ae(d,E)){let D=de>0||pe>0?Ne(E):0;if(de>0&&D>de){let K=new Error(`Object size (${D} bytes) exceeds maxObjectSize (${de} bytes)`);b?b(K,{operation:"set",key:s}):w||console.warn(`[gState] ${K.message} for "${s}"`)}if(pe>0){let K=T-y+D;if(K>pe){let rt=new Error(`Total store size (${K} bytes) exceeds limit (${pe} bytes)`);b?b(rt,{operation:"set"}):w||console.warn(`[gState] ${rt.message}`)}}T=T-y+D,r.set(s,D),t.set(s,E),n.set(s,(n.get(s)||0)+1);let I=c.persist??Tt;return I&&(m.set(s,{value:E,options:{...c,persist:I,encoded:c.encoded||e?.encoded}}),G&&clearTimeout(G),G=setTimeout(tt,fe)),B("onSet",{key:s,value:E,store:C,version:n.get(s)}),z("set",s,!0),ee(s),!0}return!1},get:s=>{if(!Te(_,s,"read",Q))return z("get",s,!1,"RBAC Denied"),null;let a=t.get(s);return B("onGet",{store:C,key:s,value:a}),z("get",s,!0),a},compute:(s,a)=>{try{return p.has(s)||(p.set(s,{selector:a,lastValue:null,deps:new Set}),et(s)),p.get(s).lastValue}catch(c){let d=c instanceof Error?c:new Error(String(c));return b?b(d,{operation:"compute",key:s}):w||console.error(`[gState] Compute error for "${s}": `,c),null}},watch:(s,a)=>{f.has(s)||f.set(s,new Set);let c=f.get(s);return c.add(a),()=>{c.delete(a),c.size===0&&f.delete(s)}},remove:s=>{if(!Te(_,s,"delete",Q))return z("delete",s,!1,"RBAC Denied"),!1;let a=t.get(s),c=t.delete(s);return c&&(T-=r.get(s)||0,r.delete(s),B("onRemove",{store:C,key:s,value:a})),n.set(s,(n.get(s)||0)+1),A&&A.removeItem(`${Z()}${s} `),z("delete",s,!0),ee(s),c},delete:s=>C.remove(s),deleteAll:()=>{if(Array.from(t.keys()).forEach(s=>C.remove(s)),A){let s=Z();for(let a=0;a<(A.length||0);a++){let c=A.key(a);c?.startsWith(s)&&(A.removeItem(c),a--)}}return T=0,r.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:s=>{u.add(s)},transaction:s=>{ze=!0,B("onTransaction",{store:C,key:"START"});try{s()}finally{ze=!1,B("onTransaction",{store:C,key:"END"}),Ve&&(Ve=!1,ee())}},destroy:()=>{G&&(clearTimeout(G),G=null),m.clear(),typeof window<"u"&&window.removeEventListener("beforeunload",nt),B("onDestroy",{store:C}),o.clear(),i.clear(),f.clear(),p.clear(),g.clear(),S.clear(),t.clear(),r.clear(),T=0,_.clear(),k.clear(),n.clear(),v.clear(),u.clear()},_addPlugin:s=>{try{S.set(s.name,s),s.hooks?.onInstall?.({store:C})}catch(a){let c=a instanceof Error?a:new Error(String(a));b?b(c,{operation:"plugin:install",key:s.name}):w||console.error(`[gState] Failed to install plugin "${s.name}": `,a)}},_removePlugin:s=>{S.delete(s)},_subscribe:(s,a)=>{if(a){i.has(a)||i.set(a,new Set);let c=i.get(a);return c.add(s),()=>{c.delete(s),c.size===0&&i.delete(a)}}return o.add(s),()=>o.delete(s)},_getVersion:s=>n.get(s)??0,addAccessRule:(s,a)=>Xe(_,s,a),hasPermission:(s,a,c)=>{if(_.size===0)return!0;for(let[d,h]of _){let l;if(typeof d=="function")l=d(s,c);else try{let y=v.get(d);y||(y=new RegExp(d),v.set(d,y)),l=y.test(s)}catch{continue}if(l)return h.includes(a)||h.includes("admin")}return!1},recordConsent:(s,a,c)=>Ye(k,s,a,c),hasConsent:(s,a)=>Ct(k,s,a),getConsents:s=>At(k,s),revokeConsent:(s,a)=>Rt(k,s,a),exportUserData:s=>It(k,s),deleteUserData:s=>Mt(k,s),get plugins(){return L},get isReady(){return ye},get namespace(){return P},get userId(){return Q},whenReady:()=>zt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(s=>{let a=C[s];a&&C._registerMethod("security",s,a)});let nt=()=>{m.size>0&&tt()};return typeof window<"u"&&window.addEventListener("beforeunload",nt),A?(async()=>{try{let a={},c=Z(),d=0;for(let l=0;l<(A.length||0);l++){let y=A.key(l);if(!y||!y.startsWith(c))continue;let E=A.getItem(y);if(E)try{let x=JSON.parse(E),D=y.substring(c.length);if(d=Math.max(d,x._sys_v!==void 0?x._sys_v:x.v||0),x.e&&Date.now()>x.e){A.removeItem(y),l--;continue}let I=x.d;if(x._enc&&ge)I=await vt(I,ge);else if(typeof I=="string"){if(x._b64)try{I=JSON.parse(atob(I))}catch{}else if(I.startsWith("{")||I.startsWith("["))try{I=JSON.parse(I)}catch{}}a[D]=I,z("hydrate",D,!0)}catch(x){z("hydrate",y,!1,String(x));let D=x instanceof Error?x:new Error(String(x));b?b(D,{operation:"hydration",key:y}):w||console.error(`[gState] Hydration failed for "${y}": `,x)}}let h=d<X&&e?.migrate?e.migrate(a,d):a;Object.entries(h).forEach(([l,y])=>{let E=Y&&y!==null&&typeof y=="object"?j(ce(y),!0):y,x=Ne(E),D=r.get(l)||0;T=T-D+x,r.set(l,x),t.set(l,E),n.set(l,1)}),ye=!0,he(),ee()}catch(a){ye=!0,he();let c=a instanceof Error?a:new Error(String(a));b?b(c,{operation:"hydration"}):w||console.error("[gState] Hydration failed: ",c)}})():(ye=!0,he()),C};import{useSyncExternalStore as Dt,useDebugValue as rn,useMemo as ue}from"react";var F=null,on=e=>{F&&!e?.namespace&&(e?.silent||console.warn("[gState] Store already exists. Pass a unique namespace to create additional stores."));let t=q(e);return F=t,t},sn=()=>{F&&(F.destroy(),F=null)},an=e=>{let t=e||F,n=ue(()=>r=>t?t._subscribe(r):()=>{},[t]);return Dt(n,()=>t?t.isReady:!1,()=>!0)},V=()=>F;var le=(e,t)=>{let n=ue(()=>t||F,[t]),r=ue(()=>{let p=()=>{},g=()=>!1,S=()=>null;return{set:g,get:S,remove:g,delete:g,deleteAll:g,list:()=>({}),compute:S,watch:()=>()=>{},use:p,transaction:p,destroy:p,_subscribe:()=>()=>{},_setSilently:p,_registerMethod:p,_addPlugin:p,_removePlugin:p,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}}}},[]),o=n||r,i=ue(()=>p=>o._subscribe(p,e),[o,e]),u=Dt(i,()=>o.get(e)??void 0,()=>{}),f=ue(()=>(p,g)=>o.set(e,p,g),[o,e]);return rn(u,p=>`${e}: ${JSON.stringify(p)}`),[u,f]};var cn=(e,t)=>{let n=t?.key||"async_data",r=t?.store||q({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 i=r.get(n);r.set(n,{...i||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{let u=await e(),f=r.get(n);r.set(n,{...f||{data:null,loading:!1,error:null,updatedAt:null},data:u,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(u){let f=r.get(n);r.set(n,{...f||{data:null,loading:!1,error:null,updatedAt:null},error:u instanceof Error?u:new Error(String(u)),loading:!1})}}})};var un=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",((t,n)=>e.set(t,n)))}}});var ln=e=>{let t=[],n=-1,r=!1,o=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:i})=>{t.push(i.list()),n=0,i._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;let u=t[n];return u?(Object.entries(u).forEach(([f,p])=>{i._setSilently(f,p)}),r=!1,!0):!1}return!1}),i._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;let u=t[n];return u?(Object.entries(u).forEach(([f,p])=>{i._setSilently(f,p)}),r=!1,!0):!1}return!1}),i._registerMethod("undoRedo","canUndo",()=>n>0),i._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:i})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(i.list()),t.length>o?t.shift():n++)}}}};var fn=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 dn=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:i})=>{o=r.connect({name:e?.name||"Magnetar Store"}),o.init(i.list())},onSet:({key:i,store:u})=>{!i||!o||o.send(`SET_${i.toUpperCase()}`,u.list())},onRemove:({key:i,store:u})=>{!i||!o||o.send(`REMOVE_${i.toUpperCase()}`,u.list())}}}};var pn=()=>{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,i])=>{t.set(o,i)})}),!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 gn=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;let o=e[t];if(o){let i=o(n)}}}});var yn=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 hn=e=>{let t=new BroadcastChannel(e?.channelName||"gstate_sync"),n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:r})=>{t.onmessage=o=>{let{key:i,value:u,action:f}=o.data;i&&(n=!0,f==="REMOVE"?r.remove(i):r.set(i,u),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 Sn=()=>({name:"gstate-debug-noop",hooks:{}});var mn=(e={})=>{let t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1,o=null,i=()=>new Promise((g,S)=>{if(o)return g(o);let m=indexedDB.open(t,r);m.onerror=()=>S(m.error),m.onsuccess=()=>{o=m.result,g(o)},m.onupgradeneeded=v=>{let _=v.target.result;_.objectStoreNames.contains(n)||_.createObjectStore(n)}}),u=async(g,S)=>{let m=await i();return new Promise((v,_)=>{let w=m.transaction(n,"readwrite").objectStore(n).put(S,g);w.onsuccess=()=>v(),w.onerror=()=>_(w.error)})},f=async g=>{let S=await i();return new Promise((m,v)=>{let P=S.transaction(n,"readonly").objectStore(n).get(g);P.onsuccess=()=>m(P.result),P.onerror=()=>v(P.error)})},p=async g=>{let S=await i();return new Promise((m,v)=>{let P=S.transaction(n,"readwrite").objectStore(n).delete(g);P.onsuccess=()=>m(),P.onerror=()=>v(P.error)})};return{name:"indexedDB",hooks:{onInstall:({store:g})=>{g._registerMethod("indexedDB","clear",async()=>{(await i()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:g})=>{let _=(await i()).transaction(n,"readonly").objectStore(n).getAllKeys();_.onsuccess=async()=>{let k=_.result,P=g.namespace+"_";for(let w of k)if(w.startsWith(P)){let fe=await f(w);if(fe){let X=w.substring(P.length);g._setSilently(X,fe.d)}}}},onSet:async({key:g,value:S,store:m})=>{if(!g)return;let v=m.namespace+"_",_={d:S,t:Date.now(),v:m._getVersion?.(g)||1};await u(`${v}${g}`,_)},onRemove:async({key:g,store:S})=>{if(!g)return;let m=S.namespace+"_";await p(`${m}${g}`)}}}};var _n=e=>{let{adapter:t,autoSyncInterval:n}=e,r=new Map,o={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0},i=null;return{name:"cloudSync",hooks:{onInstall:({store:u})=>{u._registerMethod("cloudSync","sync",async()=>{let f=performance.now(),p={},g=0;try{let S=u.list(),m=Object.keys(S);for(let _ of m){let k=u._getVersion?.(_)||0,P=r.get(_)||0;if(k>P){let w=S[_];p[_]=w,g+=JSON.stringify(w).length,r.set(_,k)}}if(Object.keys(p).length===0)return{status:"no-change",stats:o};if(await t.save(p))return o.lastSyncTimestamp=Date.now(),o.totalKeysSynced+=Object.keys(p).length,o.totalBytesSynced+=g,o.syncCount++,o.lastDuration=performance.now()-f,e.onSync&&e.onSync(o),{status:"success",stats:o};throw new Error(`Adapter ${t.name} failed to save.`)}catch(S){return o.errors++,console.error(`[gState] Cloud Sync Failed (${t.name}):`,S),{status:"error",error:String(S),stats:o}}}),u._registerMethod("cloudSync","getStats",()=>o),n&&n>0&&(i=setInterval(()=>{let p=u.plugins.cloudSync;p&&p.sync()},n))},onDestroy:()=>{i&&clearInterval(i)}}}},wn=(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}),bn=(e,t)=>({name:"Firebase-Firestore",save:async n=>{try{return console.log("[Mock] Firestore Syncing:",n),!0}catch{return!1}}}),En=(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 Gn=e=>({name:"gstate-logger",hooks:{onSet:({key:t,value:n,version:r})=>{let o=new Date().toLocaleTimeString(),i=`[gState] SET: ${t} (v${r}) @ ${o}`;e?.collapsed?console.groupCollapsed(i):console.group(i),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 cr=(e,t)=>{let r=q(typeof t=="string"?{namespace:t}:t);e&&Object.entries(e).forEach(([i,u])=>{r.get(i)===null&&r._setSilently(i,u)});let o=i=>le(i,r);return typeof window<"u"&&(window.gState=r,window.rgs=r),Object.assign(o,r)};var ur=(e,t)=>V()?.addAccessRule(e,t),lr=(e,t,n)=>V()?.hasPermission(e,t,n)??!0,fr=(e,t,n)=>{let r=V();if(!r)throw new Error("[gState] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},dr=(e,t)=>V()?.hasConsent(e,t)??!1,pr=e=>V()?.getConsents(e)??[],gr=(e,t)=>V()?.revokeConsent(e,t),yr=e=>{let t=V();if(!t)throw new Error("[gState] exportUserData failed: No store found.");return t.exportUserData(e)},hr=e=>{let t=V();if(!t)throw new Error("[gState] deleteUserData failed: No store found.");return t.deleteUserData(e)},Sr=()=>{},mr=()=>{};export{ur as addAccessRule,yn as analyticsPlugin,Sr as clearAccessRules,mr as clearAllConsents,_n as cloudSyncPlugin,cn as createAsyncStore,bn as createFirestoreAdapter,wn as createMongoAdapter,En as createSqlRestAdapter,q as createStore,Sn as debugPlugin,hr as deleteUserData,sn as destroyState,dn as devToolsPlugin,Yt as exportKey,yr as exportUserData,Qt as generateEncryptionKey,pr as getConsents,V as getStore,cr as gstate,gn as guardPlugin,dr as hasConsent,lr as hasPermission,un as immerPlugin,Zt as importKey,mn as indexedDBPlugin,on as initState,xt as isCryptoAvailable,ie as logAudit,Gn as loggerPlugin,fr as recordConsent,gr as revokeConsent,se as sanitizeValue,fn as schemaPlugin,en as setAuditLogger,pn as snapshotPlugin,hn as syncPlugin,ln as undoRedoPlugin,le as useGState,an as useIsStoreReady,le as useSimpleState,le as useStore,Qe as validateKey};
|
|
1
|
+
var pt=Symbol.for("immer-nothing"),ot=Symbol.for("immer-draftable"),R=Symbol.for("immer-state");function O(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var M=Object,H=M.getPrototypeOf,we="constructor",ke="prototype",Fe="configurable",be="enumerable",me="writable",te="value",$=e=>!!e&&!!e[R];function U(e){return e?gt(e)||Re(e)||!!e[ot]||!!e[we]?.[ot]||Ie(e)||Ae(e):!1}var Nt=M[ke][we].toString(),st=new WeakMap;function gt(e){if(!e||!He(e))return!1;let t=H(e);if(t===null||t===M[ke])return!0;let n=M.hasOwnProperty.call(t,we)&&t[we];if(n===Object)return!0;if(!J(n))return!1;let r=st.get(n);return r===void 0&&(r=Function.toString.call(n),st.set(n,r)),r===Nt}function Ce(e,t,n=!0){oe(e)===0?(n?Reflect.ownKeys(e):M.keys(e)).forEach(o=>{t(o,e[o],e)}):e.forEach((r,o)=>t(o,r,e))}function oe(e){let t=e[R];return t?t.type_:Re(e)?1:Ie(e)?2:Ae(e)?3:0}var it=(e,t,n=oe(e))=>n===2?e.has(t):M[ke].hasOwnProperty.call(e,t),je=(e,t,n=oe(e))=>n===2?e.get(t):e[t],Ee=(e,t,n,r=oe(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Vt(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var Re=Array.isArray,Ie=e=>e instanceof Map,Ae=e=>e instanceof Set,He=e=>typeof e=="object",J=e=>typeof e=="function",Ue=e=>typeof e=="boolean";function Ut(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var V=e=>e.copy_||e.base_;var qe=e=>e.modified_?e.copy_:e.base_;function Be(e,t){if(Ie(e))return new Map(e);if(Ae(e))return new Set(e);if(Re(e))return Array[ke].slice.call(e);let n=gt(e);if(t===!0||t==="class_only"&&!n){let r=M.getOwnPropertyDescriptors(e);delete r[R];let o=Reflect.ownKeys(r);for(let s=0;s<o.length;s++){let u=o[s],l=r[u];l[me]===!1&&(l[me]=!0,l[Fe]=!0),(l.get||l.set)&&(r[u]={[Fe]:!0,[me]:!0,[be]:l[be],[te]:e[u]})}return M.create(H(e),r)}else{let r=H(e);if(r!==null&&n)return{...e};let o=M.create(r);return M.assign(o,e)}}function F(e,t=!1){return Me(e)||$(e)||!U(e)||(oe(e)>1&&M.defineProperties(e,{set:Se,add:Se,clear:Se,delete:Se}),M.freeze(e),t&&Ce(e,(n,r)=>{F(r,!0)},!1)),e}function $t(){O(2)}var Se={[te]:$t};function Me(e){return e===null||!He(e)?!0:M.isFrozen(e)}var xe="MapSet",Le="Patches",at="ArrayMethods",yt={};function W(e){let t=yt[e];return t||O(0,e),t}var ct=e=>!!yt[e];var ne,ht=()=>ne,Ft=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:ct(xe)?W(xe):void 0,arrayMethodsPlugin_:ct(at)?W(at):void 0});function ut(e,t){t&&(e.patchPlugin_=W(Le),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Ke(e){We(e),e.drafts_.forEach(jt),e.drafts_=null}function We(e){e===ne&&(ne=e.parent_)}var lt=e=>ne=Ft(ne,e);function jt(e){let t=e[R];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function ft(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[R].modified_&&(Ke(t),O(4)),U(e)&&(e=dt(t,e));let{patchPlugin_:o}=t;o&&o.generateReplacementPatches_(n[R].base_,e,t)}else e=dt(t,n);return Bt(t,e,!0),Ke(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==pt?e:void 0}function dt(e,t){if(Me(t))return t;let n=t[R];if(!n)return ve(t,e.handledSet_,e);if(!De(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:r}=n;if(r)for(;r.length>0;)r.pop()(e);_t(n,e)}return n.copy_}function Bt(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&F(t,n)}function St(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var De=(e,t)=>e.scope_===t,Lt=[];function mt(e,t,n,r){let o=V(e),s=e.type_;if(r!==void 0&&je(o,r,s)===t){Ee(o,r,n,s);return}if(!e.draftLocations_){let l=e.draftLocations_=new Map;Ce(o,(g,y)=>{if($(y)){let S=l.get(y)||[];S.push(g),l.set(y,S)}})}let u=e.draftLocations_.get(t)??Lt;for(let l of u)Ee(o,l,n,s)}function Kt(e,t,n){e.callbacks_.push(function(o){let s=t;if(!s||!De(s,o))return;o.mapSetPlugin_?.fixSetContents(s);let u=qe(s);mt(e,s.draft_??s,u,n),_t(s,o)})}function _t(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:r}=t;if(r){let o=r.getPath(e);o&&r.generatePatches_(e,o,t)}St(e)}}function Wt(e,t,n){let{scope_:r}=e;if($(n)){let o=n[R];De(o,r)&&o.callbacks_.push(function(){_e(e);let u=qe(o);mt(e,n,u,t)})}else U(n)&&e.callbacks_.push(function(){let s=V(e);e.type_===3?s.has(n)&&ve(n,r.handledSet_,r):je(s,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&ve(je(e.copy_,t,e.type_),r.handledSet_,r)})}function ve(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||$(e)||t.has(e)||!U(e)||Me(e)||(t.add(e),Ce(e,(r,o)=>{if($(o)){let s=o[R];if(De(s,n)){let u=qe(s);Ee(e,r,u,e.type_),St(s)}}else U(o)&&ve(o,t,n)})),e}function Gt(e,t){let n=Re(e),r={type_:n?1:0,scope_:t?t.scope_:ht(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},o=r,s=Pe;n&&(o=[r],s=re);let{revoke:u,proxy:l}=Proxy.revocable(o,s);return r.draft_=l,r.revoke_=u,[l,r]}var Pe={get(e,t){if(t===R)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t=="string";if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let o=V(e);if(!it(o,t,e.type_))return Jt(e,o,t);let s=o[t];if(e.finalized_||!U(s)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Ut(t))return s;if(s===$e(e.base_,t)){_e(e);let u=e.type_===1?+t:t,l=Je(e.scope_,s,e,u);return e.copy_[u]=l}return s},has(e,t){return t in V(e)},ownKeys(e){return Reflect.ownKeys(V(e))},set(e,t,n){let r=wt(V(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let o=$e(V(e),t),s=o?.[R];if(s&&s.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(Vt(n,o)&&(n!==void 0||it(e.base_,t,e.type_)))return!0;_e(e),Ge(e)}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),Wt(e,t,n)),!0},deleteProperty(e,t){return _e(e),$e(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),Ge(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=V(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[me]:!0,[Fe]:e.type_!==1||t!=="length",[be]:r[be],[te]:n[t]}},defineProperty(){O(11)},getPrototypeOf(e){return H(e.base_)},setPrototypeOf(){O(12)}},re={};for(let e in Pe){let t=Pe[e];re[e]=function(){let n=arguments;return n[0]=n[0][0],t.apply(this,n)}}re.deleteProperty=function(e,t){return re.set.call(this,e,t,void 0)};re.set=function(e,t,n){return Pe.set.call(this,e[0],t,n,e[0])};function $e(e,t){let n=e[R];return(n?V(n):e)[t]}function Jt(e,t,n){let r=wt(t,n);return r?te in r?r[te]:r.get?.call(e.draft_):void 0}function wt(e,t){if(!(t in e))return;let n=H(e);for(;n;){let r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=H(n)}}function Ge(e){e.modified_||(e.modified_=!0,e.parent_&&Ge(e.parent_))}function _e(e){e.copy_||(e.assigned_=new Map,e.copy_=Be(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var Ht=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,n,r)=>{if(J(t)&&!J(n)){let s=n;n=t;let u=this;return function(g=s,...y){return u.produce(g,S=>n.call(this,S,...y))}}J(n)||O(6),r!==void 0&&!J(r)&&O(7);let o;if(U(t)){let s=lt(this),u=Je(s,t,void 0),l=!0;try{o=n(u),l=!1}finally{l?Ke(s):We(s)}return ut(s,r),ft(o,s)}else if(!t||!He(t)){if(o=n(t),o===void 0&&(o=t),o===pt&&(o=void 0),this.autoFreeze_&&F(o,!0),r){let s=[],u=[];W(Le).generateReplacementPatches_(t,o,{patches_:s,inversePatches_:u}),r(s,u)}return o}else O(1,t)},this.produceWithPatches=(t,n)=>{if(J(t))return(u,...l)=>this.produceWithPatches(u,g=>t(g,...l));let r,o;return[this.produce(t,n,(u,l)=>{r=u,o=l}),r,o]},Ue(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Ue(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Ue(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){U(e)||O(8),$(e)&&(e=qt(e));let t=lt(this),n=Je(t,e,void 0);return n[R].isManual_=!0,We(t),n}finishDraft(e,t){let n=e&&e[R];(!n||!n.isManual_)&&O(9);let{scope_:r}=n;return ut(r,t),ft(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}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=W(Le).applyPatches_;return $(e)?r(e,t):this.produce(e,o=>r(o,t))}};function Je(e,t,n,r){let[o,s]=Ie(t)?W(xe).proxyMap_(t,n):Ae(t)?W(xe).proxySet_(t,n):Gt(t,n);return(n?.scope_??ht()).drafts_.push(o),s.callbacks_=n?.callbacks_??[],s.key_=r,n&&r!==void 0?Kt(n,s,r):s.callbacks_.push(function(g){g.mapSetPlugin_?.fixSetContents(s);let{patchPlugin_:y}=g;s.modified_&&y&&y.generatePatches_(s,[],g)}),o}function qt(e){return $(e)||O(10,e),bt(e)}function bt(e){if(!U(e)||Me(e))return e;let t=e[R],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=Be(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=Be(e,!0);return Ce(n,(o,s)=>{Ee(n,o,bt(s))},r),t&&(t.finalized_=!1),n}var Xt=new Ht,Et=Xt.produce;var xt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",Qt=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}},Yt=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))}},Zt=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}},vt=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))},Pt=async(e,t)=>{let n=Uint8Array.from(atob(e),u=>u.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))},Oe=null,en=e=>{Oe=e},kt=()=>Oe!==null,ie=e=>{Oe&&Oe(e)},Xe=(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 u;if(typeof o=="function")u=o(t,r);else try{u=new RegExp(o).test(t)}catch{continue}if(u)return s.includes(n)||s.includes("admin")}return!1},se=e=>{if(typeof e=="string"){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,r=>{let o=r.match(/&#x([0-9a-fA-F]+);?/i);if(o&&o[1])return String.fromCharCode(parseInt(o[1],16));let s=r.match(/&#([0-9]+);?/);return s&&s[1]?String.fromCharCode(parseInt(s[1],10)):""});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/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]")}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]=se(r);return t}return e}return Array.isArray(e)?e.map(t=>se(t)):e},Qe=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,Ye=(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),ie({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),o},Ct=(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},Rt=(e,t,n)=>Ye(e,t,n,!1),It=(e,t)=>e.get(t)||[],At=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),Mt=(e,t)=>{let n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}};var ce=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 u=new Map;return t.set(r,u),r.forEach((l,g)=>u.set(n(g),n(l))),u}if(r instanceof Set){let u=new Set;return t.set(r,u),r.forEach(l=>u.add(n(l))),u}let o=Array.isArray(r)?[]:Object.create(Object.getPrototypeOf(r));t.set(r,o);let s=[...Object.keys(r),...Object.getOwnPropertySymbols(r)];for(let u of s)o[u]=n(r[u]);return o};return n(e)},ae=(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(!ae(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=0;o<n.length;o++){let s=n[o];if(!(s in t)||!ae(e[s],t[s]))return!1}return!0};var nn={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}}}},q=e=>{let t=new Map,n=new Map,r=new Map,o=new Set,s=new Map,u=new Set,l=new Map,g=new Map,y=new Map,S=new Map,m=new Map,P=new Map,_=new Map,k=new Map,v=e?.namespace||"gstate",w=e?.silent??!1,fe=e?.debounceTime??150,X=e?.version??0,I=e?.storage||nn.local(),b=e?.onError,de=e?.maxObjectSize??5*1024*1024,pe=e?.maxTotalSize??50*1024*1024,ge=e?.encryptionKey??null,Ze=e?.validateInput??!0,Ot=e?.auditEnabled??!0,Q=e?.userId,Y=e?.immer??!0,Tt=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(i=>Xe(_,i.pattern,i.permissions));let ze=!1,Ne=!1,ye=!1,T=0,G=null,he,zt=new Promise(i=>{he=i}),Ve=i=>{if(i==null)return 0;let a=typeof i;if(a==="boolean")return 4;if(a==="number")return 8;if(a==="string")return i.length*2;if(a!=="object")return 0;let c=0,d=[i],h=new WeakSet;for(;d.length>0;){let f=d.pop();if(typeof f=="boolean")c+=4;else if(typeof f=="number")c+=8;else if(typeof f=="string")c+=f.length*2;else if(typeof f=="object"&&f!==null){let p=f;if(h.has(p))continue;if(h.add(p),Array.isArray(p))for(let E=0;E<p.length;E++)d.push(p[E]);else for(let E of Object.keys(p))c+=E.length*2,d.push(p[E])}}return c},Z=()=>`${v}_`,B=(i,a)=>{if(S.size!==0)for(let c of S.values()){let d=c.hooks?.[i];if(d)try{d(a)}catch(h){let f=h instanceof Error?h:new Error(String(h));b?b(f,{operation:`plugin:${c.name}:${i}`,key:a.key}):w||console.error(`[gState] Plugin "${c.name}" error:`,h)}}},z=(i,a,c,d)=>{Ot&&kt()&&ie&&ie({timestamp:Date.now(),action:i,key:a,userId:Q,success:c,error:d})},ee=i=>{if(i){let a=y.get(i);if(a)for(let h of a)et(h);let c=l.get(i);if(c){let h=C.get(i);for(let f of c)try{f(h)}catch(p){let E=p instanceof Error?p:new Error(String(p));b?b(E,{operation:"watcher",key:i}):w||console.error(`[gState] Watcher error for "${i}":`,p)}}let d=s.get(i);if(d)for(let h of d)try{h()}catch(f){let p=f instanceof Error?f:new Error(String(f));b?b(p,{operation:"keyListener",key:i}):w||console.error(`[gState] Listener error for "${i}":`,f)}}if(ze){Ne=!0;return}for(let a of o)try{a()}catch(c){let d=c instanceof Error?c:new Error(String(c));b?b(d,{operation:"listener"}):w||console.error("[gState] Global listener error: ",c)}},et=i=>{let a=g.get(i),c=new Set;if(!a)return;let d=f=>(c.add(f),g.has(f)?g.get(f).lastValue:C.get(f)),h=a.selector(d);a.deps.forEach(f=>{if(!c.has(f)){let p=y.get(f);p&&(p.delete(i),p.size===0&&y.delete(f))}}),c.forEach(f=>{a.deps.has(f)||(y.has(f)||y.set(f,new Set),y.get(f).add(i))}),a.deps=c,ae(a.lastValue,h)||(a.lastValue=Y&&h!==null&&typeof h=="object"?F(ce(h),!0):h,n.set(i,(n.get(i)||0)+1),ee(i))},tt=async()=>{if(!I)return;try{let a={};t.forEach((h,f)=>{a[f]=h});let c,d=e?.encoded;d?c=btoa(JSON.stringify(a)):c=JSON.stringify(a),I.setItem(Z().replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:c,_sys_v:X,_b64:d?!0:void 0})),z("set","FULL_STATE",!0)}catch(a){let c=a instanceof Error?a:new Error(String(a));b?b(c,{operation:"persist",key:"FULL_STATE"}):w||console.error("[gState] Persist failed: ",c)}let i=Array.from(m.entries());m.clear();for(let[a,c]of i)try{let d=c.value,h=c.options.encoded||c.options.secure;if(c.options.encrypted){if(!ge)throw new Error(`Encryption key missing for "${a}"`);d=await vt(c.value,ge)}else h?d=btoa(JSON.stringify(c.value)):typeof c.value=="object"&&c.value!==null&&(d=JSON.stringify(c.value));I.setItem(`${Z()}${a}`,JSON.stringify({v:n.get(a)||1,t:Date.now(),e:c.options.ttl?Date.now()+c.options.ttl:null,d,_sys_v:X,_enc:c.options.encrypted?!0:void 0,_b64:h?!0:void 0})),z("set",a,!0)}catch(d){let h=d instanceof Error?d:new Error(String(d));b?b(h,{operation:"persist",key:a}):w||console.error("[gState] Persist failed: ",h)}},L={},C={_setSilently:(i,a)=>{let c=r.get(i)||0,d=Y&&a!==null&&typeof a=="object"?F(ce(a),!0):a,h=Ve(d);T=T-c+h,r.set(i,h),t.set(i,d),n.set(i,(n.get(i)||0)+1)},_registerMethod:(i,a,c)=>{let d=p=>p==="__proto__"||p==="constructor"||p==="prototype";if(c!==void 0){let p=i,E=a;if(d(p)||d(E)){console.warn("[gState] Refusing to register method with unsafe key:",p,E);return}L[p]||(L[p]={}),L[p][E]=c;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let h=i,f=a;L.core||(L.core={}),L.core[h]=f},set:(i,a,c={})=>{let d=t.get(i),h=Y&&typeof a=="function"?Et(d,a):a;if(Ze&&!Qe(i))return w||console.warn(`[gState] Invalid key: ${i}`),!1;if(!Te(_,i,"write",Q))return z("set",i,!1,"RBAC Denied"),w||console.error(`[gState] RBAC Denied for "${i}"`),!1;let f=Ze?se(h):h,p=r.get(i)||0;B("onBeforeSet",{key:i,value:f,store:C,version:n.get(i)||0});let E=Y&&f!==null&&typeof f=="object"?F(ce(f),!0):f;if(!ae(d,E)){let D=de>0||pe>0?Ve(E):0;if(de>0&&D>de){let K=new Error(`Object size (${D} bytes) exceeds maxObjectSize (${de} bytes)`);b?b(K,{operation:"set",key:i}):w||console.warn(`[gState] ${K.message} for "${i}"`)}if(pe>0){let K=T-p+D;if(K>pe){let rt=new Error(`Total store size (${K} bytes) exceeds limit (${pe} bytes)`);b?b(rt,{operation:"set"}):w||console.warn(`[gState] ${rt.message}`)}}T=T-p+D,r.set(i,D),t.set(i,E),n.set(i,(n.get(i)||0)+1);let A=c.persist??Tt;return A&&(m.set(i,{value:E,options:{...c,persist:A,encoded:c.encoded||e?.encoded}}),G&&clearTimeout(G),G=setTimeout(tt,fe)),B("onSet",{key:i,value:E,store:C,version:n.get(i)}),z("set",i,!0),ee(i),!0}return!1},get:i=>{if(!Te(_,i,"read",Q))return z("get",i,!1,"RBAC Denied"),null;let a=t.get(i);return B("onGet",{store:C,key:i,value:a}),z("get",i,!0),a},compute:(i,a)=>{try{return g.has(i)||(g.set(i,{selector:a,lastValue:null,deps:new Set}),et(i)),g.get(i).lastValue}catch(c){let d=c instanceof Error?c:new Error(String(c));return b?b(d,{operation:"compute",key:i}):w||console.error(`[gState] Compute error for "${i}": `,c),null}},watch:(i,a)=>{l.has(i)||l.set(i,new Set);let c=l.get(i);return c.add(a),()=>{c.delete(a),c.size===0&&l.delete(i)}},remove:i=>{if(!Te(_,i,"delete",Q))return z("delete",i,!1,"RBAC Denied"),!1;let a=t.get(i),c=t.delete(i);return c&&(T-=r.get(i)||0,r.delete(i),B("onRemove",{store:C,key:i,value:a})),n.set(i,(n.get(i)||0)+1),I&&I.removeItem(`${Z()}${i} `),z("delete",i,!0),ee(i),c},delete:i=>C.remove(i),deleteAll:()=>{if(Array.from(t.keys()).forEach(i=>C.remove(i)),I){let i=Z();for(let a=0;a<(I.length||0);a++){let c=I.key(a);c?.startsWith(i)&&(I.removeItem(c),a--)}}return T=0,r.clear(),!0},list:()=>Object.fromEntries(t.entries()),use:i=>{u.add(i)},transaction:i=>{ze=!0,B("onTransaction",{store:C,key:"START"});try{i()}finally{ze=!1,B("onTransaction",{store:C,key:"END"}),Ne&&(Ne=!1,ee())}},destroy:()=>{G&&(clearTimeout(G),G=null),m.clear(),typeof window<"u"&&window.removeEventListener("beforeunload",nt),B("onDestroy",{store:C}),o.clear(),s.clear(),l.clear(),g.clear(),y.clear(),S.clear(),t.clear(),r.clear(),T=0,_.clear(),k.clear(),n.clear(),P.clear(),u.clear()},_addPlugin:i=>{try{S.set(i.name,i),i.hooks?.onInstall?.({store:C})}catch(a){let c=a instanceof Error?a:new Error(String(a));b?b(c,{operation:"plugin:install",key:i.name}):w||console.error(`[gState] Failed to install plugin "${i.name}": `,a)}},_removePlugin:i=>{S.delete(i)},_subscribe:(i,a)=>{if(a){s.has(a)||s.set(a,new Set);let c=s.get(a);return c.add(i),()=>{c.delete(i),c.size===0&&s.delete(a)}}return o.add(i),()=>o.delete(i)},_getVersion:i=>n.get(i)??0,addAccessRule:(i,a)=>Xe(_,i,a),hasPermission:(i,a,c)=>{if(_.size===0)return!0;for(let[d,h]of _){let f;if(typeof d=="function")f=d(i,c);else try{let p=P.get(d);p||(p=new RegExp(d),P.set(d,p)),f=p.test(i)}catch{continue}if(f)return h.includes(a)||h.includes("admin")}return!1},recordConsent:(i,a,c)=>Ye(k,i,a,c),hasConsent:(i,a)=>Ct(k,i,a),getConsents:i=>It(k,i),revokeConsent:(i,a)=>Rt(k,i,a),exportUserData:i=>At(k,i),deleteUserData:i=>Mt(k,i),get plugins(){return L},get isReady(){return ye},get namespace(){return v},get userId(){return Q},whenReady:()=>zt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(i=>{let a=C[i];a&&C._registerMethod("security",i,a)});let nt=()=>{m.size>0&&tt()};return typeof window<"u"&&window.addEventListener("beforeunload",nt),I?(async()=>{try{let a={},c=Z(),d=0;for(let f=0;f<(I.length||0);f++){let p=I.key(f);if(!p||!p.startsWith(c))continue;let E=I.getItem(p);if(E)try{let x=JSON.parse(E),D=p.substring(c.length);if(d=Math.max(d,x._sys_v!==void 0?x._sys_v:x.v||0),x.e&&Date.now()>x.e){I.removeItem(p),f--;continue}let A=x.d;if(x._enc&&ge)A=await Pt(A,ge);else if(typeof A=="string"){if(x._b64)try{A=JSON.parse(atob(A))}catch{}else if(A.startsWith("{")||A.startsWith("["))try{A=JSON.parse(A)}catch{}}a[D]=A,z("hydrate",D,!0)}catch(x){z("hydrate",p,!1,String(x));let D=x instanceof Error?x:new Error(String(x));b?b(D,{operation:"hydration",key:p}):w||console.error(`[gState] Hydration failed for "${p}": `,x)}}let h=d<X&&e?.migrate?e.migrate(a,d):a;Object.entries(h).forEach(([f,p])=>{let E=Y&&p!==null&&typeof p=="object"?F(ce(p),!0):p,x=Ve(E),D=r.get(f)||0;T=T-D+x,r.set(f,x),t.set(f,E),n.set(f,1)}),ye=!0,he(),ee()}catch(a){ye=!0,he();let c=a instanceof Error?a:new Error(String(a));b?b(c,{operation:"hydration"}):w||console.error("[gState] Hydration failed: ",c)}})():(ye=!0,he()),C};import{useSyncExternalStore as Dt,useDebugValue as rn,useMemo as ue}from"react";var j=null,on=e=>{j&&!e?.namespace&&(e?.silent||console.warn("[gState] Store already exists. Pass a unique namespace to create additional stores."));let t=q(e);return j=t,t},sn=()=>{j&&(j.destroy(),j=null)},an=e=>{let t=e||j,n=ue(()=>r=>t?t._subscribe(r):()=>{},[t]);return Dt(n,()=>t?t.isReady:!1,()=>!0)},N=()=>j;var le=(e,t)=>{let n=ue(()=>t||j,[t]),r=ue(()=>{let g=()=>{},y=()=>!1,S=()=>null;return{set:y,get:S,remove:y,delete:y,deleteAll:y,list:()=>({}),compute:S,watch:()=>()=>{},use:g,transaction:g,destroy:g,_subscribe:()=>()=>{},_setSilently:g,_registerMethod:g,_addPlugin:g,_removePlugin:g,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}}}},[]),o=n||r,s=ue(()=>g=>o._subscribe(g,e),[o,e]),u=Dt(s,()=>o.get(e)??void 0,()=>{}),l=ue(()=>(g,y)=>o.set(e,g,y),[o,e]);return rn(u,g=>`${e}: ${JSON.stringify(g)}`),[u,l]};var cn=(e,t)=>{let n=t?.key||"async_data",r=t?.store||q({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 u=await e(),l=r.get(n);r.set(n,{...l||{data:null,loading:!1,error:null,updatedAt:null},data:u,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(u){let l=r.get(n);r.set(n,{...l||{data:null,loading:!1,error:null,updatedAt:null},error:u instanceof Error?u:new Error(String(u)),loading:!1})}}})};var un=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",((t,n)=>e.set(t,n)))}}});var ln=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 u=t[n];return u?(Object.entries(u).forEach(([l,g])=>{s._setSilently(l,g)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;let u=t[n];return u?(Object.entries(u).forEach(([l,g])=>{s._setSilently(l,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 fn=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 dn=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:u})=>{!s||!o||o.send(`SET_${s.toUpperCase()}`,u.list())},onRemove:({key:s,store:u})=>{!s||!o||o.send(`REMOVE_${s.toUpperCase()}`,u.list())}}}};var pn=()=>{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 gn=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 yn=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 hn=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:u,action:l}=o.data;s&&(n=!0,l==="REMOVE"?r.remove(s):r.set(s,u),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 Sn=()=>({name:"gstate-debug-noop",hooks:{}});var mn=(e={})=>{let t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1,o=null,s=()=>new Promise((y,S)=>{if(o)return y(o);let m=indexedDB.open(t,r);m.onerror=()=>S(m.error),m.onsuccess=()=>{o=m.result,y(o)},m.onupgradeneeded=P=>{let _=P.target.result;_.objectStoreNames.contains(n)||_.createObjectStore(n)}}),u=async(y,S)=>{let m=await s();return new Promise((P,_)=>{let w=m.transaction(n,"readwrite").objectStore(n).put(S,y);w.onsuccess=()=>P(),w.onerror=()=>_(w.error)})},l=async y=>{let S=await s();return new Promise((m,P)=>{let v=S.transaction(n,"readonly").objectStore(n).get(y);v.onsuccess=()=>m(v.result),v.onerror=()=>P(v.error)})},g=async y=>{let S=await s();return new Promise((m,P)=>{let v=S.transaction(n,"readwrite").objectStore(n).delete(y);v.onsuccess=()=>m(),v.onerror=()=>P(v.error)})};return{name:"indexedDB",hooks:{onInstall:({store:y})=>{y._registerMethod("indexedDB","clear",async()=>{(await s()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:y})=>{let _=(await s()).transaction(n,"readonly").objectStore(n).getAllKeys();_.onsuccess=async()=>{let k=_.result,v=y.namespace+"_";for(let w of k)if(w.startsWith(v)){let fe=await l(w);if(fe){let X=w.substring(v.length);y._setSilently(X,fe.d)}}}},onSet:async({key:y,value:S,store:m})=>{if(!y)return;let P=m.namespace+"_",_={d:S,t:Date.now(),v:m._getVersion?.(y)||1};await u(`${P}${y}`,_)},onRemove:async({key:y,store:S})=>{if(!y)return;let m=S.namespace+"_";await g(`${m}${y}`)}}}};var _n=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:u})=>{u._registerMethod("cloudSync","sync",async()=>{let l=performance.now(),g={},y=0;try{let S=u.list(),m=Object.keys(S);for(let _ of m){let k=u._getVersion?.(_)||0,v=r.get(_)||0;if(k>v){let w=S[_];g[_]=w,y+=JSON.stringify(w).length,r.set(_,k)}}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+=y,o.syncCount++,o.lastDuration=performance.now()-l,e.onSync&&e.onSync(o),{status:"success",stats:o};throw new Error(`Adapter ${t.name} failed to save.`)}catch(S){return o.errors++,console.error(`[gState] Cloud Sync Failed (${t.name}):`,S),{status:"error",error:String(S),stats:o}}}),u._registerMethod("cloudSync","getStats",()=>o),n&&n>0&&(s=setInterval(()=>{let g=u.plugins.cloudSync;g&&g.sync()},n))},onDestroy:()=>{s&&clearInterval(s)}}}},wn=(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}),bn=(e,t)=>({name:"Firebase-Firestore",save:async n=>{try{return((...s)=>{})("[Mock] Firestore Syncing:",n),!0}catch{return!1}}}),En=(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 Gn=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 ar=(e,t)=>{let r=q(typeof t=="string"?{namespace:t}:t);e&&Object.entries(e).forEach(([s,u])=>{r.get(s)===null&&r._setSilently(s,u)});let o=s=>le(s,r);return typeof window<"u"&&(window.gState=r,window.rgs=r),Object.assign(o,r)};var cr=(e,t)=>N()?.addAccessRule(e,t),ur=(e,t,n)=>N()?.hasPermission(e,t,n)??!0,lr=(e,t,n)=>{let r=N();if(!r)throw new Error("[gState] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},fr=(e,t)=>N()?.hasConsent(e,t)??!1,dr=e=>N()?.getConsents(e)??[],pr=(e,t)=>N()?.revokeConsent(e,t),gr=e=>{let t=N();if(!t)throw new Error("[gState] exportUserData failed: No store found.");return t.exportUserData(e)},yr=e=>{let t=N();if(!t)throw new Error("[gState] deleteUserData failed: No store found.");return t.deleteUserData(e)},hr=()=>{},Sr=()=>{};export{cr as addAccessRule,yn as analyticsPlugin,hr as clearAccessRules,Sr as clearAllConsents,_n as cloudSyncPlugin,cn as createAsyncStore,bn as createFirestoreAdapter,wn as createMongoAdapter,En as createSqlRestAdapter,q as createStore,Sn as debugPlugin,yr as deleteUserData,sn as destroyState,dn as devToolsPlugin,Yt as exportKey,gr as exportUserData,Qt as generateEncryptionKey,dr as getConsents,N as getStore,ar as gstate,gn as guardPlugin,fr as hasConsent,ur as hasPermission,un as immerPlugin,Zt as importKey,mn as indexedDBPlugin,on as initState,xt as isCryptoAvailable,ie as logAudit,Gn as loggerPlugin,lr as recordConsent,pr as revokeConsent,se as sanitizeValue,fn as schemaPlugin,en as setAuditLogger,pn as snapshotPlugin,hn as syncPlugin,ln as undoRedoPlugin,le as useGState,an as useIsStoreReady,le as useSimpleState,le as useStore,Qe as validateKey};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@biglogic/rgs",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "Argis (RGS) - React Globo State: A react state everywhere made easy",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"react-globo-state",
|
|
18
18
|
"argis"
|
|
19
19
|
],
|
|
20
|
-
"homepage": "https://
|
|
20
|
+
"homepage": "https://github.com/BigLogic-ca/rgs",
|
|
21
21
|
"bugs": {
|
|
22
22
|
"url": "https://github.com/BigLogic-ca/rgs/issues"
|
|
23
23
|
},
|
|
@@ -40,11 +40,14 @@
|
|
|
40
40
|
".": "./index.js"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
|
-
"build": "tsc --emitDeclarationOnly --outDir dist && node ./esbuild.config.mjs && npm run build:extension",
|
|
43
|
+
"build": "rm -rf dist && tsc --emitDeclarationOnly --outDir dist && node ./esbuild.config.mjs && npm run build:extension",
|
|
44
|
+
"build:watch": "node ./esbuild.config.mjs --watch",
|
|
44
45
|
"build:extension": "cd vscode-extension && vsce package -o ../dist/rgs-extension.vsix",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
46
|
+
"dev": "npm run build:watch",
|
|
47
|
+
"lint": "cd tests && npm run lint",
|
|
48
|
+
"tsc": "tsc --noEmit",
|
|
49
|
+
"npm:pack": "npm run build && cd dist && npm pack",
|
|
50
|
+
"npm:publish": "npm run build && npm run build:extension && cd dist && npm publish --access=public"
|
|
48
51
|
},
|
|
49
52
|
"dependencies": {
|
|
50
53
|
"immer": "^11.1.4"
|
|
@@ -53,32 +56,27 @@
|
|
|
53
56
|
"react": ">=16.8.0",
|
|
54
57
|
"react-dom": ">=16.8.0"
|
|
55
58
|
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"react": {
|
|
61
|
+
"optional": false
|
|
62
|
+
},
|
|
63
|
+
"react-dom": {
|
|
64
|
+
"optional": false
|
|
65
|
+
}
|
|
66
|
+
},
|
|
56
67
|
"devDependencies": {
|
|
57
|
-
"@eslint/js": "10.0.1",
|
|
58
|
-
"@playwright/test": "1.58.2",
|
|
59
|
-
"@testing-library/dom": "10.4.1",
|
|
60
|
-
"@testing-library/jest-dom": "6.9.1",
|
|
61
|
-
"@testing-library/react": "16.3.2",
|
|
62
68
|
"@types/jest": "30.0.0",
|
|
63
|
-
"@types/node": "25.2.3",
|
|
64
|
-
"@types/react": "19.2.14",
|
|
65
|
-
"@types/react-dom": "19.2.3",
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"esbuild": "0.27.3",
|
|
70
|
-
"esbuild-plugin-copy": "2.1.1",
|
|
71
|
-
"eslint": "^10.0.0",
|
|
72
|
-
"eslint-plugin-react": "7.37.5",
|
|
73
|
-
"eslint-plugin-react-hooks": "7.0.1",
|
|
74
|
-
"globals": "17.3.0",
|
|
75
|
-
"jest": "30.2.0",
|
|
69
|
+
"@types/node": "^25.2.3",
|
|
70
|
+
"@types/react": "^19.2.14",
|
|
71
|
+
"@types/react-dom": "^19.2.3",
|
|
72
|
+
"dphelper": "^2.6.4",
|
|
73
|
+
"esbuild": "^0.27.3",
|
|
74
|
+
"esbuild-plugin-copy": "^2.1.1",
|
|
76
75
|
"jest-environment-jsdom": "30.2.0",
|
|
77
|
-
"react": "19.2.4",
|
|
78
|
-
"react-dom": "19.2.4",
|
|
76
|
+
"react": "^19.2.4",
|
|
77
|
+
"react-dom": "^19.2.4",
|
|
79
78
|
"ts-jest": "29.4.6",
|
|
80
79
|
"tslib": "^2.8.1",
|
|
81
|
-
"typescript": "^5.9.3"
|
|
82
|
-
"typescript-eslint": "8.56.0"
|
|
80
|
+
"typescript": "^5.9.3"
|
|
83
81
|
}
|
|
84
82
|
}
|
package/rgs-extension.vsix
CHANGED
|
Binary file
|
package/examples/README.md
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
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.
|
|
@@ -1,12 +0,0 @@
|
|
|
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 {};
|
|
@@ -1,30 +0,0 @@
|
|
|
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
|
-
export const fetchUser = async (args: { id: string }) => {
|
|
15
|
-
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${args.id}`)
|
|
16
|
-
if (!response.ok) throw new Error('User not found')
|
|
17
|
-
return response.json() as Promise<User>
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Basic Async Store for a specific user (Example)
|
|
21
|
-
export const useUser = createAsyncStore<User>(() => fetchUser({ id: '1' }), {
|
|
22
|
-
key: 'userData'
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Usage in component:
|
|
27
|
-
*
|
|
28
|
-
* const [state, actions] = useUser()
|
|
29
|
-
* useEffect(() => { actions.execute({ id: '1' }) }, [])
|
|
30
|
-
*/
|
|
@@ -1,22 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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;
|
|
@@ -1,25 +0,0 @@
|
|
|
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
|
-
useCounter.set('count', (d) => d + 1)
|
|
19
|
-
useCounter.set('lastUpdated', new Date().toISOString())
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const decrement = () => {
|
|
23
|
-
useCounter.set('count', (d) => d - 1)
|
|
24
|
-
useCounter.set('lastUpdated', new Date().toISOString())
|
|
25
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
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>;
|