stroid 0.1.2 → 0.1.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +27 -2
  2. package/dist/async.js +22 -22
  3. package/dist/async.js.map +1 -1
  4. package/dist/computed.d.ts +7 -1
  5. package/dist/computed.js +11 -11
  6. package/dist/computed.js.map +1 -1
  7. package/dist/core.js +14 -14
  8. package/dist/core.js.map +1 -1
  9. package/dist/devtools.js +1 -1
  10. package/dist/devtools.js.map +1 -1
  11. package/dist/feature.js.map +1 -1
  12. package/dist/helpers.js +14 -14
  13. package/dist/helpers.js.map +1 -1
  14. package/dist/index.d.cts +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.js +24 -24
  17. package/dist/index.js.map +1 -1
  18. package/dist/install.js +1 -1
  19. package/dist/install.js.map +1 -1
  20. package/dist/persist.js +1 -1
  21. package/dist/persist.js.map +1 -1
  22. package/dist/react/index.js +25 -25
  23. package/dist/react/index.js.map +1 -1
  24. package/dist/runtime-admin.js +1 -1
  25. package/dist/runtime-admin.js.map +1 -1
  26. package/dist/runtime-tools.js +2 -2
  27. package/dist/runtime-tools.js.map +1 -1
  28. package/dist/selectors.js +1 -1
  29. package/dist/selectors.js.map +1 -1
  30. package/dist/server.js +11 -11
  31. package/dist/server.js.map +1 -1
  32. package/dist/store-registry.d.ts +0 -1
  33. package/dist/sync.js +1 -1
  34. package/dist/sync.js.map +1 -1
  35. package/dist/testing.js +14 -14
  36. package/dist/testing.js.map +1 -1
  37. package/package.json +4 -1
  38. package/dist/types/adapters/options.d.ts +0 -335
  39. package/dist/types/async/cache.d.ts +0 -39
  40. package/dist/types/async/clone.d.ts +0 -10
  41. package/dist/types/async/errors.d.ts +0 -3
  42. package/dist/types/async/fetch.d.ts +0 -37
  43. package/dist/types/async/inflight.d.ts +0 -13
  44. package/dist/types/async/rate.d.ts +0 -5
  45. package/dist/types/async/registry.d.ts +0 -116
  46. package/dist/types/async/request.d.ts +0 -11
  47. package/dist/types/async/retry.d.ts +0 -10
  48. package/dist/types/async.d.ts +0 -10
  49. package/dist/types/computed/computed-graph.d.ts +0 -29
  50. package/dist/types/computed/index.d.ts +0 -16
  51. package/dist/types/config.d.ts +0 -10
  52. package/dist/types/core/index.d.ts +0 -11
  53. package/dist/types/core/lifecycle-hooks.d.ts +0 -16
  54. package/dist/types/core/store-admin-impl.d.ts +0 -9
  55. package/dist/types/core/store-admin.d.ts +0 -9
  56. package/dist/types/core/store-core.d.ts +0 -13
  57. package/dist/types/core/store-create.d.ts +0 -16
  58. package/dist/types/core/store-hydrate-impl.d.ts +0 -35
  59. package/dist/types/core/store-hydrate.d.ts +0 -9
  60. package/dist/types/core/store-lifecycle/hooks.d.ts +0 -19
  61. package/dist/types/core/store-lifecycle/identity.d.ts +0 -23
  62. package/dist/types/core/store-lifecycle/registry.d.ts +0 -53
  63. package/dist/types/core/store-lifecycle/types.d.ts +0 -67
  64. package/dist/types/core/store-lifecycle/validation.d.ts +0 -53
  65. package/dist/types/core/store-name.d.ts +0 -28
  66. package/dist/types/core/store-notify.d.ts +0 -12
  67. package/dist/types/core/store-read.d.ts +0 -18
  68. package/dist/types/core/store-registry.d.ts +0 -108
  69. package/dist/types/core/store-replace-impl.d.ts +0 -11
  70. package/dist/types/core/store-replace.d.ts +0 -9
  71. package/dist/types/core/store-set-impl.d.ts +0 -13
  72. package/dist/types/core/store-set.d.ts +0 -9
  73. package/dist/types/core/store-shared/core.d.ts +0 -13
  74. package/dist/types/core/store-shared/notify.d.ts +0 -12
  75. package/dist/types/core/store-transaction.d.ts +0 -26
  76. package/dist/types/core/store-write-shared.d.ts +0 -19
  77. package/dist/types/core/store-write.d.ts +0 -13
  78. package/dist/types/features/feature-registry.d.ts +0 -91
  79. package/dist/types/features/lifecycle.d.ts +0 -40
  80. package/dist/types/index.d.ts +0 -17
  81. package/dist/types/integrations/query.d.ts +0 -8
  82. package/dist/types/internals/computed-order.d.ts +0 -3
  83. package/dist/types/internals/config.d.ts +0 -116
  84. package/dist/types/internals/diagnostics.d.ts +0 -21
  85. package/dist/types/internals/reporting.d.ts +0 -9
  86. package/dist/types/internals/store-admin.d.ts +0 -7
  87. package/dist/types/internals/store-ops.d.ts +0 -13
  88. package/dist/types/internals/test-reset.d.ts +0 -2
  89. package/dist/types/internals/write-context.d.ts +0 -15
  90. package/dist/types/notification/delivery.d.ts +0 -3
  91. package/dist/types/notification/index.d.ts +0 -10
  92. package/dist/types/notification/metrics.d.ts +0 -12
  93. package/dist/types/notification/priority.d.ts +0 -9
  94. package/dist/types/notification/scheduler.d.ts +0 -11
  95. package/dist/types/notification/snapshot.d.ts +0 -8
  96. package/dist/types/runtime-admin/index.d.ts +0 -2
  97. package/dist/types/runtime-tools/index.d.ts +0 -58
  98. package/dist/types/store.d.ts +0 -16
  99. package/dist/types/types/utility.d.ts +0 -17
  100. package/dist/types/utils/clone.d.ts +0 -4
  101. package/dist/types/utils/devfreeze.d.ts +0 -2
  102. package/dist/types/utils/hash.d.ts +0 -8
  103. package/dist/types/utils/path.d.ts +0 -5
  104. package/dist/types/utils/validation.d.ts +0 -14
  105. package/dist/types/utils.d.ts +0 -13
package/dist/install.js CHANGED
@@ -1,2 +1,2 @@
1
- var X=new Map,z=(e,t)=>{X.set(e,t);};var ye=e=>X.get(e),me=()=>Array.from(X.keys());var et=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",Q=e=>!!e?.[et],q=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,r=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(r)===r}catch{return false}},Se=(e,t,r)=>{let o="__stroid_persist_roundtrip_probe__",a;try{a=t(o);}catch(l){return {ok:false,reason:`persist: encrypt failed for store "${e}" (${l?.message??l})`}}if(typeof a!="string")return {ok:false,reason:`persist: encrypt must return a string for store "${e}".`};let c;try{c=r(a);}catch(l){return {ok:false,reason:`persist: decrypt failed for store "${e}" (${l?.message??l})`}}return typeof c!="string"?{ok:false,reason:`persist: decrypt must return a string for store "${e}".`}:c!==o?{ok:false,reason:`persist: encrypt/decrypt must round-trip for store "${e}".`}:{ok:true}};var he=(e,t,r)=>{e[t]&&(e[t].lastPresent=r);},be=({name:e,persistConfig:t,persistWatchState:r})=>{let o=t?.onStorageCleared;if(!t||typeof o!="function"||typeof window>"u"||typeof window.addEventListener!="function")return;r[e]?.dispose();let a=window,c=()=>{try{return t.driver.getItem?.(t.key)!=null}catch{return false}},l=i=>{let k=r[e],s=c();if(k){if(!k.lastPresent||s){k.lastPresent=s;return}k.lastPresent=false,o({name:e,key:t.key,reason:i});}},g=i=>{if(i.key===null){l("clear");return}i.key===t.key&&i.newValue===null&&l("remove");},n=()=>{l("missing");};a.addEventListener("storage",g),a.addEventListener("focus",n),r[e]={lastPresent:c(),dispose:()=>{a.removeEventListener("storage",g),a.removeEventListener("focus",n);}};};var U=({value:e,sanitize:t,validate:r,onSanitizeError:o})=>{let a;if(t)try{a=t(e);}catch(l){return o?.(l),{ok:false}}else a=e;let c=r(a);return c.ok?{ok:true,value:c.value??a}:{ok:false}},j=({value:e,fallbackMs:t=Date.now(),onInvalid:r})=>{if(typeof e=="number")return Number.isFinite(e)?e:(r?.(),t);if(typeof e=="string"){let o=Date.parse(e);return Number.isFinite(o)?o:(r?.(),t)}return r?.(),t};var tt=new Map,G=(e,t,r=0)=>{!e||typeof t!="function"||tt.set(e,{name:e,order:r,fn:t});};var rt=()=>new Map([["noSignal",new Set],["shape",new Set],["autoCreate",new Set],["mutableResult",new Set]]),ke=()=>({fetchRegistry:Object.create(null),inflight:Object.create(null),requestVersion:Object.create(null),cacheMeta:Object.create(null),rateWindowStart:Object.create(null),rateCount:Object.create(null),ratePruneState:{lastAt:0},ratePruneTimer:null,warnedOnce:rt(),storeCleanups:Object.create(null),revalidateKeys:new Set,revalidateHandlers:Object.create(null),asyncMetrics:{cacheHits:0,cacheMisses:0,dedupes:0,requests:0,failures:0,avgMs:0,lastMs:0}});var Z=new Map,ve=new WeakSet,nt=e=>{ve.has(e)||(ve.add(e),me().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=ye(t);r&&e.featureRuntimes.set(t,r());}}));},ot=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,we,Re=e=>(we||ot||e).replace(/\.ts(\?|$)/,".js$1"),st=Re(new URL("../../store.js",import.meta.url).href);var at=()=>{we=void 0,Z.clear();};G("registry.scope-override",at,110);var it=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],subscriberBuffer:[],notifyScheduled:false,batchDepth:0,flushId:0,isFlushing:false});var ct=()=>({depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0}),ut=(e="default")=>{let t={scope:e,stores:Object.create(null),subscribers:Object.create(null),initialStates:Object.create(null),initialFactories:Object.create(null),metaEntries:Object.create(null),snapshotCache:Object.create(null),featureRuntimes:new Map,deletingStores:new Set,computedEntries:Object.create(null),computedDependents:Object.create(null),computedCleanups:new Map,transaction:ct(),async:ke(),notify:it(),lifecycleListener:null};return nt(t),t},lt=e=>{let t=Re(e),r=Z.get(t);if(r)return r;let o=ut();return Z.set(t,o),o};var F=[],ft={run:(e,t)=>{F.push(e);try{return t()}finally{F.pop();}},get:()=>F.length>0?F[F.length-1]:null,enterWith:e=>{if(F.length>0){F[F.length-1]=e;return}F.push(e);}};var Ce=e=>(ft).get()||e||lt(st);var pt={log:(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},warn:(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},critical:(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));}},Me={logSink:pt,flush:{chunkSize:Number.POSITIVE_INFINITY,chunkDelayMs:0,priorityStores:[]},revalidateOnFocus:{debounceMs:0,maxConcurrent:3,staggerMs:100},namespace:"",strictMissingFeatures:true,assertRuntime:false,strictMutatorReturns:true,asyncAutoCreate:false,asyncCloneResult:"none",autoCorrelationIds:false,acknowledgeLooseTypes:false,pathCacheSize:500,defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0,selectorCloneFrozen:true},te=e=>({logSink:{...e.logSink},flush:{...e.flush},revalidateOnFocus:{...e.revalidateOnFocus},namespace:e.namespace,strictMissingFeatures:e.strictMissingFeatures,assertRuntime:e.assertRuntime,strictMutatorReturns:e.strictMutatorReturns,asyncAutoCreate:e.asyncAutoCreate,asyncCloneResult:e.asyncCloneResult,autoCorrelationIds:e.autoCorrelationIds,acknowledgeLooseTypes:e.acknowledgeLooseTypes,pathCacheSize:e.pathCacheSize,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce,selectorCloneFrozen:e.selectorCloneFrozen}),ee=new WeakMap,Ee=te(Me),gt=e=>{let t=ee.get(e);return t||(t=te(Ee),ee.set(e,t)),t};var re=()=>gt(Ce());var ht=()=>{ee=new WeakMap,Ee=te(Me);};G("config.reset",ht,90);var bt=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,kt=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,Fe=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,vt="production",wt=bt??kt??vt,Pe=typeof Fe=="boolean"?Fe:wt!=="production",ne=()=>Pe,Rt=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));};var _=(e,t)=>{if((re().logSink.warn??Rt)(e,t),re().assertRuntime)throw new Error(e)};var Te=new Set(["__proto__","constructor","prototype"]);var oe=null,Ct=()=>{if(oe)return oe;let e,t=[];for(let r=0;r<256;r++){e=r;for(let o=0;o<8;o++)e=e&1?3988292384^e>>>1:e>>>1;t[r]=e>>>0;}return oe=t,t},Ae=e=>{let t=Ct(),r=-1;for(let o=0;o<e.length;o++)r=r>>>0,r=r>>>8^t[(r^e.charCodeAt(o))&255];return (r^-1)>>>0},Mt=2166136261,Et=2654435761,Ft=1e5,T=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},D=(e,t)=>{T(e,t.length);for(let r=0;r<t.length;r++)T(e,t.charCodeAt(r));},w=(e,t)=>{D(e,t);},Ve=(e,t)=>{if(Number.isNaN(t)){w(e,"NaN");return}if(!Number.isFinite(t)){w(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){w(e,"-0");return}let r=t|0;if(t===r){w(e,"int"),T(e,r);return}w(e,"num"),D(e,String(t));},W=(e,t)=>{if(e.nodes++>Ft){w(e,"[max]");return}if(t===null){w(e,"null");return}let r=typeof t;if(r==="string"){w(e,"string"),D(e,t);return}if(r==="number"){w(e,"number"),Ve(e,t);return}if(r==="boolean"){w(e,t?"true":"false");return}if(r==="undefined"){w(e,"undefined");return}if(r==="bigint"){w(e,"bigint"),D(e,t.toString());return}if(r==="symbol"){w(e,"symbol");let n=t;D(e,Symbol.keyFor(n)??n.description??String(n));return}if(r==="function"){w(e,"function"),D(e,t.name||"anonymous");return}let o=t,a=e.seen.get(o);if(a!==void 0){w(e,"ref"),T(e,a);return}let c=e.nextId++;if(e.seen.set(o,c),Array.isArray(o)){w(e,"array"),T(e,o.length);for(let n=0;n<o.length;n++)Object.prototype.hasOwnProperty.call(o,n)?W(e,o[n]):w(e,"hole");return}if(o instanceof Date){w(e,"date"),Ve(e,o.getTime());return}if(o instanceof Map){w(e,"map"),T(e,o.size),o.forEach((n,i)=>{W(e,i),W(e,n);});return}if(o instanceof Set){w(e,"set"),T(e,o.size),o.forEach(n=>{W(e,n);});return}w(e,"object");let l=Object.getOwnPropertyDescriptors(o),g=[];Object.entries(l).forEach(([n,i])=>{i?.enumerable&&(Te.has(n)||"get"in i||"set"in i||g.push([n,i]));}),T(e,g.length);for(let[n,i]of g)D(e,n),W(e,i.value);},se=e=>{if(typeof e=="string")return Ae(JSON.stringify(e));let t={h1:Mt,h2:Et,seen:new WeakMap,nextId:1,nodes:0};W(t,e);let r=t.h1>>>0,o=t.h2>>>0;return r^=r>>>16,r=Math.imul(r,2246822507),r^=r>>>13,r=Math.imul(r,3266489909),r^=r>>>16,o^=o>>>16,o=Math.imul(o,668265261),o^=o>>>15,o=Math.imul(o,374761393),o^=o>>>16,(r&2097151)*4294967296+(o>>>0)};var Vt=e=>{let t=new Uint8Array(e),r="";for(let o=0;o<t.length;o++)r+=t[o].toString(16).padStart(2,"0");return r},At=async e=>{if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let t=typeof TextEncoder<"u"?new TextEncoder:null,r=t?t.encode(e):new Uint8Array(Buffer.from(e)),o=await globalThis.crypto.subtle.digest("SHA-256",r);return Vt(o)}try{let{createHash:t}=await import('crypto');return t("sha256").update(e).digest("hex")}catch{throw new Error("sha256 checksum is not supported in this environment")}},K=async(e,t,r=se)=>e==="none"?null:e==="sha256"?At(t):r(t);var je=1e6,_e=(e,t)=>{let r=e?.options?.migrations??{};if(Object.keys(r).length>0)return r;let o=t?.migrate;if(typeof o!="function")return r;let a=e?.version??1;return !Number.isFinite(a)||a<=1?r:{[a]:o}},ae=({name:e,persisted:t,reason:r,persistConfig:o,initialState:a,reportStoreError:c,sanitize:l,deepClone:g})=>{c(e,r);let n=o?.onMigrationFail??"reset";if(n==="keep")return {state:t,requiresValidation:true};if(typeof n=="function")try{let i=n(g(t));if(i!==void 0)return {state:l(i),requiresValidation:!0};c(e,`onMigrationFail for "${e}" returned undefined. Falling back to initial state.`);}catch(i){c(e,`onMigrationFail for "${e}" failed: ${i?.message??i}`);}return {state:g(a),requiresValidation:true}},De=e=>{let r=e.getMeta()?.options?.persist;return r?!!r.decryptAsync||r.checksum==="sha256"?_t(e):jt(e):false},jt=({name:e,silent:t=false,getMeta:r,getInitialState:o,applyFeatureState:a,reportStoreError:c,warnMissingMaxSize:l,validate:g,log:n,hashState:i,deepClone:k,sanitize:s,shouldApply:u})=>{let y=r(),d=y?.options?.persist;if(!d)return false;let m=_e(y,d),S=p=>U({value:p,validate:g});try{let p=d.driver.getItem?.(d.key)??null;if(!p)return !1;if(typeof p!="string")return c(e,`Persist driver for "${e}" returned an async value during sync hydration. Provide async decrypt hooks or use an async-capable persist driver.`),!0;if(typeof d.maxSize!="number"&&p.length>je&&l?.(p.length),typeof d.maxSize=="number"&&p.length>d.maxSize)return c(e,`Persist payload for "${e}" exceeds maxSize (${p.length} > ${d.maxSize}). Skipping hydration.`),!0;let f=d.decrypt(p),h=JSON.parse(f),{v=1,checksum:R,data:C,updatedAt:O,updatedAtMs:E}=h||{};if(!C)return !0;let V=j({value:typeof E=="number"?E:O,fallbackMs:Date.now(),onInvalid:()=>{n(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}});if(d.checksum!=="none"&&R!==i(C))return c(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!u||u())&&a(k(o()),Date.now()),!0;let A=d.deserialize(C),P=y?.version??1,M=Oe({name:e,parsed:A,v,targetVersion:P,cfg:d,migrations:m,getInitialState:o,reportStoreError:c,sanitize:s,deepClone:k,validateState:S,safeUpdatedAt:V,applyFeatureState:a,shouldApply:u});return M.ok&&(A=M.state,(!u||u())&&(a(M.state,V),t||n(`Store "${e}" loaded from persistence`))),!0}catch(p){return c(e,`Could not load store "${e}" (${p?.message||p})`),true}},_t=async({name:e,silent:t=false,getMeta:r,getInitialState:o,applyFeatureState:a,reportStoreError:c,warnMissingMaxSize:l,validate:g,log:n,hashState:i,deepClone:k,sanitize:s,shouldApply:u})=>{let y=r(),d=y?.options?.persist;if(!d)return false;let m=_e(y,d),S=p=>U({value:p,validate:g});try{let p=await Promise.resolve(d.driver.getItem?.(d.key)??null);if(!p)return !1;if(typeof d.maxSize!="number"&&typeof p=="string"&&p.length>je&&l?.(p.length),typeof d.maxSize=="number"&&typeof p=="string"&&p.length>d.maxSize)return c(e,`Persist payload for "${e}" exceeds maxSize (${p.length} > ${d.maxSize}). Skipping hydration.`),!0;let f=d.decryptAsync?await d.decryptAsync(p):d.decrypt(p),h=JSON.parse(f),{v=1,checksum:R,data:C,updatedAt:O,updatedAtMs:E}=h||{};if(!C)return !0;let V=j({value:typeof E=="number"?E:O,fallbackMs:Date.now(),onInvalid:()=>{n(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}}),A=await K(d.checksum,C,i);if(d.checksum!=="none"&&R!==A)return c(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!u||u())&&a(k(o()),Date.now()),!0;let P=d.deserialize(C),M=y?.version??1,H=Oe({name:e,parsed:P,v,targetVersion:M,cfg:d,migrations:m,getInitialState:o,reportStoreError:c,sanitize:s,deepClone:k,validateState:S,safeUpdatedAt:V,applyFeatureState:a,shouldApply:u});return H.ok&&(!u||u())&&(a(H.state,V),t||n(`Store "${e}" loaded from persistence`)),!0}catch(p){return c(e,`Could not load store "${e}" (${p?.message||p})`),true}},Oe=({name:e,parsed:t,v:r,targetVersion:o,cfg:a,migrations:c,getInitialState:l,reportStoreError:g,sanitize:n,deepClone:i,validateState:k,safeUpdatedAt:s,applyFeatureState:u,shouldApply:y})=>{if(r!==o){let m=Object.keys(c).map(f=>Number(f)).filter(f=>f>r&&f<=o).sort((f,h)=>f-h);if(m.length===0){let f=ae({name:e,persisted:t,reason:`No migration path from v${r} to v${o} for "${e}". Applying onMigrationFail strategy.`,persistConfig:a,initialState:l(),reportStoreError:g,sanitize:n,deepClone:i});if(t=f.state,!f.requiresValidation)return (!y||y())&&u(t,s),{ok:false,state:t}}let S=false,p=true;if(m.forEach(f=>{if(!S)try{let h=c[f](t);h!==void 0&&(t=h);}catch(h){let v=ae({name:e,persisted:t,reason:`Migration to v${f} failed for "${e}": ${h?.message||h}`,persistConfig:a,initialState:l(),reportStoreError:g,sanitize:n,deepClone:i});t=v.state,p=v.requiresValidation,S=true;}}),S){if(!p)return (!y||y())&&u(t,s),{ok:false,state:t};let f=k(t);return f.ok?{ok:true,state:f.value??t}:((!y||y())&&u(i(l()),Date.now()),{ok:false,state:t})}}let d=k(t);if(!d.ok){if(r!==o){let m=a?.onMigrationFail??"reset",S=ae({name:e,persisted:t,reason:`Persisted state for "${e}" failed schema after version change. Applying onMigrationFail strategy.`,persistConfig:a,initialState:l(),reportStoreError:g,sanitize:n,deepClone:i});if(!S.requiresValidation)return (!y||y())&&u(S.state,s),{ok:false,state:S.state};let p=k(S.state);if(p.ok)return m==="reset"&&g(e,`Persisted state for "${e}" failed schema; resetting to initial.`),{ok:true,state:p.value??S.state}}return g(e,`Persisted state for "${e}" failed schema; resetting to initial.`),(!y||y())&&u(i(l()),Date.now()),{ok:false,state:t}}return {ok:true,state:d.value??t}};var $e=(e,t,...r)=>{if(typeof e=="function")try{e(...r);}catch(o){let a=o?.message??o;_(`${t} callback threw: ${String(a)}`);}};var Ne=({name:e,persistTimers:t,persistInFlight:r,persistSequence:o,persistWatchState:a,plaintextWarningsIssued:c,exists:l,getMeta:g,getStoreValue:n,reportStoreError:i,hashState:k},s=false)=>{let u=g()?.options?.persist;if(!u)return;let y=async S=>{let p=g();if(!(!p?.options?.persist||p.options.persist!==u||!l())&&!(S!==void 0&&o[e]!==S)){if(!u.allowPlaintext&&!c.has(e)&&Q(u.encrypt)&&Q(u.decrypt)){c.add(e);let f=`[stroid/persist] Store '${e}' is persisted in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`;$e(p.options.onError,`onError(${e})`,f),_(f);}try{let f=u.serialize(n()),h=await K(u.checksum,f,k),v=JSON.stringify({v:p.version??1,updatedAt:p.updatedAt,updatedAtMs:p.updatedAtMs??Date.now(),checksum:h,data:f}),R=u.encryptAsync?await u.encryptAsync(v):u.encrypt(v);if(S!==void 0&&o[e]!==S)return;await Promise.resolve(u.driver.setItem?.(u.key,R)),he(a,e,!0);}catch(f){i(e,`Could not persist store "${e}" (${f?.message||f})`);}}},d=S=>{let p=r[e],f=(o[e]??0)+1;o[e]=f;let v=(async()=>{p&&await p,!(S&&t[e]!==S)&&o[e]===f&&await y(f);})().finally(()=>{r[e]===v&&(r[e]=null),S&&t[e]===S&&delete t[e];});r[e]=v;};if(s){t[e]&&(clearTimeout(t[e]),delete t[e]),d();return}t[e]&&clearTimeout(t[e]);let m=setTimeout(()=>{t[e]===m&&d(m);},0);t[e]=m;},B=e=>Ne(e),Ie=(e,t)=>Ne({...t,name:e},true);var xe=false,Dt=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,Ot=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,$t=Dt??Ot,Nt=()=>$t==="production",It=()=>{let e={},t={},r=Object.create(null),o=Object.create(null),a=Object.create(null),c=new Set,l=new Set,g=Object.create(null);return {api:{getPersistQueueDepth(n){return e[n]?1:0}},onStoreCreate(n){let i=n.options.persist;if(!i)return;if(!i.encryptAsync&&q(i.encrypt)&&q(i.decrypt)&&!i.allowPlaintext){let m=`[stroid/persist] Store "${n.name}" is configured for plaintext persistence. Provide encrypt/decrypt hooks or set persist.allowPlaintext: true to acknowledge.`;if(Nt()){n.reportStoreError(m),n.options.persist=null;return}n.warn(m);}if(i.sensitiveData&&!i.encryptAsync&&q(i.encrypt)){n.reportStoreError(`persist: store "${n.name}" is marked sensitiveData but has no encrypt function. Plaintext data will be written to storage.`);return}let s=Se(n.name,i.encrypt,i.decrypt);if(!s.ok){n.reportStoreError(s.reason??`persist: encrypt/decrypt validation failed for store "${n.name}".`),n.options.persist=null;return}if(i.key){let m=o[i.key];m&&m!==n.name&&n.isDev()?n.warn(`Persist key collision: "${i.key}" already used by store "${m}". Store "${n.name}" will overwrite the same storage key.`):o[i.key]=n.name;}let u=n.getMeta()?.updateCount??0,y=()=>{let m=n.getMeta();return m?(m.updateCount??0)===u:false},d=De({name:n.name,silent:true,getMeta:n.getMeta,getInitialState:n.getInitialState,applyFeatureState:n.applyFeatureState,reportStoreError:(m,S)=>n.reportStoreError(S),warnMissingMaxSize:m=>{l.has(n.name)||(l.add(n.name),n.warnAlways(`[stroid/persist] Store "${n.name}" loaded ${m} bytes without a maxSize guard. Set persist.maxSize to prevent oversized payloads.`));},validate:n.validate,log:n.log,hashState:n.hashState,deepClone:n.deepClone,sanitize:n.sanitize,shouldApply:y});if(typeof d?.then=="function"?(g[n.name]={loading:true,pendingSave:false},d.then(m=>{let S=g[n.name];S&&(S.loading=false,(!m||S.pendingSave)&&B({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(p,f)=>n.reportStoreError(f),hashState:n.hashState}),delete g[n.name]);}).catch(()=>{let m=g[n.name];m&&(m.loading=false,m.pendingSave&&B({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(S,p)=>n.reportStoreError(p),hashState:n.hashState}),delete g[n.name]);})):d||B({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(m,S)=>n.reportStoreError(S),hashState:n.hashState}),typeof window<"u"&&typeof window.addEventListener=="function"){let m=()=>{Ie(n.name,{name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(S,p)=>n.reportStoreError(p),hashState:n.hashState});};window.addEventListener("pagehide",m,{once:true}),window.addEventListener("beforeunload",m,{once:true});}be({name:n.name,persistConfig:i,persistWatchState:a});},onStoreWrite(n){if(!n.options.persist)return;let i=g[n.name];if(i?.loading){i.pendingSave=true;return}B({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:a,plaintextWarningsIssued:c,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(k,s)=>n.reportStoreError(s),hashState:n.hashState});},beforeStoreDelete(n){let i=n.options.persist;if(i){delete g[n.name],l.delete(n.name),e[n.name]&&(clearTimeout(e[n.name]),delete e[n.name]),t[n.name]=null,delete r[n.name];try{i.driver.removeItem?.(i.key);}catch{}i.key&&o[i.key]===n.name&&delete o[i.key],a[n.name]?.dispose(),delete a[n.name];}},resetAll(){Object.values(e).forEach(n=>clearTimeout(n)),Object.values(a).forEach(n=>{try{n.dispose();}catch{}}),Object.keys(e).forEach(n=>delete e[n]),Object.keys(t).forEach(n=>{t[n]=null,delete t[n];}),Object.keys(r).forEach(n=>delete r[n]),Object.keys(o).forEach(n=>delete o[n]),Object.keys(a).forEach(n=>delete a[n]),Object.keys(g).forEach(n=>delete g[n]),c.clear(),l.clear();}}},ze=()=>{xe||(xe=true,z("persist",It));};var We=false,L=1,xt=e=>typeof e?.v=="number"?e.v:typeof e?.protocol=="number"?e.protocol:void 0,ie=new Set,ce=new Set,Y=100,Ue=e=>{if(!e)return null;if(e===true)return Y;if(typeof e!="object")return null;let t=e.loopGuard;if(t===false)return null;if(t===true||t===void 0)return Y;if(typeof t=="object"){let r=t.windowMs;return typeof r=="number"&&Number.isFinite(r)&&r>0?r:Y}return Y},zt=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:typeof Buffer<"u"?Buffer.byteLength(e):e.length,Wt=({incoming:e,accepted:t})=>{let r=t?.clock??0,o=typeof e.clock=="number"?e.clock:0;if(o!==r)return o-r;let a=e.source??"",c=t?.source??"";return a===c?0:a.localeCompare(c,"en",{sensitivity:"variant"})},Lt=e=>e?.updatedAtMs??j({value:e?.updatedAt,fallbackMs:0}),Ht=e=>{if(typeof e!="object"||e===null)return false;let t=e;return (typeof t.v=="number"||typeof t.protocol=="number")&&typeof t.type=="string"&&typeof t.name=="string"&&typeof t.clock=="number"&&typeof t.source=="string"},Le=({name:e,syncChannels:t,instanceId:r,authToken:o,reportStoreError:a})=>{let c=t[e];if(c)try{let l={v:L,protocol:L,type:"sync-request",source:r,name:e,clock:0,requestedAt:Date.now()};o&&(l.token=o),c.postMessage(l);}catch(l){a(e,`Failed to request sync snapshot for "${e}": ${l?.message??l}`);}},Ut=(e,t)=>(t[e]=(t[e]??0)+1,t[e]),Bt=(e,t,r)=>(r[e]=Math.max(r[e]??0,t)+1,r[e]),qt=({name:e,syncChannels:t,syncWindowCleanup:r,syncClocks:o,syncVersions:a})=>{t[e]?.close(),delete t[e],r[e]?.(),delete r[e],delete o[e],delete a[e];},Gt=({syncChannels:e,syncWindowCleanup:t})=>{Object.values(t).forEach(r=>{try{r();}catch{}}),Object.values(e).forEach(r=>{try{r.close();}catch{}});},Kt=({name:e,syncOption:t,syncChannels:r,syncClocks:o,syncVersions:a,syncWindowCleanup:c,instanceId:l,getMeta:g,getAcceptedSyncVersion:n,getStoreValue:i,hasStoreEntry:k,notify:s,validate:u,reportStoreError:y,warn:d,setStoreValue:m,normalizeIncomingState:S,acceptIncomingSyncVersion:p,resolveSyncVersion:f,broadcastSync:h,markLoopGuard:v})=>{if(!t)return;if(typeof window>"u"||typeof BroadcastChannel>"u"){y(e,`Sync enabled for "${e}" but BroadcastChannel not available in this environment.`);return}let R=typeof t=="object"?t.policy:void 0,C=R==="insecure"||R!=="strict"&&typeof t=="object"&&t.insecure===true,O=typeof t=="object"&&typeof t.authToken=="string"&&t.authToken.length>0,E=typeof t=="object"&&typeof t.verify=="function",V=typeof t=="object"&&typeof t.sign=="function",A=R==="strict"||!ne()&&R!=="insecure";if(A&&!C&&!O&&!E){y(e,`Sync for "${e}" requires authToken or verify in strict mode. Use sync: { policy: "insecure" } to acknowledge the risk.`);return}!A&&!C&&!O&&!E&&!ie.has(e)&&(ie.add(e),_(`Sync for "${e}" is unauthenticated. Any same-origin tab can forge sync messages. Provide sync.authToken or sync.verify to enforce authentication.`)),V&&!E&&!ce.has(e)&&(ce.add(e),d(`Sync for "${e}" is configured with "sign" but no "verify". "sign" has no effect unless incoming messages are verified.`));let P=typeof t=="object"?t.authToken:void 0,M=Ue(t),H=false,Xe=typeof t=="object"&&t.channel?t.channel:`stroid_sync_${e}`;try{let $=new BroadcastChannel(Xe);if(r[e]=$,$.onmessage=N=>{let b=N.data;if(!b||b.source===l||b.name!==e||r[e]!==$||!k(e)||!g(e))return;if(!Ht(b)){y(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(P&&b.token!==P){H||(y(e,`Sync message for "${e}" failed auth token verification; ignoring.`),H=!0);return}let ue=xt(b);if(ue!==L){y(e,`Sync protocol mismatch for "${e}". Expected v${L} but received ${String(ue??"unknown")}. Ignoring message.`);return}if(b.type==="sync-state"&&(typeof b.data>"u"||typeof b.clock!="number")){y(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(typeof t=="object"&&typeof t.verify=="function"){let I=!1;try{I=!!t.verify(b);}catch(x){y(e,`Sync message verification failed for "${e}": ${x?.message??x}`);return}if(!I){y(e,`Sync message for "${e}" failed verification; ignoring.`);return}}if(b.type==="sync-request"){h(e);return}let le=typeof t=="object"?t.conflictResolver:null;if(Wt({incoming:{clock:b.clock,source:b.source},accepted:n(e)})<=0){let I=Lt(g(e)),x=typeof b.updatedAt=="number"?b.updatedAt:Date.now();if(le){let fe=le({local:i(e),incoming:b.data,localUpdated:I,incomingUpdated:x});if(fe!==void 0){let pe=S(e,fe);if(pe===null)return;m(e,pe);let ge=typeof t=="object"?t.resolveUpdatedAt:null,Qe=ge?ge({localUpdated:I,incomingUpdated:x,now:Date.now()}):Math.max(Date.now(),I,x);f(e,Qe,typeof b.clock=="number"?b.clock:0),M&&v(e,M),s(e),h(e);}}return}let de=S(e,b.data);de!==null&&(m(e,de),p(e,typeof b.updatedAt=="number"?b.updatedAt:Date.now(),typeof b.clock=="number"?b.clock:0,typeof b.source=="string"?b.source:""),M&&v(e,M),s(e));},typeof window<"u"&&typeof window.addEventListener=="function"){c[e]?.();let N=window,b=()=>{Le({name:e,syncChannels:r,instanceId:l,authToken:P,reportStoreError:y});};N.addEventListener("focus",b),N.addEventListener("online",b),c[e]=()=>{N.removeEventListener("focus",b),N.removeEventListener("online",b);};}queueMicrotask(()=>{Le({name:e,syncChannels:r,instanceId:l,authToken:P,reportStoreError:y});});}catch($){d(`Failed to setup sync for "${e}": ${$?.message||$}`);}},He=({name:e,syncOption:t,syncChannels:r,syncClocks:o,instanceId:a,updatedAt:c,data:l,hashState:g,reportStoreError:n})=>{let i=r[e];if(i)try{let k=typeof t=="object"&&t.checksum==="none"?"none":"hash",s={v:L,protocol:L,type:"sync-state",source:a,name:e,clock:o[e]??0,updatedAt:j({value:c,fallbackMs:Date.now()}),data:l,checksum:k==="hash"?g(l):null};if(typeof t=="object"&&t.authToken&&(s.token=t.authToken),typeof t=="object"&&typeof t.sign=="function")try{let d=t.sign(s);if(d&&typeof d.then=="function"){n(e,`Sync signer for "${e}" returned a Promise. "sign" must be synchronous.`);return}d!==void 0&&(s.auth=d);}catch(d){n(e,`Failed to sign sync payload for "${e}": ${d?.message??d}`);return}let u=typeof t=="object"&&typeof t.maxPayloadBytes=="number"?t.maxPayloadBytes:64*1024,y=zt(JSON.stringify(s));if(y>u){n(e,`Sync payload for "${e}" exceeds ${u} bytes (${y} bytes). Skipping BroadcastChannel sync.`);return}try{i.postMessage(s);}catch(d){if(d&&typeof d=="object"&&d.name==="DataCloneError"){n(e,`Sync payload for "${e}" could not be cloned (DataCloneError). Remove non-serializable values or provide a custom serializer. Payload size ~${y} bytes.`);return}throw d}}catch(k){n(e,`Failed to broadcast sync for "${e}": ${k?.message??k}`);}},Yt=()=>{let e=Object.create(null),t=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),c=new Set,l=`stroid_${Math.random().toString(16).slice(2)}`,g=(s,u)=>{r[s]={clock:t[s]??0,updatedAt:j({value:u,fallbackMs:Date.now()}),source:l};},n=(s,u)=>{Ut(s,t),g(s,u);},i=(s,u)=>{!u||!Number.isFinite(u)||(a[s]=Date.now()+u);},k=(s,u)=>{if(!u)return false;let y=a[s];return y?Date.now()>=y?(delete a[s],false):true:false};return {onStoreCreate(s){if(!s.options.sync)return;let u=s.options.sync,y=typeof u=="object"?u.policy:void 0,d=y==="insecure"||y!=="strict"&&typeof u=="object"&&u.insecure===true,m=typeof u=="object"&&typeof u.authToken=="string"&&u.authToken.length>0,S=typeof u=="object"&&typeof u.verify=="function";if((y==="strict"||!s.isDev()&&y!=="insecure")&&u&&!d&&!m&&!S){s.reportStoreError(`Sync for "${s.name}" requires authToken or verify in strict mode. Use sync: { policy: "insecure" } to acknowledge the risk.`),s.options.sync=false;return}if(Kt({name:s.name,syncOption:u,syncChannels:e,syncClocks:t,syncVersions:r,syncWindowCleanup:o,instanceId:l,getMeta:s.getMeta,getAcceptedSyncVersion:f=>r[f],getStoreValue:f=>s.getStoreValue(),hasStoreEntry:()=>s.hasStore(),notify:()=>s.notify(),validate:(f,h)=>s.validate(h),reportStoreError:(f,h)=>s.reportStoreError(h),warn:s.warn,setStoreValue:(f,h)=>s.setStoreValue(h),normalizeIncomingState:(f,h)=>{let v=U({value:h,sanitize:s.sanitize,validate:s.validate,onSanitizeError:R=>{s.reportStoreError(`Sanitize failed for incoming sync "${f}": ${R?.message??R}`);}});return v.ok?v.value:null},acceptIncomingSyncVersion:(f,h,v,R)=>{s.applyFeatureState(s.getStoreValue(),h),t[s.name]=Math.max(t[s.name]??0,v),r[s.name]={clock:v,updatedAt:h,source:R};},resolveSyncVersion:(f,h,v)=>{s.applyFeatureState(s.getStoreValue(),h);let R=Bt(s.name,v,t);return r[s.name]={clock:R,updatedAt:h,source:l},R},broadcastSync:()=>{let f=s.getMeta();f&&He({name:s.name,syncOption:s.options.sync,syncChannels:e,syncClocks:t,instanceId:l,updatedAt:f.updatedAtMs??f.updatedAt,data:s.getStoreValue(),hashState:s.hashState,reportStoreError:(h,v)=>s.reportStoreError(v)});},markLoopGuard:i}),e[s.name]){let f=s.getMeta();g(s.name,f?.updatedAtMs??f?.updatedAt??new Date().toISOString());}},onStoreWrite(s){if(!s.options.sync)return;let u=s.getMeta();if(!u)return;let y=Ue(s.options.sync);if(k(s.name,y)){n(s.name,u.updatedAtMs??u.updatedAt),c.has(s.name)||(c.add(s.name),s.warn(`Sync broadcast for "${s.name}" suppressed by loopGuard to prevent feedback loops.`));return}n(s.name,u.updatedAtMs??u.updatedAt),He({name:s.name,syncOption:s.options.sync,syncChannels:e,syncClocks:t,instanceId:l,updatedAt:u.updatedAtMs??u.updatedAt,data:s.next,hashState:s.hashState,reportStoreError:(d,m)=>s.reportStoreError(m)});},beforeStoreDelete(s){qt({name:s.name,syncChannels:e,syncWindowCleanup:o,syncClocks:t,syncVersions:r}),delete a[s.name],c.delete(s.name);},resetAll(){Gt({syncChannels:e,syncWindowCleanup:o}),Object.keys(e).forEach(s=>delete e[s]),Object.keys(t).forEach(s=>delete t[s]),Object.keys(r).forEach(s=>delete r[s]),Object.keys(o).forEach(s=>delete o[s]),Object.keys(a).forEach(s=>delete a[s]),ie.clear(),ce.clear(),c.clear();}}},Be=()=>{We||(We=true,z("sync",Yt));};var qe=false,Ge=e=>{try{return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}catch{return e}},Jt=({name:e,useDevtools:t,existingDevtools:r,stores:o,warn:a})=>{if(!t||typeof window>"u")return r;let c=window.__REDUX_DEVTOOLS_EXTENSION__||window.__REDUX_DEVTOOLS_EXTENSION__;if(!c||typeof c.connect!="function")return a(`DevTools requested for "${e}" but Redux DevTools extension not found.`),r;if(r)return r;let l=c.connect({name:"stroid"});return l.init(o),l},J=({data:e,redactor:t,deepClone:r})=>{if(typeof t=="function")try{return t(r(e))}catch{return e}return e},Xt=(e,t)=>{if(typeof e!="object"||typeof t!="object"||e===null||t===null)return null;let r=e,o=t,a=[],c=[],l=[],g=new Set(Object.keys(r)),n=new Set(Object.keys(o));return n.forEach(i=>{g.has(i)?Object.is(r[i],o[i])||l.push(i):a.push(i);}),g.forEach(i=>{n.has(i)||c.push(i);}),{added:a,removed:c,changed:l}},Ke=({name:e,action:t,prev:r,next:o,history:a,historyLimit:c,applyRedactor:l,deepClone:g})=>{if(c===0)return;a[e]||(a[e]=[]);let n={ts:Date.now(),action:t,prev:g(l(r)),next:g(l(o)),diff:Xt(r,o)};a[e].push(n),a[e].length>c&&a[e].splice(0,a[e].length-c);},Ye=({name:e,action:t,force:r=false,devtools:o,enabled:a,stores:c,applyRedactor:l})=>{if(!(!o||!r&&!a))try{let g={...c,[e]:l(c[e])};o.send({type:`${e}/${t}`},g);}catch{}},Qt=()=>{let e=Object.create(null),t;return {onStoreCreate(r){t=Jt({name:r.name,useDevtools:!!r.options.devtools,existingDevtools:t,stores:r.getAllStores(),warn:r.warn}),Ke({name:r.name,action:"create",prev:null,next:r.getStoreValue(),history:e,historyLimit:r.options.historyLimit??50,applyRedactor:o=>J({data:o,redactor:r.options.redactor,deepClone:r.deepClone}),deepClone:r.deepClone});},onStoreWrite(r){Ke({name:r.name,action:r.action,prev:r.prev,next:r.next,history:e,historyLimit:r.options.historyLimit??50,applyRedactor:o=>J({data:o,redactor:r.options.redactor,deepClone:r.deepClone}),deepClone:r.deepClone}),Ye({name:r.name,action:r.action,devtools:t,enabled:!!r.options.devtools,stores:r.getAllStores(),applyRedactor:o=>J({data:o,redactor:r.options.redactor,deepClone:r.deepClone})});},afterStoreDelete(r){r.options.devtools&&Ye({name:r.name,action:"delete",force:true,devtools:t,enabled:true,stores:r.getAllStores(),applyRedactor:o=>J({data:o,redactor:r.options.redactor,deepClone:r.deepClone})}),delete e[r.name];},resetAll(){Object.keys(e).forEach(r=>{delete e[r];}),t=void 0;},api:{getHistory(r,o){if(!e[r])return [];let a=e[r];return o&&o>0?Ge(a.slice(-o)):Ge(a)},clearHistory(r){if(r){delete e[r];return}Object.keys(e).forEach(o=>{delete e[o];});}}}},Je=()=>{qe||(qe=true,z("devtools",Qt));};var Zt=()=>{ze();},er=()=>{Be();},tr=()=>{Je();},sn=()=>{Zt(),er(),tr();};export{sn as installAllFeatures,tr as installDevtools,Zt as installPersist,er as installSync};//# sourceMappingURL=install.js.map
1
+ var Ue=new Map,Et=null,fe=(e,t)=>{Ue.set(e,t),Et?.(e,t);};var Pe=e=>Ue.get(e),pe=()=>Array.from(Ue.keys()),Ft=e=>{Et=e;};var Br=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",qe=e=>!!e?.[Br],Ae=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,r=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(r)===r}catch{return false}},xt=(e,t,r)=>{let o="__stroid_persist_roundtrip_probe__",s;try{s=t(o);}catch(c){return {ok:false,reason:`persist: encrypt failed for store "${e}" (${c?.message??c})`}}if(typeof s!="string")return {ok:false,reason:`persist: encrypt must return a string for store "${e}".`};let a;try{a=r(s);}catch(c){return {ok:false,reason:`persist: decrypt failed for store "${e}" (${c?.message??c})`}}return typeof a!="string"?{ok:false,reason:`persist: decrypt must return a string for store "${e}".`}:a!==o?{ok:false,reason:`persist: encrypt/decrypt must round-trip for store "${e}".`}:{ok:true}};var Tt=(e,t,r)=>{e[t]&&(e[t].lastPresent=r);},Vt=({name:e,persistConfig:t,persistWatchState:r})=>{let o=t?.onStorageCleared;if(!t||typeof o!="function"||typeof window>"u"||typeof window.addEventListener!="function")return;r[e]?.dispose();let s=window,a=()=>{try{return t.driver.getItem?.(t.key)!=null}catch{return false}},c=n=>{let p=r[e],i=a();if(p){if(!p.lastPresent||i){p.lastPresent=i;return}p.lastPresent=false,o({name:e,key:t.key,reason:n});}},l=n=>{if(n.key===null){c("clear");return}n.key===t.key&&n.newValue===null&&c("remove");},g=()=>{c("missing");};s.addEventListener("storage",l),s.addEventListener("focus",g),r[e]={lastPresent:a(),dispose:()=>{s.removeEventListener("storage",l),s.removeEventListener("focus",g);}};};var Me=({value:e,sanitize:t,validate:r,onSanitizeError:o})=>{let s;if(t)try{s=t(e);}catch(c){return o?.(c),{ok:false}}else s=e;let a=r(s);return a.ok?{ok:true,value:a.value??s}:{ok:false}},ie=({value:e,fallbackMs:t=Date.now(),onInvalid:r})=>{if(typeof e=="number")return Number.isFinite(e)?e:(r?.(),t);if(typeof e=="string"){let o=Date.parse(e);return Number.isFinite(o)?o:(r?.(),t)}return r?.(),t};var Ur=new Map,A=(e,t,r=0)=>{!e||typeof t!="function"||Ur.set(e,{name:e,order:r,fn:t});};var jt=()=>new Map([["noSignal",new Set],["shape",new Set],["autoCreate",new Set],["mutableResult",new Set]]),Pt=()=>({fetchRegistry:Object.create(null),inflight:Object.create(null),requestVersion:Object.create(null),cacheMeta:Object.create(null),rateWindowStart:Object.create(null),rateCount:Object.create(null),ratePruneState:{lastAt:0},ratePruneTimer:null,warnedOnce:jt(),storeCleanups:Object.create(null),revalidateKeys:new Set,revalidateHandlers:Object.create(null),asyncMetrics:{cacheHits:0,cacheMisses:0,dedupes:0,requests:0,failures:0,avgMs:0,lastMs:0}}),At=e=>{Object.values(e.storeCleanups).forEach(t=>{Object.values(t).forEach(r=>{r?.forEach(o=>{try{o();}catch{}});});}),Object.keys(e.fetchRegistry).forEach(t=>delete e.fetchRegistry[t]),Object.keys(e.inflight).forEach(t=>delete e.inflight[t]),Object.keys(e.requestVersion).forEach(t=>delete e.requestVersion[t]),Object.keys(e.cacheMeta).forEach(t=>delete e.cacheMeta[t]),Object.keys(e.rateWindowStart).forEach(t=>delete e.rateWindowStart[t]),Object.keys(e.rateCount).forEach(t=>delete e.rateCount[t]),Object.keys(e.storeCleanups).forEach(t=>delete e.storeCleanups[t]),Object.keys(e.revalidateHandlers).forEach(t=>delete e.revalidateHandlers[t]),e.revalidateKeys.clear(),e.warnedOnce.forEach(t=>t.clear()),e.warnedOnce.clear(),jt().forEach((t,r)=>{e.warnedOnce.set(r,t);}),e.ratePruneState.lastAt=0,e.ratePruneTimer&&(clearTimeout(e.ratePruneTimer),e.ratePruneTimer=null),e.asyncMetrics.cacheHits=0,e.asyncMetrics.cacheMisses=0,e.asyncMetrics.dedupes=0,e.asyncMetrics.requests=0,e.asyncMetrics.failures=0,e.asyncMetrics.avgMs=0,e.asyncMetrics.lastMs=0;};var Ke=new Map,Dt=new WeakSet,Ge=e=>{Dt.has(e)||(Dt.add(e),pe().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=Pe(t);r&&e.featureRuntimes.set(t,r());}}));},qr=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,$t,Ye=e=>($t||qr||e).replace(/\.ts(\?|$)/,".js$1"),ge=Ye("stroid:default-registry");var Kr=()=>{$t=void 0,Ke.clear();};A("registry.scope-override",Kr,110);var Gr=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],notifyScheduled:false,batchDepth:0,flushId:0,isFlushing:false}),Yr=e=>{e.pendingNotifications.clear(),e.pendingBuffer.length=0,e.orderedNames.length=0,e.notifyScheduled=false,e.batchDepth=0,e.flushId=0,e.isFlushing=false;},Jr=()=>({depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0}),Xr=(e="default")=>{let t={scope:e,stores:Object.create(null),subscribers:Object.create(null),initialStates:Object.create(null),initialFactories:Object.create(null),metaEntries:Object.create(null),snapshotCache:Object.create(null),featureRuntimes:new Map,deletingStores:new Set,computedEntries:Object.create(null),computedDependents:Object.create(null),computedCleanups:new Map,transaction:Jr(),async:Pt(),notify:Gr(),lifecycleListener:null};return Ge(t),t},ye=e=>{let t=Ye(e),r=Ke.get(t);if(r)return r;let o=Xr();return Ke.set(t,o),o},ae=(e,t)=>Object.prototype.hasOwnProperty.call(e.stores,t);var Ot=e=>{e.computedCleanups.forEach(t=>{try{t();}catch{}}),e.computedCleanups.clear(),[e.stores,e.subscribers,e.initialStates,e.initialFactories,e.metaEntries,e.snapshotCache,e.computedEntries,e.computedDependents].forEach(t=>{Object.keys(t).forEach(r=>{delete t[r];});}),e.deletingStores.clear(),e.transaction.depth=0,e.transaction.pending=[],e.transaction.stagedValues.clear(),e.transaction.snapshotCache.clear(),e.transaction.failed=false,e.transaction.error=void 0,Yr(e.notify),At(e.async),e.lifecycleListener=null;};var Je=(e,t)=>{try{e.lifecycleListener?.(t);}catch{}};var ee=[],It={run:(e,t)=>{ee.push(e);try{return t()}finally{ee.pop();}},get:()=>ee.length>0?ee[ee.length-1]:null,enterWith:e=>{if(ee.length>0){ee[ee.length-1]=e;return}ee.push(e);}};var he=e=>(It).get()||e||ye(ge);var Zr={log:(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},warn:(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},critical:(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));}},zt={logSink:Zr,flush:{chunkSize:Number.POSITIVE_INFINITY,chunkDelayMs:0,priorityStores:[]},revalidateOnFocus:{debounceMs:0,maxConcurrent:3,staggerMs:100},namespace:"",strictMissingFeatures:true,assertRuntime:false,strictMutatorReturns:true,asyncAutoCreate:false,asyncCloneResult:"none",autoCorrelationIds:false,acknowledgeLooseTypes:false,pathCacheSize:500,defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0,selectorCloneFrozen:true},Qe=e=>({logSink:{...e.logSink},flush:{...e.flush},revalidateOnFocus:{...e.revalidateOnFocus},namespace:e.namespace,strictMissingFeatures:e.strictMissingFeatures,assertRuntime:e.assertRuntime,strictMutatorReturns:e.strictMutatorReturns,asyncAutoCreate:e.asyncAutoCreate,asyncCloneResult:e.asyncCloneResult,autoCorrelationIds:e.autoCorrelationIds,acknowledgeLooseTypes:e.acknowledgeLooseTypes,pathCacheSize:e.pathCacheSize,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce,selectorCloneFrozen:e.selectorCloneFrozen}),Xe=new WeakMap,Wt=Qe(zt),eo=e=>{let t=Xe.get(e);return t||(t=Qe(Wt),Xe.set(e,t)),t};var N=()=>eo(he());var no=()=>{Xe=new WeakMap,Wt=Qe(zt);};A("config.reset",no,90);var so=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,io=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,Ht=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,ao="production",co=so??io??ao,$e=typeof Ht=="boolean"?Ht:co!=="production",D=()=>$e,Lt=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},uo=(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));},lo=(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},Ee=(e,t)=>{if((N().logSink.critical??uo)(e,t),N().assertRuntime)throw new Error(e)},E=(e,t)=>{if(!$e)return;if((N().logSink.warn??Lt)(e,t),N().assertRuntime)throw new Error(e)},U=(e,t)=>{if((N().logSink.warn??Lt)(e,t),N().assertRuntime)throw new Error(e)};var oe=(e,t)=>{if(!$e)return;(N().logSink.log??lo)(e,t);};var Bt=()=>"Date detected; stored as ISO string. Use new Date(value) when reading.",Ut=()=>"Map detected; converting to plain object.",qt=()=>"Set detected; converting to array.";var me=new Set(["__proto__","constructor","prototype"]),Ze=(e,t)=>{if(!e)return {ok:true};try{if(typeof e.safeParse=="function"){let r=e.safeParse(t);return r.success?{ok:!0,data:r.data}:{ok:!1,error:r.error}}if(typeof e.parse=="function")return e.parse(t),{ok:!0,data:t};if(typeof e.validateSync=="function")return e.validateSync(t),{ok:!0,data:t};if(typeof e.isValidSync=="function")return e.isValidSync(t)?{ok:!0,data:t}:{ok:!1,error:"Schema validation failed"};if(typeof e.validate=="function"){let r=e.validate(t);if(r===!0)return {ok:!0,data:t};if(r===!1)return {ok:!1,error:e.errors||"Schema validation failed"};if(r&&typeof r=="object"){let s=r.error,a=s?.details?.[0]?.message||s?.message||r.message||e.errors;if(a)return {ok:!1,error:a};if(s)return {ok:!1,error:s}}return {ok:!1,error:e.errors||"Schema validation failed"}}if(typeof e=="function"){let r=e(t);return r===!1?{ok:!1,error:"Schema validation failed"}:{ok:!0,data:r===!0?t:r}}return {ok:!0,data:t}}catch(r){return {ok:false,error:r?.message??r}}};var et=e=>e===null?"null":Array.isArray(e)?"array":e instanceof Map?"map":e instanceof Set?"set":e instanceof Date?"date":typeof e=="function"?"function":typeof e,po=e=>{if(!e||typeof e!="object")return null;let t=globalThis?.WeakRef;return t&&e instanceof t?"WeakRef":typeof WeakMap<"u"&&e instanceof WeakMap?"WeakMap":typeof WeakSet<"u"&&e instanceof WeakSet?"WeakSet":typeof EventTarget<"u"&&e instanceof EventTarget?"EventTarget":typeof ReadableStream<"u"&&e instanceof ReadableStream?"ReadableStream":typeof WritableStream<"u"&&e instanceof WritableStream?"WritableStream":typeof Request<"u"&&e instanceof Request?"Request":typeof Response<"u"&&e instanceof Response?"Response":typeof Headers<"u"&&e instanceof Headers?"Headers":typeof FormData<"u"&&e instanceof FormData?"FormData":null};var Fe=(e,t)=>{let r=po(e);if(r)throw new Error(`${r} values are not supported`);let o=et(e);if(o==="number"){if(!Number.isFinite(e))throw new Error("Non-finite numbers are not supported");return e}if(o==="bigint")throw new Error("BigInt values are not supported");if(o==="symbol")throw new Error("Symbol values are not supported");if(o==="date")return D()&&E(Bt()),e.toISOString();if(o==="map"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e),D()&&E(Ut());let s={};for(let[a,c]of e){if(typeof a!="string")throw new Error("Map keys must be strings to remain JSON-safe");s[String(a)]=Fe(c,t);}return s}if(o==="set"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),D()&&E(qt()),Array.from(e,s=>Fe(s,t))}if(o==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let s={},a=Object.getOwnPropertyDescriptors(e);for(let[c,l]of Object.entries(a))if(l.enumerable&&!me.has(c)){if("get"in l||"set"in l)throw new Error(`Accessor properties are not supported during sanitize ("${c}")`);s[c]=Fe(l.value,t);}return s}if(o==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),e.map(s=>Fe(s,t))}return e},Se=e=>Fe(e,new WeakSet);var tt=null,go=()=>{if(tt)return tt;let e,t=[];for(let r=0;r<256;r++){e=r;for(let o=0;o<8;o++)e=e&1?3988292384^e>>>1:e>>>1;t[r]=e>>>0;}return tt=t,t},Gt=e=>{let t=go(),r=-1;for(let o=0;o<e.length;o++)r=r>>>0,r=r>>>8^t[(r^e.charCodeAt(o))&255];return (r^-1)>>>0},yo=2166136261,ho=2654435761,mo=1e5,ne=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},ce=(e,t)=>{ne(e,t.length);for(let r=0;r<t.length;r++)ne(e,t.charCodeAt(r));},V=(e,t)=>{ce(e,t);},Kt=(e,t)=>{if(Number.isNaN(t)){V(e,"NaN");return}if(!Number.isFinite(t)){V(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){V(e,"-0");return}let r=t|0;if(t===r){V(e,"int"),ne(e,r);return}V(e,"num"),ce(e,String(t));},be=(e,t)=>{if(e.nodes++>mo){V(e,"[max]");return}if(t===null){V(e,"null");return}let r=typeof t;if(r==="string"){V(e,"string"),ce(e,t);return}if(r==="number"){V(e,"number"),Kt(e,t);return}if(r==="boolean"){V(e,t?"true":"false");return}if(r==="undefined"){V(e,"undefined");return}if(r==="bigint"){V(e,"bigint"),ce(e,t.toString());return}if(r==="symbol"){V(e,"symbol");let g=t;ce(e,Symbol.keyFor(g)??g.description??String(g));return}if(r==="function"){V(e,"function"),ce(e,t.name||"anonymous");return}let o=t,s=e.seen.get(o);if(s!==void 0){V(e,"ref"),ne(e,s);return}let a=e.nextId++;if(e.seen.set(o,a),Array.isArray(o)){V(e,"array"),ne(e,o.length);for(let g=0;g<o.length;g++)Object.prototype.hasOwnProperty.call(o,g)?be(e,o[g]):V(e,"hole");return}if(o instanceof Date){V(e,"date"),Kt(e,o.getTime());return}if(o instanceof Map){V(e,"map"),ne(e,o.size),o.forEach((g,n)=>{be(e,n),be(e,g);});return}if(o instanceof Set){V(e,"set"),ne(e,o.size),o.forEach(g=>{be(e,g);});return}V(e,"object");let c=Object.getOwnPropertyDescriptors(o),l=[];Object.entries(c).forEach(([g,n])=>{n?.enumerable&&(me.has(g)||"get"in n||"set"in n||l.push([g,n]));}),ne(e,l.length);for(let[g,n]of l)ce(e,g),be(e,n.value);},ue=e=>{if(typeof e=="string")return Gt(JSON.stringify(e));let t={h1:yo,h2:ho,seen:new WeakMap,nextId:1,nodes:0};be(t,e);let r=t.h1>>>0,o=t.h2>>>0;return r^=r>>>16,r=Math.imul(r,2246822507),r^=r>>>13,r=Math.imul(r,3266489909),r^=r>>>16,o^=o>>>16,o=Math.imul(o,668265261),o^=o>>>15,o=Math.imul(o,374761393),o^=o>>>16,(r&2097151)*4294967296+(o>>>0)};var So=typeof globalThis<"u"&&typeof globalThis.structuredClone=="function",ot=e=>{if(typeof e=="function")return "function";if(typeof e=="symbol")return "symbol";if(e===null||typeof e!="object")return null;let t=[["WeakMap",globalThis.WeakMap],["WeakSet",globalThis.WeakSet],["WeakRef",globalThis.WeakRef],["Promise",globalThis.Promise],["ReadableStream",globalThis.ReadableStream],["WritableStream",globalThis.WritableStream],["TransformStream",globalThis.TransformStream],["EventTarget",globalThis.EventTarget]];for(let[o,s]of t)if(typeof s=="function"&&e instanceof s)return o;let r=globalThis.Node;return typeof r=="function"&&e instanceof r?"DOM Node":null},bo=e=>ot(e)===null,ko=e=>{let t=ot(e);if(t)throw new Error(`deepClone failed: value is not structured-cloneable (${t}). Avoid storing this type in stroid state.`)},le=(e,t=new WeakMap)=>{if(ko(e),e===null||typeof e!="object")return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let s=new Map;return t.set(e,s),e.forEach((a,c)=>{s.set(le(c,t),le(a,t));}),s}if(e instanceof Set){let s=new Set;return t.set(e,s),e.forEach(a=>{s.add(le(a,t));}),s}if(Array.isArray(e)){let s=[];return t.set(e,s),e.forEach((a,c)=>{s[c]=le(a,t);}),s}let r={};t.set(e,r);let o;try{o=Object.getOwnPropertyDescriptors(e);}catch(s){throw new Error(`deepClone failed to read object descriptors (possible Proxy or host object): ${s?.message??s}`)}return Object.entries(o).forEach(([s,a])=>{!a.enumerable||me.has(s)||"get"in a||"set"in a||(r[s]=le(a.value,t));}),r},G=e=>{if(So)try{return structuredClone(e)}catch(t){if(!bo(e)){let r=ot(e)??"unknown";throw new Error(`deepClone failed: value is not structured-cloneable (${r}). Avoid storing this type in stroid state.`)}return E(`deepClone fell back to manual clone after structuredClone failed: ${t?.message??t}`),le(e)}return le(e)};var wo=e=>{let t=new Uint8Array(e),r="";for(let o=0;o<t.length;o++)r+=t[o].toString(16).padStart(2,"0");return r},Co=async e=>{if(typeof globalThis<"u"&&globalThis.crypto?.subtle){let t=typeof TextEncoder<"u"?new TextEncoder:null,r=t?t.encode(e):new Uint8Array(Buffer.from(e)),o=await globalThis.crypto.subtle.digest("SHA-256",r);return wo(o)}try{let{createHash:t}=await import('crypto');return t("sha256").update(e).digest("hex")}catch{throw new Error("sha256 checksum is not supported in this environment")}},Oe=async(e,t,r=ue)=>e==="none"?null:e==="sha256"?Co(t):r(t);var Yt=1e6,Jt=(e,t)=>{let r=e?.options?.migrations??{};if(Object.keys(r).length>0)return r;let o=t?.migrate;if(typeof o!="function")return r;let s=e?.version??1;return !Number.isFinite(s)||s<=1?r:{[s]:o}},nt=({name:e,persisted:t,reason:r,persistConfig:o,initialState:s,reportStoreError:a,sanitize:c,deepClone:l})=>{a(e,r);let g=o?.onMigrationFail??"reset";if(g==="keep")return {state:t,requiresValidation:true};if(typeof g=="function")try{let n=g(l(t));if(n!==void 0)return {state:c(n),requiresValidation:!0};a(e,`onMigrationFail for "${e}" returned undefined. Falling back to initial state.`);}catch(n){a(e,`onMigrationFail for "${e}" failed: ${n?.message??n}`);}return {state:l(s),requiresValidation:true}},Xt=e=>{let r=e.getMeta()?.options?.persist;return r?!!r.decryptAsync||r.checksum==="sha256"?Mo(e):Ro(e):false},Ro=({name:e,silent:t=false,getMeta:r,getInitialState:o,applyFeatureState:s,reportStoreError:a,warnMissingMaxSize:c,validate:l,log:g,hashState:n,deepClone:p,sanitize:i,shouldApply:u})=>{let m=r(),d=m?.options?.persist;if(!d)return false;let h=Jt(m,d),y=f=>Me({value:f,validate:l});try{let f=d.driver.getItem?.(d.key)??null;if(!f)return !1;if(typeof f!="string")return a(e,`Persist driver for "${e}" returned an async value during sync hydration. Provide async decrypt hooks or use an async-capable persist driver.`),!0;if(typeof d.maxSize!="number"&&f.length>Yt&&c?.(f.length),typeof d.maxSize=="number"&&f.length>d.maxSize)return a(e,`Persist payload for "${e}" exceeds maxSize (${f.length} > ${d.maxSize}). Skipping hydration.`),!0;let b=d.decrypt(f),v=JSON.parse(b),{v:C=1,checksum:M,data:R,updatedAt:j,updatedAtMs:O}=v||{};if(!R)return !0;let L=ie({value:typeof O=="number"?O:j,fallbackMs:Date.now(),onInvalid:()=>{g(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}});if(d.checksum!=="none"&&M!==n(R))return a(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!u||u())&&s(p(o()),Date.now()),!0;let J=d.deserialize(R),X=m?.version??1,_=Qt({name:e,parsed:J,v:C,targetVersion:X,cfg:d,migrations:h,getInitialState:o,reportStoreError:a,sanitize:i,deepClone:p,validateState:y,safeUpdatedAt:L,applyFeatureState:s,shouldApply:u});return _.ok&&(J=_.state,(!u||u())&&(s(_.state,L),t||g(`Store "${e}" loaded from persistence`))),!0}catch(f){return a(e,`Could not load store "${e}" (${f?.message||f})`),true}},Mo=async({name:e,silent:t=false,getMeta:r,getInitialState:o,applyFeatureState:s,reportStoreError:a,warnMissingMaxSize:c,validate:l,log:g,hashState:n,deepClone:p,sanitize:i,shouldApply:u})=>{let m=r(),d=m?.options?.persist;if(!d)return false;let h=Jt(m,d),y=f=>Me({value:f,validate:l});try{let f=await Promise.resolve(d.driver.getItem?.(d.key)??null);if(!f)return !1;if(typeof d.maxSize!="number"&&typeof f=="string"&&f.length>Yt&&c?.(f.length),typeof d.maxSize=="number"&&typeof f=="string"&&f.length>d.maxSize)return a(e,`Persist payload for "${e}" exceeds maxSize (${f.length} > ${d.maxSize}). Skipping hydration.`),!0;let b=d.decryptAsync?await d.decryptAsync(f):d.decrypt(f),v=JSON.parse(b),{v:C=1,checksum:M,data:R,updatedAt:j,updatedAtMs:O}=v||{};if(!R)return !0;let L=ie({value:typeof O=="number"?O:j,fallbackMs:Date.now(),onInvalid:()=>{g(`persist: corrupt updatedAt in stored data for "${e}". Using current time to prevent sync overwrite.`);}}),J=await Oe(d.checksum,R,n);if(d.checksum!=="none"&&M!==J)return a(e,`Checksum mismatch loading store "${e}". Falling back to initial state.`),(!u||u())&&s(p(o()),Date.now()),!0;let X=d.deserialize(R),_=m?.version??1,k=Qt({name:e,parsed:X,v:C,targetVersion:_,cfg:d,migrations:h,getInitialState:o,reportStoreError:a,sanitize:i,deepClone:p,validateState:y,safeUpdatedAt:L,applyFeatureState:s,shouldApply:u});return k.ok&&(!u||u())&&(s(k.state,L),t||g(`Store "${e}" loaded from persistence`)),!0}catch(f){return a(e,`Could not load store "${e}" (${f?.message||f})`),true}},Qt=({name:e,parsed:t,v:r,targetVersion:o,cfg:s,migrations:a,getInitialState:c,reportStoreError:l,sanitize:g,deepClone:n,validateState:p,safeUpdatedAt:i,applyFeatureState:u,shouldApply:m})=>{if(r!==o){let h=Object.keys(a).map(b=>Number(b)).filter(b=>b>r&&b<=o).sort((b,v)=>b-v);if(h.length===0){let b=nt({name:e,persisted:t,reason:`No migration path from v${r} to v${o} for "${e}". Applying onMigrationFail strategy.`,persistConfig:s,initialState:c(),reportStoreError:l,sanitize:g,deepClone:n});if(t=b.state,!b.requiresValidation)return (!m||m())&&u(t,i),{ok:false,state:t}}let y=false,f=true;if(h.forEach(b=>{if(!y)try{let v=a[b](t);v!==void 0&&(t=v);}catch(v){let C=nt({name:e,persisted:t,reason:`Migration to v${b} failed for "${e}": ${v?.message||v}`,persistConfig:s,initialState:c(),reportStoreError:l,sanitize:g,deepClone:n});t=C.state,f=C.requiresValidation,y=true;}}),y){if(!f)return (!m||m())&&u(t,i),{ok:false,state:t};let b=p(t);return b.ok?{ok:true,state:b.value??t}:((!m||m())&&u(n(c()),Date.now()),{ok:false,state:t})}}let d=p(t);if(!d.ok){if(r!==o){let h=s?.onMigrationFail??"reset",y=nt({name:e,persisted:t,reason:`Persisted state for "${e}" failed schema after version change. Applying onMigrationFail strategy.`,persistConfig:s,initialState:c(),reportStoreError:l,sanitize:g,deepClone:n});if(!y.requiresValidation)return (!m||m())&&u(y.state,i),{ok:false,state:y.state};let f=p(y.state);if(f.ok)return h==="reset"&&l(e,`Persisted state for "${e}" failed schema; resetting to initial.`),{ok:true,state:f.value??y.state}}return l(e,`Persisted state for "${e}" failed schema; resetting to initial.`),(!m||m())&&u(n(c()),Date.now()),{ok:false,state:t}}return {ok:true,state:d.value??t}};var xe=(e,t,...r)=>{if(typeof e=="function")try{e(...r);}catch(o){let s=o?.message??o;U(`${t} callback threw: ${String(s)}`);}},ke=(e,t={})=>{let{severity:r="warn",visibility:o="dev",onError:s}=t;if(xe(s,"onError",e),r==="critical"){o==="dev"&&E(e),Ee(e);return}if(o==="always"){U(e);return}E(e);};var Zt=({name:e,persistTimers:t,persistInFlight:r,persistSequence:o,persistWatchState:s,plaintextWarningsIssued:a,exists:c,getMeta:l,getStoreValue:g,reportStoreError:n,hashState:p},i=false)=>{let u=l()?.options?.persist;if(!u)return;let m=async y=>{let f=l();if(!(!f?.options?.persist||f.options.persist!==u||!c())&&!(y!==void 0&&o[e]!==y)){if(!u.allowPlaintext&&!a.has(e)&&qe(u.encrypt)&&qe(u.decrypt)){a.add(e);let b=`[stroid/persist] Store '${e}' is persisted in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`;xe(f.options.onError,`onError(${e})`,b),U(b);}try{let b=u.serialize(g()),v=await Oe(u.checksum,b,p),C=JSON.stringify({v:f.version??1,updatedAt:f.updatedAt,updatedAtMs:f.updatedAtMs??Date.now(),checksum:v,data:b}),M=u.encryptAsync?await u.encryptAsync(C):u.encrypt(C);if(y!==void 0&&o[e]!==y)return;await Promise.resolve(u.driver.setItem?.(u.key,M)),Tt(s,e,!0);}catch(b){n(e,`Could not persist store "${e}" (${b?.message||b})`);}}},d=y=>{let f=r[e],b=(o[e]??0)+1;o[e]=b;let C=(async()=>{f&&await f,!(y&&t[e]!==y)&&o[e]===b&&await m(b);})().finally(()=>{r[e]===C&&(r[e]=null),y&&t[e]===y&&delete t[e];});r[e]=C;};if(i){t[e]&&(clearTimeout(t[e]),delete t[e]),d();return}t[e]&&clearTimeout(t[e]);let h=setTimeout(()=>{t[e]===h&&d(h);},0);t[e]=h;},Te=e=>Zt(e),er=(e,t)=>Zt({...t,name:e},true);var tr=false,Eo=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,Fo=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,xo=Eo??Fo,To=()=>xo==="production",Vo=()=>{let e={},t={},r=Object.create(null),o=Object.create(null),s=Object.create(null),a=new Set,c=new Set,l=Object.create(null),g=Object.create(null);return {api:{getPersistQueueDepth(n){return e[n]?1:0}},onStoreCreate(n){let p=n.options.persist;if(!p)return;if(!p.encryptAsync&&Ae(p.encrypt)&&Ae(p.decrypt)&&!p.allowPlaintext){let y=`[stroid/persist] Store "${n.name}" is configured for plaintext persistence. Provide encrypt/decrypt hooks or set persist.allowPlaintext: true to acknowledge.`;if(To()){n.reportStoreError(y),n.options.persist=null;return}n.warn(y);}if(p.sensitiveData&&!p.encryptAsync&&Ae(p.encrypt)){n.reportStoreError(`persist: store "${n.name}" is marked sensitiveData but has no encrypt function. Plaintext data will be written to storage.`);return}let u=xt(n.name,p.encrypt,p.decrypt);if(!u.ok){n.reportStoreError(u.reason??`persist: encrypt/decrypt validation failed for store "${n.name}".`),n.options.persist=null;return}if(p.key){let y=o[p.key];y&&y!==n.name&&n.isDev()?n.warn(`Persist key collision: "${p.key}" already used by store "${y}". Store "${n.name}" will overwrite the same storage key.`):o[p.key]=n.name;}let m=n.getMeta()?.updateCount??0,d=()=>{let y=n.getMeta();return y?(y.updateCount??0)===m:false},h=Xt({name:n.name,silent:true,getMeta:n.getMeta,getInitialState:n.getInitialState,applyFeatureState:n.applyFeatureState,reportStoreError:(y,f)=>n.reportStoreError(f),warnMissingMaxSize:y=>{c.has(n.name)||(c.add(n.name),n.warnAlways(`[stroid/persist] Store "${n.name}" loaded ${y} bytes without a maxSize guard. Set persist.maxSize to prevent oversized payloads.`));},validate:n.validate,log:n.log,hashState:n.hashState,deepClone:n.deepClone,sanitize:n.sanitize,shouldApply:d});if(typeof h?.then=="function"?(l[n.name]={loading:true,pendingSave:false},h.then(y=>{let f=l[n.name];f&&(f.loading=false,(!y||f.pendingSave)&&Te({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:s,plaintextWarningsIssued:a,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(b,v)=>n.reportStoreError(v),hashState:n.hashState}),delete l[n.name]);}).catch(()=>{let y=l[n.name];y&&(y.loading=false,y.pendingSave&&Te({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:s,plaintextWarningsIssued:a,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(f,b)=>n.reportStoreError(b),hashState:n.hashState}),delete l[n.name]);})):h||Te({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:s,plaintextWarningsIssued:a,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(y,f)=>n.reportStoreError(f),hashState:n.hashState}),typeof window<"u"&&typeof window.addEventListener=="function"){g[n.name]?.();let y=window,f=false,b=()=>{f||(f=true,y.removeEventListener("pagehide",v),y.removeEventListener("beforeunload",v),delete g[n.name]);},v=()=>{b(),er(n.name,{name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:s,plaintextWarningsIssued:a,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(C,M)=>n.reportStoreError(M),hashState:n.hashState});};y.addEventListener("pagehide",v,{once:true}),y.addEventListener("beforeunload",v,{once:true}),g[n.name]=b;}Vt({name:n.name,persistConfig:p,persistWatchState:s});},onStoreWrite(n){if(!n.options.persist)return;let p=l[n.name];if(p?.loading){p.pendingSave=true;return}Te({name:n.name,persistTimers:e,persistInFlight:t,persistSequence:r,persistWatchState:s,plaintextWarningsIssued:a,exists:()=>n.hasStore(),getMeta:n.getMeta,getStoreValue:n.getStoreValue,reportStoreError:(i,u)=>n.reportStoreError(u),hashState:n.hashState});},beforeStoreDelete(n){let p=n.options.persist;if(p){delete l[n.name],c.delete(n.name),e[n.name]&&(clearTimeout(e[n.name]),delete e[n.name]),t[n.name]=null,delete r[n.name];try{p.driver.removeItem?.(p.key);}catch{}p.key&&o[p.key]===n.name&&delete o[p.key],g[n.name]?.(),s[n.name]?.dispose(),delete g[n.name],delete s[n.name];}},resetAll(){Object.values(e).forEach(n=>clearTimeout(n)),Object.values(g).forEach(n=>{try{n();}catch{}}),Object.values(s).forEach(n=>{try{n.dispose();}catch{}}),Object.keys(e).forEach(n=>delete e[n]),Object.keys(t).forEach(n=>{t[n]=null,delete t[n];}),Object.keys(r).forEach(n=>delete r[n]),Object.keys(o).forEach(n=>delete o[n]),Object.keys(s).forEach(n=>delete s[n]),Object.keys(l).forEach(n=>delete l[n]),a.clear(),c.clear();}}},rr=()=>{tr||(tr=true,fe("persist",Vo));};var or=({name:e,label:t,fn:r,args:o,reportIssue:s})=>{if(typeof r=="function")try{r(...o);}catch(a){let c=`${t} for "${e}" failed: ${a?.message??a}`;s(c,"always");}};A("computed.order-resolver",()=>{},105);var ir=()=>he(ye(ge)),st=()=>ir().computedEntries,ar=()=>ir().computedDependents;var cr=e=>Object.prototype.hasOwnProperty.call(st(),e);var it=e=>{let t=st()[e];if(!t)return null;let r=ar()[e];return {deps:[...t.deps],dependents:r?[...r]:[]}};var Po=new Set;var Ao=()=>{Po.clear();};A("ssr.warnings",Ao,60);var Do=(e,t,r={})=>{ke(t,{...r,onError:$[e]?.options?.onError});};var at=(e,t)=>Do(e,t,{severity:"critical",visibility:"always"});var ur=new WeakMap,lr=new WeakMap;var ze=e=>{let t=ur.get(e);return t||(t=new Map,ur.set(e,t)),t},dr=e=>{let t=lr.get(e);return t||(t=new Map,lr.set(e,t)),t};new Proxy(new Map,{get:(e,t)=>{let r=ze(z());if(t==="size")return r.size;if(t===Symbol.iterator)return r[Symbol.iterator].bind(r);let o=r[t];return typeof o=="function"?o.bind(r):o},set:(e,t,r)=>(ze(z())[t]=r,true)});var $o=(e,t)=>{let r=new Set,o=$[e]?.options?.onError;return typeof o=="function"&&r.add(o),r},fr=(e,t,r,o)=>{if(!r)return {ok:true,value:t};let s=$o(e),a=(l,g)=>{s.forEach(n=>xe(n,`onError(${e})`,l)),g==="critical"?Ee(l):E(l);};if(typeof r=="function")try{let l=r(t);return l===!1?(a(`Validation blocked update for "${e}"`,"warn"),{ok:!1}):{ok:!0,value:l===!0?t:l}}catch(l){return a(`Validation for "${e}" failed: ${l?.message??l}`,"critical"),{ok:false}}let c=Ze(r,t);return c.ok?{ok:true,value:c.data??t}:(a(`Validation failed for "${e}": ${c.error}`,"critical"),{ok:false})};var ct=e=>{let t=z();ze(t).delete(e),dr(t).delete(e);},Oo=()=>{let e=z();ze(e).clear(),dr(e).clear();};A("validation.path-cache",Oo,50);pr(ct);var kr=new Map;var je=(e,t,r)=>{let o=kr.get(e);!o||o.size===0||o.forEach(s=>{try{s(t,r);}catch(a){typeof console<"u"&&console.warn&&console.warn(`[stroid] lifecycle hook "${e}" failed:`,a);}});};var _o=()=>{};A("write-context.runner",_o,121);var zo=()=>{let e=z().notify;e.pendingNotifications.clear(),e.pendingBuffer.length=0,e.orderedNames.length=0,e.notifyScheduled=false,e.batchDepth=0;};A("notify.reset",zo,40);var Wo=()=>z().computedCleanups,Cr=new WeakMap;var Ho=e=>{let t=Cr.get(e);return t||(t=new Map,Cr.set(e,t)),t};var Rr=e=>{let t=Wo(),r=t.get(e);if(!r){D()&&E(`deleteComputed("${e}") -- not found`);return}r(),t.delete(e);};var Mr=(e,t=z())=>Ho(t).get(e)?.autoDispose===true;var Er=e=>{let t=e.stores,r=e.subscribers,o=e.initialStates,s=e.initialFactories,a=e.metaEntries,c=e.snapshotCache,l=e.featureRuntimes,g=e.deletingStores,n=(h,y)=>{ke(y,{onError:a[h]?.options?.onError,severity:"warn",visibility:"dev"});},p=({name:h,prev:y,options:f,initialState:b,getMeta:v,getStoreValue:C,hasStore:M})=>({name:h,options:f,prev:y,getMeta:v,getStoreValue:C,getAllStores:()=>t,getInitialState:()=>b,hasStore:M,setStoreValue:()=>{},applyFeatureState:()=>{},notify:()=>{},reportStoreError:R=>{ke(R,{onError:f.onError,severity:"warn",visibility:"dev"});},warn:E,warnAlways:U,log:oe,hashState:ue,deepClone:G,sanitize:Se,validate:()=>({ok:true,value:y}),isDev:D}),i=({name:h,prev:y,options:f,initialState:b,phase:v})=>{let C=p({name:h,prev:y,options:f,initialState:b,getMeta:()=>a[h],getStoreValue:()=>t[h],hasStore:()=>ae(e,h)}),M=p({name:h,prev:y,options:f,initialState:b,getMeta:()=>{},getStoreValue:()=>y,hasStore:()=>false});pe().forEach(R=>{let j=l.get(R);v==="before"?j?.beforeStoreDelete?.(C):j?.afterStoreDelete?.(M);});},u=h=>{if(!ae(e,h))return;let y=t[h],f=a[h].options,b=o[h],v=r[h];g.add(h);try{v?.forEach(R=>{try{R(null);}catch(j){E(`Subscriber for "${h}" threw during delete: ${j?.message??j}`);}}),or({name:h,label:"onDelete",fn:f.onDelete,args:[y],reportIssue:(R,j)=>{ke(R,{onError:f.onError,severity:"warn",visibility:j});}}),i({name:h,prev:y,options:f,initialState:b,phase:"before"}),delete t[h],delete r[h],delete o[h],delete s[h],delete a[h],delete c[h],cr(h)&&Rr(h);let M=e.computedDependents[h];if(M)for(let R of [...M]){let j=it(R);if(j&&Mr(R,e)&&j.deps.every(O=>!ae(e,O))){u(R);continue}E(`[stroid] source store "${h}" was deleted. Computed store "${R}" depends on it and will return stale data. Call deleteComputed("${R}") to clean up.`);}i({name:h,prev:y,options:f,initialState:b,phase:"after"}),je("afterStoreDelete",h,{type:"afterStoreDelete",prev:y}),Je(e,{type:"deleted",name:h}),oe(`Store "${h}" deleted`);}finally{g.delete(h);}};return {deleteExistingStore:u,clearAllStores:()=>{let h=[],f=0,b=Number.POSITIVE_INFINITY;for(;f<20;){let C=Object.keys(t);if(C.length===0)break;C.forEach(R=>{ae(e,R)&&(u(R),h.push(R));}),f+=1;let M=Object.keys(t).length;if(M===0||M>=b)break;b=M;}let v=Object.keys(t).length;return v>0?E(`clearAllStores stopped after ${f} pass${f===1?"":"es"}; ${v} store(s) still registered (likely recreated during deletion).`):oe(`All stores cleared (${h.length} stores removed)`),h},clearStores:h=>{let y=Object.keys(t).filter(f=>h?h.endsWith("*")?f.startsWith(h.slice(0,-1)):f===h:true);return y.forEach(f=>u(f)),y},reportStoreError:n}};var bt=ge,xr=ye(bt),Tr=null,q=()=>{let e=he(xr);return Ge(e),e};var z=()=>q();function pr(e){Tr=e;}var ve=e=>new Proxy(Object.create(null),{get:(t,r)=>e()[r],set:(t,r,o)=>(e()[r]=o,true),deleteProperty:(t,r)=>(delete e()[r],true),has:(t,r)=>r in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(t,r)=>{let o=Object.getOwnPropertyDescriptor(e(),r);if(o)return {...o,configurable:true}}}),Lo=e=>new Proxy(new Map,{get:(t,r)=>{let o=e();if(r==="size")return o.size;if(r===Symbol.iterator)return o[Symbol.iterator].bind(o);let s=o[r];return typeof s=="function"?s.bind(o):s},set:(t,r,o)=>(e()[r]=o,true)}),Bo=e=>new Proxy({},{get:(t,r)=>{let o=e(),s=o[r];return typeof s=="function"?s.bind(o):s},set:(t,r,o)=>(e()[r]=o,true)}),Ie=ve(()=>q().stores);ve(()=>q().subscribers);var Vr=ve(()=>q().initialStates);ve(()=>q().initialFactories);var $=ve(()=>q().metaEntries);ve(()=>q().snapshotCache);var te=Lo(()=>q().featureRuntimes),Fr=new WeakMap,Uo=e=>{let t=Fr.get(e);return t||(t=Er(e),Fr.set(e,t)),t};Bo(()=>Uo(q()));var qo=e=>{let t=te.get(e);if(t)return t;let r=Pe(e);if(!r)return;let o=r();return te.set(e,o),o},kt=()=>{pe().forEach(e=>{qo(e);});};Ft((e,t)=>{te.get(e)||te.set(e,t());});kt();var Ne=(e,t)=>ae(q(),e);var We=(e,t,r=q())=>{r.stores[e]=t;},jr=(e,t,r=Date.now())=>{We(e,t),$[e]&&($[e].updatedAt=new Date(r).toISOString(),$[e].updatedAtMs=r,$[e].lastCorrelationId=null,$[e].lastCorrelationAt=null,$[e].lastCorrelationAtMs=null,$[e].lastTraceContext=null,$[e].updateCount>=Number.MAX_SAFE_INTEGER?$[e].updateCount=0:$[e].updateCount+=1,Tr?.(e));};var Ko=()=>{Ot(q());},Go=()=>{te.forEach(e=>{try{e.resetAll?.();}catch{}}),te.clear();};A("features.reset",Go,10);A("registries.clear",Ko,20);A("registry.default",()=>{bt=ge,xr=ye(bt);},115);var Pr=new WeakMap,Ar=e=>{let t=Pr.get(e);return t||(t=new Map,Pr.set(e,t)),t},Yo=()=>{Ar(z()).clear();};A("features.contexts",Yo,100);var Jo=e=>{let t=z(),r=Ar(t),o=r.get(e);if(o)return o;let s=$[e];if(!s)return E(`Internal feature context requested for "${e}" after metadata was cleared.`),null;let a={name:e,options:s.options,getMeta:()=>$[e],getStoreValue:()=>Ie[e],getAllStores:()=>Ie,getInitialState:()=>Vr[e],hasStore:()=>Ne(e),setStoreValue:c=>{We(e,c);},applyFeatureState:(c,l)=>{jr(e,c,l),ct(e);},notify:()=>{},reportStoreError:c=>{at(e,c);},warn:E,warnAlways:U,log:oe,hashState:ue,deepClone:G,sanitize:Se,validate:c=>fr(e,c,$[e]?.options?.validate),isDev:D};return r.set(e,a),a},Xo=(e,t)=>{let r=N();if(!r.strictMissingFeatures&&!r.assertRuntime)return;let o=[];if(typeof t.getMeta!="function"&&o.push("getMeta"),typeof t.getStoreValue!="function"&&o.push("getStoreValue"),typeof t.getAllStores!="function"&&o.push("getAllStores"),typeof t.getInitialState!="function"&&o.push("getInitialState"),typeof t.hasStore!="function"&&o.push("hasStore"),typeof t.setStoreValue!="function"&&o.push("setStoreValue"),typeof t.applyFeatureState!="function"&&o.push("applyFeatureState"),typeof t.notify!="function"&&o.push("notify"),typeof t.reportStoreError!="function"&&o.push("reportStoreError"),typeof t.warn!="function"&&o.push("warn"),typeof t.warnAlways!="function"&&o.push("warnAlways"),typeof t.log!="function"&&o.push("log"),typeof t.hashState!="function"&&o.push("hashState"),typeof t.deepClone!="function"&&o.push("deepClone"),typeof t.sanitize!="function"&&o.push("sanitize"),typeof t.validate!="function"&&o.push("validate"),typeof t.isDev!="function"&&o.push("isDev"),o.length===0)return;let s=`Feature hook context missing fields for "${e}": ${o.join(", ")}.`;if(at(e,s),r.assertRuntime)throw new Error(s)};var vt=(e,t,r,o,s,a)=>{kt();let c=Jo(e);if(!c)return;c.notify=()=>s(e);let l=Object.assign(Object.create(c),{action:t,prev:r,next:o});Xo(e,l);let g=new Set(a);te.forEach((n,p)=>{g.has(p)||n.onStoreWrite?.(l);});};var Dr=false,we=1,Qo=e=>typeof e?.v=="number"?e.v:typeof e?.protocol=="number"?e.protocol:void 0,wt=new Set,Ct=new Set,Le=100,_r=e=>{if(!e)return null;if(e===true)return Le;if(typeof e!="object")return null;let t=e.loopGuard;if(t===false)return null;if(t===true||t===void 0)return Le;if(typeof t=="object"){let r=t.windowMs;return typeof r=="number"&&Number.isFinite(r)&&r>0?r:Le}return Le},Zo=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:typeof Buffer<"u"?Buffer.byteLength(e):e.length,en=({incoming:e,accepted:t})=>{let r=t?.clock??0,o=typeof e.clock=="number"?e.clock:0;if(o!==r)return o-r;let s=e.source??"",a=t?.source??"";return s===a?0:s.localeCompare(a,"en",{sensitivity:"variant"})},tn=e=>e?.updatedAtMs??ie({value:e?.updatedAt,fallbackMs:0}),rn=e=>{if(typeof e!="object"||e===null)return false;let t=e;return (typeof t.v=="number"||typeof t.protocol=="number")&&typeof t.type=="string"&&typeof t.name=="string"&&typeof t.clock=="number"&&typeof t.source=="string"},$r=({name:e,syncChannels:t,instanceId:r,authToken:o,reportStoreError:s})=>{let a=t[e];if(a)try{let c={v:we,protocol:we,type:"sync-request",source:r,name:e,clock:0,requestedAt:Date.now()};o&&(c.token=o),a.postMessage(c);}catch(c){s(e,`Failed to request sync snapshot for "${e}": ${c?.message??c}`);}},on=(e,t)=>(t[e]=(t[e]??0)+1,t[e]),nn=(e,t,r)=>(r[e]=Math.max(r[e]??0,t)+1,r[e]),sn=({name:e,syncChannels:t,syncWindowCleanup:r,syncClocks:o,syncVersions:s})=>{t[e]?.close(),delete t[e],r[e]?.(),delete r[e],delete o[e],delete s[e];},an=({syncChannels:e,syncWindowCleanup:t})=>{Object.values(t).forEach(r=>{try{r();}catch{}}),Object.values(e).forEach(r=>{try{r.close();}catch{}});},cn=({name:e,syncOption:t,syncChannels:r,syncClocks:o,syncVersions:s,syncWindowCleanup:a,instanceId:c,getMeta:l,getAcceptedSyncVersion:g,getStoreValue:n,hasStoreEntry:p,notify:i,validate:u,reportStoreError:m,warn:d,setStoreValue:h,normalizeIncomingState:y,acceptIncomingSyncVersion:f,resolveSyncVersion:b,broadcastSync:v,markLoopGuard:C,hashState:M})=>{if(!t)return;if(typeof window>"u"||typeof BroadcastChannel>"u"){m(e,`Sync enabled for "${e}" but BroadcastChannel not available in this environment.`);return}let R=typeof t=="object"?t.policy:void 0,j=R==="insecure"||R!=="strict"&&typeof t=="object"&&t.insecure===true,O=typeof t=="object"&&typeof t.authToken=="string"&&t.authToken.length>0,L=typeof t=="object"&&typeof t.verify=="function",J=typeof t=="object"&&typeof t.sign=="function",X=R==="strict"||!D()&&R!=="insecure";if(X&&!j&&!O&&!L){m(e,`Sync for "${e}" requires authToken or verify in strict mode. Use sync: { policy: "insecure" } to acknowledge the risk.`);return}!X&&!j&&!O&&!L&&!wt.has(e)&&(wt.add(e),U(`Sync for "${e}" is unauthenticated. Any same-origin tab can forge sync messages. Provide sync.authToken or sync.verify to enforce authentication.`)),J&&!L&&!Ct.has(e)&&(Ct.add(e),d(`Sync for "${e}" is configured with "sign" but no "verify". "sign" has no effect unless incoming messages are verified.`));let _=typeof t=="object"?t.authToken:void 0,k=_r(t),T=false,F=typeof t=="object"&&t.channel?t.channel:`stroid_sync_${e}`;try{let S=new BroadcastChannel(F);if(r[e]=S,S.onmessage=W=>{let w=W.data;if(!w||w.source===c||w.name!==e||r[e]!==S||!p(e)||!l(e))return;if(!rn(w)){m(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(_&&w.token!==_){T||(m(e,`Sync message for "${e}" failed auth token verification; ignoring.`),T=!0);return}let I=Qo(w);if(I!==we){m(e,`Sync protocol mismatch for "${e}". Expected v${we} but received ${String(I??"unknown")}. Ignoring message.`);return}let B=w.type==="sync-state";if(B&&(typeof w.data>"u"||typeof w.clock!="number")){m(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(typeof t=="object"&&typeof t.verify=="function"){let P=!1;try{P=!!t.verify(w);}catch(x){m(e,`Sync message verification failed for "${e}": ${x?.message??x}`);return}if(!P){m(e,`Sync message for "${e}" failed verification; ignoring.`);return}}let Q=typeof t=="object"&&t.checksum==="none"?"none":"hash";if(B&&Q!=="none"){let P=M(w.data);if(w.checksum!==P){m(e,`Sync checksum mismatch for "${e}". Expected ${String(P)}, got ${String(w.checksum)}. Ignoring message.`);return}}if(w.type==="sync-request"){v(e);return}let K=typeof t=="object"?t.conflictResolver:null;if(en({incoming:{clock:w.clock,source:w.source},accepted:g(e)})<=0){let P=tn(l(e)),x=typeof w.updatedAt=="number"?w.updatedAt:Date.now();if(K){let Y=K({local:n(e),incoming:w.data,localUpdated:P,incomingUpdated:x});if(Y!==void 0){let H=y(e,Y);if(H===null)return;let Ce=n(e);h(e,H);let re=typeof t=="object"?t.resolveUpdatedAt:null,Re=re?re({localUpdated:P,incomingUpdated:x,now:Date.now()}):Math.max(Date.now(),P,x);b(e,Re,typeof w.clock=="number"?w.clock:0),vt(e,"sync",Ce,H,()=>i(e),["sync"]),k&&C(e,k),i(e),v(e);}}return}let Z=y(e,w.data);if(Z===null)return;let se=n(e);h(e,Z),f(e,typeof w.updatedAt=="number"?w.updatedAt:Date.now(),typeof w.clock=="number"?w.clock:0,typeof w.source=="string"?w.source:""),vt(e,"sync",se,Z,()=>i(e),["sync"]),k&&C(e,k),i(e);},typeof window<"u"&&typeof window.addEventListener=="function"){a[e]?.();let W=window,w=()=>{$r({name:e,syncChannels:r,instanceId:c,authToken:_,reportStoreError:m});};W.addEventListener("focus",w),W.addEventListener("online",w),a[e]=()=>{W.removeEventListener("focus",w),W.removeEventListener("online",w);};}queueMicrotask(()=>{$r({name:e,syncChannels:r,instanceId:c,authToken:_,reportStoreError:m});});}catch(S){d(`Failed to setup sync for "${e}": ${S?.message||S}`);}},Or=({name:e,syncOption:t,syncChannels:r,syncClocks:o,instanceId:s,updatedAt:a,data:c,hashState:l,reportStoreError:g})=>{let n=r[e];if(n)try{let p=typeof t=="object"&&t.checksum==="none"?"none":"hash",i={v:we,protocol:we,type:"sync-state",source:s,name:e,clock:o[e]??0,updatedAt:ie({value:a,fallbackMs:Date.now()}),data:c,checksum:p==="hash"?l(c):null};if(typeof t=="object"&&t.authToken&&(i.token=t.authToken),typeof t=="object"&&typeof t.sign=="function")try{let d=t.sign(i);if(d&&typeof d.then=="function"){g(e,`Sync signer for "${e}" returned a Promise. "sign" must be synchronous.`);return}d!==void 0&&(i.auth=d);}catch(d){g(e,`Failed to sign sync payload for "${e}": ${d?.message??d}`);return}let u=typeof t=="object"&&typeof t.maxPayloadBytes=="number"?t.maxPayloadBytes:64*1024,m=Zo(JSON.stringify(i));if(m>u){g(e,`Sync payload for "${e}" exceeds ${u} bytes (${m} bytes). Skipping BroadcastChannel sync.`);return}try{n.postMessage(i);}catch(d){if(d&&typeof d=="object"&&d.name==="DataCloneError"){g(e,`Sync payload for "${e}" could not be cloned (DataCloneError). Remove non-serializable values or provide a custom serializer. Payload size ~${m} bytes.`);return}throw d}}catch(p){g(e,`Failed to broadcast sync for "${e}": ${p?.message??p}`);}},un=()=>{let e=Object.create(null),t=Object.create(null),r=Object.create(null),o=Object.create(null),s=Object.create(null),a=new Set,c=`stroid_${Math.random().toString(16).slice(2)}`,l=(i,u)=>{r[i]={clock:t[i]??0,updatedAt:ie({value:u,fallbackMs:Date.now()}),source:c};},g=(i,u)=>{on(i,t),l(i,u);},n=(i,u)=>{!u||!Number.isFinite(u)||(s[i]=Date.now()+u);},p=(i,u)=>{if(!u)return false;let m=s[i];return m?Date.now()>=m?(delete s[i],false):true:false};return {onStoreCreate(i){if(!i.options.sync)return;let u=i.options.sync,m=i.notify,d=typeof u=="object"?u.policy:void 0,h=d==="insecure"||d!=="strict"&&typeof u=="object"&&u.insecure===true,y=typeof u=="object"&&typeof u.authToken=="string"&&u.authToken.length>0,f=typeof u=="object"&&typeof u.verify=="function";if((d==="strict"||!i.isDev()&&d!=="insecure")&&u&&!h&&!y&&!f){i.reportStoreError(`Sync for "${i.name}" requires authToken or verify in strict mode. Use sync: { policy: "insecure" } to acknowledge the risk.`),i.options.sync=false;return}if(cn({name:i.name,syncOption:u,syncChannels:e,syncClocks:t,syncVersions:r,syncWindowCleanup:o,instanceId:c,getMeta:i.getMeta,getAcceptedSyncVersion:v=>r[v],getStoreValue:v=>i.getStoreValue(),hasStoreEntry:()=>i.hasStore(),notify:()=>m(),validate:(v,C)=>i.validate(C),reportStoreError:(v,C)=>i.reportStoreError(C),warn:i.warn,setStoreValue:(v,C)=>i.setStoreValue(C),normalizeIncomingState:(v,C)=>{let M=Me({value:C,sanitize:i.sanitize,validate:i.validate,onSanitizeError:R=>{i.reportStoreError(`Sanitize failed for incoming sync "${v}": ${R?.message??R}`);}});return M.ok?M.value:null},acceptIncomingSyncVersion:(v,C,M,R)=>{i.applyFeatureState(i.getStoreValue(),C),t[i.name]=Math.max(t[i.name]??0,M),r[i.name]={clock:M,updatedAt:C,source:R};},resolveSyncVersion:(v,C,M)=>{i.applyFeatureState(i.getStoreValue(),C);let R=nn(i.name,M,t);return r[i.name]={clock:R,updatedAt:C,source:c},R},broadcastSync:()=>{let v=i.getMeta();v&&Or({name:i.name,syncOption:i.options.sync,syncChannels:e,syncClocks:t,instanceId:c,updatedAt:v.updatedAtMs??v.updatedAt,data:i.getStoreValue(),hashState:i.hashState,reportStoreError:(C,M)=>i.reportStoreError(M)});},markLoopGuard:n,hashState:i.hashState}),e[i.name]){let v=i.getMeta();l(i.name,v?.updatedAtMs??v?.updatedAt??new Date().toISOString());}},onStoreWrite(i){if(!i.options.sync)return;let u=i.getMeta();if(!u)return;let m=_r(i.options.sync);if(p(i.name,m)){g(i.name,u.updatedAtMs??u.updatedAt),a.has(i.name)||(a.add(i.name),i.warn(`Sync broadcast for "${i.name}" suppressed by loopGuard to prevent feedback loops.`));return}g(i.name,u.updatedAtMs??u.updatedAt),Or({name:i.name,syncOption:i.options.sync,syncChannels:e,syncClocks:t,instanceId:c,updatedAt:u.updatedAtMs??u.updatedAt,data:i.next,hashState:i.hashState,reportStoreError:(d,h)=>i.reportStoreError(h)});},beforeStoreDelete(i){sn({name:i.name,syncChannels:e,syncWindowCleanup:o,syncClocks:t,syncVersions:r}),delete s[i.name],a.delete(i.name);},resetAll(){an({syncChannels:e,syncWindowCleanup:o}),Object.keys(e).forEach(i=>delete e[i]),Object.keys(t).forEach(i=>delete t[i]),Object.keys(r).forEach(i=>delete r[i]),Object.keys(o).forEach(i=>delete o[i]),Object.keys(s).forEach(i=>delete s[i]),wt.clear(),Ct.clear(),a.clear();}}},Ir=()=>{Dr||(Dr=true,fe("sync",un));};var Nr=false,zr=e=>{try{return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}catch{return e}},ln=({name:e,useDevtools:t,existingDevtools:r,stores:o,warn:s})=>{if(!t||typeof window>"u")return r;let a=window.__REDUX_DEVTOOLS_EXTENSION__||window.__REDUX_DEVTOOLS_EXTENSION__;if(!a||typeof a.connect!="function")return s(`DevTools requested for "${e}" but Redux DevTools extension not found.`),r;if(r)return r;let c=a.connect({name:"stroid"});return c.init(o),c},Be=({data:e,redactor:t,deepClone:r})=>{if(typeof t=="function")try{return t(r(e))}catch{return e}return e},dn=(e,t)=>{if(typeof e!="object"||typeof t!="object"||e===null||t===null)return null;let r=e,o=t,s=[],a=[],c=[],l=new Set(Object.keys(r)),g=new Set(Object.keys(o));return g.forEach(n=>{l.has(n)?Object.is(r[n],o[n])||c.push(n):s.push(n);}),l.forEach(n=>{g.has(n)||a.push(n);}),{added:s,removed:a,changed:c}},Wr=({name:e,action:t,prev:r,next:o,history:s,historyLimit:a,applyRedactor:c,deepClone:l})=>{if(a===0)return;s[e]||(s[e]=[]);let g={ts:Date.now(),action:t,prev:l(c(r)),next:l(c(o)),diff:dn(r,o)};s[e].push(g),s[e].length>a&&s[e].splice(0,s[e].length-a);},Hr=({name:e,action:t,force:r=false,devtools:o,enabled:s,stores:a,applyRedactor:c})=>{if(!(!o||!r&&!s))try{let l={...a,[e]:c(a[e])};o.send({type:`${e}/${t}`},l);}catch{}},fn=()=>{let e=Object.create(null),t;return {onStoreCreate(r){t=ln({name:r.name,useDevtools:!!r.options.devtools,existingDevtools:t,stores:r.getAllStores(),warn:r.warn}),Wr({name:r.name,action:"create",prev:null,next:r.getStoreValue(),history:e,historyLimit:r.options.historyLimit??50,applyRedactor:o=>Be({data:o,redactor:r.options.redactor,deepClone:r.deepClone}),deepClone:r.deepClone});},onStoreWrite(r){Wr({name:r.name,action:r.action,prev:r.prev,next:r.next,history:e,historyLimit:r.options.historyLimit??50,applyRedactor:o=>Be({data:o,redactor:r.options.redactor,deepClone:r.deepClone}),deepClone:r.deepClone}),Hr({name:r.name,action:r.action,devtools:t,enabled:!!r.options.devtools,stores:r.getAllStores(),applyRedactor:o=>Be({data:o,redactor:r.options.redactor,deepClone:r.deepClone})});},afterStoreDelete(r){r.options.devtools&&Hr({name:r.name,action:"delete",force:true,devtools:t,enabled:true,stores:r.getAllStores(),applyRedactor:o=>Be({data:o,redactor:r.options.redactor,deepClone:r.deepClone})}),delete e[r.name];},resetAll(){Object.keys(e).forEach(r=>{delete e[r];}),t=void 0;},api:{getHistory(r,o){if(!e[r])return [];let s=e[r];return o&&o>0?zr(s.slice(-o)):zr(s)},clearHistory(r){if(r){delete e[r];return}Object.keys(e).forEach(o=>{delete e[o];});}}}},Lr=()=>{Nr||(Nr=true,fe("devtools",fn));};var pn=()=>{rr();},gn=()=>{Ir();},yn=()=>{Lr();},ma=()=>{pn(),gn(),yn();};export{ma as installAllFeatures,yn as installDevtools,pn as installPersist,gn as installSync};//# sourceMappingURL=install.js.map
2
2
  //# sourceMappingURL=install.js.map