@biglogic/rgs 3.5.2 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FUNDING.yml +12 -0
- package/README.md +389 -323
- package/core/hooks.d.ts +10 -0
- package/core/security.d.ts +2 -0
- package/core/sync.d.ts +76 -0
- package/core/types.d.ts +7 -1
- package/docs/README.md +389 -0
- package/docs/SUMMARY.md +64 -0
- package/docs/_config.yml +1 -0
- package/docs/api.md +381 -0
- package/docs/chapters/01-philosophy.md +54 -0
- package/docs/chapters/02-getting-started.md +68 -0
- package/docs/chapters/03-the-magnetar-way.md +69 -0
- package/docs/chapters/04-persistence-and-safety.md +125 -0
- package/docs/chapters/05-plugin-sdk.md +290 -0
- package/docs/chapters/05-plugins-and-extensibility.md +190 -0
- package/docs/chapters/06-case-studies.md +69 -0
- package/docs/chapters/07-faq.md +53 -0
- package/docs/chapters/08-migration-guide.md +284 -0
- package/docs/chapters/09-security-architecture.md +50 -0
- package/docs/chapters/10-local-first-sync.md +146 -0
- package/docs/qa.md +47 -0
- package/index.d.ts +4 -1
- package/index.js +2 -1
- package/index.js.map +7 -0
- package/package.json +85 -81
- package/plugins/official/cloud-sync.plugin.d.ts +1 -1
- package/rgs-extension.vsix +0 -0
- package/advanced.js +0 -1
- /package/{LICENSE → LICENSE.md} +0 -0
package/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
var yt=Symbol.for("immer-nothing"),it=Symbol.for("immer-draftable"),R=Symbol.for("immer-state");function T(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var M=Object,q=M.getPrototypeOf,Se="constructor",Pe="prototype",$e="configurable",he="enumerable",ge="writable",ne="value",j=e=>!!e&&!!e[R];function U(e){return e?St(e)||ke(e)||!!e[it]||!!e[Se]?.[it]||ve(e)||xe(e):!1}var Wt=M[Pe][Se].toString(),at=new WeakMap;function St(e){if(!e||!Je(e))return!1;let t=q(e);if(t===null||t===M[Pe])return!0;let n=M.hasOwnProperty.call(t,Se)&&t[Se];if(n===Object)return!0;if(!G(n))return!1;let r=at.get(n);return r===void 0&&(r=Function.toString.call(n),at.set(n,r)),r===Wt}function Ee(e,t,n=!0){se(e)===0?(n?Reflect.ownKeys(e):M.keys(e)).forEach(o=>{t(o,e[o],e)}):e.forEach((r,o)=>t(o,r,e))}function se(e){let t=e[R];return t?t.type_:ke(e)?1:ve(e)?2:xe(e)?3:0}var ct=(e,t,n=se(e))=>n===2?e.has(t):M[Pe].hasOwnProperty.call(e,t),Fe=(e,t,n=se(e))=>n===2?e.get(t):e[t],me=(e,t,n,r=se(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function Ht(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}var ke=Array.isArray,ve=e=>e instanceof Map,xe=e=>e instanceof Set,Je=e=>typeof e=="object",G=e=>typeof e=="function",Ne=e=>typeof e=="boolean";function Jt(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var N=e=>e.copy_||e.base_;var Ge=e=>e.modified_?e.copy_:e.base_;function je(e,t){if(ve(e))return new Map(e);if(xe(e))return new Set(e);if(ke(e))return Array[Pe].slice.call(e);let n=St(e);if(t===!0||t==="class_only"&&!n){let r=M.getOwnPropertyDescriptors(e);delete r[R];let o=Reflect.ownKeys(r);for(let s=0;s<o.length;s++){let a=o[s],u=r[a];u[ge]===!1&&(u[ge]=!0,u[$e]=!0),(u.get||u.set)&&(r[a]={[$e]:!0,[ge]:!0,[he]:u[he],[ne]:e[a]})}return M.create(q(e),r)}else{let r=q(e);if(r!==null&&n)return{...e};let o=M.create(r);return M.assign(o,e)}}function $(e,t=!1){return Ce(e)||j(e)||!U(e)||(se(e)>1&&M.defineProperties(e,{set:pe,add:pe,clear:pe,delete:pe}),M.freeze(e),t&&Ee(e,(n,r)=>{$(r,!0)},!1)),e}function Gt(){T(2)}var pe={[ne]:Gt};function Ce(e){return e===null||!Je(e)?!0:M.isFrozen(e)}var _e="MapSet",Le="Patches",ut="ArrayMethods",ht={};function H(e){let t=ht[e];return t||T(0,e),t}var lt=e=>!!ht[e];var re,mt=()=>re,qt=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:lt(_e)?H(_e):void 0,arrayMethodsPlugin_:lt(ut)?H(ut):void 0});function ft(e,t){t&&(e.patchPlugin_=H(Le),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Be(e){Ke(e),e.drafts_.forEach(Qt),e.drafts_=null}function Ke(e){e===re&&(re=e.parent_)}var dt=e=>re=qt(re,e);function Qt(e){let t=e[R];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function pt(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[R].modified_&&(Be(t),T(4)),U(e)&&(e=gt(t,e));let{patchPlugin_:o}=t;o&&o.generateReplacementPatches_(n[R].base_,e,t)}else e=gt(t,n);return Xt(t,e,!0),Be(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==yt?e:void 0}function gt(e,t){if(Ce(t))return t;let n=t[R];if(!n)return we(t,e.handledSet_,e);if(!Re(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:r}=n;if(r)for(;r.length>0;)r.pop()(e);bt(n,e)}return n.copy_}function Xt(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&$(t,n)}function _t(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Re=(e,t)=>e.scope_===t,Yt=[];function wt(e,t,n,r){let o=N(e),s=e.type_;if(r!==void 0&&Fe(o,r,s)===t){me(o,r,n,s);return}if(!e.draftLocations_){let u=e.draftLocations_=new Map;Ee(o,(p,d)=>{if(j(d)){let h=u.get(d)||[];h.push(p),u.set(d,h)}})}let a=e.draftLocations_.get(t)??Yt;for(let u of a)me(o,u,n,s)}function Zt(e,t,n){e.callbacks_.push(function(o){let s=t;if(!s||!Re(s,o))return;o.mapSetPlugin_?.fixSetContents(s);let a=Ge(s);wt(e,s.draft_??s,a,n),bt(s,o)})}function bt(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:r}=t;if(r){let o=r.getPath(e);o&&r.generatePatches_(e,o,t)}_t(e)}}function en(e,t,n){let{scope_:r}=e;if(j(n)){let o=n[R];Re(o,r)&&o.callbacks_.push(function(){ye(e);let a=Ge(o);wt(e,n,a,t)})}else U(n)&&e.callbacks_.push(function(){let s=N(e);e.type_===3?s.has(n)&&we(n,r.handledSet_,r):Fe(s,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&we(Fe(e.copy_,t,e.type_),r.handledSet_,r)})}function we(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||j(e)||t.has(e)||!U(e)||Ce(e)||(t.add(e),Ee(e,(r,o)=>{if(j(o)){let s=o[R];if(Re(s,n)){let a=Ge(s);me(e,r,a,e.type_),_t(s)}}else U(o)&&we(o,t,n)})),e}function tn(e,t){let n=ke(e),r={type_:n?1:0,scope_:t?t.scope_:mt(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},o=r,s=be;n&&(o=[r],s=oe);let{revoke:a,proxy:u}=Proxy.revocable(o,s);return r.draft_=u,r.revoke_=a,[u,r]}var be={get(e,t){if(t===R)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t=="string";if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let o=N(e);if(!ct(o,t,e.type_))return nn(e,o,t);let s=o[t];if(e.finalized_||!U(s)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Jt(t))return s;if(s===Ue(e.base_,t)){ye(e);let a=e.type_===1?+t:t,u=He(e.scope_,s,e,a);return e.copy_[a]=u}return s},has(e,t){return t in N(e)},ownKeys(e){return Reflect.ownKeys(N(e))},set(e,t,n){let r=Pt(N(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let o=Ue(N(e),t),s=o?.[R];if(s&&s.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(Ht(n,o)&&(n!==void 0||ct(e.base_,t,e.type_)))return!0;ye(e),We(e)}return e.copy_[t]===n&&(n!==void 0||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),en(e,t,n)),!0},deleteProperty(e,t){return ye(e),Ue(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),We(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=N(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[ge]:!0,[$e]:e.type_!==1||t!=="length",[he]:r[he],[ne]:n[t]}},defineProperty(){T(11)},getPrototypeOf(e){return q(e.base_)},setPrototypeOf(){T(12)}},oe={};for(let e in be){let t=be[e];oe[e]=function(){let n=arguments;return n[0]=n[0][0],t.apply(this,n)}}oe.deleteProperty=function(e,t){return oe.set.call(this,e,t,void 0)};oe.set=function(e,t,n){return be.set.call(this,e[0],t,n,e[0])};function Ue(e,t){let n=e[R];return(n?N(n):e)[t]}function nn(e,t,n){let r=Pt(t,n);return r?ne in r?r[ne]:r.get?.call(e.draft_):void 0}function Pt(e,t){if(!(t in e))return;let n=q(e);for(;n;){let r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=q(n)}}function We(e){e.modified_||(e.modified_=!0,e.parent_&&We(e.parent_))}function ye(e){e.copy_||(e.assigned_=new Map,e.copy_=je(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var rn=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,n,r)=>{if(G(t)&&!G(n)){let s=n;n=t;let a=this;return function(p=s,...d){return a.produce(p,h=>n.call(this,h,...d))}}G(n)||T(6),r!==void 0&&!G(r)&&T(7);let o;if(U(t)){let s=dt(this),a=He(s,t,void 0),u=!0;try{o=n(a),u=!1}finally{u?Be(s):Ke(s)}return ft(s,r),pt(o,s)}else if(!t||!Je(t)){if(o=n(t),o===void 0&&(o=t),o===yt&&(o=void 0),this.autoFreeze_&&$(o,!0),r){let s=[],a=[];H(Le).generateReplacementPatches_(t,o,{patches_:s,inversePatches_:a}),r(s,a)}return o}else T(1,t)},this.produceWithPatches=(t,n)=>{if(G(t))return(a,...u)=>this.produceWithPatches(a,p=>t(p,...u));let r,o;return[this.produce(t,n,(a,u)=>{r=a,o=u}),r,o]},Ne(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Ne(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Ne(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){U(e)||T(8),j(e)&&(e=on(e));let t=dt(this),n=He(t,e,void 0);return n[R].isManual_=!0,Ke(t),n}finishDraft(e,t){let n=e&&e[R];(!n||!n.isManual_)&&T(9);let{scope_:r}=n;return ft(r,t),pt(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let o=t[n];if(o.path.length===0&&o.op==="replace"){e=o.value;break}}n>-1&&(t=t.slice(n+1));let r=H(Le).applyPatches_;return j(e)?r(e,t):this.produce(e,o=>r(o,t))}};function He(e,t,n,r){let[o,s]=ve(t)?H(_e).proxyMap_(t,n):xe(t)?H(_e).proxySet_(t,n):tn(t,n);return(n?.scope_??mt()).drafts_.push(o),s.callbacks_=n?.callbacks_??[],s.key_=r,n&&r!==void 0?Zt(n,s,r):s.callbacks_.push(function(p){p.mapSetPlugin_?.fixSetContents(s);let{patchPlugin_:d}=p;s.modified_&&d&&d.generatePatches_(s,[],p)}),o}function on(e){return j(e)||T(10,e),Et(e)}function Et(e){if(!U(e)||Ce(e))return e;let t=e[R],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=je(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=je(e,!0);return Ee(n,(o,s)=>{me(n,o,Et(s))},r),t&&(t.finalized_=!1),n}var sn=new rn,kt=sn.produce;var vt=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",an=async()=>{if(!vt)throw new Error("Web Crypto API not available");let e=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),t=crypto.getRandomValues(new Uint8Array(12));return{key:e,iv:t}},cn=async e=>{let t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},un=async(e,t)=>{let n=Uint8Array.from(atob(e),s=>s.charCodeAt(0)),r=Uint8Array.from(atob(t),s=>s.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},xt=async(e,t)=>{let n=new TextEncoder,r=n.encode(JSON.stringify(e)),o=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,r),s=new Uint8Array(t.iv.length+o.byteLength);return s.set(t.iv),s.set(new Uint8Array(o),t.iv.length),btoa(String.fromCharCode(...s))},Ct=async(e,t)=>{let n=Uint8Array.from(atob(e),a=>a.charCodeAt(0)),r=n.slice(0,12),o=n.slice(12),s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,o);return JSON.parse(new TextDecoder().decode(s))},Ie=null,ln=e=>{Ie=e},Rt=()=>Ie!==null,ae=e=>{Ie&&Ie(e)},qe=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},Ae=(e,t,n,r)=>{if(e.size===0)return!0;for(let[o,s]of e){let a;if(typeof o=="function")a=o(t,r);else try{a=new RegExp(o).test(t)}catch{continue}if(a)return s.includes(n)||s.includes("admin")}return!1},ie=e=>{if(typeof e=="string"){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,r=>{let o=r.match(/&#x([0-9a-fA-F]+);?/i);if(o&&o[1])return String.fromCharCode(parseInt(o[1],16));let s=r.match(/&#([0-9]+);?/);return s&&s[1]?String.fromCharCode(parseInt(s[1],10)):""});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]")}if(e&&typeof e=="object"&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){let t={};for(let[n,r]of Object.entries(e))t[n]=ie(r);return t}return e}return Array.isArray(e)?e.map(t=>ie(t)):e},Qe=e=>/^[a-zA-Z0-9_.-]+$/.test(e)&&e.length<=256,Xe=(e,t,n,r)=>{let o={id:crypto.randomUUID(),purpose:n,granted:r,timestamp:Date.now()},s=e.get(t)||[];return s.push(o),e.set(t,s),ae({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),o},It=(e,t,n)=>{let r=e.get(t);if(!r)return!1;for(let o=r.length-1;o>=0;o--){let s=r[o];if(s&&s.purpose===n)return s.granted}return!1},At=(e,t,n)=>Xe(e,t,n,!1),Mt=(e,t)=>e.get(t)||[],Dt=(e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}),Ot=(e,t)=>{let n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}};var Q=e=>{if(e===null||typeof e!="object")return e;if(typeof structuredClone=="function")try{return structuredClone(e)}catch{}let t=new WeakMap,n=r=>{if(r===null||typeof r!="object"||typeof r=="function")return r;if(t.has(r))return t.get(r);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r.source,r.flags);if(r instanceof Map){let a=new Map;return t.set(r,a),r.forEach((u,p)=>a.set(n(p),n(u))),a}if(r instanceof Set){let a=new Set;return t.set(r,a),r.forEach(u=>a.add(n(u))),a}let o=Array.isArray(r)?[]:Object.create(Object.getPrototypeOf(r));t.set(r,o);let s=[...Object.keys(r),...Object.getOwnPropertySymbols(r)];for(let a of s)o[a]=n(r[a]);return o};return n(e)},ce=(e,t)=>{if(e===t)return!0;if(e===null||t===null||typeof e!="object"||typeof t!="object")return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let o=0;o<e.length;o++)if(!ce(e[o],t[o]))return!1;return!0}let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let o=0;o<n.length;o++){let s=n[o];if(!(s in t)||!ce(e[s],t[s]))return!1}return!0};var zt=e=>`${e}_`,Vt=async e=>{if(!e.storage)return;let{store:t,config:n,diskQueue:r,storage:o,encryptionKey:s,audit:a,onError:u,silent:p,currentVersion:d}=e,h=zt(n.namespace||"gstate");try{let _={};t.forEach((y,b)=>{_[b]=y});let l,S=n?.encoded;S?l=btoa(JSON.stringify(_)):l=JSON.stringify(_),o.setItem(h.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:l,_sys_v:d,_b64:S?!0:void 0})),a("set","FULL_STATE",!0)}catch(_){let l=_ instanceof Error?_:new Error(String(_));u?u(l,{operation:"persist",key:"FULL_STATE"}):p||console.error("[gState] Persist failed: ",l)}let m=Array.from(r.entries());r.clear();for(let[_,l]of m)try{let S=l.value,y=l.options.encoded||l.options.secure;if(l.options.encrypted){if(!s)throw new Error(`Encryption key missing for "${_}"`);S=await xt(l.value,s)}else y?S=btoa(JSON.stringify(l.value)):typeof l.value=="object"&&l.value!==null&&(S=JSON.stringify(l.value));o.setItem(`${h}${_}`,JSON.stringify({v:e.versions.get(_)||1,t:Date.now(),e:l.options.ttl?Date.now()+l.options.ttl:null,d:S,_sys_v:d,_enc:l.options.encrypted?!0:void 0,_b64:y?!0:void 0})),a("set",_,!0)}catch(S){let y=S instanceof Error?S:new Error(String(S));u?u(y,{operation:"persist",key:_}):p||console.error("[gState] Persist failed: ",y)}},Nt=async(e,t,n)=>{let{storage:r,config:o,encryptionKey:s,audit:a,onError:u,silent:p,currentVersion:d,store:h,sizes:m,versions:_}=e,l=zt(o.namespace||"gstate"),S=o.immer??!0;if(r)try{let y={},b=0;for(let I=0;I<(r.length||0);I++){let k=r.key(I);if(!k||!k.startsWith(l))continue;let x=r.getItem(k);if(x)try{let E=JSON.parse(x),A=k.substring(l.length);if(b=Math.max(b,E._sys_v!==void 0?E._sys_v:E.v||0),E.e&&Date.now()>E.e){r.removeItem(k),I--;continue}let D=E.d;if(E._enc&&s)D=await Ct(D,s);else if(typeof D=="string"){if(E._b64)try{D=JSON.parse(atob(D))}catch{}else if(D.startsWith("{")||D.startsWith("["))try{D=JSON.parse(D)}catch{}}y[A]=D,a("hydrate",A,!0)}catch(E){a("hydrate",k,!1,String(E));let A=E instanceof Error?E:new Error(String(E));u?u(A,{operation:"hydration",key:k}):p||console.error(`[gState] Hydration failed for "${k}": `,E)}}let B=b<d&&o.migrate?o.migrate(y,b):y;Object.entries(B).forEach(([I,k])=>{let x=S&&k!==null&&typeof k=="object"?$(Q(k),!0):k,E=t(x),A=m.get(I)||0;e.totalSize=e.totalSize-A+E,m.set(I,E),h.set(I,x),_.set(I,1)}),n()}catch(y){let b=y instanceof Error?y:new Error(String(y));u?u(b,{operation:"hydration"}):p||console.error("[gState] Hydration failed: ",b)}};var Ut=(e,t,n)=>{if(e.plugins.size!==0)for(let r of e.plugins.values()){let o=r.hooks?.[t];if(o)try{o(n)}catch(s){let a=s instanceof Error?s:new Error(String(s));e.onError?e.onError(a,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent||console.error(`[gState] Plugin "${r.name}" error:`,s)}}},$t=(e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(r){let o=r instanceof Error?r:new Error(String(r));e.onError?e.onError(o,{operation:"plugin:install",key:t.name}):e.silent||console.error(`[gState] Failed to install plugin "${t.name}": `,r)}};var pn={local:()=>typeof window<"u"?window.localStorage:null,session:()=>typeof window<"u"?window.sessionStorage:null,memory:()=>{let e=new Map;return{getItem:t=>e.get(t)||null,setItem:(t,n)=>e.set(t,n),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},X=e=>{let t=new Map,n=new Map,r=new Map,o=new Set,s=new Map,a=new Set,u=new Map,p=new Map,d=new Map,h=new Map,m=new Map,_=new Map,l=new Map,S=new Map,y=e?.namespace||"gstate",b=e?.silent??!1,B=e?.debounceTime??150,I=e?.version??0,k=e?.storage||pn.local(),x=e?.onError,E=e?.maxObjectSize??0,A=e?.maxTotalSize??0,D=e?.encryptionKey??null,le=e?.validateInput??!0,jt=e?.auditEnabled??!0,Y=e?.userId,fe=e?.immer??!0,Lt=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(i=>qe(l,i.pattern,i.permissions));let De=!1,Oe=!1,Te=!1,V=0,J=null,F=null,ze,Bt=new Promise(i=>{ze=i}),Kt=()=>`${y}_`,Ze=()=>({store:t,versions:n,sizes:r,totalSize:V,storage:k,config:e||{},diskQueue:m,encryptionKey:D,audit:W,onError:x,silent:b,debounceTime:B,currentVersion:I}),et=()=>({plugins:h,onError:x,silent:b}),Ve=i=>{if(i==null)return 0;let c=typeof i;if(c==="boolean")return 4;if(c==="number")return 8;if(c==="string")return i.length*2;if(c!=="object")return 0;let f=0,w=[i],P=new WeakSet;for(;w.length>0;){let g=w.pop();if(typeof g=="boolean")f+=4;else if(typeof g=="number")f+=8;else if(typeof g=="string")f+=g.length*2;else if(typeof g=="object"&&g!==null){let v=g;if(P.has(v))continue;if(P.add(v),Array.isArray(v))for(let O=0;O<v.length;O++)w.push(v[O]);else for(let O of Object.keys(v))f+=O.length*2,w.push(v[O])}}return f},K=(i,c)=>{Ut(et(),i,c)},W=(i,c,f,w)=>{jt&&Rt()&&ae&&ae({timestamp:Date.now(),action:i,key:c,userId:Y,success:f,error:w})},tt=i=>{let c=p.get(i);if(!c)return;let f=new Set,w=g=>(f.add(g),p.has(g)?p.get(g).lastValue:C.get(g)),P=c.selector(w);c.deps.forEach(g=>{if(!f.has(g)){let v=d.get(g);v&&(v.delete(i),v.size===0&&d.delete(g))}}),f.forEach(g=>{c.deps.has(g)||(d.has(g)||d.set(g,new Set),d.get(g).add(i))}),c.deps=f,ce(c.lastValue,P)||(c.lastValue=fe&&P!==null&&typeof P=="object"?$(Q(P),!0):P,n.set(i,(n.get(i)||0)+1),Z(i))},Z=i=>{if(i){if(d.has(i)){let w=d.get(i);for(let P of w)tt(P)}let c=u.get(i);if(c){let w=C.get(i);for(let P of c)try{P(w)}catch(g){let v=g instanceof Error?g:new Error(String(g));x?x(v,{operation:"watcher",key:i}):b||console.error(`[gState] Watcher error for "${i}":`,g)}}let f=s.get(i);if(f)for(let w of f)try{w()}catch(P){let g=P instanceof Error?P:new Error(String(P));x?x(g,{operation:"keyListener",key:i}):b||console.error(`[gState] Listener error for "${i}":`,P)}}if(De){Oe=!0;return}for(let c of o)try{c()}catch(f){let w=f instanceof Error?f:new Error(String(f));x?x(w,{operation:"listener"}):b||console.error("[gState] Global listener error: ",f)}},nt=async()=>{Vt(Ze())},de={},C={_setSilently:(i,c)=>{let f=r.get(i)||0,w=fe&&c!==null&&typeof c=="object"?$(Q(c),!0):c,g=(E>0||A>0)&&!1?Ve(w):0;V=V-f+g,r.set(i,g),t.set(i,w),n.set(i,(n.get(i)||0)+1),F=null},_registerMethod:(i,c,f)=>{let w=P=>P==="__proto__"||P==="constructor"||P==="prototype";if(w(i)||w(c)){console.warn("[gState] Refusing to register method with unsafe key:",i,c);return}de[i]||(de[i]={}),de[i][c]=f},set:(i,c,f={})=>{let w=t.get(i),P=fe&&typeof c=="function"?kt(w,c):c;if(le&&!Qe(i))return b||console.warn(`[gState] Invalid key: ${i}`),!1;if(!Ae(l,i,"write",Y))return W("set",i,!1,"RBAC Denied"),b||console.error(`[gState] RBAC Denied for "${i}"`),!1;let g=le?ie(P):P,v=r.get(i)||0;K("onBeforeSet",{key:i,value:g,store:C,version:n.get(i)||0});let O=fe&&g!==null&&typeof g=="object"?$(Q(g),!0):g;if(!ce(w,O)){let ee=(E>0||A>0)&&!1?Ve(O):0;if(E>0&&ee>E){let te=new Error(`Object size (${ee} bytes) exceeds maxObjectSize (${E} bytes)`);x?x(te,{operation:"set",key:i}):b||console.warn(`[gState] ${te.message} for "${i}"`)}if(A>0){let te=V-v+ee;if(te>A){let st=new Error(`Total store size (${te} bytes) exceeds limit (${A} bytes)`);x?x(st,{operation:"set"}):b||console.warn(`[gState] ${st.message}`)}}V=V-v+ee,r.set(i,ee),t.set(i,O),n.set(i,(n.get(i)||0)+1),F=null;let ot=f.persist??Lt;return ot&&(m.set(i,{value:O,options:{...f,persist:ot,encoded:f.encoded||e?.encoded}}),J&&clearTimeout(J),J=setTimeout(nt,B)),K("onSet",{key:i,value:O,store:C,version:n.get(i)}),W("set",i,!0),Z(i),!0}return!1},get:i=>{if(!Ae(l,i,"read",Y))return W("get",i,!1,"RBAC Denied"),null;let c=t.get(i);return K("onGet",{store:C,key:i,value:c}),W("get",i,!0),c},compute:(i,c)=>{try{return p.has(i)||(p.set(i,{selector:c,lastValue:null,deps:new Set}),tt(i)),p.get(i).lastValue}catch(f){let w=f instanceof Error?f:new Error(String(f));return x?x(w,{operation:"compute",key:i}):b||console.error(`[gState] Compute error for "${i}": `,f),null}},watch:(i,c)=>{u.has(i)||u.set(i,new Set);let f=u.get(i);return f.add(c),()=>{f.delete(c),f.size===0&&u.delete(i)}},remove:i=>{if(!Ae(l,i,"delete",Y))return W("delete",i,!1,"RBAC Denied"),!1;let c=t.get(i),f=t.delete(i);return f&&(V-=r.get(i)||0,r.delete(i),K("onRemove",{store:C,key:i,value:c}),F=null),n.set(i,(n.get(i)||0)+1),k&&k.removeItem(`${Kt()}${i}`),W("delete",i,!0),Z(i),f},delete:i=>C.remove(i),deleteAll:()=>{if(Array.from(t.keys()).forEach(i=>C.remove(i)),k){let i=y+"_";for(let c=0;c<(k.length||0);c++){let f=k.key(c);f?.startsWith(i)&&(k.removeItem(f),c--)}}return V=0,r.clear(),F=null,!0},list:()=>Object.fromEntries(t.entries()),use:i=>{a.add(i)},transaction:i=>{De=!0,K("onTransaction",{store:C,key:"START"});try{i()}finally{De=!1,K("onTransaction",{store:C,key:"END"}),Oe&&(Oe=!1,Z())}},destroy:()=>{J&&(clearTimeout(J),J=null),m.clear(),typeof window<"u"&&window.removeEventListener("beforeunload",rt),K("onDestroy",{store:C}),o.clear(),s.clear(),u.clear(),p.clear(),d.clear(),h.clear(),t.clear(),r.clear(),V=0,l.clear(),S.clear(),n.clear(),_.clear(),a.clear()},_addPlugin:i=>{$t(et(),i,C)},_removePlugin:i=>{h.delete(i)},_subscribe:(i,c)=>{if(c){s.has(c)||s.set(c,new Set);let f=s.get(c);return f.add(i),()=>{f.delete(i),f.size===0&&s.delete(c)}}return o.add(i),()=>o.delete(i)},_getVersion:i=>n.get(i)??0,addAccessRule:(i,c)=>qe(l,i,c),hasPermission:(i,c,f)=>{if(l.size===0)return!0;for(let[w,P]of l){let g;if(typeof w=="function")g=w(i,f);else try{let v=_.get(w);v||(v=new RegExp(w),_.set(w,v)),g=v.test(i)}catch{continue}if(g)return P.includes(c)||P.includes("admin")}return!1},recordConsent:(i,c,f)=>Xe(S,i,c,f),hasConsent:(i,c)=>It(S,i,c),getConsents:i=>Mt(S,i),revokeConsent:(i,c)=>At(S,i,c),exportUserData:i=>Dt(S,i),deleteUserData:i=>Ot(S,i),getSnapshot:()=>(F||(F=Object.fromEntries(t.entries())),F),get plugins(){return de},get isReady(){return Te},get namespace(){return y},get userId(){return Y},whenReady:()=>Bt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(i=>{let c=C[i];c&&C._registerMethod("security",i,c)});let rt=()=>{m.size>0&&nt()};return typeof window<"u"&&window.addEventListener("beforeunload",rt),k?Nt(Ze(),i=>(E>0||A>0)&&!1?Ve(i):0,()=>{Te=!0,F=null,ze(),Z()}).then(()=>{}):(Te=!0,ze()),C};import{useSyncExternalStore as Ft,useDebugValue as gn,useMemo as Ye,useCallback as Me}from"react";var L=null,yn=e=>{L&&!e?.namespace&&(e?.silent||console.warn("[gState] Store already exists. Pass a unique namespace to create additional stores."));let t=X(e);return L=t,t},Sn=()=>{L&&(L.destroy(),L=null)},hn=e=>{let t=e||L,n=Ye(()=>r=>t?t._subscribe(r):()=>{},[t]);return Ft(n,()=>t?t.isReady:!1,()=>!0)},z=()=>L;function ue(e,t){let n=Ye(()=>t||L,[t]),r=Ye(()=>{let l=()=>{},S=()=>!1,y=()=>null;return{set:S,get:y,remove:S,delete:S,deleteAll:S,list:()=>({}),compute:y,watch:()=>()=>{},use:l,transaction:l,destroy:l,_subscribe:()=>()=>{},_setSilently:l,_registerMethod:l,_addPlugin:l,_removePlugin:l,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}},getSnapshot:()=>({}),get namespace(){return"ghost"},get userId(){}}},[]),o=n||r,s=typeof e=="function",a=s?null:e,u=s?e:null,p=Me(l=>s?o._subscribe(l):o._subscribe(l,a),[o,s,a]),d=Me(()=>s?u(o.getSnapshot()):o.get(a)??void 0,[o,s,a,u]),h=Me(()=>{if(s)try{return u({})}catch{return}else return},[u,s]),m=Ft(p,d,h),_=Me((l,S)=>s?!1:o.set(a,l,S),[o,s,a]);return gn(m,l=>s?`Selector: ${JSON.stringify(l)}`:`${a}: ${JSON.stringify(l)}`),s?m:[m,_]}var mn=(e,t)=>{let n=t?.key||"async_data",r=t?.store||X({namespace:`async_${n}`,silent:!0});return r.get(n)==null&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null}),Object.assign(r,{execute:async()=>{let s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{let a=await e(),u=r.get(n);r.set(n,{...u||{data:null,loading:!1,error:null,updatedAt:null},data:a,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(a){let u=r.get(n);r.set(n,{...u||{data:null,loading:!1,error:null,updatedAt:null},error:a instanceof Error?a:new Error(String(a)),loading:!1})}}})};var _n=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",((t,n)=>e.set(t,n)))}}});var wn=e=>{let t=[],n=-1,r=!1,o=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:s})=>{t.push(s.list()),n=0,s._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;let a=t[n];return a?(Object.entries(a).forEach(([u,p])=>{s._setSilently(u,p)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;let a=t[n];return a?(Object.entries(a).forEach(([u,p])=>{s._setSilently(u,p)}),r=!1,!0):!1}return!1}),s._registerMethod("undoRedo","canUndo",()=>n>0),s._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:s})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(s.list()),t.length>o?t.shift():n++)}}}};var bn=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;let r=e[t];if(r){let o=r(n);if(o!==!0)throw new Error(`[Schema Error] Validation failed for key "${t}": ${o===!1?"Invalid type":o}`)}}}});var Pn=e=>{let r=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!r?.connect)return{name:"gstate-devtools-noop",hooks:{}};let o=null;return{name:"gstate-devtools",hooks:{onInstall:({store:s})=>{o=r.connect({name:e?.name||"Magnetar Store"}),o.init(s.list())},onSet:({key:s,store:a})=>{!s||!o||o.send(`SET_${s.toUpperCase()}`,a.list())},onRemove:({key:s,store:a})=>{!s||!o||o.send(`REMOVE_${s.toUpperCase()}`,a.list())}}}};var En=()=>{let e=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:t})=>{t._registerMethod("snapshot","takeSnapshot",(n=>{e.set(n,t.list())})),t._registerMethod("snapshot","restoreSnapshot",(n=>{let r=e.get(n);return r?(t.transaction(()=>{Object.entries(r).forEach(([o,s])=>{t.set(o,s)})}),!0):!1})),t._registerMethod("snapshot","listSnapshots",(()=>Array.from(e.keys()))),t._registerMethod("snapshot","deleteSnapshot",(n=>e.delete(n))),t._registerMethod("snapshot","clearSnapshots",(()=>e.clear()))}}}};var kn=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;let o=e[t];if(o){let s=o(n)}}}});var vn=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(!e.keys||e.keys.includes(t))&&e.provider({key:t,value:n,action:"SET"})},onRemove:({key:t})=>{t&&(!e.keys||e.keys.includes(t))&&e.provider({key:t,value:null,action:"REMOVE"})}}});var xn=e=>{let t=new BroadcastChannel(e?.channelName||"gstate_sync"),n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:r})=>{t.onmessage=o=>{let{key:s,value:a,action:u}=o.data;s&&(n=!0,u==="REMOVE"?r.remove(s):r.set(s,a),n=!1)}},onSet:({key:r,value:o})=>{!r||n||t.postMessage({key:r,value:o,action:"SET"})},onRemove:({key:r})=>{!r||n||t.postMessage({key:r,action:"REMOVE"})},onDestroy:()=>{t.close()}}}};var Cn=()=>({name:"gstate-debug-noop",hooks:{}});var Rn=(e={})=>{let t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1,o=null,s=()=>new Promise((d,h)=>{if(o)return d(o);let m=indexedDB.open(t,r);m.onerror=()=>h(m.error),m.onsuccess=()=>{o=m.result,d(o)},m.onupgradeneeded=_=>{let l=_.target.result;l.objectStoreNames.contains(n)||l.createObjectStore(n)}}),a=async(d,h)=>{let m=await s();return new Promise((_,l)=>{let b=m.transaction(n,"readwrite").objectStore(n).put(h,d);b.onsuccess=()=>_(),b.onerror=()=>l(b.error)})},u=async d=>{let h=await s();return new Promise((m,_)=>{let y=h.transaction(n,"readonly").objectStore(n).get(d);y.onsuccess=()=>m(y.result),y.onerror=()=>_(y.error)})},p=async d=>{let h=await s();return new Promise((m,_)=>{let y=h.transaction(n,"readwrite").objectStore(n).delete(d);y.onsuccess=()=>m(),y.onerror=()=>_(y.error)})};return{name:"indexedDB",hooks:{onInstall:({store:d})=>{d._registerMethod("indexedDB","clear",async()=>{(await s()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:d})=>{let l=(await s()).transaction(n,"readonly").objectStore(n).getAllKeys();l.onsuccess=async()=>{let S=l.result,y=d.namespace+"_";for(let b of S)if(b.startsWith(y)){let B=await u(b);if(B){let I=b.substring(y.length);d._setSilently(I,B.d)}}}},onSet:async({key:d,value:h,store:m})=>{if(!d)return;let _=m.namespace+"_",l={d:h,t:Date.now(),v:m._getVersion?.(d)||1};await a(`${_}${d}`,l)},onRemove:async({key:d,store:h})=>{if(!d)return;let m=h.namespace+"_";await p(`${m}${d}`)}}}};var In=e=>{let{adapter:t,autoSyncInterval:n}=e,r=new Map,o={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0},s=null;return{name:"cloudSync",hooks:{onInstall:({store:a})=>{a._registerMethod("cloudSync","sync",async()=>{let u=performance.now(),p={},d=0;try{let h=a.list(),m=Object.keys(h);for(let l of m){let S=a._getVersion?.(l)||0,y=r.get(l)||0;if(S>y){let b=h[l];p[l]=b,d+=JSON.stringify(b).length,r.set(l,S)}}if(Object.keys(p).length===0)return{status:"no-change",stats:o};if(await t.save(p))return o.lastSyncTimestamp=Date.now(),o.totalKeysSynced+=Object.keys(p).length,o.totalBytesSynced+=d,o.syncCount++,o.lastDuration=performance.now()-u,e.onSync&&e.onSync(o),{status:"success",stats:o};throw new Error(`Adapter ${t.name} failed to save.`)}catch(h){return o.errors++,console.error(`[gState] Cloud Sync Failed (${t.name}):`,h),{status:"error",error:String(h),stats:o}}}),a._registerMethod("cloudSync","getStats",()=>o),n&&n>0&&(s=setInterval(()=>{let p=a.plugins.cloudSync;p&&p.sync()},n))},onDestroy:()=>{s&&clearInterval(s)}}}},An=(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}),Mn=(e,t)=>({name:"Firebase-Firestore",save:async n=>{try{return((...s)=>{})("[Mock] Firestore Syncing:",n),!0}catch{return!1}}}),Dn=(e,t)=>({name:"SQL-REST-API",save:async n=>(await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(n)})).ok});var ir=e=>({name:"gstate-logger",hooks:{onSet:({key:t,value:n,version:r})=>{let o=new Date().toLocaleTimeString(),s=`[gState] SET: ${t} (v${r}) @ ${o}`;e?.collapsed?console.groupCollapsed(s):console.group(s),console.info("%c Value:","color: #4CAF50; font-weight: bold;",n),console.groupEnd()},onRemove:({key:t})=>{console.warn(`[gState] REMOVED: ${t}`)},onTransaction:({key:t})=>{t==="START"?console.group("\u2500\u2500 TRANSACTION START \u2500\u2500"):console.groupEnd()}}});var br=(e,t)=>{let r=X(typeof t=="string"?{namespace:t}:t);e&&Object.entries(e).forEach(([s,a])=>{r.get(s)===null&&r._setSilently(s,a)});let o=s=>ue(s,r);return typeof window<"u"&&(window.gState=r,window.rgs=r),Object.assign(o,r)};var Pr=(e,t)=>z()?.addAccessRule(e,t),Er=(e,t,n)=>z()?.hasPermission(e,t,n)??!0,kr=(e,t,n)=>{let r=z();if(!r)throw new Error("[gState] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},vr=(e,t)=>z()?.hasConsent(e,t)??!1,xr=e=>z()?.getConsents(e)??[],Cr=(e,t)=>z()?.revokeConsent(e,t),Rr=e=>{let t=z();if(!t)throw new Error("[gState] exportUserData failed: No store found.");return t.exportUserData(e)},Ir=e=>{let t=z();if(!t)throw new Error("[gState] deleteUserData failed: No store found.");return t.deleteUserData(e)},Ar=()=>{},Mr=()=>{};export{Pr as addAccessRule,vn as analyticsPlugin,Ar as clearAccessRules,Mr as clearAllConsents,In as cloudSyncPlugin,mn as createAsyncStore,Mn as createFirestoreAdapter,An as createMongoAdapter,Dn as createSqlRestAdapter,X as createStore,Cn as debugPlugin,Ir as deleteUserData,Sn as destroyState,Pn as devToolsPlugin,cn as exportKey,Rr as exportUserData,an as generateEncryptionKey,xr as getConsents,z as getStore,br as gstate,kn as guardPlugin,vr as hasConsent,Er as hasPermission,_n as immerPlugin,un as importKey,Rn as indexedDBPlugin,yn as initState,vt as isCryptoAvailable,ae as logAudit,ir as loggerPlugin,kr as recordConsent,Cr as revokeConsent,ie as sanitizeValue,bn as schemaPlugin,ln as setAuditLogger,En as snapshotPlugin,xn as syncPlugin,wn as undoRedoPlugin,ue as useGState,hn as useIsStoreReady,ue as useSimpleState,ue as useStore,Qe as validateKey};
|
|
1
|
+
import{produce as Ct,freeze as Le}from"immer";var ht=(t,e)=>{let n=Date.now();if(/\(\.*\+\?\)\+/.test(t)||/\(\.*\?\)\*/.test(t))return console.warn(`[gstate] Potentially dangerous regex pattern blocked: ${t}`),!1;if(t.length>500)return console.warn("[gstate] Regex pattern exceeds maximum length limit"),!1;try{let s=new RegExp(t).test(e),i=Date.now()-n;return i>100&&console.warn(`[gstate] Slow regex detected (${i}ms) for pattern: ${t}`),s}catch{return!1}},wt=()=>{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")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.")},A=typeof crypto<"u"&&typeof crypto.subtle<"u"&&typeof crypto.subtle.generateKey=="function",M=async(t,e,n=1e5)=>{if(!A)throw new Error("Web Crypto API not available");let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(t),"PBKDF2",!1,["deriveKey"]),s=await crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(e),iterations:n,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),i=crypto.getRandomValues(new Uint8Array(12));return{key:s,iv:i}},V=(t=16)=>crypto.getRandomValues(new Uint8Array(t)),j=async()=>{if(!A)throw new Error("Web Crypto API not available");let t=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),e=crypto.getRandomValues(new Uint8Array(12));return{key:t,iv:e}},$=async t=>{let e=await crypto.subtle.exportKey("raw",t.key);return{key:btoa(String.fromCharCode(...new Uint8Array(e))),iv:btoa(String.fromCharCode(...t.iv))}},U=async(t,e)=>{let n=Uint8Array.from(atob(t),i=>i.charCodeAt(0)),r=Uint8Array.from(atob(e),i=>i.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},He=async(t,e)=>{let n=new TextEncoder,r=n.encode(JSON.stringify(t)),s=await crypto.subtle.encrypt({name:"AES-GCM",iv:e.iv},e.key,r),i=new Uint8Array(e.iv.length+s.byteLength);return i.set(e.iv),i.set(new Uint8Array(s),e.iv.length),btoa(String.fromCharCode(...i))},Xe=async(t,e)=>{let n=Uint8Array.from(atob(t),a=>a.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),i=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},e.key,s);return JSON.parse(new TextDecoder().decode(i))},De=null,N=t=>{De=t},Ze=()=>De!==null,P=t=>{De&&De(t)},Ne=(t,e,n)=>{t.set(e instanceof RegExp?e.source:e,n)},_e=(t,e,n,r)=>{if(t.size===0)return!0;for(let[s,i]of t){let a;if(typeof s=="function"?a=s(e,r):a=ht(s,e),a)return i.includes(n)||i.includes("admin")}return!1},R=t=>{if(typeof t=="string"){let e=t.replace(/&#[xX]?[0-9a-fA-F]+;?/g,r=>{let s=r.match(/&#x([0-9a-fA-F]+);?/i);if(s&&s[1])return String.fromCharCode(parseInt(s[1],16));let i=r.match(/&#([0-9]+);?/);return i&&i[1]?String.fromCharCode(parseInt(i[1],10)):""});try{e=decodeURIComponent(e)}catch{}return e.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(t&&typeof t=="object"&&!Array.isArray(t)){if(Object.getPrototypeOf(t)===Object.prototype){let e={};for(let[n,r]of Object.entries(t))e[n]=R(r);return e}return t}return Array.isArray(t)?t.map(e=>R(e)):t},O=t=>/^[a-zA-Z0-9_.-]+$/.test(t)&&t.length<=256,ze=(t,e,n,r)=>{let s={id:wt(),purpose:n,granted:r,timestamp:Date.now()},i=t.get(e)||[];return i.push(s),t.set(e,i),P({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:e,success:!0}),s},Ye=(t,e,n)=>{let r=t.get(e);if(!r)return!1;for(let s=r.length-1;s>=0;s--){let i=r[s];if(i&&i.purpose===n)return i.granted}return!1},et=(t,e,n)=>ze(t,e,n,!1),tt=(t,e)=>t.get(e)||[],nt=(t,e)=>({userId:e,exportedAt:Date.now(),consents:t.get(e)||[]}),rt=(t,e)=>{let n=t.get(e)?.length||0;return t.delete(e),{success:!0,deletedConsents:n}};var me=t=>{if(t===null||typeof t!="object")return t;if(typeof structuredClone=="function")try{return structuredClone(t)}catch{}let e=new WeakMap,n=r=>{if(r===null||typeof r!="object"||typeof r=="function")return r;if(e.has(r))return e.get(r);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r.source,r.flags);if(r instanceof Map){let a=new Map;return e.set(r,a),r.forEach((u,f)=>a.set(n(f),n(u))),a}if(r instanceof Set){let a=new Set;return e.set(r,a),r.forEach(u=>a.add(n(u))),a}let s=Array.isArray(r)?[]:Object.create(Object.getPrototypeOf(r));e.set(r,s);let i=[...Object.keys(r),...Object.getOwnPropertySymbols(r)];for(let a of i)s[a]=n(r[a]);return s};return n(t)},Re=(t,e)=>{if(t===e)return!0;if(t===null||e===null||typeof t!="object"||typeof e!="object")return t===e;if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(let s=0;s<t.length;s++)if(!Re(t[s],e[s]))return!1;return!0}let n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(let s=0;s<n.length;s++){let i=n[s];if(!(i in e)||!Re(t[i],e[i]))return!1}return!0};import{freeze as bt}from"immer";var ot=t=>`${t}_`,it=async t=>{if(!t.storage)return;let{store:e,config:n,diskQueue:r,storage:s,encryptionKey:i,audit:a,onError:u,silent:f,currentVersion:p}=t,b=ot(n.namespace||"gstate");try{let h={};e.forEach((S,v)=>{h[v]=S});let l,y=n?.encoded;y?l=btoa(JSON.stringify(h)):l=JSON.stringify(h),s.setItem(b.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:l,_sys_v:p,_b64:y?!0:void 0})),a("set","FULL_STATE",!0)}catch(h){let l=h instanceof Error?h:new Error(String(h));u?u(l,{operation:"persist",key:"FULL_STATE"}):f||console.error("[gstate] Persist failed: ",l)}let m=Array.from(r.entries());r.clear();for(let[h,l]of m)try{if(!h||!/^[a-zA-Z0-9_.-]+$/.test(h)||h.length>256){console.warn(`[gstate] Invalid storage key: ${h}`);continue}let y=l.value,S=l.options.encoded||l.options.encrypted;if(l.options.encrypted){if(!i)throw new Error(`Encryption key missing for "${h}"`);y=await He(l.value,i)}else S?y=btoa(JSON.stringify(l.value)):typeof l.value=="object"&&l.value!==null&&(y=JSON.stringify(l.value));s.setItem(`${b}${h}`,JSON.stringify({v:t.versions.get(h)||1,t:Date.now(),e:l.options.ttl?Date.now()+l.options.ttl:null,d:y,_sys_v:p,_enc:l.options.encrypted?!0:void 0,_b64:S?!0:void 0})),a("set",h,!0)}catch(y){let S=y instanceof Error?y:new Error(String(y));u?u(S,{operation:"persist",key:h}):f||console.error("[gstate] Persist failed: ",S)}},at=async(t,e,n)=>{let{storage:r,config:s,encryptionKey:i,audit:a,onError:u,silent:f,currentVersion:p,store:b,sizes:m,versions:h}=t,l=ot(s.namespace||"gstate"),y=s.immer??!0;if(r)try{let S={},v=0;for(let ue=0;ue<(r.length||0);ue++){let I=r.key(ue);if(!I||!I.startsWith(l))continue;let D=r.getItem(I);if(D)try{let _=JSON.parse(D),le=I.substring(l.length);if(v=Math.max(v,_._sys_v!==void 0?_._sys_v:_.v||0),_.e&&Date.now()>_.e){r.removeItem(I),ue--;continue}let de=_.d;if(_._enc&&i)de=await Xe(de,i);else if(typeof de=="string"){if(_._b64)try{de=JSON.parse(atob(de))}catch{}else if(de.startsWith("{")||de.startsWith("["))try{de=JSON.parse(de)}catch{}}S[le]=de,a("hydrate",le,!0)}catch(_){a("hydrate",I,!1,String(_));let le=_ instanceof Error?_:new Error(String(_));u?u(le,{operation:"hydration",key:I}):f||console.error(`[gstate] Hydration failed for "${I}": `,_)}}let he=v<p&&s.migrate?s.migrate(S,v):S;Object.entries(he).forEach(([ue,I])=>{let D=y&&I!==null&&typeof I=="object"?bt(me(I),!0):I,_=e(D),le=m.get(ue)||0;t.totalSize=t.totalSize-le+_,m.set(ue,_),b.set(ue,D),h.set(ue,1)}),n()}catch(S){let v=S instanceof Error?S:new Error(String(S));u?u(v,{operation:"hydration"}):f||console.error("[gstate] Hydration failed: ",v)}};var ct=(t,e,n)=>{if(t.plugins.size!==0)for(let r of t.plugins.values()){let s=r.hooks?.[e];if(s)try{s(n)}catch(i){let a=i instanceof Error?i:new Error(String(i));t.onError?t.onError(a,{operation:`plugin:${r.name}:${e}`,key:n.key}):t.silent||console.error(`[gstate] Plugin "${r.name}" error:`,i)}}},ut=(t,e,n)=>{try{t.plugins.set(e.name,e),e.hooks?.onInstall?.({store:n})}catch(r){let s=r instanceof Error?r:new Error(String(r));t.onError?t.onError(s,{operation:"plugin:install",key:e.name}):t.silent||console.error(`[gstate] Failed to install plugin "${e.name}": `,r)}};var E=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,n){this.store=e,this.config={endpoint:n.endpoint,authToken:n.authToken||"",strategy:n.strategy||"last-write-wins",autoSyncInterval:n.autoSyncInterval??3e4,syncOnReconnect:n.syncOnReconnect??!0,debounceTime:n.debounceTime??1e3,fetch:n.fetch||fetch,onSync:n.onSync||(()=>{}),onConflict:n.onConflict||(()=>({action:"accept-local"})),maxRetries:n.maxRetries??3},this._isOnline=typeof navigator<"u"?navigator.onLine:!0,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){let e=this.config.authToken;return typeof e=="function"?e()||"":e||""}_setupOnlineListener(){typeof window>"u"||(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(n=>n(e)),this._notifyStateChange()}_notifyStateChange(){let e=this.getState();this.syncStateListeners.forEach(n=>n(e))}queueChange(e,n){let r=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:me(n),timestamp:Date.now(),version:r}),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();let e=Date.now(),n=[],r=[],s=[];try{let i=Array.from(this.pendingQueue.values());if(i.length===0)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(i.map(u=>u.key));for(let u of i)try{let f=this.remoteVersions.get(u.key);if(!f)await this._pushChange(u),n.push(u.key),this.pendingQueue.delete(u.key);else if(f.version>=u.version){let p={key:u.key,localValue:u.value,remoteValue:f.value,localVersion:u.version,remoteVersion:f.version,timestamp:u.timestamp};r.push(p);let b=this.config.onConflict(p);await this._resolveConflict(u,f,b),n.push(u.key),this.pendingQueue.delete(u.key)}else await this._pushChange(u),n.push(u.key),this.pendingQueue.delete(u.key)}catch(f){s.push(`Failed to sync "${u.key}": ${f}`)}let a={success:s.length===0,syncedKeys:n,conflicts:r,errors:s,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(a),a}catch(i){let a=`Sync failed: ${i}`;return s.push(a),{success:!1,syncedKeys:n,conflicts:r,errors:s,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{let n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({keys:e})});if(r.ok){let s=await r.json();if(s.versions)for(let[i,a]of Object.entries(s.versions))this.remoteVersions.set(i,a)}}catch(n){console.warn("[SyncEngine] Failed to fetch remote versions:",n)}}async _pushChange(e){let n=0;for(;n<this.config.maxRetries;)try{let r=this._getAuthToken(),s=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...r&&{Authorization:`Bearer ${r}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(s.ok){let i=await s.json();i.version&&this.remoteVersions.set(e.key,{version:i.version,timestamp:i.timestamp||Date.now(),value:e.value});return}n++}catch(r){if(n++,n>=this.config.maxRetries)throw r}}async _resolveConflict(e,n,r){switch(r.action){case"accept-local":await this._pushChange({...e,version:n.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,n.value);break;case"merge":this.store.set(e.key,r.value),await this._pushChange({key:e.key,value:r.value,version:Math.max(e.version,n.version)+1,timestamp:Date.now()});break;case"discard":break}}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()}},z=(t,e)=>new E(t,e);var xt={local:()=>typeof window<"u"?window.localStorage:null,session:()=>typeof window<"u"?window.sessionStorage:null,memory:()=>{let t=new Map;return{getItem:e=>t.get(e)||null,setItem:(e,n)=>t.set(e,n),removeItem:e=>t.delete(e),key:e=>Array.from(t.keys())[e]||null,get length(){return t.size}}}},T=t=>{let e=new Map,n=new Map,r=new Map,s=new Set,i=new Map,a=new Set,u=new Map,f=new Map,p=new Map,b=new Map,m=new Map,h=new Map,l=new Map,y=new Map,S=t?.namespace||"gstate",v=t?.silent??!1,he=t?.debounceTime??150,ue=t?.version??0,I=t?.storage||xt.local(),D=t?.onError,_=t?.maxObjectSize??0,le=t?.maxTotalSize??0,de=t?.encryptionKey??null,Te=t?.validateInput??!0,pt=t?.auditEnabled??!0,ke=t?.userId,Ie=t?.immer??!0,ft=t?.persistByDefault??t?.persistence??t?.persist??!1;t?.accessRules&&t.accessRules.forEach(o=>Ne(l,o.pattern,o.permissions));let Me=!1,Ve=!1,je=!1,fe=0,ve=null,Se=null,$e,yt=new Promise(o=>{$e=o}),St=()=>`${S}_`,Be=()=>({store:e,versions:n,sizes:r,totalSize:fe,storage:I,config:t||{},diskQueue:m,encryptionKey:de,audit:be,onError:D,silent:v,debounceTime:he,currentVersion:ue}),Fe=()=>({plugins:b,onError:D,silent:v}),Ue=o=>{if(o==null)return 0;let c=typeof o;if(c==="boolean")return 4;if(c==="number")return 8;if(c==="string")return o.length*2;if(c!=="object")return 0;let g=0,C=[o],x=new WeakSet;for(;C.length>0;){let w=C.pop();if(typeof w=="boolean")g+=4;else if(typeof w=="number")g+=8;else if(typeof w=="string")g+=w.length*2;else if(typeof w=="object"&&w!==null){let ee=w;if(x.has(ee))continue;if(x.add(ee),Array.isArray(ee))for(let ge=0;ge<ee.length;ge++)C.push(ee[ge]);else for(let ge of Object.keys(ee))g+=ge.length*2,C.push(ee[ge])}}return g},we=(o,c)=>{ct(Fe(),o,c)},be=(o,c,g,C)=>{pt&&Ze()&&P&&P({timestamp:Date.now(),action:o,key:c,userId:ke,success:g,error:C})},Je=o=>{let c=f.get(o);if(!c)return;let g=new Set,C=w=>(g.add(w),f.has(w)?f.get(w).lastValue:Y.get(w)),x=c.selector(C);c.deps.forEach(w=>{if(!g.has(w)){let ee=p.get(w);ee&&(ee.delete(o),ee.size===0&&p.delete(w))}}),g.forEach(w=>{c.deps.has(w)||(p.has(w)||p.set(w,new Set),p.get(w).add(o))}),c.deps=g,Re(c.lastValue,x)||(c.lastValue=Ie&&x!==null&&typeof x=="object"?Le(me(x),!0):x,n.set(o,(n.get(o)||0)+1),Ce(o))},Ce=o=>{if(o){if(p.has(o)){let C=p.get(o);for(let x of C)Je(x)}let c=u.get(o);if(c){let C=Y.get(o);for(let x of c)try{x(C)}catch(w){let ee=w instanceof Error?w:new Error(String(w));D?D(ee,{operation:"watcher",key:o}):v||console.error(`[gstate] Watcher error for "${o}":`,w)}}let g=i.get(o);if(g)for(let C of g)try{C()}catch(x){let w=x instanceof Error?x:new Error(String(x));D?D(w,{operation:"keyListener",key:o}):v||console.error(`[gstate] Listener error for "${o}":`,x)}}if(Me){Ve=!0;return}for(let c of s)try{c()}catch(g){let C=g instanceof Error?g:new Error(String(g));D?D(C,{operation:"listener"}):v||console.error("[gstate] Global listener error: ",g)}},We=async()=>{it(Be())},Ae={},Y={_setSilently:(o,c)=>{let g=r.get(o)||0,C=Ie&&c!==null&&typeof c=="object"?Le(me(c),!0):c,x=typeof process<"u"&&!0,ee=(_>0||le>0)&&!x?Ue(C):0;fe=fe-g+ee,r.set(o,ee),e.set(o,C),n.set(o,(n.get(o)||0)+1),Se=null},_registerMethod:(o,c,g)=>{let C=x=>x==="__proto__"||x==="constructor"||x==="prototype";if(C(o)||C(c)){console.warn("[gstate] Refusing to register method with unsafe key:",o,c);return}Ae[o]||(Ae[o]={}),Ae[o][c]=g},set:(o,c,g={})=>{let C=e.get(o),x=Ie&&typeof c=="function"?Ct(C,c):c;if(Te&&!O(o))return v||console.warn(`[gstate] Invalid key: ${o}`),!1;if(!_e(l,o,"write",ke))return be("set",o,!1,"RBAC Denied"),v||console.error(`[gstate] RBAC Denied for "${o}"`),!1;let w=Te?R(x):x,ee=r.get(o)||0;we("onBeforeSet",{key:o,value:w,store:Y,version:n.get(o)||0});let ge=Ie&&w!==null&&typeof w=="object"?Le(me(w),!0):w;if(!Re(C,ge)){let mt=typeof process<"u"&&!0,xe=(_>0||le>0)&&!mt?Ue(ge):0;if(_>0&&xe>_){let Ee=new Error(`Object size (${xe} bytes) exceeds maxObjectSize (${_} bytes)`);D?D(Ee,{operation:"set",key:o}):v||console.warn(`[gstate] ${Ee.message} for "${o}"`)}if(le>0){let Ee=fe-ee+xe;if(Ee>le){let Ge=new Error(`Total store size (${Ee} bytes) exceeds limit (${le} bytes)`);D?D(Ge,{operation:"set"}):v||console.warn(`[gstate] ${Ge.message}`)}}fe=fe-ee+xe,r.set(o,xe),e.set(o,ge),n.set(o,(n.get(o)||0)+1),Se=null;let Qe=g.persist??ft;return Qe&&(m.set(o,{value:ge,options:{...g,persist:Qe,encoded:g.encoded||t?.encoded}}),ve&&clearTimeout(ve),ve=setTimeout(We,he)),we("onSet",{key:o,value:ge,store:Y,version:n.get(o)}),be("set",o,!0),Ce(o),!0}return!1},get:o=>{if(!_e(l,o,"read",ke))return be("get",o,!1,"RBAC Denied"),null;let c=e.get(o);return we("onGet",{store:Y,key:o,value:c}),be("get",o,!0),c},compute:(o,c)=>{try{return f.has(o)||(f.set(o,{selector:c,lastValue:null,deps:new Set}),Je(o)),f.get(o).lastValue}catch(g){let C=g instanceof Error?g:new Error(String(g));return D?D(C,{operation:"compute",key:o}):v||console.error(`[gstate] Compute error for "${o}": `,g),null}},watch:(o,c)=>{u.has(o)||u.set(o,new Set);let g=u.get(o);return g.add(c),()=>{g.delete(c),g.size===0&&u.delete(o)}},remove:o=>{if(!_e(l,o,"delete",ke))return be("delete",o,!1,"RBAC Denied"),!1;let c=e.get(o),g=e.delete(o);return g&&(fe-=r.get(o)||0,r.delete(o),we("onRemove",{store:Y,key:o,value:c}),Se=null),n.set(o,(n.get(o)||0)+1),I&&I.removeItem(`${St()}${o}`),be("delete",o,!0),Ce(o),g},delete:o=>Y.remove(o),deleteAll:()=>{if(Array.from(e.keys()).forEach(o=>Y.remove(o)),I){let o=S+"_";for(let c=0;c<(I.length||0);c++){let g=I.key(c);g?.startsWith(o)&&(I.removeItem(g),c--)}}return fe=0,r.clear(),Se=null,!0},list:()=>Object.fromEntries(e.entries()),use:o=>{a.add(o)},transaction:o=>{Me=!0,we("onTransaction",{store:Y,key:"START"});try{o()}finally{Me=!1,we("onTransaction",{store:Y,key:"END"}),Ve&&(Ve=!1,Ce())}},destroy:()=>{ve&&(clearTimeout(ve),ve=null),m.clear(),typeof window<"u"&&window.removeEventListener("beforeunload",qe),we("onDestroy",{store:Y}),s.clear(),i.clear(),u.clear(),f.clear(),p.clear(),b.clear(),e.clear(),r.clear(),fe=0,l.clear(),y.clear(),n.clear(),h.clear(),a.clear()},_addPlugin:o=>{ut(Fe(),o,Y)},_removePlugin:o=>{b.delete(o)},_subscribe:(o,c)=>{if(c){i.has(c)||i.set(c,new Set);let g=i.get(c);return g.add(o),()=>{g.delete(o),g.size===0&&i.delete(c)}}return s.add(o),()=>s.delete(o)},_getVersion:o=>n.get(o)??0,addAccessRule:(o,c)=>Ne(l,o,c),hasPermission:(o,c,g)=>_e(l,o,c,g),recordConsent:(o,c,g)=>ze(y,o,c,g),hasConsent:(o,c)=>Ye(y,o,c),getConsents:o=>tt(y,o),revokeConsent:(o,c)=>et(y,o,c),exportUserData:o=>nt(y,o),deleteUserData:o=>rt(y,o),getSnapshot:()=>(Se||(Se=Object.fromEntries(e.entries())),Se),get plugins(){return Ae},get isReady(){return je},get namespace(){return S},get userId(){return ke},whenReady:()=>yt};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(o=>{let c=Y[o];c&&Y._registerMethod("security",o,c)});let qe=()=>{m.size>0&&We()};typeof window<"u"&&window.addEventListener("beforeunload",qe),I?at(Be(),o=>{let c=typeof process<"u"&&!0;return(_>0||le>0)&&!c?Ue(o):0},()=>{je=!0,Se=null,$e(),Ce()}).then(()=>{}):(je=!0,$e());let Oe=null;return t?.sync&&(Oe=new E(Y,t.sync),Y._registerMethod("sync","flush",()=>Oe?.flush()),Y._registerMethod("sync","getState",()=>Oe?.getState()),Y._registerMethod("sync","onStateChange",o=>Oe?.onStateChange(o))),Y};import{useSyncExternalStore as lt,useDebugValue as Et,useMemo as Ke,useCallback as Pe,useEffect as dt,useState as gt}from"react";var pe=null,L=t=>{pe&&!t?.namespace&&(t?.silent||console.warn("[gstate] Store already exists. Pass a unique namespace to create additional stores."));let e=T(t);return pe=e,e},K=()=>{pe&&(pe.destroy(),pe=null)},B=t=>{let e=t||pe,n=Ke(()=>r=>e?e._subscribe(r):()=>{},[e]);return lt(n,()=>e?e.isReady:!1,()=>!0)},k=()=>pe;function d(t,e){let n=Ke(()=>e||pe,[e]),r=Ke(()=>{let l=()=>{},y=()=>!1,S=()=>null;return{set:y,get:S,remove:y,delete:y,deleteAll:y,list:()=>({}),compute:S,watch:()=>()=>{},use:l,transaction:l,destroy:l,_subscribe:()=>()=>{},_setSilently:l,_registerMethod:l,_addPlugin:l,_removePlugin:l,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}},getSnapshot:()=>({}),get namespace(){return"ghost"},get userId(){}}},[]),s=n||r,i=typeof t=="function",a=i?null:t,u=i?t:null,f=Pe(l=>i?s._subscribe(l):s._subscribe(l,a),[s,i,a]),p=Pe(()=>i?u(s.getSnapshot()):s.get(a)??void 0,[s,i,a,u]),b=Pe(()=>{if(i)try{return u({})}catch{return}else return},[u,i]),m=lt(f,p,b),h=Pe((l,y)=>i?(typeof process<"u"||console.warn("[gstate] Cannot set value when using a selector."),!1):s.set(a,l,y),[s,i,a]);return Et(m,l=>i?`Selector: ${JSON.stringify(l)}`:`${a}: ${JSON.stringify(l)}`),i?m:[m,h]}var ye=new Map,F=(t,e)=>{let n=t.namespace;if(ye.has(n))return console.warn(`[gstate] Sync engine already exists for namespace "${n}". Call destroySync first.`),ye.get(n);let r=new E(t,e);return ye.set(n,r),r},J=t=>{let e=ye.get(t);e&&(e.destroy(),ye.delete(t))};function W(t,e){let n=e||pe,r=n?.namespace||"default",s=ye.get(r),i=d(t,n),a=i[0],u=i[1],[f,p]=gt(()=>s?.getState()||{isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});dt(()=>s?s.onStateChange(p):void 0,[s]);let b=Pe((m,h)=>{let l=u(m,h);if(l&&s){let y=n?.get(t);s.queueChange(t,y)}return l},[u,s,t,n]);return[a,b,f]}var q=()=>{let[t,e]=gt({isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return dt(()=>{let n=()=>{let s=!0,i=!1,a=0,u=0;ye.forEach(f=>{let p=f.getState();s=s&&p.isOnline,i=i||p.isSyncing,a+=p.pendingChanges,u+=p.conflicts}),e({isOnline:s,isSyncing:i,lastSyncTimestamp:null,pendingChanges:a,conflicts:u})};n();let r=Array.from(ye.values()).map(s=>s.onStateChange(n));return()=>r.forEach(s=>s())},[]),t},Q=async t=>{let e=t||pe?.namespace;if(!e)return;let n=ye.get(e);n&&await n.flush()};var G=(t,e)=>{let n=e?.key||"async_data",r=e?.store||T({namespace:`async_${n}`,silent:!0});return r.get(n)==null&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null}),Object.assign(r,{execute:async()=>{let i=r.get(n);r.set(n,{...i||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{let a=await t(),u=r.get(n);r.set(n,{...u||{data:null,loading:!1,error:null,updatedAt:null},data:a,loading:!1,updatedAt:Date.now()},{persist:e?.persist})}catch(a){let u=r.get(n);r.set(n,{...u||{data:null,loading:!1,error:null,updatedAt:null},error:a instanceof Error?a:new Error(String(a)),loading:!1})}}})};var _t=()=>({name:"gstate-immer",hooks:{onInstall:({store:t})=>{t._registerMethod("immer","setWithProduce",((e,n)=>t.set(e,n)))}}});var Rt=t=>{let e=[],n=-1,r=!1,s=t?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:i})=>{e.push(i.list()),n=0,i._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;let a=e[n];return a?(Object.entries(a).forEach(([u,f])=>{i._setSilently(u,f)}),r=!1,!0):!1}return!1}),i._registerMethod("undoRedo","redo",()=>{if(n<e.length-1){r=!0,n++;let a=e[n];return a?(Object.entries(a).forEach(([u,f])=>{i._setSilently(u,f)}),r=!1,!0):!1}return!1}),i._registerMethod("undoRedo","canUndo",()=>n>0),i._registerMethod("undoRedo","canRedo",()=>n<e.length-1)},onSet:({store:i})=>{r||(n<e.length-1&&(e=e.slice(0,n+1)),e.push(i.list()),e.length>s?e.shift():n++)}}}};var Pt=t=>({name:"gstate-schema",hooks:{onSet:({key:e,value:n})=>{if(!e)return;let r=t[e];if(r){let s=r(n);if(s!==!0)throw new Error(`[Schema Error] Validation failed for key "${e}": ${s===!1?"Invalid type":s}`)}}}});var Tt=t=>{let r=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!r?.connect)return{name:"gstate-devtools-noop",hooks:{}};let s=null;return{name:"gstate-devtools",hooks:{onInstall:({store:i})=>{s=r.connect({name:t?.name||"Magnetar Store"}),s.init(i.list())},onSet:({key:i,store:a})=>{!i||!s||s.send(`SET_${i.toUpperCase()}`,a.list())},onRemove:({key:i,store:a})=>{!i||!s||s.send(`REMOVE_${i.toUpperCase()}`,a.list())}}}};var It=()=>{let t=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:e})=>{e._registerMethod("snapshot","takeSnapshot",(n=>{t.set(n,e.list())})),e._registerMethod("snapshot","restoreSnapshot",(n=>{let r=t.get(n);return r?(e.transaction(()=>{Object.entries(r).forEach(([s,i])=>{e.set(s,i)})}),!0):!1})),e._registerMethod("snapshot","listSnapshots",(()=>Array.from(t.keys()))),e._registerMethod("snapshot","deleteSnapshot",(n=>t.delete(n))),e._registerMethod("snapshot","clearSnapshots",(()=>t.clear()))}}}};var At=t=>({name:"gstate-guard",hooks:{onBeforeSet:({key:e,value:n,store:r})=>{if(!e)return;let s=t[e];if(s){let i=s(n)}}}});var Ot=t=>({name:"gstate-analytics",hooks:{onSet:({key:e,value:n})=>{e&&(!t.keys||t.keys.includes(e))&&t.provider({key:e,value:n,action:"SET"})},onRemove:({key:e})=>{e&&(!t.keys||t.keys.includes(e))&&t.provider({key:e,value:null,action:"REMOVE"})}}});var Dt=t=>{let e=new BroadcastChannel(t?.channelName||"gstate_sync"),n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:r})=>{e.onmessage=s=>{let{key:i,value:a,action:u}=s.data;i&&(n=!0,u==="REMOVE"?r.remove(i):r.set(i,a),n=!1)}},onSet:({key:r,value:s})=>{!r||n||e.postMessage({key:r,value:s,action:"SET"})},onRemove:({key:r})=>{!r||n||e.postMessage({key:r,action:"REMOVE"})},onDestroy:()=>{e.close()}}}};var Mt=()=>({name:"gstate-debug-noop",hooks:{}});var Vt=(t={})=>{let e=t.dbName||"rgs-db",n=t.storeName||"states",r=t.version||1,s=null,i=()=>new Promise((p,b)=>{if(s)return p(s);let m=indexedDB.open(e,r);m.onerror=()=>b(m.error),m.onsuccess=()=>{s=m.result,p(s)},m.onupgradeneeded=h=>{let l=h.target.result;l.objectStoreNames.contains(n)||l.createObjectStore(n)}}),a=async(p,b)=>{let m=await i();return new Promise((h,l)=>{let v=m.transaction(n,"readwrite").objectStore(n).put(b,p);v.onsuccess=()=>h(),v.onerror=()=>l(v.error)})},u=async p=>{let b=await i();return new Promise((m,h)=>{let S=b.transaction(n,"readonly").objectStore(n).get(p);S.onsuccess=()=>m(S.result),S.onerror=()=>h(S.error)})},f=async p=>{let b=await i();return new Promise((m,h)=>{let S=b.transaction(n,"readwrite").objectStore(n).delete(p);S.onsuccess=()=>m(),S.onerror=()=>h(S.error)})};return{name:"indexedDB",hooks:{onInstall:({store:p})=>{p._registerMethod("indexedDB","clear",async()=>{(await i()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:p})=>{let l=(await i()).transaction(n,"readonly").objectStore(n).getAllKeys();l.onsuccess=async()=>{let y=l.result,S=p.namespace+"_";for(let v of y)if(v.startsWith(S)){let he=await u(v);if(he){let ue=v.substring(S.length);p._setSilently(ue,he.d)}}}},onSet:async({key:p,value:b,store:m})=>{if(!p)return;let h=m.namespace+"_",l={d:b,t:Date.now(),v:m._getVersion?.(p)||1};await a(`${h}${p}`,l)},onRemove:async({key:p,store:b})=>{if(!p)return;let m=b.namespace+"_";await f(`${m}${p}`)}}}};var jt=t=>{let{adapter:e,autoSyncInterval:n}=t,r=new Map,s={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0},i=null;return{name:"cloudSync",hooks:{onInstall:({store:a})=>{a._registerMethod("cloudSync","sync",async()=>{let u=performance.now(),f={},p=0;try{let b=a.list(),m=Object.keys(b);for(let l of m){let y=a._getVersion?.(l)||0,S=r.get(l)||0;if(y>S){let v=b[l];f[l]=v,p+=JSON.stringify(v).length,r.set(l,y)}}if(Object.keys(f).length===0)return{status:"no-change",stats:s};if(await e.save(f))return s.lastSyncTimestamp=Date.now(),s.totalKeysSynced+=Object.keys(f).length,s.totalBytesSynced+=p,s.syncCount++,s.lastDuration=performance.now()-u,t.onSync&&t.onSync(s),{status:"success",stats:s};throw new Error(`Adapter ${e.name} failed to save.`)}catch(b){return s.errors++,console.error(`[gstate] Cloud Sync Failed (${e.name}):`,b),{status:"error",error:String(b),stats:s}}}),a._registerMethod("cloudSync","getStats",()=>s),n&&n>0&&(i=setInterval(()=>{let f=a.plugins.cloudSync;f&&f.sync()},n))},onDestroy:()=>{i&&clearInterval(i)}}}},$t=(t,e)=>({name:"MongoDB-Atlas",save:async n=>(await fetch(`${t}/action/updateOne`,{method:"POST",headers:{"Content-Type":"application/json","api-key":e},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}),Ut=(t,e)=>({name:"Firebase-Firestore",save:async n=>{try{return((...i)=>{})("[Mock] Firestore Syncing:",n),!0}catch{return!1}}}),Nt=(t,e)=>({name:"SQL-REST-API",save:async n=>{let r=e();return r?(await fetch(t,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n),credentials:"same-origin"})).ok:(console.warn("[gstate] No auth token available for SQL-REST sync"),!1)}});var $n=t=>({name:"gstate-logger",hooks:{onSet:({key:e,value:n,version:r})=>{let s=new Date().toLocaleTimeString(),i=`[gstate] SET: ${e} (v${r}) @ ${s}`;t?.collapsed?console.groupCollapsed(i):console.group(i),console.info("%c Value:","color: #4CAF50; font-weight: bold;",n),console.groupEnd()},onRemove:({key:e})=>{console.warn(`[gstate] REMOVED: ${e}`)},onTransaction:({key:e})=>{e==="START"?console.group("\u2500\u2500 TRANSACTION START \u2500\u2500"):console.groupEnd()}}});var H=(t,e)=>{let r=T(typeof e=="string"?{namespace:e}:e);t&&Object.entries(t).forEach(([a,u])=>{r.get(a)===null&&r._setSilently(a,u)});let s=a=>d(a,r);return typeof window<"u"&&typeof process>"u"&&(window.gstate=r,window.gState=r,window.rgs=r),Object.assign(s,r)};var te=(t,e)=>k()?.addAccessRule(t,e),ne=(t,e,n)=>k()?.hasPermission(t,e,n)??!0,re=(t,e,n)=>{let r=k();if(!r)throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");return r.recordConsent(t,e,n)},se=(t,e)=>k()?.hasConsent(t,e)??!1,oe=t=>k()?.getConsents(t)??[],ie=(t,e)=>k()?.revokeConsent(t,e),ae=t=>{let e=k();if(!e)throw new Error("[gstate] exportUserData failed: No store found.");return e.exportUserData(t)},ce=t=>{let e=k();if(!e)throw new Error("[gstate] deleteUserData failed: No store found.");return e.deleteUserData(t)},X=()=>{},Z=()=>{};export{E as SyncEngine,te as addAccessRule,Ot as analyticsPlugin,X as clearAccessRules,Z as clearAllConsents,jt as cloudSyncPlugin,G as createAsyncStore,Ut as createFirestoreAdapter,$t as createMongoAdapter,Nt as createSqlRestAdapter,T as createStore,z as createSyncEngine,Mt as debugPlugin,ce as deleteUserData,M as deriveKeyFromPassword,K as destroyState,J as destroySync,Tt as devToolsPlugin,$ as exportKey,ae as exportUserData,j as generateEncryptionKey,V as generateSalt,oe as getConsents,k as getStore,H as gstate,At as guardPlugin,se as hasConsent,ne as hasPermission,_t as immerPlugin,U as importKey,Vt as indexedDBPlugin,L as initState,F as initSync,A as isCryptoAvailable,P as logAudit,$n as loggerPlugin,re as recordConsent,ie as revokeConsent,R as sanitizeValue,Pt as schemaPlugin,N as setAuditLogger,It as snapshotPlugin,Dt as syncPlugin,Q as triggerSync,Rt as undoRedoPlugin,d as useGState,B as useIsStoreReady,d as useSimpleState,d as useStore,q as useSyncStatus,W as useSyncedState,O as validateKey};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|