@biglogic/rgs 3.1.0 → 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.
Files changed (77) hide show
  1. package/README.md +14 -0
  2. package/advanced.js +1 -1
  3. package/index.js +1 -1
  4. package/package.json +8 -3
  5. package/rgs-extension.vsix +0 -0
  6. package/core/advanced.js +0 -4
  7. package/core/async.js +0 -40
  8. package/core/hooks.js +0 -52
  9. package/core/security.js +0 -124
  10. package/core/store.js +0 -595
  11. package/core/types.js +0 -5
  12. package/core/utils.js +0 -72
  13. package/examples/README.md +0 -41
  14. package/examples/async-data-fetch/UserLoader.d.ts +0 -12
  15. package/examples/async-data-fetch/UserLoader.js +0 -10
  16. package/examples/async-data-fetch/UserLoader.ts +0 -30
  17. package/examples/basic-counter/CounterComponent.d.ts +0 -2
  18. package/examples/basic-counter/CounterComponent.js +0 -7
  19. package/examples/basic-counter/CounterComponent.tsx +0 -22
  20. package/examples/basic-counter/CounterStore.d.ts +0 -7
  21. package/examples/basic-counter/CounterStore.js +0 -13
  22. package/examples/basic-counter/CounterStore.ts +0 -25
  23. package/examples/big-data-indexeddb/BigDataStore.d.ts +0 -10
  24. package/examples/big-data-indexeddb/BigDataStore.js +0 -32
  25. package/examples/big-data-indexeddb/BigDataStore.ts +0 -60
  26. package/examples/global-theme/ThemeManager.d.ts +0 -7
  27. package/examples/global-theme/ThemeManager.js +0 -13
  28. package/examples/global-theme/ThemeManager.ts +0 -32
  29. package/examples/hybrid-cloud-sync/HybridStore.d.ts +0 -19
  30. package/examples/hybrid-cloud-sync/HybridStore.js +0 -44
  31. package/examples/hybrid-cloud-sync/HybridStore.ts +0 -78
  32. package/examples/persistent-cart/CartStore.d.ts +0 -13
  33. package/examples/persistent-cart/CartStore.js +0 -23
  34. package/examples/persistent-cart/CartStore.ts +0 -41
  35. package/examples/rbac-dashboard/DashboardStore.d.ts +0 -47
  36. package/examples/rbac-dashboard/DashboardStore.js +0 -31
  37. package/examples/rbac-dashboard/DashboardStore.ts +0 -46
  38. package/examples/secure-auth/AuthStore.d.ts +0 -14
  39. package/examples/secure-auth/AuthStore.js +0 -20
  40. package/examples/secure-auth/AuthStore.ts +0 -36
  41. package/examples/security-best-practices/SecurityStore.d.ts +0 -22
  42. package/examples/security-best-practices/SecurityStore.js +0 -30
  43. package/examples/security-best-practices/SecurityStore.ts +0 -75
  44. package/examples/stress-tests/StressStore.d.ts +0 -41
  45. package/examples/stress-tests/StressStore.js +0 -41
  46. package/examples/stress-tests/StressStore.ts +0 -61
  47. package/examples/super-easy/EasyStore.d.ts +0 -44
  48. package/examples/super-easy/EasyStore.js +0 -24
  49. package/examples/super-easy/EasyStore.ts +0 -61
  50. package/examples/undo-redo-editor/EditorStore.d.ts +0 -9
  51. package/examples/undo-redo-editor/EditorStore.js +0 -13
  52. package/examples/undo-redo-editor/EditorStore.ts +0 -28
  53. package/markdown/SUMMARY.md +0 -59
  54. package/markdown/api.md +0 -381
  55. package/markdown/chapters/01-philosophy.md +0 -54
  56. package/markdown/chapters/02-getting-started.md +0 -68
  57. package/markdown/chapters/03-the-magnetar-way.md +0 -69
  58. package/markdown/chapters/04-persistence-and-safety.md +0 -125
  59. package/markdown/chapters/05-plugin-sdk.md +0 -290
  60. package/markdown/chapters/05-plugins-and-extensibility.md +0 -190
  61. package/markdown/chapters/06-case-studies.md +0 -69
  62. package/markdown/chapters/07-faq.md +0 -53
  63. package/markdown/chapters/08-migration-guide.md +0 -253
  64. package/markdown/chapters/09-security-architecture.md +0 -40
  65. package/plugins/index.js +0 -34
  66. package/plugins/official/analytics.plugin.js +0 -19
  67. package/plugins/official/cloud-sync.plugin.js +0 -117
  68. package/plugins/official/debug.plugin.js +0 -62
  69. package/plugins/official/devtools.plugin.js +0 -28
  70. package/plugins/official/guard.plugin.js +0 -15
  71. package/plugins/official/immer.plugin.js +0 -10
  72. package/plugins/official/indexeddb.plugin.js +0 -102
  73. package/plugins/official/schema.plugin.js +0 -16
  74. package/plugins/official/snapshot.plugin.js +0 -27
  75. package/plugins/official/sync.plugin.js +0 -37
  76. package/plugins/official/undo-redo.plugin.js +0 -61
  77. package/tsconfig.tsbuildinfo +0 -1
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 d=s[a],_=n[d];_[le]===!1&&(_[le]=!0,_[Ne]=!0),(_.get||_.set)&&(n[d]={[Ne]:!0,[le]:!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 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 d=e.draftLocations_.get(t)??Lt;for(let _ of d)_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 d=He(a);Ct(e,a.draft_??a,d,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 d=He(s);Ct(e,r,d,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 d=He(a);_e(e,n,d,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:d,proxy:_}=Proxy.revocable(s,a);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(!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 d=e.type_===1?+t:t,_=Be(e.scope_,a,e,d);return e.copy_[d]=_}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 d=this;return function(y=a,...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 a=gt(this),d=Be(a,t,void 0),_=!0;try{s=r(d),_=!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=[],d=[];j(je).generateReplacementPatches_(t,s,{patches_:a,inversePatches_:d}),n(a,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=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),d=>d.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 d;if(typeof s=="function")d=s(t,n);else try{d=new RegExp(s).test(t)}catch{continue}if(d)return a.includes(r)||a.includes("admin")}return!1},Z=e=>{if(typeof e=="string")return e.replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/javascript:/gi,"[SEC-REMOVED]").replace(/data:/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 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 a=[...Object.keys(n),...Object.getOwnPropertySymbols(n)];for(let d of a)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 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,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(),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 f=u;if(p.has(f))continue;if(p.add(f),Array.isArray(f))for(let h=0;h<f.length;h++)l.push(f[h]);else for(let h of Object.keys(f))c+=h.length*2,l.push(f[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(f){let h=f instanceof Error?f:new Error(String(f));g?g(h,{operation:"watcher",key:o}):E||console.error(`[gState] Watcher error for "${o}":`,f)}}let l=a.get(o);if(l)for(let p of l)try{p()}catch(u){let f=u instanceof Error?u:new Error(String(u));g?g(f,{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 f=S.get(u);f&&(f.delete(o),f.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)=>{let l=f=>f==="__proto__"||f==="constructor"||f==="prototype";if(c!==void 0){let f=o,h=i;if(l(f)||l(h)){console.warn("[gState] Refusing to register method with unsafe key:",f,h);return}F[f]||(F[f]={}),F[f][h]=c;return}console.warn("[gState] _registerMethod(name, fn) is deprecated. Use _registerMethod(pluginName, methodName, fn) instead.");let p=o,u=i;F.core||(F.core={}),F.core[p]=u},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,f=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-f+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-f+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=>{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(),a.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(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 f=Re.get(l);f||(f=new RegExp(l),Re.set(l,f)),u=f.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 f=C.key(u);if(!f||!f.startsWith(c))continue;let h=C.getItem(f);if(h)try{let m=JSON.parse(h),A=f.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(f),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",f,!1,String(m));let A=m instanceof Error?m:new Error(String(m));g?g(A,{operation:"hydration",key:f}):E||console.error(`[gState] Hydration failed for "${f}": `,m)}}let p=l<ke&&e?.migrate?e.migrate(i,l):i;Object.entries(p).forEach(([u,f])=>{let h=H&&f!==null&&typeof f=="object"?T(ne(f),!0):f,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(/&amp;#x([0-9a-fA-F]+);?/i);if(s&&s[1])return String.fromCharCode(parseInt(s[1],16));let i=n.match(/&amp;#([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],l=r[u];l[me]===!1&&(l[me]=!0,l[je]=!0),(l.get||l.set)&&(r[u]={[je]:!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 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 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,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:l}=Proxy.revocable(o,i);return r.draft_=l,r.revoke_=u,[l,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,l=Je(e.scope_,i,e,u);return e.copy_[u]=l}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(g=i,...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 i=lt(this),u=Je(i,t,void 0),l=!0;try{o=n(u),l=!1}finally{l?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,...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,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(g){g.mapSetPlugin_?.fixSetContents(i);let{patchPlugin_:y}=g;i.modified_&&y&&y.generatePatches_(i,[],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,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[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/javascript:/gi,"[SEC-REMOVED]").replace(/data:/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((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 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,l=new Map,g=new Map,y=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 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=()=>`${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 f=h instanceof Error?h:new Error(String(h));b?b(f,{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=y.get(s);if(a)for(let h of a)et(h);let c=l.get(s);if(c){let h=C.get(s);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:s}):w||console.error(`[gState] Watcher error for "${s}":`,p)}}let d=i.get(s);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:s}):w||console.error(`[gState] Listener error for "${s}":`,f)}}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=g.get(s),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(s),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(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,f)=>{a[f]=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)=>{let d=p=>p==="__proto__"||p==="constructor"||p==="prototype";if(c!==void 0){let p=s,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=s,f=a;L.core||(L.core={}),L.core[h]=f},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 f=Ze?se(h):h,p=r.get(s)||0;B("onBeforeSet",{key:s,value:f,store:C,version:n.get(s)||0});let E=Y&&f!==null&&typeof f=="object"?j(ce(f),!0):f;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-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(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 g.has(s)||(g.set(s,{selector:a,lastValue:null,deps:new Set}),et(s)),g.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)=>{l.has(s)||l.set(s,new Set);let c=l.get(s);return c.add(a),()=>{c.delete(a),c.size===0&&l.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(),l.clear(),g.clear(),y.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 f;if(typeof d=="function")f=d(s,c);else try{let p=v.get(d);p||(p=new RegExp(d),v.set(d,p)),f=p.test(s)}catch{continue}if(f)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 f=0;f<(A.length||0);f++){let p=A.key(f);if(!p||!p.startsWith(c))continue;let E=A.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){A.removeItem(p),f--;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",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"?j(ce(p),!0):p,x=Ne(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 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 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,i=ue(()=>g=>o._subscribe(g,e),[o,e]),u=Dt(i,()=>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 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(),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: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(([l,g])=>{i._setSilently(l,g)}),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(([l,g])=>{i._setSilently(l,g)}),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:l}=o.data;i&&(n=!0,l==="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((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=v=>{let _=v.target.result;_.objectStoreNames.contains(n)||_.createObjectStore(n)}}),u=async(y,S)=>{let m=await i();return new Promise((v,_)=>{let w=m.transaction(n,"readwrite").objectStore(n).put(S,y);w.onsuccess=()=>v(),w.onerror=()=>_(w.error)})},l=async y=>{let S=await i();return new Promise((m,v)=>{let P=S.transaction(n,"readonly").objectStore(n).get(y);P.onsuccess=()=>m(P.result),P.onerror=()=>v(P.error)})},g=async y=>{let S=await i();return new Promise((m,v)=>{let P=S.transaction(n,"readwrite").objectStore(n).delete(y);P.onsuccess=()=>m(),P.onerror=()=>v(P.error)})};return{name:"indexedDB",hooks:{onInstall:({store:y})=>{y._registerMethod("indexedDB","clear",async()=>{(await i()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:y})=>{let _=(await i()).transaction(n,"readonly").objectStore(n).getAllKeys();_.onsuccess=async()=>{let k=_.result,P=y.namespace+"_";for(let w of k)if(w.startsWith(P)){let fe=await l(w);if(fe){let X=w.substring(P.length);y._setSilently(X,fe.d)}}}},onSet:async({key:y,value:S,store:m})=>{if(!y)return;let v=m.namespace+"_",_={d:S,t:Date.now(),v:m._getVersion?.(y)||1};await u(`${v}${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},i=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,P=r.get(_)||0;if(k>P){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&&(i=setInterval(()=>{let g=u.plugins.cloudSync;g&&g.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 ar=(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 cr=(e,t)=>V()?.addAccessRule(e,t),ur=(e,t,n)=>V()?.hasPermission(e,t,n)??!0,lr=(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)},fr=(e,t)=>V()?.hasConsent(e,t)??!1,dr=e=>V()?.getConsents(e)??[],pr=(e,t)=>V()?.revokeConsent(e,t),gr=e=>{let t=V();if(!t)throw new Error("[gState] exportUserData failed: No store found.");return t.exportUserData(e)},yr=e=>{let t=V();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,V 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};
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(/&amp;#x([0-9a-fA-F]+);?/i);if(o&&o[1])return String.fromCharCode(parseInt(o[1],16));let s=r.match(/&amp;#([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.1.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": [
@@ -40,10 +40,12 @@
40
40
  ".": "./index.js"
41
41
  },
42
42
  "scripts": {
43
- "build": "tsc --emitDeclarationOnly --outDir dist && node ./esbuild.config.mjs && npm run build:extension",
44
- "build:extension": "cd vscode-extension && vsce package -o ../dist/rgs-extension.vsix",
43
+ "build": "rm -rf dist && tsc --emitDeclarationOnly --outDir dist && node ./esbuild.config.mjs && npm run build:extension",
45
44
  "build:watch": "node ./esbuild.config.mjs --watch",
45
+ "build:extension": "cd vscode-extension && vsce package -o ../dist/rgs-extension.vsix",
46
46
  "dev": "npm run build:watch",
47
+ "lint": "cd tests && npm run lint",
48
+ "tsc": "tsc --noEmit",
47
49
  "npm:pack": "npm run build && cd dist && npm pack",
48
50
  "npm:publish": "npm run build && npm run build:extension && cd dist && npm publish --access=public"
49
51
  },
@@ -63,14 +65,17 @@
63
65
  }
64
66
  },
65
67
  "devDependencies": {
68
+ "@types/jest": "30.0.0",
66
69
  "@types/node": "^25.2.3",
67
70
  "@types/react": "^19.2.14",
68
71
  "@types/react-dom": "^19.2.3",
69
72
  "dphelper": "^2.6.4",
70
73
  "esbuild": "^0.27.3",
71
74
  "esbuild-plugin-copy": "^2.1.1",
75
+ "jest-environment-jsdom": "30.2.0",
72
76
  "react": "^19.2.4",
73
77
  "react-dom": "^19.2.4",
78
+ "ts-jest": "29.4.6",
74
79
  "tslib": "^2.8.1",
75
80
  "typescript": "^5.9.3"
76
81
  }
Binary file
package/core/advanced.js DELETED
@@ -1,4 +0,0 @@
1
- export { createAsyncStore } from "./async";
2
- export { StorageAdapters } from "./store";
3
- export { syncPlugin as SyncPlugin } from "../plugins/official/sync.plugin";
4
- export { analyticsPlugin as AnalyticsPlugin } from "../plugins/official/analytics.plugin";
package/core/async.js DELETED
@@ -1,40 +0,0 @@
1
- import { createStore } from "./store";
2
- export const createAsyncStore = (resolver, options) => {
3
- const key = options?.key || 'async_data';
4
- const store = options?.store || createStore({
5
- namespace: `async_${key}`,
6
- silent: true
7
- });
8
- if (store.get(key) == null) {
9
- store.set(key, { data: null, loading: false, error: null, updatedAt: null });
10
- }
11
- const run = async () => {
12
- const current = store.get(key);
13
- store.set(key, {
14
- ...(current || { data: null, loading: false, error: null, updatedAt: null }),
15
- loading: true,
16
- error: null
17
- });
18
- if ('whenReady' in store && !store.isReady)
19
- await store.whenReady();
20
- try {
21
- const result = await resolver();
22
- const prev = store.get(key);
23
- store.set(key, {
24
- ...(prev || { data: null, loading: false, error: null, updatedAt: null }),
25
- data: result,
26
- loading: false,
27
- updatedAt: Date.now()
28
- }, { persist: options?.persist });
29
- }
30
- catch (e) {
31
- const prev = store.get(key);
32
- store.set(key, {
33
- ...(prev || { data: null, loading: false, error: null, updatedAt: null }),
34
- error: e instanceof Error ? e : new Error(String(e)),
35
- loading: false
36
- });
37
- }
38
- };
39
- return Object.assign(store, { execute: run });
40
- };
package/core/hooks.js DELETED
@@ -1,52 +0,0 @@
1
- import { useSyncExternalStore, useDebugValue, useMemo } from "react";
2
- import { createStore } from "./store";
3
- let _defaultStore = null;
4
- export const initState = (config) => {
5
- if (_defaultStore && !config?.namespace) {
6
- if (!config?.silent) {
7
- console.warn("[gState] Store already exists. Pass a unique namespace to create additional stores.");
8
- }
9
- }
10
- const store = createStore(config);
11
- _defaultStore = store;
12
- return store;
13
- };
14
- export const destroyState = () => {
15
- if (_defaultStore) {
16
- _defaultStore.destroy();
17
- _defaultStore = null;
18
- }
19
- };
20
- export const useIsStoreReady = (store) => {
21
- const targetStore = store || _defaultStore;
22
- const subscribe = useMemo(() => (callback) => targetStore ? targetStore._subscribe(callback) : () => { }, [targetStore]);
23
- return useSyncExternalStore(subscribe, () => targetStore ? targetStore.isReady : false, () => true);
24
- };
25
- export const getStore = () => _defaultStore;
26
- const _isServer = () => typeof window === 'undefined' ||
27
- typeof window.document === 'undefined';
28
- export const useStore = (key, store) => {
29
- const targetStore = useMemo(() => (store || _defaultStore), [store]);
30
- const ghostStore = useMemo(() => {
31
- const noop = () => { };
32
- const noopFalse = () => false;
33
- const noopNull = () => null;
34
- return {
35
- set: noopFalse, get: noopNull, remove: noopFalse, delete: noopFalse,
36
- deleteAll: noopFalse, list: () => ({}), compute: noopNull,
37
- watch: () => () => { }, use: noop, transaction: noop, destroy: noop,
38
- _subscribe: () => () => { }, _setSilently: noop, _registerMethod: noop,
39
- _addPlugin: noop, _removePlugin: noop, _getVersion: () => 0,
40
- get isReady() { return false; }, whenReady: () => Promise.resolve(),
41
- get plugins() { return {}; }
42
- };
43
- }, []);
44
- const safeStore = targetStore || ghostStore;
45
- const subscribe = useMemo(() => (callback) => safeStore._subscribe(callback, key), [safeStore, key]);
46
- const value = useSyncExternalStore(subscribe, () => safeStore.get(key) ?? undefined, () => undefined);
47
- const setter = useMemo(() => (val, options) => safeStore.set(key, val, options), [safeStore, key]);
48
- useDebugValue(value, v => `${key}: ${JSON.stringify(v)}`);
49
- return [value, setter];
50
- };
51
- export const useGState = useStore;
52
- export const useSimpleState = useStore;
package/core/security.js DELETED
@@ -1,124 +0,0 @@
1
- export const isCryptoAvailable = typeof crypto !== 'undefined' &&
2
- typeof crypto.subtle !== 'undefined' &&
3
- typeof crypto.subtle.generateKey === 'function';
4
- export const generateEncryptionKey = async () => {
5
- if (!isCryptoAvailable)
6
- throw new Error('Web Crypto API not available');
7
- const key = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']), iv = crypto.getRandomValues(new Uint8Array(12));
8
- return { key, iv };
9
- };
10
- export const exportKey = async (encryptionKey) => {
11
- const exportedKey = await crypto.subtle.exportKey('raw', encryptionKey.key);
12
- return {
13
- key: btoa(String.fromCharCode(...new Uint8Array(exportedKey))),
14
- iv: btoa(String.fromCharCode(...encryptionKey.iv))
15
- };
16
- };
17
- export const importKey = async (keyData, ivData) => {
18
- const keyBytes = Uint8Array.from(atob(keyData), c => c.charCodeAt(0)), ivBytes = Uint8Array.from(atob(ivData), c => c.charCodeAt(0)), key = await crypto.subtle.importKey('raw', keyBytes, { name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
19
- return { key, iv: ivBytes };
20
- };
21
- export const encrypt = async (data, encryptionKey) => {
22
- const encoder = new TextEncoder(), encoded = encoder.encode(JSON.stringify(data)), encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: encryptionKey.iv }, encryptionKey.key, encoded), combined = new Uint8Array(encryptionKey.iv.length + encrypted.byteLength);
23
- combined.set(encryptionKey.iv);
24
- combined.set(new Uint8Array(encrypted), encryptionKey.iv.length);
25
- return btoa(String.fromCharCode(...combined));
26
- };
27
- export const decrypt = async (encryptedData, encryptionKey) => {
28
- const combined = Uint8Array.from(atob(encryptedData), c => c.charCodeAt(0)), iv = combined.slice(0, 12), ciphertext = combined.slice(12), decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: iv }, encryptionKey.key, ciphertext);
29
- return JSON.parse(new TextDecoder().decode(decrypted));
30
- };
31
- let _auditLogger = null;
32
- export const setAuditLogger = (logger) => { _auditLogger = logger; };
33
- export const isAuditActive = () => _auditLogger !== null;
34
- export const logAudit = (entry) => { if (_auditLogger)
35
- _auditLogger(entry); };
36
- export const addAccessRule = (rules, pattern, perms) => {
37
- rules.set(pattern instanceof RegExp ? pattern.source : pattern, perms);
38
- };
39
- export const hasPermission = (rules, key, action, _userId) => {
40
- if (rules.size === 0)
41
- return true;
42
- for (const [pattern, perms] of rules) {
43
- let matches;
44
- if (typeof pattern === 'function') {
45
- matches = pattern(key, _userId);
46
- }
47
- else {
48
- try {
49
- matches = new RegExp(pattern).test(key);
50
- }
51
- catch {
52
- continue;
53
- }
54
- }
55
- if (matches) {
56
- return perms.includes(action) || perms.includes('admin');
57
- }
58
- }
59
- return false;
60
- };
61
- export const sanitizeValue = (value) => {
62
- if (typeof value === 'string') {
63
- return value
64
- .replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '[SEC-REMOVED]')
65
- .replace(/javascript:/gi, '[SEC-REMOVED]')
66
- .replace(/data:text\/html/gi, '[SEC-REMOVED]')
67
- .replace(/vbscript:/gi, '[SEC-REMOVED]')
68
- .replace(/on\w+\s*=/gi, '[SEC-REMOVED]=')
69
- .replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, '[SEC-REMOVED]')
70
- .replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi, '[SEC-REMOVED]')
71
- .replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi, '[SEC-REMOVED]')
72
- .replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi, '[SEC-REMOVED]')
73
- .replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi, '[SEC-REMOVED]')
74
- .replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi, '[SEC-REMOVED]')
75
- .replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi, '[SEC-REMOVED]')
76
- .replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi, '[SEC-REMOVED]')
77
- .replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, '[SEC-REMOVED]')
78
- .replace(/&#[xX]?[0-9a-fA-F]+;?/g, '');
79
- }
80
- if (value && typeof value === 'object' && !Array.isArray(value)) {
81
- if (Object.getPrototypeOf(value) === Object.prototype) {
82
- const sanitized = {};
83
- for (const [k, v] of Object.entries(value)) {
84
- sanitized[k] = sanitizeValue(v);
85
- }
86
- return sanitized;
87
- }
88
- return value;
89
- }
90
- if (Array.isArray(value)) {
91
- return value.map(v => sanitizeValue(v));
92
- }
93
- return value;
94
- };
95
- export const validateKey = (key) => /^[a-zA-Z0-9_.-]+$/.test(key) && key.length <= 256;
96
- export const recordConsent = (consents, userId, purpose, granted) => {
97
- const record = { id: crypto.randomUUID(), purpose, granted, timestamp: Date.now() }, user = consents.get(userId) || [];
98
- user.push(record);
99
- consents.set(userId, user);
100
- logAudit({ timestamp: Date.now(), action: 'set', key: `consent:${purpose}`, userId, success: true });
101
- return record;
102
- };
103
- export const hasConsent = (consents, userId, purpose) => {
104
- const userConsents = consents.get(userId);
105
- if (!userConsents)
106
- return false;
107
- for (let i = userConsents.length - 1; i >= 0; i--) {
108
- const record = userConsents[i];
109
- if (record && record.purpose === purpose) {
110
- return record.granted;
111
- }
112
- }
113
- return false;
114
- };
115
- export const revokeConsent = (consents, userId, purpose) => {
116
- return recordConsent(consents, userId, purpose, false);
117
- };
118
- export const getConsents = (consents, userId) => consents.get(userId) || [];
119
- export const exportUserData = (consents, userId) => ({ userId, exportedAt: Date.now(), consents: consents.get(userId) || [] });
120
- export const deleteUserData = (consents, userId) => {
121
- const count = consents.get(userId)?.length || 0;
122
- consents.delete(userId);
123
- return { success: true, deletedConsents: count };
124
- };