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