@biglogic/rgs 3.9.1 → 3.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -1 +1,1390 @@
1
- import{useMemo as e,useSyncExternalStore as t,useCallback as n,useDebugValue as r,useState as s,useEffect as o}from"react";var a=Symbol.for("immer-nothing"),i=Symbol.for("immer-draftable"),c=Symbol.for("immer-state"),l=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}];function u(e,...t){{const n=l[e],r=T(n)?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}}var d=Object,f=d.getPrototypeOf,y="constructor",p="prototype",h="configurable",g="enumerable",m="writable",_="value",S=e=>!!e&&!!e[c];function w(e){return!!e&&(k(e)||M(e)||!!e[i]||!!e[y]?.[i]||R(e)||j(e))}var b=d[p][y].toString(),v=new WeakMap;function k(e){if(!e||!P(e))return!1;const t=f(e);if(null===t||t===d[p])return!0;const n=d.hasOwnProperty.call(t,y)&&t[y];if(n===Object)return!0;if(!T(n))return!1;let r=v.get(n);return void 0===r&&(r=Function.toString.call(n),v.set(n,r)),r===b}function E(e,t,n=!0){if(0===C(e)){(n?Reflect.ownKeys(e):d.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function C(e){const t=e[c];return t?t.type_:M(e)?1:R(e)?2:j(e)?3:0}var O=(e,t,n=C(e))=>2===n?e.has(t):d[p].hasOwnProperty.call(e,t),D=(e,t,n=C(e))=>2===n?e.get(t):e[t],A=(e,t,n,r=C(e))=>{2===r?e.set(t,n):3===r?e.add(n):e[t]=n};var M=Array.isArray,R=e=>e instanceof Map,j=e=>e instanceof Set,P=e=>"object"==typeof e,T=e=>"function"==typeof e,I=e=>"boolean"==typeof e;var z=e=>e.copy_||e.base_,V=e=>e.modified_?e.copy_:e.base_;function $(e,t){if(R(e))return new Map(e);if(j(e))return new Set(e);if(M(e))return Array[p].slice.call(e);const n=k(e);if(!0===t||"class_only"===t&&!n){const t=d.getOwnPropertyDescriptors(e);delete t[c];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const s=n[r],o=t[s];!1===o[m]&&(o[m]=!0,o[h]=!0),(o.get||o.set)&&(t[s]={[h]:!0,[m]:!0,[g]:o[g],[_]:e[s]})}return d.create(f(e),t)}{const t=f(e);if(null!==t&&n)return{...e};const r=d.create(t);return d.assign(r,e)}}function x(e,t=!1){return N(e)||S(e)||!w(e)||(C(e)>1&&d.defineProperties(e,{set:U,add:U,clear:U,delete:U}),d.freeze(e),t&&E(e,(e,t)=>{x(t,!0)},!1)),e}var U={[_]:function(){u(2)}};function N(e){return null===e||!P(e)||d.isFrozen(e)}var L="MapSet",F="Patches",K="ArrayMethods",J={};function B(e){const t=J[e];return t||u(0,e),t}var W,Q=e=>!!J[e],G=()=>W;function q(e,t){t&&(e.patchPlugin_=B(F),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function X(e){Z(e),e.drafts_.forEach(Y),e.drafts_=null}function Z(e){e===W&&(W=e.parent_)}var H=e=>W={drafts_:[],parent_:W,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:Q(L)?B(L):void 0,arrayMethodsPlugin_:Q(K)?B(K):void 0};function Y(e){const t=e[c];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function ee(e,t){t.unfinalizedDrafts_=t.drafts_.length;const n=t.drafts_[0];if(void 0!==e&&e!==n){n[c].modified_&&(X(t),u(4)),w(e)&&(e=te(t,e));const{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[c].base_,e,t)}else e=te(t,n);return function(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&x(t,n)}(t,e,!0),X(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==a?e:void 0}function te(e,t){if(N(t))return t;const n=t[c];if(!n){return ie(t,e.handledSet_,e)}if(!re(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){const{callbacks_:t}=n;if(t)for(;t.length>0;){t.pop()(e)}ae(n,e)}return n.copy_}function ne(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var re=(e,t)=>e.scope_===t,se=[];function oe(e,t,n,r){const s=z(e),o=e.type_;if(void 0!==r){if(D(s,r,o)===t)return void A(s,r,n,o)}if(!e.draftLocations_){const t=e.draftLocations_=new Map;E(s,(e,n)=>{if(S(n)){const r=t.get(n)||[];r.push(e),t.set(n,r)}})}const a=e.draftLocations_.get(t)??se;for(const e of a)A(s,e,n,o)}function ae(e,t){if(e.modified_&&!e.finalized_&&(3===e.type_||1===e.type_&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){const{patchPlugin_:n}=t;if(n){const r=n.getPath(e);r&&n.generatePatches_(e,r,t)}ne(e)}}function ie(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||S(e)||t.has(e)||!w(e)||N(e)||(t.add(e),E(e,(r,s)=>{if(S(s)){const t=s[c];if(re(t,n)){const n=V(t);A(e,r,n,e.type_),ne(t)}}else w(s)&&ie(s,t,n)})),e}var ce={get(e,t){if(t===c)return e;let n=e.scope_.arrayMethodsPlugin_;const r=1===e.type_&&"string"==typeof t;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);const s=z(e);if(!O(s,t,e.type_))return function(e,t,n){const r=de(t,n);return r?_ in r?r[_]:r.get?.call(e.draft_):void 0}(e,s,t);const o=s[t];if(e.finalized_||!w(o))return o;if(r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&function(e){const t=+e;return Number.isInteger(t)&&String(t)===e}(t))return o;if(o===ue(e.base_,t)){ye(e);const n=1===e.type_?+t:t,r=pe(e.scope_,o,e,n);return e.copy_[n]=r}return o},has:(e,t)=>t in z(e),ownKeys:e=>Reflect.ownKeys(z(e)),set(e,t,n){const r=de(z(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){const r=ue(z(e),t),a=r?.[c];if(a&&a.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(((s=n)===(o=r)?0!==s||1/s==1/o:s!=s&&o!=o)&&(void 0!==n||O(e.base_,t,e.type_)))return!0;ye(e),fe(e)}var s,o;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),function(e,t,n){const{scope_:r}=e;if(S(n)){const s=n[c];re(s,r)&&s.callbacks_.push(function(){ye(e);const r=V(s);oe(e,n,r,t)})}else w(n)&&e.callbacks_.push(function(){const s=z(e);3===e.type_?s.has(n)&&ie(n,r.handledSet_,r):D(s,t,e.type_)===n&&r.drafts_.length>1&&!0===(e.assigned_.get(t)??!1)&&e.copy_&&ie(D(e.copy_,t,e.type_),r.handledSet_,r)})}(e,t,n)),!0},deleteProperty:(e,t)=>(ye(e),void 0!==ue(e.base_,t)||t in e.base_?(e.assigned_.set(t,!1),fe(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=z(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{[m]:!0,[h]:1!==e.type_||"length"!==t,[g]:r[g],[_]:n[t]}:r},defineProperty(){u(11)},getPrototypeOf:e=>f(e.base_),setPrototypeOf(){u(12)}},le={};for(let e in ce){let t=ce[e];le[e]=function(){const e=arguments;return e[0]=e[0][0],t.apply(this,e)}}function ue(e,t){const n=e[c];return(n?z(n):e)[t]}function de(e,t){if(!(t in e))return;let n=f(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=f(n)}}function fe(e){e.modified_||(e.modified_=!0,e.parent_&&fe(e.parent_))}function ye(e){e.copy_||(e.assigned_=new Map,e.copy_=$(e.base_,e.scope_.immer_.useStrictShallowCopy_))}le.deleteProperty=function(e,t){return isNaN(parseInt(t))&&u(13),le.set.call(this,e,t,void 0)},le.set=function(e,t,n){return"length"!==t&&isNaN(parseInt(t))&&u(14),ce.set.call(this,e[0],t,n,e[0])};function pe(e,t,n,r){const[s,o]=R(t)?B(L).proxyMap_(t,n):j(t)?B(L).proxySet_(t,n):function(e,t){const n=M(e),r={type_:n?1:0,scope_:t?t.scope_:G(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let s=r,o=ce;n&&(s=[r],o=le);const{revoke:a,proxy:i}=Proxy.revocable(s,o);return r.draft_=i,r.revoke_=a,[i,r]}(t,n);return(n?.scope_??G()).drafts_.push(s),o.callbacks_=n?.callbacks_??[],o.key_=r,n&&void 0!==r?function(e,t,n){e.callbacks_.push(function(r){const s=t;if(!s||!re(s,r))return;r.mapSetPlugin_?.fixSetContents(s);const o=V(s);oe(e,s.draft_??s,o,n),ae(s,r)})}(n,o,r):o.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(o);const{patchPlugin_:t}=e;o.modified_&&t&&t.generatePatches_(o,[],e)}),s}function he(e){if(!w(e)||N(e))return e;const t=e[c];let n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=$(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=$(e,!0);return E(n,(e,t)=>{A(n,e,he(t))},r),t&&(t.finalized_=!1),n}var ge=(new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(T(e)&&!T(t)){const n=t;t=e;const r=this;return function(e=n,...s){return r.produce(e,e=>t.call(this,e,...s))}}let r;if(T(t)||u(6),void 0===n||T(n)||u(7),w(e)){const s=H(this),o=pe(s,e,void 0);let a=!0;try{r=t(o),a=!1}finally{a?X(s):Z(s)}return q(s,n),ee(r,s)}if(!e||!P(e)){if(r=t(e),void 0===r&&(r=e),r===a&&(r=void 0),this.autoFreeze_&&x(r,!0),n){const t=[],s=[];B(F).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:s}),n(t,s)}return r}u(1,e)},this.produceWithPatches=(e,t)=>{if(T(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},I(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),I(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),I(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){w(e)||u(8),S(e)&&(e=function(e){S(e)||u(10,e);return he(e)}(e));const t=H(this),n=pe(t,e,void 0);return n[c].isManual_=!0,Z(t),n}finishDraft(e,t){const n=e&&e[c];n&&n.isManual_||u(9);const{scope_:r}=n;return q(r,t),ee(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--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=B(F).applyPatches_;return S(e)?r(e,t):this.produce(e,e=>r(e,t))}}).produce,me=(e,t)=>{const n=Date.now();if(/\(\.*\+\?\)\+/.test(e)||/\(\.*\?\)\*/.test(e))return!1;if(e.length>500)return!1;try{const n=new RegExp(e).test(t);Date.now();return n}catch{return!1}},_e=()=>{if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)try{return crypto.randomUUID()}catch{}throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.")},Se="undefined"!=typeof crypto&&void 0!==crypto.subtle&&"function"==typeof crypto.subtle.generateKey,we=async(e,t,n=6e5)=>{if(!Se)throw new Error("Web Crypto API not available");const r=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return{key:await crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(t),iterations:n,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},be=(e=32)=>crypto.getRandomValues(new Uint8Array(e)),ve=async()=>{if(!Se)throw new Error("Web Crypto API not available");return{key:await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},ke=async e=>{const t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},Ee=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=Uint8Array.from(atob(t),e=>e.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},Ce=async(e,t)=>{const n=(new TextEncoder).encode(JSON.stringify(e)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),s=new Uint8Array(t.iv.length+r.byteLength);return s.set(t.iv),s.set(new Uint8Array(r),t.iv.length),btoa(String.fromCharCode(...s))},Oe=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,s);return JSON.parse((new TextDecoder).decode(o))},De=null,Ae=e=>{De=e},Me=e=>{De&&De(e)},Re=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},je=(e,t,n,r)=>{if(0===e.size)return!0;for(const[s,o]of e){let e;if(e="function"==typeof s?s(t,r):me(s,t),e)return o.includes(n)||o.includes("admin")}return!1},Pe=e=>{if("string"==typeof e){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,e=>{const t=e.match(/&#x([0-9a-fA-F]+);?/i);if(t&&t[1])return String.fromCharCode(parseInt(t[1],16));const n=e.match(/&#([0-9]+);?/);return n&&n[1]?String.fromCharCode(parseInt(n[1],10)):e});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&&"object"==typeof e&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){const t={};for(const[n,r]of Object.entries(e))t[n]=Pe(r);return t}return e}return Array.isArray(e)?e.map(e=>Pe(e)):e},Te=e=>/^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e)&&e.length<=256&&e.length>0,Ie=(e,t,n,r)=>{const s={id:_e(),purpose:n,granted:r,timestamp:Date.now()},o=e.get(t)||[];return o.push(s),e.set(t,o),Me({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),s},ze=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}const t=new WeakMap,n=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){const r=new Map;return t.set(e,r),e.forEach((e,t)=>r.set(n(t),n(e))),r}if(e instanceof Set){const r=new Set;return t.set(e,r),e.forEach(e=>r.add(n(e))),r}const r=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));t.set(e,r);const s=[...Object.keys(e),...Object.getOwnPropertySymbols(e)];for(const t of s)r[t]=n(e[t]);return r};return n(e)},Ve=(e,t)=>{if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!Ve(e[n],t[n]))return!1;return!0}const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++){const s=n[r];if(!(s in t)||!Ve(e[s],t[s]))return!1}return!0},$e=e=>`${e}_`,xe=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,t){this.store=e,this.config={endpoint:t.endpoint,authToken:t.authToken||"",strategy:t.strategy||"last-write-wins",autoSyncInterval:t.autoSyncInterval??3e4,syncOnReconnect:t.syncOnReconnect??!0,debounceTime:t.debounceTime??1e3,fetch:t.fetch||fetch,onSync:t.onSync||(()=>{}),onConflict:t.onConflict||(()=>({action:"accept-local"})),maxRetries:t.maxRetries??3},this._isOnline="undefined"==typeof navigator||navigator.onLine,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){const e=this.config.authToken;return"function"==typeof e?e()||"":e||""}_setupOnlineListener(){"undefined"!=typeof window&&(window.addEventListener("online",()=>{this._isOnline=!0,this._notifyOnlineChange(!0),this.config.syncOnReconnect&&this.sync()}),window.addEventListener("offline",()=>{this._isOnline=!1,this._notifyOnlineChange(!1)}))}_setupStoreListener(){this.store._subscribe(()=>{})}_startAutoSync(){setInterval(()=>{this._isOnline&&!this._isSyncing&&this.pendingQueue.size>0&&this.sync()},this.config.autoSyncInterval)}_notifyOnlineChange(e){this.onlineStatusListeners.forEach(t=>t(e)),this._notifyStateChange()}_notifyStateChange(){const e=this.getState();this.syncStateListeners.forEach(t=>t(e))}queueChange(e,t){const n=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:ze(t),timestamp:Date.now(),version:n}),this._notifyStateChange(),this.syncTimer&&clearTimeout(this.syncTimer),this.syncTimer=setTimeout(()=>{this._isOnline&&this.sync()},this.config.debounceTime)}async sync(){if(this._isSyncing)return{success:!1,syncedKeys:[],conflicts:[],errors:["Sync already in progress"],timestamp:Date.now(),duration:0};this._isSyncing=!0,this._notifyStateChange();const e=Date.now(),t=[],n=[],r=[];try{const s=Array.from(this.pendingQueue.values());if(0===s.length)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(s.map(e=>e.key));for(const e of s)try{const r=this.remoteVersions.get(e.key);if(r)if(r.version>=e.version){const s={key:e.key,localValue:e.value,remoteValue:r.value,localVersion:e.version,remoteVersion:r.version,timestamp:e.timestamp};n.push(s);const o=this.config.onConflict(s);await this._resolveConflict(e,r,o),t.push(e.key),this.pendingQueue.delete(e.key)}else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key);else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key)}catch(t){r.push(`Failed to sync "${e.key}": ${t}`)}const o={success:0===r.length,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(o),o}catch(s){const o=`Sync failed: ${s}`;return r.push(o),{success:!1,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{const t=this._getAuthToken(),n=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...t&&{Authorization:`Bearer ${t}`}},body:JSON.stringify({keys:e})});if(n.ok){const e=await n.json();if(e.versions)for(const[t,n]of Object.entries(e.versions))this.remoteVersions.set(t,n)}}catch(e){}}async _pushChange(e){let t=0;for(;t<this.config.maxRetries;)try{const n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(r.ok){const t=await r.json();return void(t.version&&this.remoteVersions.set(e.key,{version:t.version,timestamp:t.timestamp||Date.now(),value:e.value}))}t++}catch(e){if(t++,t>=this.config.maxRetries)throw e}}async _resolveConflict(e,t,n){switch(n.action){case"accept-local":await this._pushChange({...e,version:t.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,t.value);break;case"merge":this.store.set(e.key,n.value),await this._pushChange({key:e.key,value:n.value,version:Math.max(e.version,t.version)+1,timestamp:Date.now()})}}getState(){return{isOnline:this._isOnline,isSyncing:this._isSyncing,lastSyncTimestamp:null,pendingChanges:this.pendingQueue.size,conflicts:0}}onOnlineChange(e){return this.onlineStatusListeners.add(e),()=>this.onlineStatusListeners.delete(e)}onStateChange(e){return this.syncStateListeners.add(e),()=>this.syncStateListeners.delete(e)}async flush(){return this.sync()}destroy(){this.syncTimer&&clearTimeout(this.syncTimer),this.pendingQueue.clear(),this.onlineStatusListeners.clear(),this.syncStateListeners.clear()}},Ue=(e,t)=>new xe(e,t),Ne=()=>{try{0;const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};return void 0!==e.__DEV__&&!1===e.__DEV__}catch{return!1}},Le=()=>"undefined"!=typeof window?window.localStorage:null,Fe=e=>{const t=new Map,n=new Map,r=new Map,s=new Set,o=new Map,a=new Set,i=new Map,c=new Map,l=new Map,u=new Map,d=new Map,f=new Map,y=new Map,p=new Map,h=e?.namespace||"gstate",g=e?.silent??!1,m=e?.debounceTime??150,_=e?.version??0,S=e?.storage||Le(),w=e?.onError,b=e?.maxObjectSize??0,v=e?.maxTotalSize??0,k=e?.encryptionKey??null,E=e?.validateInput??!0,C=e?.auditEnabled??!0,O=e?.userId,D=e?.immer??!0,A=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(e=>Re(y,e.pattern,e.permissions));let M,R=!1,j=!1,P=!1,T=0,I=null,z=null;const V=new Promise(e=>{M=e}),$=()=>({store:t,versions:n,sizes:r,totalSize:T,storage:S,config:e||{},diskQueue:d,encryptionKey:k,audit:F,onError:w,silent:g,debounceTime:m,currentVersion:_}),U=()=>({plugins:u,onError:w,silent:g}),N=e=>{if(null==e)return 0;const t=typeof e;if("boolean"===t)return 4;if("number"===t)return 8;if("string"===t)return 2*e.length;if("object"!==t)return 0;let n=0;const r=[e],s=new WeakSet;for(;r.length>0;){const e=r.pop();if("boolean"==typeof e)n+=4;else if("number"==typeof e)n+=8;else if("string"==typeof e)n+=2*e.length;else if("object"==typeof e&&null!==e){const t=e;if(s.has(t))continue;if(s.add(t),Array.isArray(t))for(let e=0;e<t.length;e++)r.push(t[e]);else for(const e of Object.keys(t))n+=2*e.length,r.push(t[e])}}return n},L=(e,t)=>{((e,t,n)=>{if(0!==e.plugins.size)for(const r of e.plugins.values()){const s=r.hooks?.[t];if(s)try{s(n)}catch(s){const o=s instanceof Error?s:new Error(String(s));e.onError?e.onError(o,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent}}})(U(),e,t)},F=(e,t,n,r)=>{C&&null!==De&&Me&&Me({timestamp:Date.now(),action:e,key:t,userId:O,success:n,error:r})},K=e=>{const t=c.get(e);if(!t)return;const r=new Set,s=t.selector(e=>(r.add(e),c.has(e)?c.get(e).lastValue:Q.get(e)));t.deps.forEach(t=>{if(!r.has(t)){const n=l.get(t);n&&(n.delete(e),0===n.size&&l.delete(t))}}),r.forEach(n=>{t.deps.has(n)||(l.has(n)||l.set(n,new Set),l.get(n).add(e))}),t.deps=r,Ve(t.lastValue,s)||(t.lastValue=D&&null!==s&&"object"==typeof s?x(ze(s),!0):s,n.set(e,(n.get(e)||0)+1),J(e))},J=e=>{if(e){if(l.has(e)){const t=l.get(e);for(const e of t)K(e)}const t=i.get(e);if(t){const n=Q.get(e);for(const r of t)try{r(n)}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"watcher",key:e})}}const n=o.get(e);if(n)for(const t of n)try{t()}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"keyListener",key:e})}}if(R)j=!0;else for(const e of s)try{e()}catch(e){const t=e instanceof Error?e:new Error(String(e));w&&w(t,{operation:"listener"})}},B=async()=>{(async e=>{if(!e.storage)return;const{store:t,config:n,diskQueue:r,storage:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l}=e,u=$e(n.namespace||"gstate");try{const e={};let r;t.forEach((t,n)=>{e[n]=t});const o=n?.encoded;r=o?btoa(JSON.stringify(e)):JSON.stringify(e),s.setItem(u.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:r,_sys_v:l,_b64:!!o||void 0})),a("set","FULL_STATE",!0)}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"persist",key:"FULL_STATE"})}const d=Array.from(r.entries());r.clear();for(const[t,n]of d)try{if(!t||!/^[a-zA-Z0-9_.-]+$/.test(t)||t.length>256)continue;let r=n.value;const i=n.options.encoded||n.options.encrypted||n.options.secure;if(n.options.encrypted){if(!o)throw new Error(`Encryption key missing for "${t}"`);r=await Ce(n.value,o)}else i?r=btoa(JSON.stringify(n.value)):"object"==typeof n.value&&null!==n.value&&(r=JSON.stringify(n.value));s.setItem(`${u}${t}`,JSON.stringify({v:e.versions.get(t)||1,t:Date.now(),e:n.options.ttl?Date.now()+n.options.ttl:null,d:r,_sys_v:l,_enc:!!n.options.encrypted||void 0,_b64:!(!n.options.encoded&&!n.options.secure)||void 0})),a("set",t,!0)}catch(e){const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"persist",key:t})}})($())},W={},Q={_setSilently:(e,s)=>{const o=r.get(e)||0,a=D&&null!==s&&"object"==typeof s?x(ze(s),!0):s,i=(b>0||v>0)&&!Ne()?N(a):0;T=T-o+i,r.set(e,i),t.set(e,a),n.set(e,(n.get(e)||0)+1),z=null},_registerMethod:(e,t,n)=>{const r=e=>"__proto__"===e||"constructor"===e||"prototype"===e;r(e)||r(t)||(W[e]||(W[e]={}),W[e][t]=n)},set:(s,o,a={})=>{const i=t.get(s),c=D&&"function"==typeof o?ge(i,o):o;if(E&&!Te(s))return!1;if(!je(y,s,"write",O))return F("set",s,!1,"RBAC Denied"),!1;const l=E?Pe(c):c,u=r.get(s)||0;L("onBeforeSet",{key:s,value:l,store:Q,version:n.get(s)||0});const f=D&&null!==l&&"object"==typeof l?x(ze(l),!0):l;if(!Ve(i,f)){const o=(b>0||v>0)&&!Ne()?N(f):0;if(b>0&&o>b){const e=new Error(`Object size (${o} bytes) exceeds maxObjectSize (${b} bytes)`);w&&w(e,{operation:"set",key:s})}if(v>0){const e=T-u+o;if(e>v){const t=new Error(`Total store size (${e} bytes) exceeds limit (${v} bytes)`);w&&w(t,{operation:"set"})}}T=T-u+o,r.set(s,o),t.set(s,f),n.set(s,(n.get(s)||0)+1),z=null;const i=a.persist??A;return i&&(d.set(s,{value:f,options:{...a,persist:i,encoded:a.encoded||e?.encoded}}),I&&clearTimeout(I),I=setTimeout(B,m)),L("onSet",{key:s,value:f,store:Q,version:n.get(s)}),F("set",s,!0),J(s),!0}return!1},get:e=>{if(!je(y,e,"read",O))return F("get",e,!1,"RBAC Denied"),null;const n=t.get(e);return L("onGet",{store:Q,key:e,value:n}),F("get",e,!0),n},compute:(e,t)=>{try{return c.has(e)||(c.set(e,{selector:t,lastValue:null,deps:new Set}),K(e)),c.get(e).lastValue}catch(t){const n=t instanceof Error?t:new Error(String(t));return w&&w(n,{operation:"compute",key:e}),null}},watch:(e,t)=>{i.has(e)||i.set(e,new Set);const n=i.get(e);return n.add(t),()=>{n.delete(t),0===n.size&&i.delete(e)}},remove:e=>{if(!je(y,e,"delete",O))return F("delete",e,!1,"RBAC Denied"),!1;const s=t.get(e),o=t.delete(e);return o&&(T-=r.get(e)||0,r.delete(e),L("onRemove",{store:Q,key:e,value:s}),z=null),n.set(e,(n.get(e)||0)+1),S&&S.removeItem(`${h}_${e}`),F("delete",e,!0),J(e),o},delete:e=>Q.remove(e),deleteAll:()=>{if(Array.from(t.keys()).forEach(e=>Q.remove(e)),S){const e=h+"_";for(let t=0;t<(S.length||0);t++){const n=S.key(t);n?.startsWith(e)&&(S.removeItem(n),t--)}}return T=0,r.clear(),z=null,!0},list:()=>Object.fromEntries(t.entries()),use:e=>{a.add(e)},transaction:e=>{R=!0,L("onTransaction",{store:Q,key:"START"});try{e()}finally{R=!1,L("onTransaction",{store:Q,key:"END"}),j&&(j=!1,J())}},destroy:()=>{I&&(clearTimeout(I),I=null),d.clear(),"undefined"!=typeof window&&window.removeEventListener("beforeunload",G),L("onDestroy",{store:Q}),s.clear(),o.clear(),i.clear(),c.clear(),l.clear(),u.clear(),t.clear(),r.clear(),T=0,y.clear(),p.clear(),n.clear(),f.clear(),a.clear()},_addPlugin:e=>{((e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(n){const r=n instanceof Error?n:new Error(String(n));e.onError?e.onError(r,{operation:"plugin:install",key:t.name}):e.silent}})(U(),e,Q)},_removePlugin:e=>{u.delete(e)},_subscribe:(e,t)=>{if(t){o.has(t)||o.set(t,new Set);const n=o.get(t);return n.add(e),()=>{n.delete(e),0===n.size&&o.delete(t)}}return s.add(e),()=>s.delete(e)},_getVersion:e=>n.get(e)??0,addAccessRule:(e,t)=>Re(y,e,t),hasPermission:(e,t,n)=>je(y,e,t,n),recordConsent:(e,t,n)=>Ie(p,e,t,n),hasConsent:(e,t)=>((e,t,n)=>{const r=e.get(t);if(!r)return!1;for(let e=r.length-1;e>=0;e--){const t=r[e];if(t&&t.purpose===n)return t.granted}return!1})(p,e,t),getConsents:e=>((e,t)=>e.get(t)||[])(p,e),revokeConsent:(e,t)=>((e,t,n)=>Ie(e,t,n,!1))(p,e,t),exportUserData:e=>((e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}))(p,e),deleteUserData:e=>((e,t)=>{const n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}})(p,e),getSnapshot:()=>(z||(z=Object.fromEntries(t.entries())),z),get plugins(){return W},get isReady(){return P},get namespace(){return h},get userId(){return O},whenReady:()=>V};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(e=>{const t=Q[e];t&&Q._registerMethod("security",e,t)});const G=()=>{d.size>0&&B()};"undefined"!=typeof window&&window.addEventListener("beforeunload",G),S?(async(e,t,n)=>{const{storage:r,config:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l,store:u,sizes:d,versions:f}=e,y=$e(s.namespace||"gstate"),p=s.immer??!0;if(r)try{const c={};let h=0;for(let e=0;e<(r.length||0);e++){const t=r.key(e);if(!t||!t.startsWith(y))continue;const n=r.getItem(t);if(n)try{const s=JSON.parse(n),i=t.substring(y.length);if(h=Math.max(h,void 0!==s._sys_v?s._sys_v:s.v||0),s.e&&Date.now()>s.e){r.removeItem(t),e--;continue}let l=s.d;if(s._enc&&o)l=await Oe(l,o);else if("string"==typeof l)if(s._b64)try{l=JSON.parse(atob(l))}catch(e){}else if(l.startsWith("{")||l.startsWith("["))try{l=JSON.parse(l)}catch(e){}c[i]=l,a("hydrate",i,!0)}catch(e){a("hydrate",t,!1,String(e));const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"hydration",key:t})}}const g=h<l&&s.migrate?s.migrate(c,h):c;Object.entries(g).forEach(([n,r])=>{const s=p&&null!==r&&"object"==typeof r?x(ze(r),!0):r,o=t(s),a=d.get(n)||0;e.totalSize=e.totalSize-a+o,d.set(n,o),u.set(n,s),f.set(n,1)}),n()}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"hydration"})}})($(),e=>(b>0||v>0)&&!Ne()?N(e):0,()=>{P=!0,z=null,M(),J()}).then(()=>{}):(P=!0,M());let q=null;return e?.sync&&(q=new xe(Q,e.sync),Q._registerMethod("sync","flush",()=>q?.flush()),Q._registerMethod("sync","getState",()=>q?.getState()),Q._registerMethod("sync","onStateChange",e=>q?.onStateChange(e))),Q},Ke=null,Je=e=>{const t=Fe(e);return Ke=t,t},Be=()=>{Ke&&(Ke.destroy(),Ke=null)},We=n=>{const r=n||Ke,s=e(()=>e=>r?r._subscribe(e):()=>{},[r]);return t(s,()=>!!r&&r.isReady,()=>!0)},Qe=()=>Ke;function Ge(s,o){const a=e(()=>o||Ke,[o]),i=e(()=>{const e=()=>{},t=()=>!1,n=()=>null;return{set:t,get:n,remove:t,delete:t,deleteAll:t,list:()=>({}),compute:n,watch:()=>()=>{},use:e,transaction:e,destroy:e,_subscribe:()=>()=>{},_setSilently:e,_registerMethod:e,_addPlugin:e,_removePlugin:e,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}},getSnapshot:()=>({}),get namespace(){return"ghost"},get userId(){}}},[]),c=a||i,l="function"==typeof s,u=l?null:s,d=l?s:null,f=n(e=>l?c._subscribe(e):c._subscribe(e,u),[c,l,u]),y=n(()=>l?d(c.getSnapshot()):c.get(u)??void 0,[c,l,u,d]),p=n(()=>{if(l)try{return d({})}catch{return}},[d,l]),h=t(f,y,p),g=n((e,t)=>l?(Ne(),!1):c.set(u,e,t),[c,l,u]);return r(h,e=>l?`Selector: ${JSON.stringify(e)}`:`${u}: ${JSON.stringify(e)}`),l?h:[h,g]}var qe=new Map,Xe=(e,t)=>{const n=e.namespace;if(qe.has(n))return qe.get(n);const r=new xe(e,t);return qe.set(n,r),r},Ze=e=>{const t=qe.get(e);t&&(t.destroy(),qe.delete(e))};function He(e,t){const r=t||Ke,a=r?.namespace||"default",i=qe.get(a),c=Ge(e,r),l=c[0],u=c[1],[d,f]=s(()=>i?.getState()||{isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});o(()=>{if(!i)return;return i.onStateChange(f)},[i]);return[l,n((t,n)=>{const s=u(t,n);if(s&&i){const t=r?.get(e);i.queueChange(e,t)}return s},[u,i,e,r]),d]}var Ye=()=>{const[e,t]=s({isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return o(()=>{const e=()=>{let e=!0,n=!1,r=0,s=0;qe.forEach(t=>{const o=t.getState();e=e&&o.isOnline,n=n||o.isSyncing,r+=o.pendingChanges,s+=o.conflicts}),t({isOnline:e,isSyncing:n,lastSyncTimestamp:null,pendingChanges:r,conflicts:s})};e();const n=Array.from(qe.values()).map(t=>t.onStateChange(e));return()=>n.forEach(e=>e())},[]),e},et=async e=>{const t=e||Ke?.namespace;if(!t)return;const n=qe.get(t);n&&await n.flush()},tt=(e,t)=>{const n=t?.key||"async_data",r=t?.store||Fe({namespace:`async_${n}`,silent:!0});null==r.get(n)&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null});return Object.assign(r,{execute:async()=>{const 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{const s=await e(),o=r.get(n);r.set(n,{...o||{data:null,loading:!1,error:null,updatedAt:null},data:s,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(e){const t=r.get(n);r.set(n,{...t||{data:null,loading:!1,error:null,updatedAt:null},error:e instanceof Error?e:new Error(String(e)),loading:!1})}}})},nt=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",(t,n)=>e.set(t,n))}}}),rt=e=>{let t=[],n=-1,r=!1;const s=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:e})=>{t.push(e.list()),n=0,e._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","canUndo",()=>n>0),e._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:e})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(e.list()),t.length>s?t.shift():n++)}}}},st=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;const r=e[t];if(r){const e=r(n);if(!0!==e)throw new Error(`[Schema Error] Validation failed for key "${t}": ${!1===e?"Invalid type":e}`)}}}}),ot=e=>{const t=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!t?.connect)return{name:"gstate-devtools-noop",hooks:{}};let n=null;return{name:"gstate-devtools",hooks:{onInstall:({store:r})=>{n=t.connect({name:e?.name||"Magnetar Store"}),n.init(r.list())},onSet:({key:e,store:t})=>{e&&n&&n.send(`SET_${e.toUpperCase()}`,t.list())},onRemove:({key:e,store:t})=>{e&&n&&n.send(`REMOVE_${e.toUpperCase()}`,t.list())}}}},at=()=>{const 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=>{const r=e.get(n);return!!r&&(t.transaction(()=>{Object.entries(r).forEach(([e,n])=>{t.set(e,n)})}),!0)}),t._registerMethod("snapshot","listSnapshots",()=>Array.from(e.keys())),t._registerMethod("snapshot","deleteSnapshot",t=>e.delete(t)),t._registerMethod("snapshot","clearSnapshots",()=>e.clear())}}}},it=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;const s=e[t];s&&s(n)}}}),ct=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"}))}}}),lt=e=>{const t=new BroadcastChannel(e?.channelName||"gstate_sync");let n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:e})=>{t.onmessage=t=>{const{key:r,value:s,action:o}=t.data;r&&(n=!0,"REMOVE"===o?e.remove(r):e.set(r,s),n=!1)}},onSet:({key:e,value:r})=>{e&&!n&&t.postMessage({key:e,value:r,action:"SET"})},onRemove:({key:e})=>{e&&!n&&t.postMessage({key:e,action:"REMOVE"})},onDestroy:()=>{t.close()}}}},ut=()=>{if(Ne())return{name:"gstate-debug-noop",hooks:{}};Ne();return{name:"gstate-debug",hooks:{onInstall:({store:e})=>{"undefined"!=typeof window&&(window.gstate={list:()=>e.list(),get:t=>{const n=e.get(t);return n},set:(t,n)=>{const r=e.set(t,n);return JSON.stringify(n),r},watch:(t,n)=>e.watch(t,n),info:()=>{const t={namespace:e.namespace,isReady:e.isReady,keys:Object.keys(e.list()),size:Object.keys(e.list()).length};return t},banner:()=>{}})},onDestroy:()=>{"undefined"!=typeof window&&delete window.gstate}}}},dt=(e={})=>{const t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1;let s=null;const o=()=>new Promise((e,o)=>{if(s)return e(s);const a=indexedDB.open(t,r);a.onerror=()=>o(a.error),a.onsuccess=()=>{s=a.result,e(s)},a.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains(n)||t.createObjectStore(n)}}),a=async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readonly").objectStore(n).get(e);o.onsuccess=()=>r(o.result),o.onerror=()=>s(o.error)})};return{name:"indexedDB",hooks:{onInstall:({store:e})=>{e._registerMethod("indexedDB","clear",async()=>{(await o()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:e})=>{const t=(await o()).transaction(n,"readonly").objectStore(n).getAllKeys();t.onsuccess=async()=>{const n=t.result,r=e.namespace+"_";for(const t of n)if(t.startsWith(r)){const n=await a(t);if(n){const s=t.substring(r.length);e._setSilently(s,n.d)}}}},onSet:async({key:e,value:t,store:r})=>{if(!e)return;const s=r.namespace+"_",a={d:t,t:Date.now(),v:r._getVersion?.(e)||1};await(async(e,t)=>{const r=await o();return new Promise((s,o)=>{const a=r.transaction(n,"readwrite").objectStore(n).put(t,e);a.onsuccess=()=>s(),a.onerror=()=>o(a.error)})})(`${s}${e}`,a)},onRemove:async({key:e,store:t})=>{if(!e)return;const r=t.namespace+"_";await(async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readwrite").objectStore(n).delete(e);o.onsuccess=()=>r(),o.onerror=()=>s(o.error)})})(`${r}${e}`)}}}},ft=e=>{const{adapter:t,autoSyncInterval:n}=e,r=new Map,s={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0};let o=null;return{name:"cloudSync",hooks:{onInstall:({store:a})=>{a._registerMethod("cloudSync","sync",async()=>{const n=performance.now(),o={};let i=0;try{const c=a.list(),l=Object.keys(c);for(const e of l){const t=a._getVersion?.(e)||0;if(t>(r.get(e)||0)){const n=c[e];o[e]=n,i+=JSON.stringify(n).length,r.set(e,t)}}if(0===Object.keys(o).length)return{status:"no-change",stats:s};if(await t.save(o))return s.lastSyncTimestamp=Date.now(),s.totalKeysSynced+=Object.keys(o).length,s.totalBytesSynced+=i,s.syncCount++,s.lastDuration=performance.now()-n,e.onSync&&e.onSync(s),{status:"success",stats:s};throw new Error(`Adapter ${t.name} failed to save.`)}catch(e){return s.errors++,{status:"error",error:String(e),stats:s}}}),a._registerMethod("cloudSync","getStats",()=>s),n&&n>0&&(o=setInterval(()=>{const e=a.plugins.cloudSync;e&&e.sync()},n))},onDestroy:()=>{o&&clearInterval(o)}}}},yt=(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}),pt=(e,t)=>({name:"Firebase-Firestore",save:async e=>{try{Ne();return(()=>{})("[Mock] Firestore Syncing:",e),!0}catch(e){return!1}}}),ht=(e,t)=>({name:"SQL-REST-API",save:async n=>{const r=t();if(!r)return!1;return(await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n),credentials:"same-origin"})).ok}}),gt=e=>({name:"gstate-logger",hooks:{onSet:({key:e,value:t,version:n})=>{(new Date).toLocaleTimeString()},onRemove:({key:e})=>{},onTransaction:({key:e})=>{}}}),mt=(e,t)=>{const n=Fe("string"==typeof t?{namespace:t}:t);e&&Object.entries(e).forEach(([e,t])=>{null===n.get(e)&&n._setSilently(e,t)});return"undefined"==typeof window||Ne()||(window.gstate=n,window.gState=n,window.rgs=n),Object.assign(e=>Ge(e,n),n)},_t=(e,t)=>Qe()?.addAccessRule(e,t),St=(e,t,n)=>Qe()?.hasPermission(e,t,n)??!0,wt=(e,t,n)=>{const r=Qe();if(!r)throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},bt=(e,t)=>Qe()?.hasConsent(e,t)??!1,vt=e=>Qe()?.getConsents(e)??[],kt=(e,t)=>Qe()?.revokeConsent(e,t),Et=e=>{const t=Qe();if(!t)throw new Error("[gstate] exportUserData failed: No store found.");return t.exportUserData(e)},Ct=e=>{const t=Qe();if(!t)throw new Error("[gstate] deleteUserData failed: No store found.");return t.deleteUserData(e)},Ot=()=>{},Dt=()=>{};export{xe as SyncEngine,_t as addAccessRule,ct as analyticsPlugin,Ot as clearAccessRules,Dt as clearAllConsents,ft as cloudSyncPlugin,tt as createAsyncStore,pt as createFirestoreAdapter,yt as createMongoAdapter,ht as createSqlRestAdapter,Fe as createStore,Ue as createSyncEngine,ut as debugPlugin,Ct as deleteUserData,we as deriveKeyFromPassword,Be as destroyState,Ze as destroySync,ot as devToolsPlugin,ke as exportKey,Et as exportUserData,ve as generateEncryptionKey,be as generateSalt,vt as getConsents,Qe as getStore,mt as gstate,it as guardPlugin,bt as hasConsent,St as hasPermission,nt as immerPlugin,Ee as importKey,dt as indexedDBPlugin,Je as initState,Xe as initSync,Se as isCryptoAvailable,Me as logAudit,gt as loggerPlugin,wt as recordConsent,kt as revokeConsent,Pe as sanitizeValue,st as schemaPlugin,Ae as setAuditLogger,at as snapshotPlugin,lt as syncPlugin,et as triggerSync,rt as undoRedoPlugin,Ge as useGState,We as useIsStoreReady,Ge as useSimpleState,Ge as useStore,Ye as useSyncStatus,He as useSyncedState,Te as validateKey};
1
+ import { produce as e, freeze as t } from "immer";
2
+
3
+ import { useMemo as n, useSyncExternalStore as s, useCallback as r, useDebugValue as o, useState as a, useEffect as i } from "react";
4
+
5
+ var c = (e, t) => {
6
+ const n = Date.now();
7
+ if (/\(\.*\+\?\)\+/.test(e) || /\(\.*\?\)\*/.test(e)) return !1;
8
+ if (e.length > 500) return !1;
9
+ try {
10
+ const n = new RegExp(e).test(t);
11
+ Date.now();
12
+ return n;
13
+ } catch {
14
+ return !1;
15
+ }
16
+ }, l = () => {
17
+ if ("undefined" != typeof crypto && "function" == typeof crypto.randomUUID) try {
18
+ return crypto.randomUUID();
19
+ } catch {}
20
+ throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.");
21
+ }, u = "undefined" != typeof crypto && void 0 !== crypto.subtle && "function" == typeof crypto.subtle.generateKey, y = async (e, t, n = 6e5) => {
22
+ if (!u) throw new Error("Web Crypto API not available");
23
+ const s = await crypto.subtle.importKey("raw", (new TextEncoder).encode(e), "PBKDF2", !1, [ "deriveKey" ]);
24
+ return {
25
+ key: await crypto.subtle.deriveKey({
26
+ name: "PBKDF2",
27
+ salt: new Uint8Array(t),
28
+ iterations: n,
29
+ hash: "SHA-256"
30
+ }, s, {
31
+ name: "AES-GCM",
32
+ length: 256
33
+ }, !0, [ "encrypt", "decrypt" ]),
34
+ iv: crypto.getRandomValues(new Uint8Array(12))
35
+ };
36
+ }, d = (e = 32) => crypto.getRandomValues(new Uint8Array(e)), g = async () => {
37
+ if (!u) throw new Error("Web Crypto API not available");
38
+ return {
39
+ key: await crypto.subtle.generateKey({
40
+ name: "AES-GCM",
41
+ length: 256
42
+ }, !0, [ "encrypt", "decrypt" ]),
43
+ iv: crypto.getRandomValues(new Uint8Array(12))
44
+ };
45
+ }, f = async e => {
46
+ const t = await crypto.subtle.exportKey("raw", e.key);
47
+ return {
48
+ key: btoa(String.fromCharCode(...new Uint8Array(t))),
49
+ iv: btoa(String.fromCharCode(...e.iv))
50
+ };
51
+ }, h = async (e, t) => {
52
+ const n = Uint8Array.from(atob(e), e => e.charCodeAt(0)), s = Uint8Array.from(atob(t), e => e.charCodeAt(0));
53
+ return {
54
+ key: await crypto.subtle.importKey("raw", n, {
55
+ name: "AES-GCM",
56
+ length: 256
57
+ }, !0, [ "encrypt", "decrypt" ]),
58
+ iv: s
59
+ };
60
+ }, p = async (e, t) => {
61
+ const n = (new TextEncoder).encode(JSON.stringify(e)), s = await crypto.subtle.encrypt({
62
+ name: "AES-GCM",
63
+ iv: t.iv
64
+ }, t.key, n), r = new Uint8Array(t.iv.length + s.byteLength);
65
+ return r.set(t.iv), r.set(new Uint8Array(s), t.iv.length), btoa(String.fromCharCode(...r));
66
+ }, m = async (e, t) => {
67
+ const n = Uint8Array.from(atob(e), e => e.charCodeAt(0)), s = n.slice(0, 12), r = n.slice(12), o = await crypto.subtle.decrypt({
68
+ name: "AES-GCM",
69
+ iv: s
70
+ }, t.key, r);
71
+ return JSON.parse((new TextDecoder).decode(o));
72
+ }, w = null, S = e => {
73
+ w = e;
74
+ }, v = e => {
75
+ w && w(e);
76
+ }, b = (e, t, n) => {
77
+ e.set(t instanceof RegExp ? t.source : t, n);
78
+ }, E = (e, t, n, s) => {
79
+ if (0 === e.size) return !0;
80
+ for (const [r, o] of e) {
81
+ let e;
82
+ if (e = "function" == typeof r ? r(t, s) : c(r, t), e) return o.includes(n) || o.includes("admin");
83
+ }
84
+ return !1;
85
+ }, _ = e => {
86
+ if ("string" == typeof e) {
87
+ let t = e.replace(/&#[xX]?[0-9a-fA-F]+;?/g, e => {
88
+ const t = e.match(/&#x([0-9a-fA-F]+);?/i);
89
+ if (t && t[1]) return String.fromCharCode(parseInt(t[1], 16));
90
+ const n = e.match(/&#([0-9]+);?/);
91
+ return n && n[1] ? String.fromCharCode(parseInt(n[1], 10)) : e;
92
+ });
93
+ try {
94
+ t = decodeURIComponent(t);
95
+ } catch {}
96
+ 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]");
97
+ }
98
+ if (e && "object" == typeof e && !Array.isArray(e)) {
99
+ if (Object.getPrototypeOf(e) === Object.prototype) {
100
+ const t = {};
101
+ for (const [n, s] of Object.entries(e)) t[n] = _(s);
102
+ return t;
103
+ }
104
+ return e;
105
+ }
106
+ return Array.isArray(e) ? e.map(e => _(e)) : e;
107
+ }, k = e => /^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e) && e.length <= 256 && e.length > 0, C = (e, t, n, s) => {
108
+ const r = {
109
+ id: l(),
110
+ purpose: n,
111
+ granted: s,
112
+ timestamp: Date.now()
113
+ }, o = e.get(t) || [];
114
+ return o.push(r), e.set(t, o), v({
115
+ timestamp: Date.now(),
116
+ action: "set",
117
+ key: `consent:${n}`,
118
+ userId: t,
119
+ success: !0
120
+ }), r;
121
+ }, O = e => {
122
+ if (null === e || "object" != typeof e) return e;
123
+ if ("function" == typeof structuredClone) try {
124
+ return structuredClone(e);
125
+ } catch (e) {}
126
+ const t = new WeakMap, n = e => {
127
+ if (null === e || "object" != typeof e) return e;
128
+ if ("function" == typeof e) return e;
129
+ if (t.has(e)) return t.get(e);
130
+ if (e instanceof Date) return new Date(e.getTime());
131
+ if (e instanceof RegExp) return new RegExp(e.source, e.flags);
132
+ if (e instanceof Map) {
133
+ const s = new Map;
134
+ return t.set(e, s), e.forEach((e, t) => s.set(n(t), n(e))), s;
135
+ }
136
+ if (e instanceof Set) {
137
+ const s = new Set;
138
+ return t.set(e, s), e.forEach(e => s.add(n(e))), s;
139
+ }
140
+ const s = Array.isArray(e) ? [] : Object.create(Object.getPrototypeOf(e));
141
+ t.set(e, s);
142
+ const r = [ ...Object.keys(e), ...Object.getOwnPropertySymbols(e) ];
143
+ for (const t of r) s[t] = n(e[t]);
144
+ return s;
145
+ };
146
+ return n(e);
147
+ }, D = (e, t) => {
148
+ if (e === t) return !0;
149
+ if (null === e || null === t) return e === t;
150
+ if ("object" != typeof e || "object" != typeof t) return e === t;
151
+ if (Array.isArray(e) && Array.isArray(t)) {
152
+ if (e.length !== t.length) return !1;
153
+ for (let n = 0; n < e.length; n++) if (!D(e[n], t[n])) return !1;
154
+ return !0;
155
+ }
156
+ const n = Object.keys(e), s = Object.keys(t);
157
+ if (n.length !== s.length) return !1;
158
+ for (let s = 0; s < n.length; s++) {
159
+ const r = n[s];
160
+ if (!(r in t) || !D(e[r], t[r])) return !1;
161
+ }
162
+ return !0;
163
+ }, A = e => `${e}_`, M = class {
164
+ store;
165
+ config;
166
+ pendingQueue=new Map;
167
+ remoteVersions=new Map;
168
+ syncTimer=null;
169
+ onlineStatusListeners=new Set;
170
+ syncStateListeners=new Set;
171
+ _isOnline=!0;
172
+ _isSyncing=!1;
173
+ constructor(e, t) {
174
+ this.store = e, this.config = {
175
+ endpoint: t.endpoint,
176
+ authToken: t.authToken || "",
177
+ strategy: t.strategy || "last-write-wins",
178
+ autoSyncInterval: t.autoSyncInterval ?? 3e4,
179
+ syncOnReconnect: t.syncOnReconnect ?? !0,
180
+ debounceTime: t.debounceTime ?? 1e3,
181
+ fetch: t.fetch || fetch,
182
+ onSync: t.onSync || (() => {}),
183
+ onConflict: t.onConflict || (() => ({
184
+ action: "accept-local"
185
+ })),
186
+ maxRetries: t.maxRetries ?? 3
187
+ }, this._isOnline = "undefined" == typeof navigator || navigator.onLine, this._setupOnlineListener(),
188
+ this._setupStoreListener(), this.config.autoSyncInterval > 0 && this._startAutoSync();
189
+ }
190
+ _getAuthToken() {
191
+ const e = this.config.authToken;
192
+ return "function" == typeof e ? e() || "" : e || "";
193
+ }
194
+ _setupOnlineListener() {
195
+ "undefined" != typeof window && (window.addEventListener("online", () => {
196
+ this._isOnline = !0, this._notifyOnlineChange(!0), this.config.syncOnReconnect && this.sync();
197
+ }), window.addEventListener("offline", () => {
198
+ this._isOnline = !1, this._notifyOnlineChange(!1);
199
+ }));
200
+ }
201
+ _setupStoreListener() {
202
+ this.store._subscribe(() => {});
203
+ }
204
+ _startAutoSync() {
205
+ setInterval(() => {
206
+ this._isOnline && !this._isSyncing && this.pendingQueue.size > 0 && this.sync();
207
+ }, this.config.autoSyncInterval);
208
+ }
209
+ _notifyOnlineChange(e) {
210
+ this.onlineStatusListeners.forEach(t => t(e)), this._notifyStateChange();
211
+ }
212
+ _notifyStateChange() {
213
+ const e = this.getState();
214
+ this.syncStateListeners.forEach(t => t(e));
215
+ }
216
+ queueChange(e, t) {
217
+ const n = this.store._getVersion(e) || 1;
218
+ this.pendingQueue.set(e, {
219
+ key: e,
220
+ value: O(t),
221
+ timestamp: Date.now(),
222
+ version: n
223
+ }), this._notifyStateChange(), this.syncTimer && clearTimeout(this.syncTimer), this.syncTimer = setTimeout(() => {
224
+ this._isOnline && this.sync();
225
+ }, this.config.debounceTime);
226
+ }
227
+ async sync() {
228
+ if (this._isSyncing) return {
229
+ success: !1,
230
+ syncedKeys: [],
231
+ conflicts: [],
232
+ errors: [ "Sync already in progress" ],
233
+ timestamp: Date.now(),
234
+ duration: 0
235
+ };
236
+ this._isSyncing = !0, this._notifyStateChange();
237
+ const e = Date.now(), t = [], n = [], s = [];
238
+ try {
239
+ const r = Array.from(this.pendingQueue.values());
240
+ if (0 === r.length) return this._isSyncing = !1, this._notifyStateChange(), {
241
+ success: !0,
242
+ syncedKeys: [],
243
+ conflicts: [],
244
+ errors: [],
245
+ timestamp: Date.now(),
246
+ duration: Date.now() - e
247
+ };
248
+ await this._fetchRemoteVersions(r.map(e => e.key));
249
+ for (const e of r) try {
250
+ const s = this.remoteVersions.get(e.key);
251
+ if (s) if (s.version >= e.version) {
252
+ const r = {
253
+ key: e.key,
254
+ localValue: e.value,
255
+ remoteValue: s.value,
256
+ localVersion: e.version,
257
+ remoteVersion: s.version,
258
+ timestamp: e.timestamp
259
+ };
260
+ n.push(r);
261
+ const o = this.config.onConflict(r);
262
+ await this._resolveConflict(e, s, o), t.push(e.key), this.pendingQueue.delete(e.key);
263
+ } else await this._pushChange(e), t.push(e.key), this.pendingQueue.delete(e.key); else await this._pushChange(e),
264
+ t.push(e.key), this.pendingQueue.delete(e.key);
265
+ } catch (t) {
266
+ s.push(`Failed to sync "${e.key}": ${t}`);
267
+ }
268
+ const o = {
269
+ success: 0 === s.length,
270
+ syncedKeys: t,
271
+ conflicts: n,
272
+ errors: s,
273
+ timestamp: Date.now(),
274
+ duration: Date.now() - e
275
+ };
276
+ return this.config.onSync(o), o;
277
+ } catch (r) {
278
+ const o = `Sync failed: ${r}`;
279
+ return s.push(o), {
280
+ success: !1,
281
+ syncedKeys: t,
282
+ conflicts: n,
283
+ errors: s,
284
+ timestamp: Date.now(),
285
+ duration: Date.now() - e
286
+ };
287
+ } finally {
288
+ this._isSyncing = !1, this._notifyStateChange();
289
+ }
290
+ }
291
+ async _fetchRemoteVersions(e) {
292
+ try {
293
+ const t = this._getAuthToken(), n = await this.config.fetch(`${this.config.endpoint}/versions`, {
294
+ method: "POST",
295
+ headers: {
296
+ "Content-Type": "application/json",
297
+ ...t && {
298
+ Authorization: `Bearer ${t}`
299
+ }
300
+ },
301
+ body: JSON.stringify({
302
+ keys: e
303
+ })
304
+ });
305
+ if (n.ok) {
306
+ const e = await n.json();
307
+ if (e.versions) for (const [t, n] of Object.entries(e.versions)) this.remoteVersions.set(t, n);
308
+ }
309
+ } catch (e) {}
310
+ }
311
+ async _pushChange(e) {
312
+ let t = 0;
313
+ for (;t < this.config.maxRetries; ) try {
314
+ const n = this._getAuthToken(), s = await this.config.fetch(`${this.config.endpoint}/sync`, {
315
+ method: "POST",
316
+ headers: {
317
+ "Content-Type": "application/json",
318
+ ...n && {
319
+ Authorization: `Bearer ${n}`
320
+ }
321
+ },
322
+ body: JSON.stringify({
323
+ key: e.key,
324
+ value: e.value,
325
+ version: e.version,
326
+ timestamp: e.timestamp
327
+ })
328
+ });
329
+ if (s.ok) {
330
+ const t = await s.json();
331
+ return void (t.version && this.remoteVersions.set(e.key, {
332
+ version: t.version,
333
+ timestamp: t.timestamp || Date.now(),
334
+ value: e.value
335
+ }));
336
+ }
337
+ t++;
338
+ } catch (e) {
339
+ if (t++, t >= this.config.maxRetries) throw e;
340
+ }
341
+ }
342
+ async _resolveConflict(e, t, n) {
343
+ switch (n.action) {
344
+ case "accept-local":
345
+ await this._pushChange({
346
+ ...e,
347
+ version: t.version + 1,
348
+ timestamp: Date.now()
349
+ });
350
+ break;
351
+
352
+ case "accept-remote":
353
+ this.store.set(e.key, t.value);
354
+ break;
355
+
356
+ case "merge":
357
+ this.store.set(e.key, n.value), await this._pushChange({
358
+ key: e.key,
359
+ value: n.value,
360
+ version: Math.max(e.version, t.version) + 1,
361
+ timestamp: Date.now()
362
+ });
363
+ }
364
+ }
365
+ getState() {
366
+ return {
367
+ isOnline: this._isOnline,
368
+ isSyncing: this._isSyncing,
369
+ lastSyncTimestamp: null,
370
+ pendingChanges: this.pendingQueue.size,
371
+ conflicts: 0
372
+ };
373
+ }
374
+ onOnlineChange(e) {
375
+ return this.onlineStatusListeners.add(e), () => this.onlineStatusListeners.delete(e);
376
+ }
377
+ onStateChange(e) {
378
+ return this.syncStateListeners.add(e), () => this.syncStateListeners.delete(e);
379
+ }
380
+ async flush() {
381
+ return this.sync();
382
+ }
383
+ destroy() {
384
+ this.syncTimer && clearTimeout(this.syncTimer), this.pendingQueue.clear(), this.onlineStatusListeners.clear(),
385
+ this.syncStateListeners.clear();
386
+ }
387
+ }, R = (e, t) => new M(e, t), T = () => {
388
+ try {
389
+ if ("undefined" != typeof process && "production" === process.env?.NODE_ENV) return !0;
390
+ const e = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : {};
391
+ return void 0 !== e.__DEV__ && !1 === e.__DEV__;
392
+ } catch {
393
+ return !1;
394
+ }
395
+ }, j = () => "undefined" != typeof window ? window.localStorage : null, V = n => {
396
+ const s = new Map, r = new Map, o = new Map, a = new Set, i = new Map, c = new Set, l = new Map, u = new Map, y = new Map, d = new Map, g = new Map, f = new Map, h = new Map, S = new Map, R = n?.namespace || "gstate", V = n?.silent ?? !1, I = n?.debounceTime ?? 150, $ = n?.version ?? 0, U = n?.storage || j(), x = n?.onError, N = n?.maxObjectSize ?? 0, L = n?.maxTotalSize ?? 0, P = n?.encryptionKey ?? null, z = n?.validateInput ?? !0, K = n?.auditEnabled ?? !0, J = n?.userId, B = n?.immer ?? !0, Q = n?.persistByDefault ?? n?.persistence ?? n?.persist ?? !1;
397
+ n?.accessRules && n.accessRules.forEach(e => b(h, e.pattern, e.permissions));
398
+ let W, F = !1, G = !1, q = !1, X = 0, Z = null, H = null;
399
+ const Y = new Promise(e => {
400
+ W = e;
401
+ }), ee = () => ({
402
+ store: s,
403
+ versions: r,
404
+ sizes: o,
405
+ totalSize: X,
406
+ storage: U,
407
+ config: n || {},
408
+ diskQueue: g,
409
+ encryptionKey: P,
410
+ audit: re,
411
+ onError: x,
412
+ silent: V,
413
+ debounceTime: I,
414
+ currentVersion: $
415
+ }), te = () => ({
416
+ plugins: d,
417
+ onError: x,
418
+ silent: V
419
+ }), ne = e => {
420
+ if (null == e) return 0;
421
+ const t = typeof e;
422
+ if ("boolean" === t) return 4;
423
+ if ("number" === t) return 8;
424
+ if ("string" === t) return 2 * e.length;
425
+ if ("object" !== t) return 0;
426
+ let n = 0;
427
+ const s = [ e ], r = new WeakSet;
428
+ for (;s.length > 0; ) {
429
+ const e = s.pop();
430
+ if ("boolean" == typeof e) n += 4; else if ("number" == typeof e) n += 8; else if ("string" == typeof e) n += 2 * e.length; else if ("object" == typeof e && null !== e) {
431
+ const t = e;
432
+ if (r.has(t)) continue;
433
+ if (r.add(t), Array.isArray(t)) for (let e = 0; e < t.length; e++) s.push(t[e]); else for (const e of Object.keys(t)) n += 2 * e.length,
434
+ s.push(t[e]);
435
+ }
436
+ }
437
+ return n;
438
+ }, se = (e, t) => {
439
+ ((e, t, n) => {
440
+ if (0 !== e.plugins.size) for (const s of e.plugins.values()) {
441
+ const r = s.hooks?.[t];
442
+ if (r) try {
443
+ r(n);
444
+ } catch (r) {
445
+ const o = r instanceof Error ? r : new Error(String(r));
446
+ e.onError ? e.onError(o, {
447
+ operation: `plugin:${s.name}:${t}`,
448
+ key: n.key
449
+ }) : e.silent;
450
+ }
451
+ }
452
+ })(te(), e, t);
453
+ }, re = (e, t, n, s) => {
454
+ K && null !== w && v && v({
455
+ timestamp: Date.now(),
456
+ action: e,
457
+ key: t,
458
+ userId: J,
459
+ success: n,
460
+ error: s
461
+ });
462
+ }, oe = e => {
463
+ const n = u.get(e);
464
+ if (!n) return;
465
+ const s = new Set, o = n.selector(e => (s.add(e), u.has(e) ? u.get(e).lastValue : le.get(e)));
466
+ n.deps.forEach(t => {
467
+ if (!s.has(t)) {
468
+ const n = y.get(t);
469
+ n && (n.delete(e), 0 === n.size && y.delete(t));
470
+ }
471
+ }), s.forEach(t => {
472
+ n.deps.has(t) || (y.has(t) || y.set(t, new Set), y.get(t).add(e));
473
+ }), n.deps = s, D(n.lastValue, o) || (n.lastValue = B && null !== o && "object" == typeof o ? t(O(o), !0) : o,
474
+ r.set(e, (r.get(e) || 0) + 1), ae(e));
475
+ }, ae = e => {
476
+ if (e) {
477
+ if (y.has(e)) {
478
+ const t = y.get(e);
479
+ for (const e of t) oe(e);
480
+ }
481
+ const t = l.get(e);
482
+ if (t) {
483
+ const n = le.get(e);
484
+ for (const s of t) try {
485
+ s(n);
486
+ } catch (t) {
487
+ const n = t instanceof Error ? t : new Error(String(t));
488
+ x && x(n, {
489
+ operation: "watcher",
490
+ key: e
491
+ });
492
+ }
493
+ }
494
+ const n = i.get(e);
495
+ if (n) for (const t of n) try {
496
+ t();
497
+ } catch (t) {
498
+ const n = t instanceof Error ? t : new Error(String(t));
499
+ x && x(n, {
500
+ operation: "keyListener",
501
+ key: e
502
+ });
503
+ }
504
+ }
505
+ if (F) G = !0; else for (const e of a) try {
506
+ e();
507
+ } catch (e) {
508
+ const t = e instanceof Error ? e : new Error(String(e));
509
+ x && x(t, {
510
+ operation: "listener"
511
+ });
512
+ }
513
+ }, ie = async () => {
514
+ (async e => {
515
+ if (!e.storage) return;
516
+ const {store: t, config: n, diskQueue: s, storage: r, encryptionKey: o, audit: a, onError: i, silent: c, currentVersion: l} = e, u = A(n.namespace || "gstate");
517
+ try {
518
+ const e = {};
519
+ let s;
520
+ t.forEach((t, n) => {
521
+ e[n] = t;
522
+ });
523
+ const o = n?.encoded;
524
+ s = o ? btoa(JSON.stringify(e)) : JSON.stringify(e), r.setItem(u.replace("_", ""), JSON.stringify({
525
+ v: 1,
526
+ t: Date.now(),
527
+ e: null,
528
+ d: s,
529
+ _sys_v: l,
530
+ _b64: !!o || void 0
531
+ })), a("set", "FULL_STATE", !0);
532
+ } catch (e) {
533
+ const t = e instanceof Error ? e : new Error(String(e));
534
+ i && i(t, {
535
+ operation: "persist",
536
+ key: "FULL_STATE"
537
+ });
538
+ }
539
+ const y = Array.from(s.entries());
540
+ s.clear();
541
+ for (const [t, n] of y) try {
542
+ if (!t || !/^[a-zA-Z0-9_.-]+$/.test(t) || t.length > 256) continue;
543
+ let s = n.value;
544
+ const i = n.options.encoded || n.options.encrypted || n.options.secure;
545
+ if (n.options.encrypted) {
546
+ if (!o) throw new Error(`Encryption key missing for "${t}"`);
547
+ s = await p(n.value, o);
548
+ } else i ? s = btoa(JSON.stringify(n.value)) : "object" == typeof n.value && null !== n.value && (s = JSON.stringify(n.value));
549
+ r.setItem(`${u}${t}`, JSON.stringify({
550
+ v: e.versions.get(t) || 1,
551
+ t: Date.now(),
552
+ e: n.options.ttl ? Date.now() + n.options.ttl : null,
553
+ d: s,
554
+ _sys_v: l,
555
+ _enc: !!n.options.encrypted || void 0,
556
+ _b64: !(!n.options.encoded && !n.options.secure) || void 0
557
+ })), a("set", t, !0);
558
+ } catch (e) {
559
+ const n = e instanceof Error ? e : new Error(String(e));
560
+ i && i(n, {
561
+ operation: "persist",
562
+ key: t
563
+ });
564
+ }
565
+ })(ee());
566
+ }, ce = {}, le = {
567
+ _setSilently: (e, n) => {
568
+ const a = o.get(e) || 0, i = B && null !== n && "object" == typeof n ? t(O(n), !0) : n, c = (N > 0 || L > 0) && !T() ? ne(i) : 0;
569
+ X = X - a + c, o.set(e, c), s.set(e, i), r.set(e, (r.get(e) || 0) + 1), H = null;
570
+ },
571
+ _registerMethod: (e, t, n) => {
572
+ const s = e => "__proto__" === e || "constructor" === e || "prototype" === e;
573
+ s(e) || s(t) || (ce[e] || (ce[e] = {}), ce[e][t] = n);
574
+ },
575
+ set: (a, i, c = {}) => {
576
+ const l = s.get(a), u = B && "function" == typeof i ? e(l, i) : i;
577
+ if (z && !k(a)) return !1;
578
+ if (!E(h, a, "write", J)) return re("set", a, !1, "RBAC Denied"), !1;
579
+ const y = z ? _(u) : u, d = o.get(a) || 0;
580
+ se("onBeforeSet", {
581
+ key: a,
582
+ value: y,
583
+ store: le,
584
+ version: r.get(a) || 0
585
+ });
586
+ const f = B && null !== y && "object" == typeof y ? t(O(y), !0) : y;
587
+ if (!D(l, f)) {
588
+ const e = (N > 0 || L > 0) && !T() ? ne(f) : 0;
589
+ if (N > 0 && e > N) {
590
+ const t = new Error(`Object size (${e} bytes) exceeds maxObjectSize (${N} bytes)`);
591
+ x && x(t, {
592
+ operation: "set",
593
+ key: a
594
+ });
595
+ }
596
+ if (L > 0) {
597
+ const t = X - d + e;
598
+ if (t > L) {
599
+ const e = new Error(`Total store size (${t} bytes) exceeds limit (${L} bytes)`);
600
+ x && x(e, {
601
+ operation: "set"
602
+ });
603
+ }
604
+ }
605
+ X = X - d + e, o.set(a, e), s.set(a, f), r.set(a, (r.get(a) || 0) + 1), H = null;
606
+ const t = c.persist ?? Q;
607
+ return t && (g.set(a, {
608
+ value: f,
609
+ options: {
610
+ ...c,
611
+ persist: t,
612
+ encoded: c.encoded || n?.encoded
613
+ }
614
+ }), Z && clearTimeout(Z), Z = setTimeout(ie, I)), se("onSet", {
615
+ key: a,
616
+ value: f,
617
+ store: le,
618
+ version: r.get(a)
619
+ }), re("set", a, !0), ae(a), !0;
620
+ }
621
+ return !1;
622
+ },
623
+ get: e => {
624
+ if (!E(h, e, "read", J)) return re("get", e, !1, "RBAC Denied"), null;
625
+ const t = s.get(e);
626
+ return se("onGet", {
627
+ store: le,
628
+ key: e,
629
+ value: t
630
+ }), re("get", e, !0), t;
631
+ },
632
+ compute: (e, t) => {
633
+ try {
634
+ return u.has(e) || (u.set(e, {
635
+ selector: t,
636
+ lastValue: null,
637
+ deps: new Set
638
+ }), oe(e)), u.get(e).lastValue;
639
+ } catch (t) {
640
+ const n = t instanceof Error ? t : new Error(String(t));
641
+ return x && x(n, {
642
+ operation: "compute",
643
+ key: e
644
+ }), null;
645
+ }
646
+ },
647
+ watch: (e, t) => {
648
+ l.has(e) || l.set(e, new Set);
649
+ const n = l.get(e);
650
+ return n.add(t), () => {
651
+ n.delete(t), 0 === n.size && l.delete(e);
652
+ };
653
+ },
654
+ remove: e => {
655
+ if (!E(h, e, "delete", J)) return re("delete", e, !1, "RBAC Denied"), !1;
656
+ const t = s.get(e), n = s.delete(e);
657
+ return n && (X -= o.get(e) || 0, o.delete(e), se("onRemove", {
658
+ store: le,
659
+ key: e,
660
+ value: t
661
+ }), H = null), r.set(e, (r.get(e) || 0) + 1), U && U.removeItem(`${R}_${e}`), re("delete", e, !0),
662
+ ae(e), n;
663
+ },
664
+ delete: e => le.remove(e),
665
+ deleteAll: () => {
666
+ if (Array.from(s.keys()).forEach(e => le.remove(e)), U) {
667
+ const e = R + "_";
668
+ for (let t = 0; t < (U.length || 0); t++) {
669
+ const n = U.key(t);
670
+ n?.startsWith(e) && (U.removeItem(n), t--);
671
+ }
672
+ }
673
+ return X = 0, o.clear(), H = null, !0;
674
+ },
675
+ list: () => Object.fromEntries(s.entries()),
676
+ use: e => {
677
+ c.add(e);
678
+ },
679
+ transaction: e => {
680
+ F = !0, se("onTransaction", {
681
+ store: le,
682
+ key: "START"
683
+ });
684
+ try {
685
+ e();
686
+ } finally {
687
+ F = !1, se("onTransaction", {
688
+ store: le,
689
+ key: "END"
690
+ }), G && (G = !1, ae());
691
+ }
692
+ },
693
+ destroy: () => {
694
+ Z && (clearTimeout(Z), Z = null), g.clear(), "undefined" != typeof window && window.removeEventListener("beforeunload", ue),
695
+ se("onDestroy", {
696
+ store: le
697
+ }), a.clear(), i.clear(), l.clear(), u.clear(), y.clear(), d.clear(), s.clear(),
698
+ o.clear(), X = 0, h.clear(), S.clear(), r.clear(), f.clear(), c.clear();
699
+ },
700
+ _addPlugin: e => {
701
+ ((e, t, n) => {
702
+ try {
703
+ e.plugins.set(t.name, t), t.hooks?.onInstall?.({
704
+ store: n
705
+ });
706
+ } catch (n) {
707
+ const s = n instanceof Error ? n : new Error(String(n));
708
+ e.onError ? e.onError(s, {
709
+ operation: "plugin:install",
710
+ key: t.name
711
+ }) : e.silent;
712
+ }
713
+ })(te(), e, le);
714
+ },
715
+ _removePlugin: e => {
716
+ d.delete(e);
717
+ },
718
+ _subscribe: (e, t) => {
719
+ if (t) {
720
+ i.has(t) || i.set(t, new Set);
721
+ const n = i.get(t);
722
+ return n.add(e), () => {
723
+ n.delete(e), 0 === n.size && i.delete(t);
724
+ };
725
+ }
726
+ return a.add(e), () => a.delete(e);
727
+ },
728
+ _getVersion: e => r.get(e) ?? 0,
729
+ addAccessRule: (e, t) => b(h, e, t),
730
+ hasPermission: (e, t, n) => E(h, e, t, n),
731
+ recordConsent: (e, t, n) => C(S, e, t, n),
732
+ hasConsent: (e, t) => ((e, t, n) => {
733
+ const s = e.get(t);
734
+ if (!s) return !1;
735
+ for (let e = s.length - 1; e >= 0; e--) {
736
+ const t = s[e];
737
+ if (t && t.purpose === n) return t.granted;
738
+ }
739
+ return !1;
740
+ })(S, e, t),
741
+ getConsents: e => ((e, t) => e.get(t) || [])(S, e),
742
+ revokeConsent: (e, t) => ((e, t, n) => C(e, t, n, !1))(S, e, t),
743
+ exportUserData: e => ((e, t) => ({
744
+ userId: t,
745
+ exportedAt: Date.now(),
746
+ consents: e.get(t) || []
747
+ }))(S, e),
748
+ deleteUserData: e => ((e, t) => {
749
+ const n = e.get(t)?.length || 0;
750
+ return e.delete(t), {
751
+ success: !0,
752
+ deletedConsents: n
753
+ };
754
+ })(S, e),
755
+ getSnapshot: () => (H || (H = Object.fromEntries(s.entries())), H),
756
+ get plugins() {
757
+ return ce;
758
+ },
759
+ get isReady() {
760
+ return q;
761
+ },
762
+ get namespace() {
763
+ return R;
764
+ },
765
+ get userId() {
766
+ return J;
767
+ },
768
+ whenReady: () => Y
769
+ };
770
+ [ "addAccessRule", "recordConsent", "hasConsent", "getConsents", "revokeConsent", "exportUserData", "deleteUserData" ].forEach(e => {
771
+ const t = le[e];
772
+ t && le._registerMethod("security", e, t);
773
+ });
774
+ const ue = () => {
775
+ g.size > 0 && ie();
776
+ };
777
+ "undefined" != typeof window && window.addEventListener("beforeunload", ue), U ? (async (e, n, s) => {
778
+ const {storage: r, config: o, encryptionKey: a, audit: i, onError: c, silent: l, currentVersion: u, store: y, sizes: d, versions: g} = e, f = A(o.namespace || "gstate"), h = o.immer ?? !0;
779
+ if (r) try {
780
+ const l = {};
781
+ let p = 0;
782
+ for (let e = 0; e < (r.length || 0); e++) {
783
+ const t = r.key(e);
784
+ if (!t || !t.startsWith(f)) continue;
785
+ const n = r.getItem(t);
786
+ if (n) try {
787
+ const s = JSON.parse(n), o = t.substring(f.length);
788
+ if (p = Math.max(p, void 0 !== s._sys_v ? s._sys_v : s.v || 0), s.e && Date.now() > s.e) {
789
+ r.removeItem(t), e--;
790
+ continue;
791
+ }
792
+ let c = s.d;
793
+ if (s._enc && a) c = await m(c, a); else if ("string" == typeof c) if (s._b64) try {
794
+ c = JSON.parse(atob(c));
795
+ } catch (e) {} else if (c.startsWith("{") || c.startsWith("[")) try {
796
+ c = JSON.parse(c);
797
+ } catch (e) {}
798
+ l[o] = c, i("hydrate", o, !0);
799
+ } catch (e) {
800
+ i("hydrate", t, !1, String(e));
801
+ const n = e instanceof Error ? e : new Error(String(e));
802
+ c && c(n, {
803
+ operation: "hydration",
804
+ key: t
805
+ });
806
+ }
807
+ }
808
+ const w = p < u && o.migrate ? o.migrate(l, p) : l;
809
+ Object.entries(w).forEach(([s, r]) => {
810
+ const o = h && null !== r && "object" == typeof r ? t(O(r), !0) : r, a = n(o), i = d.get(s) || 0;
811
+ e.totalSize = e.totalSize - i + a, d.set(s, a), y.set(s, o), g.set(s, 1);
812
+ }), s();
813
+ } catch (e) {
814
+ const t = e instanceof Error ? e : new Error(String(e));
815
+ c && c(t, {
816
+ operation: "hydration"
817
+ });
818
+ }
819
+ })(ee(), e => (N > 0 || L > 0) && !T() ? ne(e) : 0, () => {
820
+ q = !0, H = null, W(), ae();
821
+ }).then(() => {}) : (q = !0, W());
822
+ let ye = null;
823
+ return n?.sync && (ye = new M(le, n.sync), le._registerMethod("sync", "flush", () => ye?.flush()),
824
+ le._registerMethod("sync", "getState", () => ye?.getState()), le._registerMethod("sync", "onStateChange", e => ye?.onStateChange(e))),
825
+ le;
826
+ }, I = null, $ = e => {
827
+ const t = V(e);
828
+ return I = t, t;
829
+ }, U = () => {
830
+ I && (I.destroy(), I = null);
831
+ }, x = e => {
832
+ const t = e || I, r = n(() => e => t ? t._subscribe(e) : () => {}, [ t ]);
833
+ return s(r, () => !!t && t.isReady, () => !0);
834
+ }, N = () => I;
835
+
836
+ function L(e, t) {
837
+ const a = n(() => t || I, [ t ]), i = n(() => {
838
+ const e = () => {}, t = () => !1, n = () => null;
839
+ return {
840
+ set: t,
841
+ get: n,
842
+ remove: t,
843
+ delete: t,
844
+ deleteAll: t,
845
+ list: () => ({}),
846
+ compute: n,
847
+ watch: () => () => {},
848
+ use: e,
849
+ transaction: e,
850
+ destroy: e,
851
+ _subscribe: () => () => {},
852
+ _setSilently: e,
853
+ _registerMethod: e,
854
+ _addPlugin: e,
855
+ _removePlugin: e,
856
+ _getVersion: () => 0,
857
+ get isReady() {
858
+ return !1;
859
+ },
860
+ whenReady: () => Promise.resolve(),
861
+ get plugins() {
862
+ return {};
863
+ },
864
+ getSnapshot: () => ({}),
865
+ get namespace() {
866
+ return "ghost";
867
+ },
868
+ get userId() {}
869
+ };
870
+ }, []), c = a || i, l = "function" == typeof e, u = l ? null : e, y = l ? e : null, d = r(e => l ? c._subscribe(e) : c._subscribe(e, u), [ c, l, u ]), g = r(() => l ? y(c.getSnapshot()) : c.get(u) ?? void 0, [ c, l, u, y ]), f = r(() => {
871
+ if (l) try {
872
+ return y({});
873
+ } catch {
874
+ return;
875
+ }
876
+ }, [ y, l ]), h = s(d, g, f), p = r((e, t) => l ? (T(), !1) : c.set(u, e, t), [ c, l, u ]);
877
+ return o(h, e => l ? `Selector: ${JSON.stringify(e)}` : `${u}: ${JSON.stringify(e)}`),
878
+ l ? h : [ h, p ];
879
+ }
880
+
881
+ var P = new Map, z = (e, t) => {
882
+ const n = e.namespace;
883
+ if (P.has(n)) return P.get(n);
884
+ const s = new M(e, t);
885
+ return P.set(n, s), s;
886
+ }, K = e => {
887
+ const t = P.get(e);
888
+ t && (t.destroy(), P.delete(e));
889
+ };
890
+
891
+ function J(e, t) {
892
+ const n = t || I, s = n?.namespace || "default", o = P.get(s), c = L(e, n), l = c[0], u = c[1], [y, d] = a(() => o?.getState() || {
893
+ isOnline: !0,
894
+ isSyncing: !1,
895
+ lastSyncTimestamp: null,
896
+ pendingChanges: 0,
897
+ conflicts: 0
898
+ });
899
+ i(() => {
900
+ if (!o) return;
901
+ return o.onStateChange(d);
902
+ }, [ o ]);
903
+ return [ l, r((t, s) => {
904
+ const r = u(t, s);
905
+ if (r && o) {
906
+ const t = n?.get(e);
907
+ o.queueChange(e, t);
908
+ }
909
+ return r;
910
+ }, [ u, o, e, n ]), y ];
911
+ }
912
+
913
+ var B = () => {
914
+ const [e, t] = a({
915
+ isOnline: !0,
916
+ isSyncing: !1,
917
+ lastSyncTimestamp: null,
918
+ pendingChanges: 0,
919
+ conflicts: 0
920
+ });
921
+ return i(() => {
922
+ const e = () => {
923
+ let e = !0, n = !1, s = 0, r = 0;
924
+ P.forEach(t => {
925
+ const o = t.getState();
926
+ e = e && o.isOnline, n = n || o.isSyncing, s += o.pendingChanges, r += o.conflicts;
927
+ }), t({
928
+ isOnline: e,
929
+ isSyncing: n,
930
+ lastSyncTimestamp: null,
931
+ pendingChanges: s,
932
+ conflicts: r
933
+ });
934
+ };
935
+ e();
936
+ const n = Array.from(P.values()).map(t => t.onStateChange(e));
937
+ return () => n.forEach(e => e());
938
+ }, []), e;
939
+ }, Q = async e => {
940
+ const t = e || I?.namespace;
941
+ if (!t) return;
942
+ const n = P.get(t);
943
+ n && await n.flush();
944
+ }, W = (e, t) => {
945
+ const n = t?.key || "async_data", s = t?.store || V({
946
+ namespace: `async_${n}`,
947
+ silent: !0
948
+ });
949
+ null == s.get(n) && s.set(n, {
950
+ data: null,
951
+ loading: !1,
952
+ error: null,
953
+ updatedAt: null
954
+ });
955
+ return Object.assign(s, {
956
+ execute: async () => {
957
+ const r = s.get(n);
958
+ s.set(n, {
959
+ ...r || {
960
+ data: null,
961
+ loading: !1,
962
+ error: null,
963
+ updatedAt: null
964
+ },
965
+ loading: !0,
966
+ error: null
967
+ }), "whenReady" in s && !s.isReady && await s.whenReady();
968
+ try {
969
+ const r = await e(), o = s.get(n);
970
+ s.set(n, {
971
+ ...o || {
972
+ data: null,
973
+ loading: !1,
974
+ error: null,
975
+ updatedAt: null
976
+ },
977
+ data: r,
978
+ loading: !1,
979
+ updatedAt: Date.now()
980
+ }, {
981
+ persist: t?.persist
982
+ });
983
+ } catch (e) {
984
+ const t = s.get(n);
985
+ s.set(n, {
986
+ ...t || {
987
+ data: null,
988
+ loading: !1,
989
+ error: null,
990
+ updatedAt: null
991
+ },
992
+ error: e instanceof Error ? e : new Error(String(e)),
993
+ loading: !1
994
+ });
995
+ }
996
+ }
997
+ });
998
+ }, F = () => ({
999
+ name: "gstate-immer",
1000
+ hooks: {
1001
+ onInstall: ({store: e}) => {
1002
+ e._registerMethod("immer", "setWithProduce", (t, n) => e.set(t, n));
1003
+ }
1004
+ }
1005
+ }), G = e => {
1006
+ let t = [], n = -1, s = !1;
1007
+ const r = e?.limit || 50;
1008
+ return {
1009
+ name: "gstate-undo-redo",
1010
+ hooks: {
1011
+ onInstall: ({store: e}) => {
1012
+ t.push(e.list()), n = 0, e._registerMethod("undoRedo", "undo", () => {
1013
+ if (n > 0) {
1014
+ s = !0, n--;
1015
+ const r = t[n];
1016
+ return !!r && (Object.entries(r).forEach(([t, n]) => {
1017
+ e._setSilently(t, n);
1018
+ }), s = !1, !0);
1019
+ }
1020
+ return !1;
1021
+ }), e._registerMethod("undoRedo", "redo", () => {
1022
+ if (n < t.length - 1) {
1023
+ s = !0, n++;
1024
+ const r = t[n];
1025
+ return !!r && (Object.entries(r).forEach(([t, n]) => {
1026
+ e._setSilently(t, n);
1027
+ }), s = !1, !0);
1028
+ }
1029
+ return !1;
1030
+ }), e._registerMethod("undoRedo", "canUndo", () => n > 0), e._registerMethod("undoRedo", "canRedo", () => n < t.length - 1);
1031
+ },
1032
+ onSet: ({store: e}) => {
1033
+ s || (n < t.length - 1 && (t = t.slice(0, n + 1)), t.push(e.list()), t.length > r ? t.shift() : n++);
1034
+ }
1035
+ }
1036
+ };
1037
+ }, q = e => ({
1038
+ name: "gstate-schema",
1039
+ hooks: {
1040
+ onSet: ({key: t, value: n}) => {
1041
+ if (!t) return;
1042
+ const s = e[t];
1043
+ if (s) {
1044
+ const e = s(n);
1045
+ if (!0 !== e) throw new Error(`[Schema Error] Validation failed for key "${t}": ${!1 === e ? "Invalid type" : e}`);
1046
+ }
1047
+ }
1048
+ }
1049
+ }), X = e => {
1050
+ const t = globalThis.__REDUX_DEVTOOLS_EXTENSION__;
1051
+ if (!t?.connect) return {
1052
+ name: "gstate-devtools-noop",
1053
+ hooks: {}
1054
+ };
1055
+ let n = null;
1056
+ return {
1057
+ name: "gstate-devtools",
1058
+ hooks: {
1059
+ onInstall: ({store: s}) => {
1060
+ n = t.connect({
1061
+ name: e?.name || "Magnetar Store"
1062
+ }), n.init(s.list());
1063
+ },
1064
+ onSet: ({key: e, store: t}) => {
1065
+ e && n && n.send(`SET_${e.toUpperCase()}`, t.list());
1066
+ },
1067
+ onRemove: ({key: e, store: t}) => {
1068
+ e && n && n.send(`REMOVE_${e.toUpperCase()}`, t.list());
1069
+ }
1070
+ }
1071
+ };
1072
+ }, Z = () => {
1073
+ const e = new Map;
1074
+ return {
1075
+ name: "gstate-snapshot",
1076
+ hooks: {
1077
+ onInstall: ({store: t}) => {
1078
+ t._registerMethod("snapshot", "takeSnapshot", n => {
1079
+ e.set(n, t.list());
1080
+ }), t._registerMethod("snapshot", "restoreSnapshot", n => {
1081
+ const s = e.get(n);
1082
+ return !!s && (t.transaction(() => {
1083
+ Object.entries(s).forEach(([e, n]) => {
1084
+ t.set(e, n);
1085
+ });
1086
+ }), !0);
1087
+ }), t._registerMethod("snapshot", "listSnapshots", () => Array.from(e.keys())),
1088
+ t._registerMethod("snapshot", "deleteSnapshot", t => e.delete(t)), t._registerMethod("snapshot", "clearSnapshots", () => e.clear());
1089
+ }
1090
+ }
1091
+ };
1092
+ }, H = e => ({
1093
+ name: "gstate-guard",
1094
+ hooks: {
1095
+ onBeforeSet: ({key: t, value: n, store: s}) => {
1096
+ if (!t) return;
1097
+ const r = e[t];
1098
+ r && r(n);
1099
+ }
1100
+ }
1101
+ }), Y = e => ({
1102
+ name: "gstate-analytics",
1103
+ hooks: {
1104
+ onSet: ({key: t, value: n}) => {
1105
+ t && (e.keys && !e.keys.includes(t) || e.provider({
1106
+ key: t,
1107
+ value: n,
1108
+ action: "SET"
1109
+ }));
1110
+ },
1111
+ onRemove: ({key: t}) => {
1112
+ t && (e.keys && !e.keys.includes(t) || e.provider({
1113
+ key: t,
1114
+ value: null,
1115
+ action: "REMOVE"
1116
+ }));
1117
+ }
1118
+ }
1119
+ }), ee = e => {
1120
+ const t = new BroadcastChannel(e?.channelName || "gstate_sync");
1121
+ let n = !1;
1122
+ return {
1123
+ name: "gstate-sync",
1124
+ hooks: {
1125
+ onInstall: ({store: e}) => {
1126
+ t.onmessage = t => {
1127
+ const {key: s, value: r, action: o} = t.data;
1128
+ s && (n = !0, "REMOVE" === o ? e.remove(s) : e.set(s, r), n = !1);
1129
+ };
1130
+ },
1131
+ onSet: ({key: e, value: s}) => {
1132
+ e && !n && t.postMessage({
1133
+ key: e,
1134
+ value: s,
1135
+ action: "SET"
1136
+ });
1137
+ },
1138
+ onRemove: ({key: e}) => {
1139
+ e && !n && t.postMessage({
1140
+ key: e,
1141
+ action: "REMOVE"
1142
+ });
1143
+ },
1144
+ onDestroy: () => {
1145
+ t.close();
1146
+ }
1147
+ }
1148
+ };
1149
+ }, te = () => {
1150
+ if (T()) return {
1151
+ name: "gstate-debug-noop",
1152
+ hooks: {}
1153
+ };
1154
+ T();
1155
+ return {
1156
+ name: "gstate-debug",
1157
+ hooks: {
1158
+ onInstall: ({store: e}) => {
1159
+ "undefined" != typeof window && (window.gstate = {
1160
+ list: () => e.list(),
1161
+ get: t => {
1162
+ const n = e.get(t);
1163
+ return n;
1164
+ },
1165
+ set: (t, n) => {
1166
+ const s = e.set(t, n);
1167
+ return JSON.stringify(n), s;
1168
+ },
1169
+ watch: (t, n) => e.watch(t, n),
1170
+ info: () => {
1171
+ const t = {
1172
+ namespace: e.namespace,
1173
+ isReady: e.isReady,
1174
+ keys: Object.keys(e.list()),
1175
+ size: Object.keys(e.list()).length
1176
+ };
1177
+ return t;
1178
+ },
1179
+ banner: () => {}
1180
+ });
1181
+ },
1182
+ onDestroy: () => {
1183
+ "undefined" != typeof window && delete window.gstate;
1184
+ }
1185
+ }
1186
+ };
1187
+ }, ne = (e = {}) => {
1188
+ const t = e.dbName || "rgs-db", n = e.storeName || "states", s = e.version || 1;
1189
+ let r = null;
1190
+ const o = () => new Promise((e, o) => {
1191
+ if (r) return e(r);
1192
+ const a = indexedDB.open(t, s);
1193
+ a.onerror = () => o(a.error), a.onsuccess = () => {
1194
+ r = a.result, e(r);
1195
+ }, a.onupgradeneeded = e => {
1196
+ const t = e.target.result;
1197
+ t.objectStoreNames.contains(n) || t.createObjectStore(n);
1198
+ };
1199
+ }), a = async e => {
1200
+ const t = await o();
1201
+ return new Promise((s, r) => {
1202
+ const o = t.transaction(n, "readonly").objectStore(n).get(e);
1203
+ o.onsuccess = () => s(o.result), o.onerror = () => r(o.error);
1204
+ });
1205
+ };
1206
+ return {
1207
+ name: "indexedDB",
1208
+ hooks: {
1209
+ onInstall: ({store: e}) => {
1210
+ e._registerMethod("indexedDB", "clear", async () => {
1211
+ (await o()).transaction(n, "readwrite").objectStore(n).clear();
1212
+ });
1213
+ },
1214
+ onInit: async ({store: e}) => {
1215
+ const t = (await o()).transaction(n, "readonly").objectStore(n).getAllKeys();
1216
+ t.onsuccess = async () => {
1217
+ const n = t.result, s = e.namespace + "_";
1218
+ for (const t of n) if (t.startsWith(s)) {
1219
+ const n = await a(t);
1220
+ if (n) {
1221
+ const r = t.substring(s.length);
1222
+ e._setSilently(r, n.d);
1223
+ }
1224
+ }
1225
+ };
1226
+ },
1227
+ onSet: async ({key: e, value: t, store: s}) => {
1228
+ if (!e) return;
1229
+ const r = s.namespace + "_", a = {
1230
+ d: t,
1231
+ t: Date.now(),
1232
+ v: s._getVersion?.(e) || 1
1233
+ };
1234
+ await (async (e, t) => {
1235
+ const s = await o();
1236
+ return new Promise((r, o) => {
1237
+ const a = s.transaction(n, "readwrite").objectStore(n).put(t, e);
1238
+ a.onsuccess = () => r(), a.onerror = () => o(a.error);
1239
+ });
1240
+ })(`${r}${e}`, a);
1241
+ },
1242
+ onRemove: async ({key: e, store: t}) => {
1243
+ if (!e) return;
1244
+ const s = t.namespace + "_";
1245
+ await (async e => {
1246
+ const t = await o();
1247
+ return new Promise((s, r) => {
1248
+ const o = t.transaction(n, "readwrite").objectStore(n).delete(e);
1249
+ o.onsuccess = () => s(), o.onerror = () => r(o.error);
1250
+ });
1251
+ })(`${s}${e}`);
1252
+ }
1253
+ }
1254
+ };
1255
+ }, se = e => {
1256
+ const {adapter: t, autoSyncInterval: n} = e, s = new Map, r = {
1257
+ lastSyncTimestamp: null,
1258
+ totalKeysSynced: 0,
1259
+ totalBytesSynced: 0,
1260
+ syncCount: 0,
1261
+ lastDuration: 0,
1262
+ errors: 0
1263
+ };
1264
+ let o = null;
1265
+ return {
1266
+ name: "cloudSync",
1267
+ hooks: {
1268
+ onInstall: ({store: a}) => {
1269
+ a._registerMethod("cloudSync", "sync", async () => {
1270
+ const n = performance.now(), o = {};
1271
+ let i = 0;
1272
+ try {
1273
+ const c = a.list(), l = Object.keys(c);
1274
+ for (const e of l) {
1275
+ const t = a._getVersion?.(e) || 0;
1276
+ if (t > (s.get(e) || 0)) {
1277
+ const n = c[e];
1278
+ o[e] = n, i += JSON.stringify(n).length, s.set(e, t);
1279
+ }
1280
+ }
1281
+ if (0 === Object.keys(o).length) return {
1282
+ status: "no-change",
1283
+ stats: r
1284
+ };
1285
+ if (await t.save(o)) return r.lastSyncTimestamp = Date.now(), r.totalKeysSynced += Object.keys(o).length,
1286
+ r.totalBytesSynced += i, r.syncCount++, r.lastDuration = performance.now() - n,
1287
+ e.onSync && e.onSync(r), {
1288
+ status: "success",
1289
+ stats: r
1290
+ };
1291
+ throw new Error(`Adapter ${t.name} failed to save.`);
1292
+ } catch (e) {
1293
+ return r.errors++, {
1294
+ status: "error",
1295
+ error: String(e),
1296
+ stats: r
1297
+ };
1298
+ }
1299
+ }), a._registerMethod("cloudSync", "getStats", () => r), n && n > 0 && (o = setInterval(() => {
1300
+ const e = a.plugins.cloudSync;
1301
+ e && e.sync();
1302
+ }, n));
1303
+ },
1304
+ onDestroy: () => {
1305
+ o && clearInterval(o);
1306
+ }
1307
+ }
1308
+ };
1309
+ }, re = (e, t) => ({
1310
+ name: "MongoDB-Atlas",
1311
+ save: async n => (await fetch(`${e}/action/updateOne`, {
1312
+ method: "POST",
1313
+ headers: {
1314
+ "Content-Type": "application/json",
1315
+ "api-key": t
1316
+ },
1317
+ body: JSON.stringify({
1318
+ dataSource: "Cluster0",
1319
+ database: "rgs_cloud",
1320
+ collection: "user_states",
1321
+ filter: {
1322
+ id: "global_state"
1323
+ },
1324
+ update: {
1325
+ $set: {
1326
+ data: n,
1327
+ updatedAt: Date.now()
1328
+ }
1329
+ },
1330
+ upsert: !0
1331
+ })
1332
+ })).ok
1333
+ }), oe = (e, t) => ({
1334
+ name: "Firebase-Firestore",
1335
+ save: async e => {
1336
+ try {
1337
+ T();
1338
+ return (() => {})("[Mock] Firestore Syncing:", e), !0;
1339
+ } catch (e) {
1340
+ return !1;
1341
+ }
1342
+ }
1343
+ }), ae = (e, t) => ({
1344
+ name: "SQL-REST-API",
1345
+ save: async n => {
1346
+ const s = t();
1347
+ if (!s) return !1;
1348
+ return (await fetch(e, {
1349
+ method: "PATCH",
1350
+ headers: {
1351
+ "Content-Type": "application/json",
1352
+ Authorization: `Bearer ${s}`
1353
+ },
1354
+ body: JSON.stringify(n),
1355
+ credentials: "same-origin"
1356
+ })).ok;
1357
+ }
1358
+ }), ie = e => ({
1359
+ name: "gstate-logger",
1360
+ hooks: {
1361
+ onSet: ({key: e, value: t, version: n}) => {
1362
+ (new Date).toLocaleTimeString();
1363
+ },
1364
+ onRemove: ({key: e}) => {},
1365
+ onTransaction: ({key: e}) => {}
1366
+ }
1367
+ }), ce = (e, t) => {
1368
+ const n = V("string" == typeof t ? {
1369
+ namespace: t
1370
+ } : t);
1371
+ e && Object.entries(e).forEach(([e, t]) => {
1372
+ null === n.get(e) && n._setSilently(e, t);
1373
+ });
1374
+ return "undefined" == typeof window || T() || (window.gstate = n, window.gState = n,
1375
+ window.rgs = n), Object.assign(e => L(e, n), n);
1376
+ }, le = (e, t) => N()?.addAccessRule(e, t), ue = (e, t, n) => N()?.hasPermission(e, t, n) ?? !0, ye = (e, t, n) => {
1377
+ const s = N();
1378
+ if (!s) throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");
1379
+ return s.recordConsent(e, t, n);
1380
+ }, de = (e, t) => N()?.hasConsent(e, t) ?? !1, ge = e => N()?.getConsents(e) ?? [], fe = (e, t) => N()?.revokeConsent(e, t), he = e => {
1381
+ const t = N();
1382
+ if (!t) throw new Error("[gstate] exportUserData failed: No store found.");
1383
+ return t.exportUserData(e);
1384
+ }, pe = e => {
1385
+ const t = N();
1386
+ if (!t) throw new Error("[gstate] deleteUserData failed: No store found.");
1387
+ return t.deleteUserData(e);
1388
+ }, me = () => {}, we = () => {};
1389
+
1390
+ export { M as SyncEngine, le as addAccessRule, Y as analyticsPlugin, me as clearAccessRules, we as clearAllConsents, se as cloudSyncPlugin, W as createAsyncStore, oe as createFirestoreAdapter, re as createMongoAdapter, ae as createSqlRestAdapter, V as createStore, R as createSyncEngine, te as debugPlugin, pe as deleteUserData, y as deriveKeyFromPassword, U as destroyState, K as destroySync, X as devToolsPlugin, f as exportKey, he as exportUserData, g as generateEncryptionKey, d as generateSalt, ge as getConsents, N as getStore, ce as gstate, H as guardPlugin, de as hasConsent, ue as hasPermission, F as immerPlugin, h as importKey, ne as indexedDBPlugin, $ as initState, z as initSync, u as isCryptoAvailable, v as logAudit, ie as loggerPlugin, ye as recordConsent, fe as revokeConsent, _ as sanitizeValue, q as schemaPlugin, S as setAuditLogger, Z as snapshotPlugin, ee as syncPlugin, Q as triggerSync, G as undoRedoPlugin, L as useGState, x as useIsStoreReady, L as useSimpleState, L as useStore, B as useSyncStatus, J as useSyncedState, k as validateKey };