stroid 0.1.1 → 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 (112) hide show
  1. package/CHANGELOG.md +235 -119
  2. package/README.md +104 -431
  3. package/dist/async.d.ts +42 -9
  4. package/dist/async.js +26 -26
  5. package/dist/async.js.map +1 -1
  6. package/dist/cache.d.ts +12 -0
  7. package/dist/computed.d.ts +46 -7
  8. package/dist/computed.js +11 -11
  9. package/dist/computed.js.map +1 -1
  10. package/dist/core.d.ts +5 -15
  11. package/dist/core.js +14 -15
  12. package/dist/core.js.map +1 -1
  13. package/dist/devtools.d.ts +30 -5
  14. package/dist/devtools.js +1 -1
  15. package/dist/devtools.js.map +1 -1
  16. package/dist/feature.d.ts +92 -14
  17. package/dist/feature.js +1 -1
  18. package/dist/feature.js.map +1 -1
  19. package/dist/helpers.d.ts +37 -3
  20. package/dist/helpers.js +14 -15
  21. package/dist/helpers.js.map +1 -1
  22. package/dist/index-internal.d.ts +44 -0
  23. package/dist/index.d.cts +170 -33
  24. package/dist/index.d.ts +170 -33
  25. package/dist/index.js +24 -23
  26. package/dist/index.js.map +1 -1
  27. package/dist/install.d.ts +6 -4
  28. package/dist/install.js +1 -1
  29. package/dist/install.js.map +1 -1
  30. package/dist/options.d.ts +295 -0
  31. package/dist/persist.d.ts +1 -1
  32. package/dist/persist.js +1 -1
  33. package/dist/persist.js.map +1 -1
  34. package/dist/react/index.d.ts +70 -0
  35. package/dist/react/index.js +38 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/registry.d.ts +117 -0
  38. package/dist/runtime-admin.d.ts +4 -2
  39. package/dist/runtime-admin.js +1 -1
  40. package/dist/runtime-admin.js.map +1 -1
  41. package/dist/runtime-tools.d.ts +66 -9
  42. package/dist/runtime-tools.js +2 -2
  43. package/dist/runtime-tools.js.map +1 -1
  44. package/dist/selectors.d.ts +4 -2
  45. package/dist/selectors.js +1 -1
  46. package/dist/selectors.js.map +1 -1
  47. package/dist/server.d.ts +30 -2
  48. package/dist/server.js +11 -10
  49. package/dist/server.js.map +1 -1
  50. package/dist/store-registry.d.ts +79 -0
  51. package/dist/sync.d.ts +1 -1
  52. package/dist/sync.js +1 -1
  53. package/dist/sync.js.map +1 -1
  54. package/dist/testing.d.ts +16 -4
  55. package/dist/testing.js +14 -15
  56. package/dist/testing.js.map +1 -1
  57. package/dist/tsdoc-metadata.json +11 -0
  58. package/dist/types.d.ts +65 -0
  59. package/dist/utility.d.ts +15 -0
  60. package/package.json +29 -11
  61. package/dist/_tsup-dts-rollup.d.cts +0 -2411
  62. package/dist/_tsup-dts-rollup.d.ts +0 -2411
  63. package/dist/async.cjs +0 -34
  64. package/dist/async.cjs.map +0 -1
  65. package/dist/async.d.cts +0 -9
  66. package/dist/computed.cjs +0 -13
  67. package/dist/computed.cjs.map +0 -1
  68. package/dist/computed.d.cts +0 -7
  69. package/dist/core.cjs +0 -24
  70. package/dist/core.cjs.map +0 -1
  71. package/dist/core.d.cts +0 -15
  72. package/dist/devtools.cjs +0 -2
  73. package/dist/devtools.cjs.map +0 -1
  74. package/dist/devtools.d.cts +0 -5
  75. package/dist/feature.cjs +0 -2
  76. package/dist/feature.cjs.map +0 -1
  77. package/dist/feature.d.cts +0 -14
  78. package/dist/helpers.cjs +0 -24
  79. package/dist/helpers.cjs.map +0 -1
  80. package/dist/helpers.d.cts +0 -3
  81. package/dist/index.cjs +0 -35
  82. package/dist/index.cjs.map +0 -1
  83. package/dist/install.cjs +0 -2
  84. package/dist/install.cjs.map +0 -1
  85. package/dist/install.d.cts +0 -4
  86. package/dist/persist.cjs +0 -2
  87. package/dist/persist.cjs.map +0 -1
  88. package/dist/persist.d.cts +0 -1
  89. package/dist/react.cjs +0 -36
  90. package/dist/react.cjs.map +0 -1
  91. package/dist/react.d.cts +0 -7
  92. package/dist/react.d.ts +0 -7
  93. package/dist/react.js +0 -36
  94. package/dist/react.js.map +0 -1
  95. package/dist/runtime-admin.cjs +0 -2
  96. package/dist/runtime-admin.cjs.map +0 -1
  97. package/dist/runtime-admin.d.cts +0 -2
  98. package/dist/runtime-tools.cjs +0 -4
  99. package/dist/runtime-tools.cjs.map +0 -1
  100. package/dist/runtime-tools.d.cts +0 -9
  101. package/dist/selectors.cjs +0 -2
  102. package/dist/selectors.cjs.map +0 -1
  103. package/dist/selectors.d.cts +0 -2
  104. package/dist/server.cjs +0 -12
  105. package/dist/server.cjs.map +0 -1
  106. package/dist/server.d.cts +0 -2
  107. package/dist/sync.cjs +0 -2
  108. package/dist/sync.cjs.map +0 -1
  109. package/dist/sync.d.cts +0 -1
  110. package/dist/testing.cjs +0 -24
  111. package/dist/testing.cjs.map +0 -1
  112. package/dist/testing.d.cts +0 -4
package/dist/server.d.cts DELETED
@@ -1,2 +0,0 @@
1
- export { RequestStoreApi } from './_tsup-dts-rollup.cjs';
2
- export { createStoreForRequest } from './_tsup-dts-rollup.cjs';
package/dist/sync.cjs DELETED
@@ -1,2 +0,0 @@
1
- 'use strict';var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var ie=new Map,U=(e,t)=>{ie.set(e,t);};var H=({value:e,sanitize:t,validate:r,onSanitizeError:a})=>{let i;if(t)try{i=t(e);}catch(d){return a?.(d),{ok:false}}else i=e;let l=r(i);return l.ok?{ok:true,value:l.value??i}:{ok:false}},R=({value:e,fallbackMs:t=Date.now(),onInvalid:r})=>{if(typeof e=="number")return Number.isFinite(e)?e:(r?.(),t);if(typeof e=="string"){let a=Date.parse(e);return Number.isFinite(a)?a:(r?.(),t)}return r?.(),t};var ue=new Map,k=(e,t,r=0)=>{!e||typeof t!="function"||ue.set(e,{name:e,order:r,fn:t});};var B=()=>({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,noSignalWarned:new Set,shapeWarned:new Set,autoCreateWarned:new Set,mutableResultWarned:new Set,cleanupSubs:Object.create(null),storeCleanupFns: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 M=new Map,le=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,L,q=e=>(L||le||e).replace(/\.ts(\?|$)/,".js$1"),de=q(new URL("./store.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('sync.cjs', document.baseURI).href))).href);var pe=()=>{L=void 0,M.clear();};k("registry.scope-override",pe,110);var ge=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],notifyScheduled:false,batchDepth:0});var fe=()=>({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:{depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0},async:B(),notify:ge()}),ye=e=>{let t=q(e),r=M.get(t);if(r)return r;let a=fe();return M.set(t,a),a};var Y=e=>e||ye(de);var me={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}`));}},G={logSink:me,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",defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0},F=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,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce}),C=new WeakMap,K=F(G),he=e=>{let t=C.get(e);return t||(t=F(K),C.set(e,t)),t};var A=()=>he(Y());var Re=()=>{C=new WeakMap,K=F(G);};k("config.reset",Re,90);typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0;typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('sync.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0;var ke=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));};var E=(e,t)=>{if((A().logSink.warn??ke)(e,t),A().assertRuntime)throw new Error(e)};var J=false,b=1,we=e=>typeof e?.v=="number"?e.v:typeof e?.protocol=="number"?e.protocol:void 0,V=new Set,T=new Set,Me=e=>typeof TextEncoder<"u"?new TextEncoder().encode(e).length:typeof Buffer<"u"?Buffer.byteLength(e):e.length,Ce=({incoming:e,accepted:t})=>{let r=t?.clock??0,a=typeof e.clock=="number"?e.clock:0;if(a!==r)return a-r;let i=e.source??"",l=t?.source??"";return i===l?0:i.localeCompare(l,"en",{sensitivity:"variant"})},Fe=e=>e?.updatedAtMs??R({value:e?.updatedAt,fallbackMs:0}),Ae=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"},Q=({name:e,syncChannels:t,instanceId:r,authToken:a,reportStoreError:i})=>{let l=t[e];if(l)try{let d={v:b,protocol:b,type:"sync-request",source:r,name:e,clock:0,requestedAt:Date.now()};a&&(d.token=a),l.postMessage(d);}catch(d){i(e,`Failed to request sync snapshot for "${e}": ${d?.message??d}`);}},Ee=(e,t)=>(t[e]=(t[e]??0)+1,t[e]),Ve=(e,t,r)=>(r[e]=Math.max(r[e]??0,t)+1,r[e]),Te=({name:e,syncChannels:t,syncWindowCleanup:r,syncClocks:a,syncVersions:i})=>{t[e]?.close(),delete t[e],r[e]?.(),delete r[e],delete a[e],delete i[e];},xe=({syncChannels:e,syncWindowCleanup:t})=>{Object.values(t).forEach(r=>{try{r();}catch{}}),Object.values(e).forEach(r=>{try{r.close();}catch{}});},_e=({name:e,syncOption:t,syncChannels:r,syncClocks:a,syncVersions:i,syncWindowCleanup:l,instanceId:d,getMeta:n,getAcceptedSyncVersion:o,getStoreValue:c,hasStoreEntry:u,notify:p,validate:w,reportStoreError:g,warn:f,setStoreValue:x,normalizeIncomingState:_,acceptIncomingSyncVersion:te,resolveSyncVersion:ne,broadcastSync:O})=>{if(!t)return;if(typeof window>"u"||typeof BroadcastChannel>"u"){g(e,`Sync enabled for "${e}" but BroadcastChannel not available in this environment.`);return}let re=typeof t=="object"&&typeof t.authToken=="string"&&t.authToken.length>0,j=typeof t=="object"&&typeof t.verify=="function",oe=typeof t=="object"&&typeof t.sign=="function";!re&&!j&&!V.has(e)&&(V.add(e),E(`Sync for "${e}" is unauthenticated. Any same-origin tab can forge sync messages. Provide sync.authToken or sync.verify to enforce authentication.`)),oe&&!j&&!T.has(e)&&(T.add(e),f(`Sync for "${e}" is configured with "sign" but no "verify". "sign" has no effect unless incoming messages are verified.`));let v=typeof t=="object"?t.authToken:void 0,D=false,se=typeof t=="object"&&t.channel?t.channel:`stroid_sync_${e}`;try{let y=new BroadcastChannel(se);if(r[e]=y,y.onmessage=S=>{let s=S.data;if(!s||s.source===d||s.name!==e||r[e]!==y||!u(e)||!n(e))return;if(!Ae(s)){g(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(v&&s.token!==v){D||(g(e,`Sync message for "${e}" failed auth token verification; ignoring.`),D=!0);return}let N=we(s);if(N!==b){g(e,`Sync protocol mismatch for "${e}". Expected v${b} but received ${String(N??"unknown")}. Ignoring message.`);return}if(s.type==="sync-state"&&(typeof s.data>"u"||typeof s.clock!="number")){g(e,`Sync message for "${e}" is malformed; ignoring.`);return}if(typeof t=="object"&&typeof t.verify=="function"){let m=!1;try{m=!!t.verify(s);}catch(h){g(e,`Sync message verification failed for "${e}": ${h?.message??h}`);return}if(!m){g(e,`Sync message for "${e}" failed verification; ignoring.`);return}}if(s.type==="sync-request"){O(e);return}let $=typeof t=="object"?t.conflictResolver:null;if(Ce({incoming:{clock:s.clock,source:s.source},accepted:o(e)})<=0){let m=Fe(n(e)),h=typeof s.updatedAt=="number"?s.updatedAt:Date.now();if($){let I=$({local:c(e),incoming:s.data,localUpdated:m,incomingUpdated:h});if(I!==void 0){let W=_(e,I);if(W===null)return;x(e,W);let z=typeof t=="object"?t.resolveUpdatedAt:null,ae=z?z({localUpdated:m,incomingUpdated:h,now:Date.now()}):Math.max(Date.now(),m,h);ne(e,ae,typeof s.clock=="number"?s.clock:0),p(e),O(e);}}return}let P=_(e,s.data);P!==null&&(x(e,P),te(e,typeof s.updatedAt=="number"?s.updatedAt:Date.now(),typeof s.clock=="number"?s.clock:0,typeof s.source=="string"?s.source:""),p(e));},typeof window<"u"&&typeof window.addEventListener=="function"){l[e]?.();let S=window,s=()=>{Q({name:e,syncChannels:r,instanceId:d,authToken:v,reportStoreError:g});};S.addEventListener("focus",s),S.addEventListener("online",s),l[e]=()=>{S.removeEventListener("focus",s),S.removeEventListener("online",s);};}queueMicrotask(()=>{Q({name:e,syncChannels:r,instanceId:d,authToken:v,reportStoreError:g});});}catch(y){f(`Failed to setup sync for "${e}": ${y?.message||y}`);}},X=({name:e,syncOption:t,syncChannels:r,syncClocks:a,instanceId:i,updatedAt:l,data:d,hashState:n,reportStoreError:o})=>{let c=r[e];if(c)try{let u=typeof t=="object"&&t.checksum==="none"?"none":"hash",p={v:b,protocol:b,type:"sync-state",source:i,name:e,clock:a[e]??0,updatedAt:R({value:l,fallbackMs:Date.now()}),data:d,checksum:u==="hash"?n(d):null};if(typeof t=="object"&&t.authToken&&(p.token=t.authToken),typeof t=="object"&&typeof t.sign=="function")try{let f=t.sign(p);if(f&&typeof f.then=="function"){o(e,`Sync signer for "${e}" returned a Promise. "sign" must be synchronous.`);return}f!==void 0&&(p.auth=f);}catch(f){o(e,`Failed to sign sync payload for "${e}": ${f?.message??f}`);return}let w=typeof t=="object"&&typeof t.maxPayloadBytes=="number"?t.maxPayloadBytes:64*1024,g=Me(JSON.stringify(p));if(g>w){o(e,`Sync payload for "${e}" exceeds ${w} bytes (${g} bytes). Skipping BroadcastChannel sync.`);return}c.postMessage(p);}catch(u){o(e,`Failed to broadcast sync for "${e}": ${u?.message??u}`);}},Oe=()=>{let e=Object.create(null),t=Object.create(null),r=Object.create(null),a=Object.create(null),i=`stroid_${Math.random().toString(16).slice(2)}`,l=(n,o)=>{r[n]={clock:t[n]??0,updatedAt:R({value:o,fallbackMs:Date.now()}),source:i};},d=(n,o)=>{Ee(n,t),l(n,o);};return {onStoreCreate(n){if(n.options.sync&&(_e({name:n.name,syncOption:n.options.sync,syncChannels:e,syncClocks:t,syncVersions:r,syncWindowCleanup:a,instanceId:i,getMeta:n.getMeta,getAcceptedSyncVersion:o=>r[o],getStoreValue:o=>n.getStoreValue(),hasStoreEntry:()=>n.hasStore(),notify:()=>n.notify(),validate:(o,c)=>n.validate(c),reportStoreError:(o,c)=>n.reportStoreError(c),warn:n.warn,setStoreValue:(o,c)=>n.setStoreValue(c),normalizeIncomingState:(o,c)=>{let u=H({value:c,sanitize:n.sanitize,validate:n.validate,onSanitizeError:p=>{n.reportStoreError(`Sanitize failed for incoming sync "${o}": ${p?.message??p}`);}});return u.ok?u.value:null},acceptIncomingSyncVersion:(o,c,u,p)=>{n.applyFeatureState(n.getStoreValue(),c),t[n.name]=Math.max(t[n.name]??0,u),r[n.name]={clock:u,updatedAt:c,source:p};},resolveSyncVersion:(o,c,u)=>{n.applyFeatureState(n.getStoreValue(),c);let p=Ve(n.name,u,t);return r[n.name]={clock:p,updatedAt:c,source:i},p},broadcastSync:()=>{let o=n.getMeta();o&&X({name:n.name,syncOption:n.options.sync,syncChannels:e,syncClocks:t,instanceId:i,updatedAt:o.updatedAtMs??o.updatedAt,data:n.getStoreValue(),hashState:n.hashState,reportStoreError:(c,u)=>n.reportStoreError(u)});}}),e[n.name])){let o=n.getMeta();l(n.name,o?.updatedAtMs??o?.updatedAt??new Date().toISOString());}},onStoreWrite(n){if(!n.options.sync)return;let o=n.getMeta();o&&(d(n.name,o.updatedAtMs??o.updatedAt),X({name:n.name,syncOption:n.options.sync,syncChannels:e,syncClocks:t,instanceId:i,updatedAt:o.updatedAtMs??o.updatedAt,data:n.next,hashState:n.hashState,reportStoreError:(c,u)=>n.reportStoreError(u)}));},beforeStoreDelete(n){Te({name:n.name,syncChannels:e,syncWindowCleanup:a,syncClocks:t,syncVersions:r});},resetAll(){xe({syncChannels:e,syncWindowCleanup:a}),Object.keys(e).forEach(n=>delete e[n]),Object.keys(t).forEach(n=>delete t[n]),Object.keys(r).forEach(n=>delete r[n]),Object.keys(a).forEach(n=>delete a[n]),V.clear(),T.clear();}}},Z=()=>{J||(J=true,U("sync",Oe));};var ee=()=>{Z();};ee();exports.installSync=ee;//# sourceMappingURL=sync.cjs.map
2
- //# sourceMappingURL=sync.cjs.map
package/dist/sync.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/feature-registry.ts","../src/features/state-helpers.ts","../src/internals/test-reset.ts","../src/async-registry.ts","../src/store-registry.ts","../src/internals/config.ts","../src/internals/diagnostics.ts","../src/features/sync.ts","../src/install.ts","../src/sync.ts"],"names":["_featureFactories","registerStoreFeature","name","factory","normalizeFeatureState","value","sanitize","validate","onSanitizeError","candidate","err","validation","resolveUpdatedAtMs","fallbackMs","onInvalid","parsed","_resetHooks","registerTestResetHook","fn","order","createAsyncRegistry","_registries","_registryOverrideEnv","_registryOverrideRuntime","normalizeStoreRegistryScope","scope","defaultRegistryScope","clearRegistryScopeOverrideForTests","createNotifyState","createStoreRegistry","getStoreRegistry","normalizedScope","existing","created","getActiveStoreRegistry","fallback","defaultLogSink","msg","meta","defaultConfig","cloneConfig","base","configByRegistry","baseConfig","getRegistryConfig","registry","config","getConfig","resetConfig","defaultWarn","warnAlways","_registered","SYNC_PROTOCOL_VERSION","resolveProtocolVersion","insecureSyncWarned","signerVerifyWarned","byteLength","compareSyncOrder","incoming","accepted","localClock","incomingClock","incomingSource","localSource","resolveMetaUpdatedAtMs","isValidSyncMessage","m","requestSyncSnapshot","syncChannels","instanceId","authToken","reportStoreError","channel","payload","bumpSyncClock","syncClocks","absorbSyncClock","closeSyncResources","syncWindowCleanup","syncVersions","cleanupAllSyncResources","dispose","setupSync","syncOption","getMeta","getAcceptedSyncVersion","getStoreValue","hasStoreEntry","notify","warn","setStoreValue","normalizeIncomingState","acceptIncomingSyncVersion","resolveSyncVersion","broadcastSync","hasAuthToken","hasVerify","hasSign","expectedToken","tokenWarned","channelName","event","incomingVersion","verified","resolver","localUpdated","incomingUpdated","resolved","normalizedResolved","resolveUpdatedAt","resolvedUpdatedAt","normalizedIncoming","hostWindow","requestLatest","e","updatedAt","data","hashState","checksumMode","auth","maxPayloadBytes","payloadSize","createSyncFeatureRuntime","recordLocalVersion","ensureLocalClock","ctx","next","message","normalized","updatedAtMs","source","resolvedClock","key","registerSyncFeature","installSync"],"mappings":"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","file":"sync.cjs","sourcesContent":["/**\r\n * @module feature-registry\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for feature-registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { NormalizedOptions, StoreValue } from \"./adapters/options.js\";\r\n\r\nexport type BuiltInFeatureName = \"persist\" | \"sync\" | \"devtools\";\r\nexport type FeatureName = BuiltInFeatureName | (string & {});\r\n\r\nexport interface FeatureMetrics {\r\n notifyCount: number;\r\n totalNotifyMs: number;\r\n lastNotifyMs: number;\r\n}\r\n\r\nexport interface StoreFeatureMeta {\r\n createdAt: string;\r\n updatedAt: string;\r\n updatedAtMs: number;\r\n updateCount: number;\r\n version: number;\r\n metrics: FeatureMetrics;\r\n options: NormalizedOptions;\r\n}\r\n\r\nexport interface BaseFeatureContext {\r\n name: string;\r\n options: NormalizedOptions;\r\n getMeta: () => StoreFeatureMeta | undefined;\r\n getStoreValue: () => StoreValue;\r\n getAllStores: () => Record<string, StoreValue>;\r\n getInitialState: () => StoreValue;\r\n hasStore: () => boolean;\r\n setStoreValue: (value: StoreValue) => void;\r\n applyFeatureState: (value: StoreValue, updatedAtMs?: number) => void;\r\n notify: () => void;\r\n reportStoreError: (message: string) => void;\r\n warn: (message: string) => void;\r\n log: (message: string) => void;\r\n hashState: (value: unknown) => number;\r\n deepClone: <T>(value: T) => T;\r\n sanitize: (value: unknown) => unknown;\r\n validate: (next: StoreValue) => { ok: boolean; value?: StoreValue };\r\n isDev: () => boolean;\r\n}\r\n\r\nexport interface FeatureCreateContext extends BaseFeatureContext {}\r\n\r\nexport interface FeatureWriteContext extends BaseFeatureContext {\r\n action: string;\r\n prev: StoreValue;\r\n next: StoreValue;\r\n}\r\n\r\nexport interface FeatureDeleteContext extends BaseFeatureContext {\r\n prev: StoreValue;\r\n}\r\n\r\nexport interface DevtoolsFeatureApi {\r\n getHistory?: (name: string, limit?: number) => unknown[];\r\n clearHistory?: (name?: string) => void;\r\n getPersistQueueDepth?: (name: string) => number;\r\n}\r\n\r\nexport interface StoreFeatureRuntime {\r\n onStoreCreate?: (ctx: FeatureCreateContext) => void;\r\n onStoreWrite?: (ctx: FeatureWriteContext) => void;\r\n beforeStoreDelete?: (ctx: FeatureDeleteContext) => void;\r\n afterStoreDelete?: (ctx: FeatureDeleteContext) => void;\r\n resetAll?: () => void;\r\n api?: DevtoolsFeatureApi;\r\n}\r\n\r\nexport type StoreFeatureFactory = () => StoreFeatureRuntime;\r\n\r\nconst _featureFactories = new Map<FeatureName, StoreFeatureFactory>();\r\nlet _onFeatureRegistered: ((name: FeatureName, factory: StoreFeatureFactory) => void) | null = null;\r\n\r\nexport const registerStoreFeature = (name: FeatureName, factory: StoreFeatureFactory): void => {\r\n _featureFactories.set(name, factory);\r\n _onFeatureRegistered?.(name, factory);\r\n};\r\n\r\nexport const hasRegisteredStoreFeature = (name: FeatureName): boolean =>\r\n _featureFactories.has(name);\r\n\r\nexport const getStoreFeatureFactory = (name: FeatureName): StoreFeatureFactory | undefined =>\r\n _featureFactories.get(name);\r\n\r\nexport const getRegisteredFeatureNames = (): FeatureName[] =>\r\n Array.from(_featureFactories.keys());\r\n\r\nexport const setFeatureRegistrationHook = (hook: ((name: FeatureName, factory: StoreFeatureFactory) => void) | null): void => {\r\n _onFeatureRegistered = hook;\r\n};\r\n\r\nexport const resetRegisteredStoreFeaturesForTests = (): void => {\r\n _featureFactories.clear();\r\n _onFeatureRegistered = null;\r\n};\r\n\r\n\r\n","/**\r\n * @module features/state-helpers\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/state-helpers.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue } from \"../adapters/options.js\";\r\n\r\nexport type FeatureValidation = (next: StoreValue) => { ok: boolean; value?: StoreValue };\r\n\r\nexport type NormalizedFeatureState =\r\n | { ok: true; value: StoreValue }\r\n | { ok: false };\r\n\r\nexport const normalizeFeatureState = ({\r\n value,\r\n sanitize,\r\n validate,\r\n onSanitizeError,\r\n}: {\r\n value: unknown;\r\n sanitize?: (value: unknown) => unknown;\r\n validate: FeatureValidation;\r\n onSanitizeError?: (error: unknown) => void;\r\n}): NormalizedFeatureState => {\r\n let candidate: StoreValue;\r\n if (sanitize) {\r\n try {\r\n candidate = sanitize(value) as StoreValue;\r\n } catch (err) {\r\n onSanitizeError?.(err);\r\n return { ok: false };\r\n }\r\n } else {\r\n candidate = value as StoreValue;\r\n }\r\n\r\n const validation = validate(candidate);\r\n if (!validation.ok) return { ok: false };\r\n return { ok: true, value: validation.value ?? candidate };\r\n};\r\n\r\nexport const resolveUpdatedAtMs = ({\r\n value,\r\n fallbackMs = Date.now(),\r\n onInvalid,\r\n}: {\r\n value: unknown;\r\n fallbackMs?: number;\r\n onInvalid?: () => void;\r\n}): number => {\r\n if (typeof value === \"number\") {\r\n if (Number.isFinite(value)) return value;\r\n onInvalid?.();\r\n return fallbackMs;\r\n }\r\n if (typeof value === \"string\") {\r\n const parsed = Date.parse(value);\r\n if (Number.isFinite(parsed)) return parsed;\r\n onInvalid?.();\r\n return fallbackMs;\r\n }\r\n onInvalid?.();\r\n return fallbackMs;\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/test-reset\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/test-reset.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\ntype TestResetHook = {\r\n name: string;\r\n order: number;\r\n fn: () => void;\r\n};\r\n\r\nconst _resetHooks = new Map<string, TestResetHook>();\r\n\r\nexport const registerTestResetHook = (name: string, fn: () => void, order = 0): void => {\r\n if (!name || typeof fn !== \"function\") return;\r\n _resetHooks.set(name, { name, order, fn });\r\n};\r\n\r\nexport const runTestResets = (): void => {\r\n const ordered = Array.from(_resetHooks.values()).sort((a, b) => {\r\n if (a.order !== b.order) return a.order - b.order;\r\n return a.name.localeCompare(b.name, \"en\");\r\n });\r\n ordered.forEach((hook) => hook.fn());\r\n};\r\n\r\n\r\n","/**\r\n * @module async-registry\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for async-registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nexport type AsyncStateSnapshot = {\r\n data?: unknown;\r\n loading: boolean;\r\n error: string | null;\r\n status: \"idle\" | \"loading\" | \"success\" | \"error\" | \"aborted\";\r\n cached?: boolean;\r\n revalidating?: boolean;\r\n};\r\n\r\nexport type AsyncStateAdapter = (ctx: {\r\n name: string;\r\n prev: unknown;\r\n next: AsyncStateSnapshot;\r\n set: (value: unknown | ((draft: any) => void)) => void;\r\n}) => void;\r\n\r\nexport interface FetchOptions {\r\n transform?: (result: unknown) => unknown;\r\n onSuccess?: (data: unknown) => void;\r\n onError?: (message: string) => void;\r\n /**\r\n * Optional adapter to write async state into a custom store shape.\r\n * When provided, default AsyncState writes are skipped.\r\n */\r\n stateAdapter?: AsyncStateAdapter;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n body?: unknown;\r\n ttl?: number;\r\n staleWhileRevalidate?: boolean;\r\n dedupe?: boolean;\r\n retry?: number;\r\n retryDelay?: number;\r\n retryBackoff?: number;\r\n signal?: AbortSignal;\r\n cacheKey?: string;\r\n responseType?: \"auto\" | \"json\" | \"text\" | \"arrayBuffer\" | \"blob\" | \"formData\";\r\n /**\r\n * Auto-create the backing store if missing.\r\n * Defaults to the global config setting (true by default).\r\n */\r\n autoCreate?: boolean;\r\n /**\r\n * Clone strategy for transformed results.\r\n * - \"none\" (default): store by reference.\r\n * - \"shallow\": shallow clone objects/arrays.\r\n * - \"deep\": deep clone objects/arrays.\r\n */\r\n cloneResult?: \"none\" | \"shallow\" | \"deep\";\r\n}\r\n\r\ntype InflightEntry = { promise: Promise<unknown>; raw: Promise<unknown>; transform?: FetchOptions[\"transform\"] };\r\n\r\nexport type AsyncRegistry = {\r\n fetchRegistry: Record<string, { kind: \"url\"; url: string; options: FetchOptions } | { kind: \"factory\"; factory: () => string | Promise<unknown>; options: FetchOptions }>;\r\n inflight: Partial<Record<string, InflightEntry>>;\r\n requestVersion: Record<string, number>;\r\n cacheMeta: Record<string, { timestamp: number; expiresAt: number | null; data: unknown }>;\r\n rateWindowStart: Record<string, number>;\r\n rateCount: Record<string, number>;\r\n ratePruneState: { lastAt: number };\r\n ratePruneTimer: ReturnType<typeof setTimeout> | null;\r\n noSignalWarned: Set<string>;\r\n shapeWarned: Set<string>;\r\n autoCreateWarned: Set<string>;\r\n mutableResultWarned: Set<string>;\r\n cleanupSubs: Record<string, () => void>;\r\n storeCleanupFns: Record<string, Set<() => void>>;\r\n revalidateKeys: Set<string>;\r\n revalidateHandlers: Record<string, () => void>;\r\n asyncMetrics: {\r\n cacheHits: number;\r\n cacheMisses: number;\r\n dedupes: number;\r\n requests: number;\r\n failures: number;\r\n avgMs: number;\r\n lastMs: number;\r\n };\r\n};\r\n\r\nexport const createAsyncRegistry = (): AsyncRegistry => ({\r\n fetchRegistry: Object.create(null),\r\n inflight: Object.create(null),\r\n requestVersion: Object.create(null),\r\n cacheMeta: Object.create(null),\r\n rateWindowStart: Object.create(null),\r\n rateCount: Object.create(null),\r\n ratePruneState: { lastAt: 0 },\r\n ratePruneTimer: null,\r\n noSignalWarned: new Set<string>(),\r\n shapeWarned: new Set<string>(),\r\n autoCreateWarned: new Set<string>(),\r\n mutableResultWarned: new Set<string>(),\r\n cleanupSubs: Object.create(null),\r\n storeCleanupFns: Object.create(null),\r\n revalidateKeys: new Set<string>(),\r\n revalidateHandlers: Object.create(null),\r\n asyncMetrics: {\r\n cacheHits: 0,\r\n cacheMisses: 0,\r\n dedupes: 0,\r\n requests: 0,\r\n failures: 0,\r\n avgMs: 0,\r\n lastMs: 0,\r\n },\r\n});\r\n\r\nexport const resetAsyncRegistry = (registry: AsyncRegistry): void => {\r\n Object.values(registry.revalidateHandlers).forEach((cleanup) => {\r\n try { cleanup(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n\r\n Object.values(registry.cleanupSubs).forEach((unsubscribe) => {\r\n try { unsubscribe(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n\r\n Object.values(registry.storeCleanupFns).forEach((fns) => {\r\n fns.forEach((fn) => {\r\n try { fn(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n });\r\n\r\n Object.keys(registry.fetchRegistry).forEach((key) => delete registry.fetchRegistry[key]);\r\n Object.keys(registry.inflight).forEach((key) => delete registry.inflight[key]);\r\n Object.keys(registry.requestVersion).forEach((key) => delete registry.requestVersion[key]);\r\n Object.keys(registry.cacheMeta).forEach((key) => delete registry.cacheMeta[key]);\r\n Object.keys(registry.rateWindowStart).forEach((key) => delete registry.rateWindowStart[key]);\r\n Object.keys(registry.rateCount).forEach((key) => delete registry.rateCount[key]);\r\n Object.keys(registry.cleanupSubs).forEach((key) => delete registry.cleanupSubs[key]);\r\n Object.keys(registry.storeCleanupFns).forEach((key) => delete registry.storeCleanupFns[key]);\r\n Object.keys(registry.revalidateHandlers).forEach((key) => delete registry.revalidateHandlers[key]);\r\n\r\n registry.revalidateKeys.clear();\r\n registry.noSignalWarned.clear();\r\n registry.shapeWarned.clear();\r\n registry.autoCreateWarned.clear();\r\n registry.mutableResultWarned.clear();\r\n registry.ratePruneState.lastAt = 0;\r\n if (registry.ratePruneTimer) {\r\n clearTimeout(registry.ratePruneTimer);\r\n registry.ratePruneTimer = null;\r\n }\r\n\r\n registry.asyncMetrics.cacheHits = 0;\r\n registry.asyncMetrics.cacheMisses = 0;\r\n registry.asyncMetrics.dedupes = 0;\r\n registry.asyncMetrics.requests = 0;\r\n registry.asyncMetrics.failures = 0;\r\n registry.asyncMetrics.avgMs = 0;\r\n registry.asyncMetrics.lastMs = 0;\r\n};\r\n\r\n\r\n","/**\r\n * @module store-registry\r\n *\r\n * LAYER: Store runtime\r\n * OWNS: Module-level behavior and exports for store-registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { FeatureName, StoreFeatureMeta, StoreFeatureRuntime } from \"./feature-registry.js\";\r\nimport type { AsyncRegistry } from \"./async-registry.js\";\r\nimport { createAsyncRegistry, resetAsyncRegistry } from \"./async-registry.js\";\r\nimport { registerTestResetHook } from \"./internals/test-reset.js\";\r\n\r\nexport type RegistryStoreValue = unknown;\r\nexport type RegistrySubscriber = (value: RegistryStoreValue | null) => void;\r\nexport type RegistrySnapshotEntry = {\r\n version: number;\r\n snapshot: RegistryStoreValue | null;\r\n};\r\n\r\nexport type TransactionState = {\r\n depth: number;\r\n pending: Array<() => void>;\r\n stagedValues: Map<string, RegistryStoreValue>;\r\n snapshotCache: Map<string, TransactionSnapshotEntry>;\r\n failed: boolean;\r\n error?: Error;\r\n};\r\n\r\ntype TransactionSnapshotMode = \"deep\" | \"shallow\" | \"ref\";\r\ntype TransactionSnapshotEntry = {\r\n source: RegistryStoreValue | null | undefined;\r\n snapshot: RegistryStoreValue | null;\r\n mode: TransactionSnapshotMode;\r\n};\r\n\r\nexport type ComputedEntry = {\r\n deps: string[];\r\n compute: (...args: unknown[]) => unknown;\r\n stale: boolean;\r\n};\r\n\r\nexport type NotifyState = {\r\n pendingNotifications: Set<string>;\r\n pendingBuffer: string[];\r\n orderedNames: string[];\r\n notifyScheduled: boolean;\r\n batchDepth: number;\r\n};\r\n\r\nexport type StoreRegistry = {\r\n stores: Record<string, RegistryStoreValue>;\r\n subscribers: Record<string, Set<RegistrySubscriber>>;\r\n initialStates: Record<string, RegistryStoreValue>;\r\n initialFactories: Record<string, (() => RegistryStoreValue) | undefined>;\r\n metaEntries: Record<string, StoreFeatureMeta>;\r\n snapshotCache: Record<string, RegistrySnapshotEntry>;\r\n featureRuntimes: Map<FeatureName, StoreFeatureRuntime>;\r\n deletingStores: Set<string>;\r\n computedEntries: Record<string, ComputedEntry>;\r\n computedDependents: Record<string, Set<string>>;\r\n computedCleanups: Map<string, () => void>;\r\n transaction: TransactionState;\r\n async: AsyncRegistry;\r\n notify: NotifyState;\r\n};\r\n\r\nconst _registries = new Map<string, StoreRegistry>();\r\n\r\ndeclare const __STROID_REGISTRY_ID__: string | undefined;\r\nconst _registryOverrideEnv =\r\n (typeof __STROID_REGISTRY_ID__ !== \"undefined\" && __STROID_REGISTRY_ID__)\r\n || (typeof process !== \"undefined\" && process.env?.STROID_REGISTRY_ID)\r\n || undefined;\r\n\r\nlet _registryOverrideRuntime: string | undefined;\r\n\r\nexport const normalizeStoreRegistryScope = (scope: string): string => {\r\n const resolved = _registryOverrideRuntime || _registryOverrideEnv || scope;\r\n return resolved.replace(/\\.ts(\\?|$)/, \".js$1\");\r\n};\r\n\r\nexport const defaultRegistryScope = normalizeStoreRegistryScope(new URL(\"./store.js\", import.meta.url).href);\r\nexport const getDefaultStoreRegistry = (): StoreRegistry => getStoreRegistry(defaultRegistryScope);\r\n\r\nexport const setRegistryScope = (scope: string): void => {\r\n _registryOverrideRuntime = scope;\r\n _registries.clear();\r\n};\r\n\r\nexport const clearRegistryScopeOverrideForTests = (): void => {\r\n _registryOverrideRuntime = undefined;\r\n _registries.clear();\r\n};\r\n\r\nregisterTestResetHook(\"registry.scope-override\", clearRegistryScopeOverrideForTests, 110);\r\n\r\nconst createNotifyState = (): NotifyState => ({\r\n pendingNotifications: new Set<string>(),\r\n pendingBuffer: [],\r\n orderedNames: [],\r\n notifyScheduled: false,\r\n batchDepth: 0,\r\n});\r\n\r\nconst resetNotifyState = (notify: NotifyState): void => {\r\n notify.pendingNotifications.clear();\r\n notify.pendingBuffer.length = 0;\r\n notify.orderedNames.length = 0;\r\n notify.notifyScheduled = false;\r\n notify.batchDepth = 0;\r\n};\r\n\r\nexport const createStoreRegistry = (): StoreRegistry => ({\r\n stores: Object.create(null),\r\n subscribers: Object.create(null),\r\n initialStates: Object.create(null),\r\n initialFactories: Object.create(null),\r\n metaEntries: Object.create(null),\r\n snapshotCache: Object.create(null),\r\n featureRuntimes: new Map(),\r\n deletingStores: new Set(),\r\n computedEntries: Object.create(null),\r\n computedDependents: Object.create(null),\r\n computedCleanups: new Map(),\r\n transaction: {\r\n depth: 0,\r\n pending: [],\r\n stagedValues: new Map(),\r\n snapshotCache: new Map(),\r\n failed: false,\r\n error: undefined,\r\n },\r\n async: createAsyncRegistry(),\r\n notify: createNotifyState(),\r\n});\r\n\r\nexport const getStoreRegistry = (scope: string): StoreRegistry => {\r\n const normalizedScope = normalizeStoreRegistryScope(scope);\r\n const existing = _registries.get(normalizedScope);\r\n if (existing) return existing;\r\n const created = createStoreRegistry();\r\n _registries.set(normalizedScope, created);\r\n return created;\r\n};\r\n\r\nexport const hasStoreEntry = (registry: StoreRegistry, name: string): boolean =>\r\n Object.prototype.hasOwnProperty.call(registry.stores, name);\r\n\r\nexport const isStoreDeleting = (registry: StoreRegistry, name: string): boolean =>\r\n registry.deletingStores.has(name);\r\n\r\nexport const clearStoreRegistries = (registry: StoreRegistry): void => {\r\n registry.computedCleanups.forEach((cleanup) => {\r\n try { cleanup(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n registry.computedCleanups.clear();\r\n [\r\n registry.stores,\r\n registry.subscribers,\r\n registry.initialStates,\r\n registry.initialFactories,\r\n registry.metaEntries,\r\n registry.snapshotCache,\r\n registry.computedEntries,\r\n registry.computedDependents,\r\n ].forEach((registryPart) => {\r\n Object.keys(registryPart).forEach((key) => {\r\n delete registryPart[key];\r\n });\r\n });\r\n registry.deletingStores.clear();\r\n registry.transaction.depth = 0;\r\n registry.transaction.pending = [];\r\n registry.transaction.stagedValues.clear();\r\n registry.transaction.snapshotCache.clear();\r\n registry.transaction.failed = false;\r\n registry.transaction.error = undefined;\r\n resetNotifyState(registry.notify);\r\n resetAsyncRegistry(registry.async);\r\n};\r\n\r\nexport const resetAllStoreRegistriesForTests = (): void => {\r\n _registries.forEach((registry) => {\r\n registry.computedCleanups.forEach((cleanup) => {\r\n try { cleanup(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n registry.computedCleanups.clear();\r\n [\r\n registry.stores,\r\n registry.subscribers,\r\n registry.initialStates,\r\n registry.initialFactories,\r\n registry.metaEntries,\r\n registry.snapshotCache,\r\n registry.computedEntries,\r\n registry.computedDependents,\r\n ].forEach((registryPart) => {\r\n Object.keys(registryPart).forEach((key) => {\r\n delete registryPart[key];\r\n });\r\n });\r\n registry.deletingStores.clear();\r\n registry.transaction.depth = 0;\r\n registry.transaction.pending = [];\r\n registry.transaction.stagedValues.clear();\r\n registry.transaction.snapshotCache.clear();\r\n registry.transaction.failed = false;\r\n registry.transaction.error = undefined;\r\n resetNotifyState(registry.notify);\r\n resetAsyncRegistry(registry.async);\r\n });\r\n _registries.clear();\r\n};\r\n\r\nexport type CarrierContext = Record<string, unknown>;\r\nexport interface CarrierRunner {\r\n run<T>(carrier: CarrierContext, fn: () => T): T;\r\n get(): CarrierContext | null;\r\n}\r\n\r\nlet currentCarrierRunner: CarrierRunner | null = null;\r\n\r\nexport const injectCarrierRunner = (runner: CarrierRunner): void => {\r\n currentCarrierRunner = runner;\r\n};\r\n\r\nexport const getRequestCarrier = (): CarrierContext | null => {\r\n return currentCarrierRunner?.get() || null;\r\n};\r\n\r\nexport interface RegistryRunner {\r\n run<T>(registry: StoreRegistry, fn: () => T): T;\r\n get(): StoreRegistry | null;\r\n enterWith?: (registry: StoreRegistry) => void;\r\n}\r\n\r\nlet currentRegistryRunner: RegistryRunner | null = null;\r\n\r\nexport const injectRegistryRunner = (runner: RegistryRunner): void => {\r\n currentRegistryRunner = runner;\r\n};\r\n\r\nexport const runWithRegistry = <T>(registry: StoreRegistry, fn: () => T): T => {\r\n if (currentRegistryRunner?.run) return currentRegistryRunner.run(registry, fn);\r\n return fn();\r\n};\r\n\r\nexport const getActiveStoreRegistry = (fallback?: StoreRegistry): StoreRegistry => {\r\n return currentRegistryRunner?.get() || fallback || getStoreRegistry(defaultRegistryScope);\r\n};\r\n\r\nexport const enterRegistry = (registry: StoreRegistry): void => {\r\n if (currentRegistryRunner?.enterWith) {\r\n currentRegistryRunner.enterWith(registry);\r\n }\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/config\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/config.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { SnapshotMode, MiddlewareCtx, StoreValue } from \"../adapters/options.js\";\r\nimport { registerTestResetHook } from \"./test-reset.js\";\r\nimport { warnAlways } from \"./diagnostics.js\";\r\nimport { getActiveStoreRegistry, getDefaultStoreRegistry, type StoreRegistry } from \"../store-registry.js\";\r\n\r\nexport type LogSink = {\r\n log?: (msg: string, meta?: Record<string, unknown>) => void;\r\n warn?: (msg: string, meta?: Record<string, unknown>) => void;\r\n critical?: (msg: string, meta?: Record<string, unknown>) => void;\r\n};\r\n\r\nexport type AsyncCloneMode = \"none\" | \"shallow\" | \"deep\";\r\n\r\nexport type FlushConfig = {\r\n chunkSize?: number;\r\n chunkDelayMs?: number;\r\n priorityStores?: string[];\r\n};\r\n\r\nexport type RevalidateOnFocusConfig = {\r\n debounceMs?: number;\r\n maxConcurrent?: number;\r\n staggerMs?: number;\r\n};\r\n\r\nexport type StroidConfig = {\r\n logSink?: LogSink;\r\n flush?: FlushConfig;\r\n revalidateOnFocus?: RevalidateOnFocusConfig;\r\n namespace?: string;\r\n strictMissingFeatures?: boolean;\r\n strictFeatures?: boolean;\r\n assertRuntime?: boolean;\r\n strictMutatorReturns?: boolean;\r\n asyncAutoCreate?: boolean;\r\n asyncCloneResult?: AsyncCloneMode;\r\n defaultSnapshotMode?: SnapshotMode;\r\n /**\r\n * Alias for defaultSnapshotMode.\r\n */\r\n snapshotStrategy?: SnapshotMode;\r\n /**\r\n * Throw on async usage errors instead of returning null.\r\n * Default: false (usage errors return null and call onError).\r\n */\r\n strictAsyncUsageErrors?: boolean;\r\n middleware?: Array<(ctx: MiddlewareCtx) => StoreValue | void>;\r\n /**\r\n * Allow hydrateStores to accept untrusted snapshots without explicit opt-in.\r\n * Default: false (hydration requires an explicit trust opt-in).\r\n */\r\n allowUntrustedHydration?: boolean;\r\n /**\r\n * Optional custom mutator engine (e.g. Immer's produce) to enable structural sharing.\r\n * You can pass the produce function directly or use \"immer\" with a global produce shim.\r\n */\r\n mutatorProduce?: (<T>(base: T, recipe: (draft: T) => void) => T) | \"immer\";\r\n};\r\n\r\ntype ResolvedConfig = {\r\n logSink: LogSink;\r\n flush: Required<FlushConfig>;\r\n revalidateOnFocus: Required<RevalidateOnFocusConfig>;\r\n namespace: string;\r\n strictMissingFeatures: boolean;\r\n assertRuntime: boolean;\r\n strictMutatorReturns: boolean;\r\n asyncAutoCreate: boolean;\r\n asyncCloneResult: AsyncCloneMode;\r\n defaultSnapshotMode: SnapshotMode;\r\n strictAsyncUsageErrors: boolean;\r\n middleware: Array<(ctx: MiddlewareCtx) => StoreValue | void>;\r\n allowUntrustedHydration: boolean;\r\n mutatorProduce?: <T>(base: T, recipe: (draft: T) => void) => T;\r\n};\r\n\r\nconst defaultLogSink: LogSink = {\r\n log: (msg: string, meta?: Record<string, unknown>) => {\r\n if (typeof console !== \"undefined\" && typeof console.log === \"function\") {\r\n if (meta) console.log(`[stroid] ${msg}`, meta);\r\n else console.log(`[stroid] ${msg}`);\r\n }\r\n },\r\n warn: (msg: string, meta?: Record<string, unknown>) => {\r\n if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\r\n if (meta) console.warn(`[stroid] ${msg}`, meta);\r\n else console.warn(`[stroid] ${msg}`);\r\n }\r\n },\r\n critical: (msg: string, meta?: Record<string, unknown>) => {\r\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\r\n if (meta) console.error(`[stroid] ${msg}`, meta);\r\n else console.error(`[stroid] ${msg}`);\r\n }\r\n },\r\n};\r\n\r\nconst defaultConfig: ResolvedConfig = {\r\n logSink: defaultLogSink,\r\n flush: {\r\n chunkSize: Number.POSITIVE_INFINITY,\r\n chunkDelayMs: 0,\r\n priorityStores: [],\r\n },\r\n revalidateOnFocus: {\r\n debounceMs: 0,\r\n maxConcurrent: 3,\r\n staggerMs: 100,\r\n },\r\n namespace: \"\",\r\n strictMissingFeatures: true,\r\n assertRuntime: false,\r\n strictMutatorReturns: true,\r\n asyncAutoCreate: false,\r\n asyncCloneResult: \"none\",\r\n defaultSnapshotMode: \"deep\",\r\n strictAsyncUsageErrors: false,\r\n middleware: [],\r\n allowUntrustedHydration: false,\r\n mutatorProduce: undefined,\r\n};\r\n\r\nconst cloneConfig = (base: ResolvedConfig): ResolvedConfig => ({\r\n logSink: { ...base.logSink },\r\n flush: { ...base.flush },\r\n revalidateOnFocus: { ...base.revalidateOnFocus },\r\n namespace: base.namespace,\r\n strictMissingFeatures: base.strictMissingFeatures,\r\n assertRuntime: base.assertRuntime,\r\n strictMutatorReturns: base.strictMutatorReturns,\r\n asyncAutoCreate: base.asyncAutoCreate,\r\n asyncCloneResult: base.asyncCloneResult,\r\n defaultSnapshotMode: base.defaultSnapshotMode,\r\n strictAsyncUsageErrors: base.strictAsyncUsageErrors,\r\n middleware: [...base.middleware],\r\n allowUntrustedHydration: base.allowUntrustedHydration,\r\n mutatorProduce: base.mutatorProduce,\r\n});\r\n\r\nlet configByRegistry = new WeakMap<StoreRegistry, ResolvedConfig>();\r\nlet baseConfig = cloneConfig(defaultConfig);\r\nconst getRegistryConfig = (registry: StoreRegistry): ResolvedConfig => {\r\n let config = configByRegistry.get(registry);\r\n if (!config) {\r\n config = cloneConfig(baseConfig);\r\n configByRegistry.set(registry, config);\r\n }\r\n return config;\r\n};\r\n\r\nconst IMMER_PRODUCE_KEY = \"__STROID_IMMER_PRODUCE__\";\r\nlet cachedImmerProduce: (<T>(base: T, recipe: (draft: T) => void) => T) | undefined;\r\nlet immerMissingWarned = false;\r\nconst resolveImmerProduce = (): (<T>(base: T, recipe: (draft: T) => void) => T) | undefined => {\r\n if (cachedImmerProduce) return cachedImmerProduce;\r\n const globalAny = globalThis as Record<string, unknown> | undefined;\r\n const candidate = globalAny ? globalAny[IMMER_PRODUCE_KEY] : undefined;\r\n if (typeof candidate === \"function\") {\r\n cachedImmerProduce = candidate as (<T>(base: T, recipe: (draft: T) => void) => T);\r\n return cachedImmerProduce;\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getConfig = (): ResolvedConfig => getRegistryConfig(getActiveStoreRegistry());\r\n\r\nexport const configureStroid = (next?: StroidConfig): void => {\r\n if (!next) return;\r\n const registry = getActiveStoreRegistry();\r\n let config = getRegistryConfig(registry);\r\n\r\n if (next.logSink) {\r\n config = {\r\n ...config,\r\n logSink: {\r\n log: next.logSink.log ?? config.logSink.log,\r\n warn: next.logSink.warn ?? config.logSink.warn,\r\n critical: next.logSink.critical ?? config.logSink.critical,\r\n },\r\n };\r\n }\r\n\r\n if (next.flush) {\r\n config = {\r\n ...config,\r\n flush: {\r\n chunkSize: Number.isFinite(next.flush.chunkSize ?? config.flush.chunkSize)\r\n ? (next.flush.chunkSize as number)\r\n : config.flush.chunkSize,\r\n chunkDelayMs: Number.isFinite(next.flush.chunkDelayMs ?? config.flush.chunkDelayMs)\r\n ? (next.flush.chunkDelayMs as number)\r\n : config.flush.chunkDelayMs,\r\n priorityStores: Array.isArray(next.flush.priorityStores)\r\n ? next.flush.priorityStores\r\n : config.flush.priorityStores,\r\n },\r\n };\r\n }\r\n\r\n if (next.revalidateOnFocus) {\r\n config = {\r\n ...config,\r\n revalidateOnFocus: {\r\n debounceMs: Number.isFinite(next.revalidateOnFocus.debounceMs ?? config.revalidateOnFocus.debounceMs)\r\n ? (next.revalidateOnFocus.debounceMs as number)\r\n : config.revalidateOnFocus.debounceMs,\r\n maxConcurrent: Number.isFinite(next.revalidateOnFocus.maxConcurrent ?? config.revalidateOnFocus.maxConcurrent)\r\n ? Math.max(1, next.revalidateOnFocus.maxConcurrent as number)\r\n : config.revalidateOnFocus.maxConcurrent,\r\n staggerMs: Number.isFinite(next.revalidateOnFocus.staggerMs ?? config.revalidateOnFocus.staggerMs)\r\n ? Math.max(0, next.revalidateOnFocus.staggerMs as number)\r\n : config.revalidateOnFocus.staggerMs,\r\n },\r\n };\r\n }\r\n\r\n if (typeof next.namespace === \"string\") {\r\n config = {\r\n ...config,\r\n namespace: next.namespace.trim(),\r\n };\r\n }\r\n\r\n if (typeof next.strictMissingFeatures === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictMissingFeatures: next.strictMissingFeatures,\r\n };\r\n }\r\n if (typeof next.strictFeatures === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictMissingFeatures: next.strictFeatures,\r\n };\r\n }\r\n\r\n if (typeof next.assertRuntime === \"boolean\") {\r\n config = {\r\n ...config,\r\n assertRuntime: next.assertRuntime,\r\n };\r\n }\r\n\r\n if (typeof next.strictMutatorReturns === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictMutatorReturns: next.strictMutatorReturns,\r\n };\r\n }\r\n\r\n if (typeof next.asyncAutoCreate === \"boolean\") {\r\n config = {\r\n ...config,\r\n asyncAutoCreate: next.asyncAutoCreate,\r\n };\r\n }\r\n if (typeof next.strictAsyncUsageErrors === \"boolean\") {\r\n config = {\r\n ...config,\r\n strictAsyncUsageErrors: next.strictAsyncUsageErrors,\r\n };\r\n }\r\n\r\n if (next.asyncCloneResult === \"none\" || next.asyncCloneResult === \"shallow\" || next.asyncCloneResult === \"deep\") {\r\n config = {\r\n ...config,\r\n asyncCloneResult: next.asyncCloneResult,\r\n };\r\n }\r\n\r\n if (next.snapshotStrategy === \"shallow\" || next.snapshotStrategy === \"ref\" || next.snapshotStrategy === \"deep\") {\r\n config = {\r\n ...config,\r\n defaultSnapshotMode: next.snapshotStrategy,\r\n };\r\n }\r\n\r\n if (next.defaultSnapshotMode === \"shallow\" || next.defaultSnapshotMode === \"ref\" || next.defaultSnapshotMode === \"deep\") {\r\n config = {\r\n ...config,\r\n defaultSnapshotMode: next.defaultSnapshotMode,\r\n };\r\n }\r\n\r\n if (Array.isArray(next.middleware)) {\r\n config = {\r\n ...config,\r\n middleware: next.middleware,\r\n };\r\n }\r\n\r\n if (typeof next.allowUntrustedHydration === \"boolean\") {\r\n config = {\r\n ...config,\r\n allowUntrustedHydration: next.allowUntrustedHydration,\r\n };\r\n }\r\n\r\n if (typeof next.mutatorProduce === \"function\") {\r\n config = {\r\n ...config,\r\n mutatorProduce: next.mutatorProduce,\r\n };\r\n } else if (next.mutatorProduce === \"immer\") {\r\n const produce = resolveImmerProduce();\r\n if (produce) {\r\n config = {\r\n ...config,\r\n mutatorProduce: produce,\r\n };\r\n } else {\r\n if (!immerMissingWarned) {\r\n immerMissingWarned = true;\r\n warnAlways(\r\n `configureStroid({ mutatorProduce: \"immer\" }) requires Immer's produce function.\\n` +\r\n `Set globalThis.${IMMER_PRODUCE_KEY} = produce or pass mutatorProduce: produce directly.`\r\n );\r\n }\r\n }\r\n }\r\n\r\n configByRegistry.set(registry, config);\r\n if (registry === getDefaultStoreRegistry()) {\r\n baseConfig = cloneConfig(config);\r\n }\r\n};\r\n\r\nexport const resetConfig = (): void => {\r\n configByRegistry = new WeakMap<StoreRegistry, ResolvedConfig>();\r\n baseConfig = cloneConfig(defaultConfig);\r\n cachedImmerProduce = undefined;\r\n immerMissingWarned = false;\r\n};\r\n\r\nregisterTestResetHook(\"config.reset\", resetConfig, 90);\r\n\r\n// Back-compat for tests\r\nexport const _resetConfigForTests = (): void => resetConfig();\r\n\r\nexport const getNamespace = (): string => getConfig().namespace;\r\nexport const setNamespace = (ns: string): void => {\r\n const registry = getActiveStoreRegistry();\r\n const config = getRegistryConfig(registry);\r\n const next = { ...config, namespace: ns.trim() };\r\n configByRegistry.set(registry, next);\r\n if (registry === getDefaultStoreRegistry()) {\r\n baseConfig = cloneConfig(next);\r\n }\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/diagnostics\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/diagnostics.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { getConfig } from \"./config.js\";\r\nconst _envFromProcess = typeof process !== \"undefined\" && typeof process.env?.NODE_ENV === \"string\"\r\n ? process.env.NODE_ENV\r\n : undefined;\r\nconst _envFromImportMeta = typeof import.meta !== \"undefined\" && (import.meta as any)?.env?.MODE\r\n ? (import.meta as any).env.MODE\r\n : undefined;\r\nconst _devFlag = typeof globalThis !== \"undefined\" && typeof (globalThis as any).__STROID_DEV__ === \"boolean\"\r\n ? (globalThis as any).__STROID_DEV__\r\n : undefined;\r\nconst _fallbackEnv = \"production\";\r\nconst _resolvedEnv = _envFromProcess ?? _envFromImportMeta ?? _fallbackEnv;\r\n\r\nexport const __DEV__ = typeof _devFlag === \"boolean\"\r\n ? _devFlag\r\n : _resolvedEnv !== \"production\";\r\n\r\nexport const isDev = (): boolean => __DEV__;\r\n\r\nconst defaultWarn = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\r\n if (meta) console.warn(`[stroid] ${msg}`, meta);\r\n else console.warn(`[stroid] ${msg}`);\r\n }\r\n};\r\n\r\nconst defaultCritical = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\r\n if (meta) console.error(`[stroid] ${msg}`, meta);\r\n else console.error(`[stroid] ${msg}`);\r\n }\r\n};\r\n\r\nconst defaultLog = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (typeof console !== \"undefined\" && typeof console.log === \"function\") {\r\n if (meta) console.log(`[stroid] ${msg}`, meta);\r\n else console.log(`[stroid] ${msg}`);\r\n }\r\n};\r\n\r\nexport const critical = (msg: string, meta?: Record<string, unknown>): void => {\r\n const sink = getConfig().logSink.critical ?? defaultCritical;\r\n sink(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\nexport const warn = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (!__DEV__) return;\r\n const sink = getConfig().logSink.warn ?? defaultWarn;\r\n sink(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\n// Used for configuration hazards that must surface in production too.\r\nexport const warnAlways = (msg: string, meta?: Record<string, unknown>): void => {\r\n const sink = getConfig().logSink.warn ?? defaultWarn;\r\n sink(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\nexport const error = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (__DEV__) {\r\n const sink = getConfig().logSink.warn ?? defaultWarn;\r\n sink(msg, meta);\r\n }\r\n critical(msg, meta);\r\n if (getConfig().assertRuntime) throw new Error(msg);\r\n};\r\n\r\nexport const log = (msg: string, meta?: Record<string, unknown>): void => {\r\n if (!__DEV__) return;\r\n const sink = getConfig().logSink.log ?? defaultLog;\r\n sink(msg, meta);\r\n};\r\n\r\nexport const getInvalidFunctionStoreValueMessage = (): string =>\r\n `Functions cannot be stored in stroid.\\n` +\r\n `Store data only - handle functions outside the store.`;\r\n\r\nexport const getMapSetStoreWarningMessage = (): string =>\r\n `Map/Set detected. stroid converts these to plain objects.\\n` +\r\n `Use arrays or plain objects for best results.`;\r\n\r\nexport const getDateStoreWarningMessage = (): string =>\r\n `Date object detected. stroid stores it as ISO string.\\n` +\r\n `Use new Date(value) to convert back when reading.`;\r\n\r\nexport const getSanitizeDateWarningMessage = (): string =>\r\n \"Date detected; stored as ISO string. Use new Date(value) when reading.\";\r\n\r\nexport const getSanitizeMapWarningMessage = (): string =>\r\n \"Map detected; converting to plain object.\";\r\n\r\nexport const getSanitizeSetWarningMessage = (): string =>\r\n \"Set detected; converting to array.\";\r\n\r\nexport const getPathDepthExceededMessage = (depth: number, maxDepth: number, parts: string[]): string =>\r\n `Path depth of ${depth} exceeded maximum of ${maxDepth}.\\n` +\r\n `\"${parts.join(\".\")}\"\\n` +\r\n `This is a data design issue. Split into separate stores:\\n` +\r\n `createStore(\"${parts[0]}\", ...) and createStore(\"${parts[1]}\", ...)`;\r\n\r\nexport const getDeepNestingWarningMessage = (depth: number, parts: string[]): string =>\r\n `Deep nesting detected (${depth} levels): \"${parts.join(\".\")}\"\\n` +\r\n `Consider splitting into separate stores for better readability.`;\r\n\r\nexport const getPathReachedNullMessage = (parts: string[], part: string): string =>\r\n `Path \"${parts.join(\".\")}\" not found - reached null at \"${part}\"`;\r\n\r\nexport const getPathNotObjectMessage = (part: string): string =>\r\n `Cannot go deeper at \"${part}\" - value is not an object`;\r\n\r\nexport const getInvalidStoreNameMessage = (name: string): string =>\r\n `Store name must be a non-empty string. Got: ${JSON.stringify(name)}`;\r\n\r\nexport const getStoreNameContainsSpacesMessage = (name: string): string =>\r\n `Store name \"${name}\" contains spaces.\\n` +\r\n `Use camelCase or kebab-case: \"userName\" or \"user-name\"`;\r\n\r\nexport const getForbiddenStoreNameMessage = (name: string): string =>\r\n `Store name \"${name}\" is not allowed.\\n` +\r\n `Reserved names: \"__proto__\", \"constructor\", \"prototype\".`;\r\n\r\nconst MAX_LEVENSHTEIN_INPUT_LENGTH = 128;\r\n\r\nconst shouldCheckLevenshtein = (a: string, b: string): boolean => {\r\n if (Math.abs(a.length - b.length) > 2) return false;\r\n return Math.max(a.length, b.length) <= MAX_LEVENSHTEIN_INPUT_LENGTH;\r\n};\r\n\r\nconst levenshtein = (a: string, b: string): number => {\r\n if (a === b) return 0;\r\n if (a.length === 0) return b.length;\r\n if (b.length === 0) return a.length;\r\n\r\n let prev = Array.from({ length: a.length + 1 }, (_, i) => i);\r\n let next = new Array<number>(a.length + 1);\r\n\r\n for (let i = 1; i <= b.length; i++) {\r\n next[0] = i;\r\n for (let j = 1; j <= a.length; j++) {\r\n next[j] =\r\n b[i - 1] === a[j - 1]\r\n ? prev[j - 1]\r\n : Math.min(prev[j - 1], next[j - 1], prev[j]) + 1;\r\n }\r\n [prev, next] = [next, prev];\r\n }\r\n return prev[a.length];\r\n};\r\n\r\nexport const suggestStoreName = (name: string, existingNames: string[]): void => {\r\n const similar = existingNames.find((entry) => {\r\n const a = entry.toLowerCase();\r\n const b = name.toLowerCase();\r\n return (\r\n a.includes(b)\r\n || b.includes(a)\r\n || (shouldCheckLevenshtein(a, b) && levenshtein(a, b) <= 2)\r\n );\r\n });\r\n\r\n if (similar) {\r\n warn(`Store \"${name}\" not found. Did you mean \"${similar}\"?`);\r\n return;\r\n }\r\n\r\n error(\r\n `Store \"${name}\" not found.\\n` +\r\n `Available stores: [${existingNames.join(\", \")}]\\n` +\r\n `Call createStore(\"${name}\", data) first.`\r\n );\r\n};\r\n\r\n\r\n","/**\r\n * @module features/sync\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/sync.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue, SyncMessage, SyncOptions } from \"../adapters/options.js\";\r\nimport { registerStoreFeature, type StoreFeatureRuntime } from \"../feature-registry.js\";\r\nimport { normalizeFeatureState, resolveUpdatedAtMs } from \"./state-helpers.js\";\r\nimport { warnAlways } from \"../utils.js\";\r\n\r\nexport type SyncChannels = Record<string, BroadcastChannel>;\r\nexport type SyncClocks = Record<string, number>;\r\nexport type SyncVersion = { clock: number; updatedAt: number; source: string };\r\nexport type SyncVersions = Record<string, SyncVersion>;\r\nexport type SyncWindowCleanup = Record<string, () => void>;\r\n\r\nlet _registered = false;\r\nconst SYNC_PROTOCOL_VERSION = 1;\r\nconst resolveProtocolVersion = (msg: { v?: unknown; protocol?: unknown }): number | undefined =>\r\n typeof msg?.v === \"number\"\r\n ? msg.v as number\r\n : (typeof msg?.protocol === \"number\" ? msg.protocol as number : undefined);\r\n\r\nconst insecureSyncWarned = new Set<string>();\r\nconst signerVerifyWarned = new Set<string>();\r\n\r\ntype SyncMeta = {\r\n updatedAt: string;\r\n updatedAtMs?: number;\r\n updateCount: number;\r\n options: {\r\n sync?: boolean | SyncOptions;\r\n };\r\n};\r\n\r\nconst byteLength = (value: string): number => {\r\n if (typeof TextEncoder !== \"undefined\") {\r\n return new TextEncoder().encode(value).length;\r\n }\r\n if (typeof Buffer !== \"undefined\") {\r\n return Buffer.byteLength(value);\r\n }\r\n return value.length;\r\n};\r\n\r\nconst compareSyncOrder = ({\r\n incoming,\r\n accepted,\r\n}: {\r\n incoming: { clock?: number; source?: string };\r\n accepted?: SyncVersion;\r\n}): number => {\r\n const localClock = accepted?.clock ?? 0;\r\n const incomingClock = typeof incoming.clock === \"number\" ? incoming.clock : 0;\r\n if (incomingClock !== localClock) return incomingClock - localClock;\r\n\r\n const incomingSource = incoming.source ?? \"\";\r\n const localSource = accepted?.source ?? \"\";\r\n if (incomingSource === localSource) return 0;\r\n return incomingSource.localeCompare(localSource, \"en\", { sensitivity: \"variant\" });\r\n};\r\n\r\nconst resolveMetaUpdatedAtMs = (meta?: SyncMeta): number =>\r\n meta?.updatedAtMs ?? resolveUpdatedAtMs({ value: meta?.updatedAt, fallbackMs: 0 });\r\n\r\nconst isValidSyncMessage = (msg: unknown): msg is {\r\n v?: number;\r\n protocol?: number;\r\n type: string;\r\n name: string;\r\n clock: number;\r\n source: string;\r\n data?: unknown;\r\n updatedAt?: number;\r\n auth?: unknown;\r\n token?: unknown;\r\n requestedAt?: number;\r\n} => {\r\n if (typeof msg !== \"object\" || msg === null) return false;\r\n const m = msg as Record<string, unknown>;\r\n const hasVersion = typeof m.v === \"number\" || typeof m.protocol === \"number\";\r\n return (\r\n hasVersion &&\r\n typeof m.type === \"string\" &&\r\n typeof m.name === \"string\" &&\r\n typeof m.clock === \"number\" &&\r\n typeof m.source === \"string\"\r\n );\r\n};\r\n\r\nconst requestSyncSnapshot = ({\r\n name,\r\n syncChannels,\r\n instanceId,\r\n authToken,\r\n reportStoreError,\r\n}: {\r\n name: string;\r\n syncChannels: SyncChannels;\r\n instanceId: string;\r\n authToken?: string;\r\n reportStoreError: (name: string, message: string) => void;\r\n}): void => {\r\n const channel = syncChannels[name];\r\n if (!channel) return;\r\n try {\r\n const payload: SyncMessage = {\r\n v: SYNC_PROTOCOL_VERSION,\r\n protocol: SYNC_PROTOCOL_VERSION,\r\n type: \"sync-request\",\r\n source: instanceId,\r\n name,\r\n clock: 0,\r\n requestedAt: Date.now(),\r\n };\r\n if (authToken) payload.token = authToken;\r\n channel.postMessage(payload);\r\n } catch (err) {\r\n reportStoreError(name, `Failed to request sync snapshot for \"${name}\": ${(err as { message?: string })?.message ?? err}`);\r\n }\r\n};\r\n\r\nexport const bumpSyncClock = (name: string, syncClocks: SyncClocks): number => {\r\n syncClocks[name] = (syncClocks[name] ?? 0) + 1;\r\n return syncClocks[name];\r\n};\r\n\r\nexport const absorbSyncClock = (\r\n name: string,\r\n incomingClock: number,\r\n syncClocks: SyncClocks\r\n): number => {\r\n syncClocks[name] = Math.max(syncClocks[name] ?? 0, incomingClock) + 1;\r\n return syncClocks[name];\r\n};\r\n\r\nexport const closeSyncResources = ({\r\n name,\r\n syncChannels,\r\n syncWindowCleanup,\r\n syncClocks,\r\n syncVersions,\r\n}: {\r\n name: string;\r\n syncChannels: SyncChannels;\r\n syncWindowCleanup: SyncWindowCleanup;\r\n syncClocks: SyncClocks;\r\n syncVersions: SyncVersions;\r\n}): void => {\r\n syncChannels[name]?.close();\r\n delete syncChannels[name];\r\n syncWindowCleanup[name]?.();\r\n delete syncWindowCleanup[name];\r\n delete syncClocks[name];\r\n delete syncVersions[name];\r\n};\r\n\r\nexport const cleanupAllSyncResources = ({\r\n syncChannels,\r\n syncWindowCleanup,\r\n}: {\r\n syncChannels: SyncChannels;\r\n syncWindowCleanup: SyncWindowCleanup;\r\n}): void => {\r\n Object.values(syncWindowCleanup).forEach((dispose) => {\r\n try { dispose(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n Object.values(syncChannels).forEach((channel) => {\r\n try { channel.close(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n};\r\n\r\nexport const setupSync = ({\r\n name,\r\n syncOption,\r\n syncChannels,\r\n syncClocks,\r\n syncVersions,\r\n syncWindowCleanup,\r\n instanceId,\r\n getMeta,\r\n getAcceptedSyncVersion,\r\n getStoreValue,\r\n hasStoreEntry,\r\n notify,\r\n validate,\r\n reportStoreError,\r\n warn,\r\n setStoreValue,\r\n normalizeIncomingState,\r\n acceptIncomingSyncVersion,\r\n resolveSyncVersion,\r\n broadcastSync,\r\n}: {\r\n name: string;\r\n syncOption?: boolean | SyncOptions;\r\n syncChannels: SyncChannels;\r\n syncClocks: SyncClocks;\r\n syncVersions: SyncVersions;\r\n syncWindowCleanup: SyncWindowCleanup;\r\n instanceId: string;\r\n getMeta: (name: string) => SyncMeta | undefined;\r\n getAcceptedSyncVersion: (name: string) => SyncVersion | undefined;\r\n getStoreValue: (name: string) => StoreValue;\r\n hasStoreEntry: (name: string) => boolean;\r\n notify: (name: string) => void;\r\n validate: (name: string, next: StoreValue) => { ok: boolean; value?: StoreValue };\r\n reportStoreError: (name: string, message: string) => void;\r\n warn: (message: string) => void;\r\n setStoreValue: (name: string, value: StoreValue) => void;\r\n normalizeIncomingState: (name: string, value: StoreValue) => StoreValue | null;\r\n acceptIncomingSyncVersion: (name: string, updatedAtMs: number, incomingClock: number, source: string) => void;\r\n resolveSyncVersion: (name: string, updatedAtMs: number, incomingClock: number) => number;\r\n broadcastSync: (name: string) => void;\r\n}): void => {\r\n if (!syncOption) return;\r\n if (typeof window === \"undefined\" || typeof BroadcastChannel === \"undefined\") {\r\n reportStoreError(name, `Sync enabled for \"${name}\" but BroadcastChannel not available in this environment.`);\r\n return;\r\n }\r\n const hasAuthToken = typeof syncOption === \"object\"\r\n && typeof syncOption.authToken === \"string\"\r\n && syncOption.authToken.length > 0;\r\n const hasVerify = typeof syncOption === \"object\" && typeof syncOption.verify === \"function\";\r\n const hasSign = typeof syncOption === \"object\" && typeof syncOption.sign === \"function\";\r\n\r\n if (!hasAuthToken && !hasVerify && !insecureSyncWarned.has(name)) {\r\n insecureSyncWarned.add(name);\r\n warnAlways(\r\n `Sync for \"${name}\" is unauthenticated. Any same-origin tab can forge sync messages. ` +\r\n `Provide sync.authToken or sync.verify to enforce authentication.`\r\n );\r\n }\r\n\r\n if (hasSign && !hasVerify && !signerVerifyWarned.has(name)) {\r\n signerVerifyWarned.add(name);\r\n warn(\r\n `Sync for \"${name}\" is configured with \"sign\" but no \"verify\". ` +\r\n `\"sign\" has no effect unless incoming messages are verified.`\r\n );\r\n }\r\n const expectedToken = typeof syncOption === \"object\" ? syncOption.authToken : undefined;\r\n let tokenWarned = false;\r\n const channelName = typeof syncOption === \"object\" && syncOption.channel\r\n ? syncOption.channel\r\n : `stroid_sync_${name}`;\r\n try {\r\n const channel = new BroadcastChannel(channelName);\r\n syncChannels[name] = channel;\r\n channel.onmessage = (event: MessageEvent) => {\r\n const msg = event.data as any;\r\n if (!msg || msg.source === instanceId) return;\r\n if (msg.name !== name) return;\r\n if (syncChannels[name] !== channel || !hasStoreEntry(name) || !getMeta(name)) return;\r\n if (!isValidSyncMessage(msg)) {\r\n reportStoreError(name, `Sync message for \"${name}\" is malformed; ignoring.`);\r\n return;\r\n }\r\n if (expectedToken && msg.token !== expectedToken) {\r\n if (!tokenWarned) {\r\n reportStoreError(name, `Sync message for \"${name}\" failed auth token verification; ignoring.`);\r\n tokenWarned = true;\r\n }\r\n return;\r\n }\r\n const incomingVersion = resolveProtocolVersion(msg);\r\n if (incomingVersion !== SYNC_PROTOCOL_VERSION) {\r\n reportStoreError(name, `Sync protocol mismatch for \"${name}\". Expected v${SYNC_PROTOCOL_VERSION} but received ${String(incomingVersion ?? \"unknown\")}. Ignoring message.`);\r\n return;\r\n }\r\n const isSyncState = msg.type === \"sync-state\";\r\n if (isSyncState && (typeof msg.data === \"undefined\" || typeof msg.clock !== \"number\")) {\r\n reportStoreError(name, `Sync message for \"${name}\" is malformed; ignoring.`);\r\n return;\r\n }\r\n if (typeof syncOption === \"object\" && typeof syncOption.verify === \"function\") {\r\n let verified = false;\r\n try {\r\n verified = !!syncOption.verify(msg as SyncMessage);\r\n } catch (err) {\r\n reportStoreError(\r\n name,\r\n `Sync message verification failed for \"${name}\": ${(err as { message?: string })?.message ?? err}`\r\n );\r\n return;\r\n }\r\n if (!verified) {\r\n reportStoreError(name, `Sync message for \"${name}\" failed verification; ignoring.`);\r\n return;\r\n }\r\n }\r\n if (msg.type === \"sync-request\") {\r\n broadcastSync(name);\r\n return;\r\n }\r\n const resolver = typeof syncOption === \"object\" ? syncOption.conflictResolver : null;\r\n const order = compareSyncOrder({\r\n incoming: {\r\n clock: msg.clock,\r\n source: msg.source,\r\n },\r\n accepted: getAcceptedSyncVersion(name),\r\n });\r\n if (order <= 0) {\r\n const localUpdated = resolveMetaUpdatedAtMs(getMeta(name));\r\n const incomingUpdated = typeof msg.updatedAt === \"number\" ? msg.updatedAt : Date.now();\r\n if (resolver) {\r\n const resolved = resolver({\r\n local: getStoreValue(name),\r\n incoming: msg.data,\r\n localUpdated,\r\n incomingUpdated,\r\n });\r\n if (resolved !== undefined) {\r\n const normalizedResolved = normalizeIncomingState(name, resolved);\r\n if (normalizedResolved === null) return;\r\n setStoreValue(name, normalizedResolved);\r\n const resolveUpdatedAt = typeof syncOption === \"object\" ? syncOption.resolveUpdatedAt : null;\r\n const resolvedUpdatedAt = resolveUpdatedAt\r\n ? resolveUpdatedAt({ localUpdated, incomingUpdated, now: Date.now() })\r\n : Math.max(Date.now(), localUpdated, incomingUpdated);\r\n resolveSyncVersion(name, resolvedUpdatedAt, typeof msg.clock === \"number\" ? msg.clock : 0);\r\n notify(name);\r\n broadcastSync(name);\r\n }\r\n }\r\n return;\r\n }\r\n const normalizedIncoming = normalizeIncomingState(name, msg.data);\r\n if (normalizedIncoming === null) return;\r\n setStoreValue(name, normalizedIncoming);\r\n acceptIncomingSyncVersion(\r\n name,\r\n typeof msg.updatedAt === \"number\" ? msg.updatedAt : Date.now(),\r\n typeof msg.clock === \"number\" ? msg.clock : 0,\r\n typeof msg.source === \"string\" ? msg.source : \"\"\r\n );\r\n notify(name);\r\n };\r\n\r\n if (typeof window !== \"undefined\" && typeof window.addEventListener === \"function\") {\r\n syncWindowCleanup[name]?.();\r\n const hostWindow = window;\r\n const requestLatest = () => {\r\n requestSyncSnapshot({\r\n name,\r\n syncChannels,\r\n instanceId,\r\n authToken: expectedToken,\r\n reportStoreError,\r\n });\r\n };\r\n hostWindow.addEventListener(\"focus\", requestLatest);\r\n hostWindow.addEventListener(\"online\", requestLatest);\r\n syncWindowCleanup[name] = () => {\r\n hostWindow.removeEventListener(\"focus\", requestLatest);\r\n hostWindow.removeEventListener(\"online\", requestLatest);\r\n };\r\n }\r\n\r\n queueMicrotask(() => {\r\n requestSyncSnapshot({\r\n name,\r\n syncChannels,\r\n instanceId,\r\n authToken: expectedToken,\r\n reportStoreError,\r\n });\r\n });\r\n } catch (e) {\r\n warn(`Failed to setup sync for \"${name}\": ${(e as { message?: string })?.message || e}`);\r\n }\r\n};\r\n\r\nexport const broadcastSync = ({\r\n name,\r\n syncOption,\r\n syncChannels,\r\n syncClocks,\r\n instanceId,\r\n updatedAt,\r\n data,\r\n hashState,\r\n reportStoreError,\r\n}: {\r\n name: string;\r\n syncOption?: boolean | SyncOptions;\r\n syncChannels: SyncChannels;\r\n syncClocks: SyncClocks;\r\n instanceId: string;\r\n updatedAt: string | number;\r\n data: StoreValue;\r\n hashState: (value: unknown) => number;\r\n reportStoreError: (name: string, message: string) => void;\r\n}): void => {\r\n const channel = syncChannels[name];\r\n if (!channel) return;\r\n try {\r\n const checksumMode = typeof syncOption === \"object\" && syncOption.checksum === \"none\" ? \"none\" : \"hash\";\r\n const payload: SyncMessage = {\r\n v: SYNC_PROTOCOL_VERSION,\r\n protocol: SYNC_PROTOCOL_VERSION,\r\n type: \"sync-state\",\r\n source: instanceId,\r\n name,\r\n clock: syncClocks[name] ?? 0,\r\n updatedAt: resolveUpdatedAtMs({ value: updatedAt, fallbackMs: Date.now() }),\r\n data,\r\n checksum: checksumMode === \"hash\" ? hashState(data) : null,\r\n };\r\n if (typeof syncOption === \"object\" && syncOption.authToken) {\r\n payload.token = syncOption.authToken;\r\n }\r\n if (typeof syncOption === \"object\" && typeof syncOption.sign === \"function\") {\r\n try {\r\n const auth = syncOption.sign(payload);\r\n if (auth && typeof (auth as { then?: unknown }).then === \"function\") {\r\n reportStoreError(\r\n name,\r\n `Sync signer for \"${name}\" returned a Promise. \"sign\" must be synchronous.`\r\n );\r\n return;\r\n }\r\n if (auth !== undefined) payload.auth = auth;\r\n } catch (err) {\r\n reportStoreError(\r\n name,\r\n `Failed to sign sync payload for \"${name}\": ${(err as { message?: string })?.message ?? err}`\r\n );\r\n return;\r\n }\r\n }\r\n const maxPayloadBytes = typeof syncOption === \"object\" && typeof syncOption.maxPayloadBytes === \"number\"\r\n ? syncOption.maxPayloadBytes\r\n : 64 * 1024;\r\n const payloadSize = byteLength(JSON.stringify(payload));\r\n\r\n if (payloadSize > maxPayloadBytes) {\r\n reportStoreError(\r\n name,\r\n `Sync payload for \"${name}\" exceeds ${maxPayloadBytes} bytes (${payloadSize} bytes). Skipping BroadcastChannel sync.`\r\n );\r\n return;\r\n }\r\n\r\n channel.postMessage(payload);\r\n } catch (err) {\r\n reportStoreError(name, `Failed to broadcast sync for \"${name}\": ${(err as { message?: string })?.message ?? err}`);\r\n }\r\n};\r\n\r\nexport const createSyncFeatureRuntime = (): StoreFeatureRuntime => {\r\n const syncChannels: SyncChannels = Object.create(null);\r\n const syncClocks: SyncClocks = Object.create(null);\r\n const syncVersions: SyncVersions = Object.create(null);\r\n const syncWindowCleanup: SyncWindowCleanup = Object.create(null);\r\n const instanceId = `stroid_${Math.random().toString(16).slice(2)}`;\r\n\r\n const recordLocalVersion = (name: string, updatedAt: string | number): void => {\r\n syncVersions[name] = {\r\n clock: syncClocks[name] ?? 0,\r\n updatedAt: resolveUpdatedAtMs({ value: updatedAt, fallbackMs: Date.now() }),\r\n source: instanceId,\r\n };\r\n };\r\n\r\n const ensureLocalClock = (name: string, updatedAt: string | number): void => {\r\n bumpSyncClock(name, syncClocks);\r\n recordLocalVersion(name, updatedAt);\r\n };\r\n\r\n return {\r\n onStoreCreate(ctx) {\r\n if (!ctx.options.sync) return;\r\n\r\n setupSync({\r\n name: ctx.name,\r\n syncOption: ctx.options.sync,\r\n syncChannels,\r\n syncClocks,\r\n syncVersions,\r\n syncWindowCleanup,\r\n instanceId,\r\n getMeta: ctx.getMeta,\r\n getAcceptedSyncVersion: (name) => syncVersions[name],\r\n getStoreValue: (name) => ctx.getStoreValue(),\r\n hasStoreEntry: () => ctx.hasStore(),\r\n notify: () => ctx.notify(),\r\n validate: (name, next) => ctx.validate(next),\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n warn: ctx.warn,\r\n setStoreValue: (name, value) => ctx.setStoreValue(value),\r\n normalizeIncomingState: (name, value) => {\r\n const normalized = normalizeFeatureState({\r\n value,\r\n sanitize: ctx.sanitize,\r\n validate: ctx.validate,\r\n onSanitizeError: (err) => {\r\n ctx.reportStoreError(\r\n `Sanitize failed for incoming sync \"${name}\": ${(err as { message?: string })?.message ?? err}`\r\n );\r\n },\r\n });\r\n if (!normalized.ok) return null;\r\n return normalized.value;\r\n },\r\n acceptIncomingSyncVersion: (name, updatedAtMs, incomingClock, source) => {\r\n ctx.applyFeatureState(ctx.getStoreValue(), updatedAtMs);\r\n syncClocks[ctx.name] = Math.max(syncClocks[ctx.name] ?? 0, incomingClock);\r\n syncVersions[ctx.name] = {\r\n clock: incomingClock,\r\n updatedAt: updatedAtMs,\r\n source,\r\n };\r\n },\r\n resolveSyncVersion: (name, updatedAtMs, incomingClock) => {\r\n ctx.applyFeatureState(ctx.getStoreValue(), updatedAtMs);\r\n const resolvedClock = absorbSyncClock(ctx.name, incomingClock, syncClocks);\r\n syncVersions[ctx.name] = {\r\n clock: resolvedClock,\r\n updatedAt: updatedAtMs,\r\n source: instanceId,\r\n };\r\n return resolvedClock;\r\n },\r\n broadcastSync: () => {\r\n const meta = ctx.getMeta();\r\n if (!meta) return;\r\n broadcastSync({\r\n name: ctx.name,\r\n syncOption: ctx.options.sync,\r\n syncChannels,\r\n syncClocks,\r\n instanceId,\r\n updatedAt: meta.updatedAtMs ?? meta.updatedAt,\r\n data: ctx.getStoreValue(),\r\n hashState: ctx.hashState,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n });\r\n },\r\n });\r\n\r\n if (syncChannels[ctx.name]) {\r\n const meta = ctx.getMeta();\r\n recordLocalVersion(ctx.name, meta?.updatedAtMs ?? meta?.updatedAt ?? new Date().toISOString());\r\n }\r\n },\r\n\r\n onStoreWrite(ctx) {\r\n if (!ctx.options.sync) return;\r\n const meta = ctx.getMeta();\r\n if (!meta) return;\r\n ensureLocalClock(ctx.name, meta.updatedAtMs ?? meta.updatedAt);\r\n broadcastSync({\r\n name: ctx.name,\r\n syncOption: ctx.options.sync,\r\n syncChannels,\r\n syncClocks,\r\n instanceId,\r\n updatedAt: meta.updatedAtMs ?? meta.updatedAt,\r\n data: ctx.next,\r\n hashState: ctx.hashState,\r\n reportStoreError: (name, message) => ctx.reportStoreError(message),\r\n });\r\n },\r\n\r\n beforeStoreDelete(ctx) {\r\n closeSyncResources({\r\n name: ctx.name,\r\n syncChannels,\r\n syncWindowCleanup,\r\n syncClocks,\r\n syncVersions,\r\n });\r\n },\r\n\r\n resetAll() {\r\n cleanupAllSyncResources({\r\n syncChannels,\r\n syncWindowCleanup,\r\n });\r\n Object.keys(syncChannels).forEach((key) => delete syncChannels[key]);\r\n Object.keys(syncClocks).forEach((key) => delete syncClocks[key]);\r\n Object.keys(syncVersions).forEach((key) => delete syncVersions[key]);\r\n Object.keys(syncWindowCleanup).forEach((key) => delete syncWindowCleanup[key]);\r\n insecureSyncWarned.clear();\r\n signerVerifyWarned.clear();\r\n },\r\n };\r\n};\r\n\r\nexport const registerSyncFeature = (): void => {\r\n if (_registered) return;\r\n _registered = true;\r\n registerStoreFeature(\"sync\", createSyncFeatureRuntime);\r\n};\r\n\r\n\r\n","/**\r\n * @module install\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for install.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { registerPersistFeature } from \"./features/persist.js\";\r\nimport { registerSyncFeature } from \"./features/sync.js\";\r\nimport { registerDevtoolsFeature } from \"./features/devtools.js\";\r\n\r\nexport const installPersist = (): void => {\r\n registerPersistFeature();\r\n};\r\n\r\nexport const installSync = (): void => {\r\n registerSyncFeature();\r\n};\r\n\r\nexport const installDevtools = (): void => {\r\n registerDevtoolsFeature();\r\n};\r\n\r\nexport const installAllFeatures = (): void => {\r\n installPersist();\r\n installSync();\r\n installDevtools();\r\n};\r\n\r\n\r\n","/**\r\n * @module sync\r\n *\r\n * LAYER: Public API\r\n * OWNS: Module-level behavior and exports for sync.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { installSync } from \"./install.js\";\r\n\r\ninstallSync();\r\n\r\nexport { installSync };\r\n\r\n\r\n"]}
package/dist/sync.d.cts DELETED
@@ -1 +0,0 @@
1
- export { installSync_alias_1 as installSync } from './_tsup-dts-rollup.cjs';
package/dist/testing.cjs DELETED
@@ -1,24 +0,0 @@
1
- 'use strict';var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var bt=new Map,O=(e,t,r=0)=>{!e||typeof t!="function"||bt.set(e,{name:e,order:r,fn:t});},wt=()=>{Array.from(bt.values()).sort((t,r)=>t.order!==r.order?t.order-r.order:t.name.localeCompare(r.name,"en")).forEach(t=>t.fn());};var vt=()=>({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,noSignalWarned:new Set,shapeWarned:new Set,autoCreateWarned:new Set,mutableResultWarned:new Set,cleanupSubs:Object.create(null),storeCleanupFns: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}}),Oe=e=>{Object.values(e.revalidateHandlers).forEach(t=>{try{t();}catch{}}),Object.values(e.cleanupSubs).forEach(t=>{try{t();}catch{}}),Object.values(e.storeCleanupFns).forEach(t=>{t.forEach(r=>{try{r();}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.cleanupSubs).forEach(t=>delete e.cleanupSubs[t]),Object.keys(e.storeCleanupFns).forEach(t=>delete e.storeCleanupFns[t]),Object.keys(e.revalidateHandlers).forEach(t=>delete e.revalidateHandlers[t]),e.revalidateKeys.clear(),e.noSignalWarned.clear(),e.shapeWarned.clear(),e.autoCreateWarned.clear(),e.mutableResultWarned.clear(),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 Le=new Map,$r=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,kt,qe=e=>(kt||$r||e).replace(/\.ts(\?|$)/,".js$1"),Se=qe(new URL("./store.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('testing.cjs', document.baseURI).href))).href);var _r=()=>{kt=void 0,Le.clear();};O("registry.scope-override",_r,110);var Ir=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],notifyScheduled:false,batchDepth:0}),Wr=e=>{e.pendingNotifications.clear(),e.pendingBuffer.length=0,e.orderedNames.length=0,e.notifyScheduled=false,e.batchDepth=0;},zr=()=>({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:{depth:0,pending:[],stagedValues:new Map,snapshotCache:new Map,failed:false,error:void 0},async:vt(),notify:Ir()}),ye=e=>{let t=qe(e),r=Le.get(t);if(r)return r;let n=zr();return Le.set(t,n),n},ie=(e,t)=>Object.prototype.hasOwnProperty.call(e.stores,t),xt=(e,t)=>e.deletingStores.has(t),Rt=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,Wr(e.notify),Oe(e.async);};var Ue=()=>null;var De=(e,t)=>t(),B=e=>e||ye(Se);var Lr={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}`));}},Ct={logSink:Lr,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",defaultSnapshotMode:"deep",strictAsyncUsageErrors:false,middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0},Ge=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,defaultSnapshotMode:e.defaultSnapshotMode,strictAsyncUsageErrors:e.strictAsyncUsageErrors,middleware:[...e.middleware],allowUntrustedHydration:e.allowUntrustedHydration,mutatorProduce:e.mutatorProduce}),Ke=new WeakMap,Mt=Ge(Ct),Br=e=>{let t=Ke.get(e);return t||(t=Ge(Mt),Ke.set(e,t)),t};var x=()=>Br(B());var Kr=()=>{Ke=new WeakMap,Mt=Ge(Ct);};O("config.reset",Kr,90);var Et=()=>x().namespace;var Gr=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,Yr=typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('testing.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0,Ft=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,Xr="production",Jr=Gr??Yr??Xr,me=typeof Ft=="boolean"?Ft:Jr!=="production",R=()=>me,Ye=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},Qr=(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));},Zr=(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},P=(e,t)=>{if((x().logSink.critical??Qr)(e,t),x().assertRuntime)throw new Error(e)},b=(e,t)=>{if(!me)return;if((x().logSink.warn??Ye)(e,t),x().assertRuntime)throw new Error(e)},z=(e,t)=>{if((x().logSink.warn??Ye)(e,t),x().assertRuntime)throw new Error(e)},_=(e,t)=>{if(me&&(x().logSink.warn??Ye)(e,t),P(e,t),x().assertRuntime)throw new Error(e)},H=(e,t)=>{if(!me)return;(x().logSink.log??Zr)(e,t);},At=()=>`Functions cannot be stored in stroid.
2
- Store data only - handle functions outside the store.`,Ot=()=>`Map/Set detected. stroid converts these to plain objects.
3
- Use arrays or plain objects for best results.`,Dt=()=>`Date object detected. stroid stores it as ISO string.
4
- Use new Date(value) to convert back when reading.`,Tt=()=>"Date detected; stored as ISO string. Use new Date(value) when reading.",Pt=()=>"Map detected; converting to plain object.",Nt=()=>"Set detected; converting to array.",Vt=(e,t,r)=>`Path depth of ${e} exceeded maximum of ${t}.
5
- "${r.join(".")}"
6
- This is a data design issue. Split into separate stores:
7
- createStore("${r[0]}", ...) and createStore("${r[1]}", ...)`,jt=(e,t)=>`Deep nesting detected (${e} levels): "${t.join(".")}"
8
- Consider splitting into separate stores for better readability.`;var $t=e=>`Store name must be a non-empty string. Got: ${JSON.stringify(e)}`,_t=e=>`Store name "${e}" contains spaces.
9
- Use camelCase or kebab-case: "userName" or "user-name"`,It=e=>`Store name "${e}" is not allowed.
10
- Reserved names: "__proto__", "constructor", "prototype".`,en=128,tn=(e,t)=>Math.abs(e.length-t.length)>2?false:Math.max(e.length,t.length)<=en,rn=(e,t)=>{if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let r=Array.from({length:e.length+1},(s,o)=>o),n=new Array(e.length+1);for(let s=1;s<=t.length;s++){n[0]=s;for(let o=1;o<=e.length;o++)n[o]=t[s-1]===e[o-1]?r[o-1]:Math.min(r[o-1],n[o-1],r[o])+1;[r,n]=[n,r];}return r[e.length]},Xe=(e,t)=>{let r=t.find(n=>{let s=n.toLowerCase(),o=e.toLowerCase();return s.includes(o)||o.includes(s)||tn(s,o)&&rn(s,o)<=2});if(r){b(`Store "${e}" not found. Did you mean "${r}"?`);return}_(`Store "${e}" not found.
11
- Available stores: [${t.join(", ")}]
12
- Call createStore("${e}", data) first.`);};var W=new Set(["__proto__","constructor","prototype"]),Qe=(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,o=s?.details?.[0]?.message||s?.message||r.message||e.errors;if(o)return {ok:!1,error:o};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 K=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,Wt=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},be=e=>{let t=K(e);return t==="function"?(_(At()),false):t==="map"||t==="set"?(b(Ot()),true):(t==="date"&&b(Dt()),true)},Je=(e,t)=>{let r=Wt(e);if(r)throw new Error(`${r} values are not supported`);let n=K(e);if(n==="number"){if(!Number.isFinite(e))throw new Error("Non-finite numbers are not supported");return true}if(n==="bigint")throw new Error("BigInt values are not supported");if(n==="symbol")throw new Error("Symbol values are not supported");if(n==="date"||n==="map"||n==="set")return false;if(n==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let s=Object.keys(e);for(let o of s){let i=Number(o);if(!Number.isInteger(i))return false}for(let o=0;o<e.length;o+=1)if(o in e&&!Je(e[o],t))return false;return true}if(n==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");if(t.add(e),Object.getOwnPropertySymbols(e).length>0)return false;let s=Object.getOwnPropertyDescriptors(e);for(let[o,i]of Object.entries(s)){if(!i.enumerable||W.has(o))return false;if("get"in i||"set"in i)throw new Error(`Accessor properties are not supported during sanitize ("${o}")`);if(!Je(i.value,t))return false}return true}return true},Ze=e=>Je(e,new WeakSet),he=(e,t)=>{let r=Wt(e);if(r)throw new Error(`${r} values are not supported`);let n=K(e);if(n==="number"){if(!Number.isFinite(e))throw new Error("Non-finite numbers are not supported");return e}if(n==="bigint")throw new Error("BigInt values are not supported");if(n==="symbol")throw new Error("Symbol values are not supported");if(n==="date")return R()&&b(Tt()),e.toISOString();if(n==="map"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e),R()&&b(Pt());let s={};for(let[o,i]of e){if(typeof o!="string")throw new Error("Map keys must be strings to remain JSON-safe");s[String(o)]=he(i,t);}return s}if(n==="set"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),R()&&b(Nt()),Array.from(e,s=>he(s,t))}if(n==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let s={},o=Object.getOwnPropertyDescriptors(e);for(let[i,c]of Object.entries(o))if(c.enumerable&&!W.has(i)){if("get"in c||"set"in c)throw new Error(`Accessor properties are not supported during sanitize ("${i}")`);s[i]=he(c.value,t);}return s}if(n==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),e.map(s=>he(s,t))}return e},Q=e=>he(e,new WeakSet),et=e=>typeof e!="string"||e.trim()===""?(_($t(e)),false):W.has(e)?(_(It(e)),false):e.includes(" ")?(_(_t(e)),false):true;var tt=null,nn=()=>{if(tt)return tt;let e,t=[];for(let r=0;r<256;r++){e=r;for(let n=0;n<8;n++)e=e&1?3988292384^e>>>1:e>>>1;t[r]=e>>>0;}return tt=t,t},Ht=e=>{let t=nn(),r=-1;for(let n=0;n<e.length;n++)r=r>>>0,r=r>>>8^t[(r^e.charCodeAt(n))&255];return (r^-1)>>>0},on=2166136261,sn=2654435761,an=1e5,G=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},Z=(e,t)=>{G(e,t.length);for(let r=0;r<t.length;r++)G(e,t.charCodeAt(r));},A=(e,t)=>{Z(e,t);},zt=(e,t)=>{if(Number.isNaN(t)){A(e,"NaN");return}if(!Number.isFinite(t)){A(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){A(e,"-0");return}let r=t|0;if(t===r){A(e,"int"),G(e,r);return}A(e,"num"),Z(e,String(t));},ae=(e,t)=>{if(e.nodes++>an){A(e,"[max]");return}if(t===null){A(e,"null");return}let r=typeof t;if(r==="string"){A(e,"string"),Z(e,t);return}if(r==="number"){A(e,"number"),zt(e,t);return}if(r==="boolean"){A(e,t?"true":"false");return}if(r==="undefined"){A(e,"undefined");return}if(r==="bigint"){A(e,"bigint"),Z(e,t.toString());return}if(r==="symbol"){A(e,"symbol");let d=t;Z(e,Symbol.keyFor(d)??d.description??String(d));return}if(r==="function"){A(e,"function"),Z(e,t.name||"anonymous");return}let n=t,s=e.seen.get(n);if(s!==void 0){A(e,"ref"),G(e,s);return}let o=e.nextId++;if(e.seen.set(n,o),Array.isArray(n)){A(e,"array"),G(e,n.length);for(let d=0;d<n.length;d++)Object.prototype.hasOwnProperty.call(n,d)?ae(e,n[d]):A(e,"hole");return}if(n instanceof Date){A(e,"date"),zt(e,n.getTime());return}if(n instanceof Map){A(e,"map"),G(e,n.size),n.forEach((d,g)=>{ae(e,g),ae(e,d);});return}if(n instanceof Set){A(e,"set"),G(e,n.size),n.forEach(d=>{ae(e,d);});return}A(e,"object");let i=Object.getOwnPropertyDescriptors(n),c=[];Object.entries(i).forEach(([d,g])=>{g?.enumerable&&(W.has(d)||"get"in g||"set"in g||c.push([d,g]));}),G(e,c.length);for(let[d,g]of c)Z(e,d),ae(e,g.value);},we=e=>{if(typeof e=="string")return Ht(JSON.stringify(e));let t={h1:on,h2:sn,seen:new WeakMap,nextId:1,nodes:0};ae(t,e);let r=t.h1>>>0,n=t.h2>>>0;return r^=r>>>16,r=Math.imul(r,2246822507),r^=r>>>13,r=Math.imul(r,3266489909),r^=r>>>16,n^=n>>>16,n=Math.imul(n,668265261),n^=n>>>15,n=Math.imul(n,374761393),n^=n>>>16,(r&2097151)*4294967296+(n>>>0)};var cn=typeof globalThis<"u"&&typeof globalThis.structuredClone=="function",rt=e=>{if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map)return new Map(e);if(e instanceof Set)return new Set(e);if(Array.isArray(e))return e.slice();let t={},r=Object.getOwnPropertyDescriptors(e);return Object.entries(r).forEach(([n,s])=>{s.enumerable&&(W.has(n)||"get"in s||"set"in s||(t[n]=s.value));}),t},ce=(e,t=new WeakMap)=>{if(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 o=new Map;return t.set(e,o),e.forEach((i,c)=>{o.set(ce(c,t),ce(i,t));}),o}if(e instanceof Set){let o=new Set;return t.set(e,o),e.forEach(i=>{o.add(ce(i,t));}),o}if(Array.isArray(e)){let o=[];return t.set(e,o),e.forEach((i,c)=>{o[c]=ce(i,t);}),o}let r=globalThis?.WeakRef;if(r&&e instanceof r)return z("WeakRef values cannot be deep-cloned. Returning the original reference."),e;let n={};t.set(e,n);let s;try{s=Object.getOwnPropertyDescriptors(e);}catch{return z("deepClone failed to read object descriptors (possible Proxy or host object). Returning the original reference."),e}return Object.entries(s).forEach(([o,i])=>{!i.enumerable||W.has(o)||"get"in i||"set"in i||(n[o]=ce(i.value,t));}),n},N=e=>{try{if(cn)return structuredClone(e)}catch{}return ce(e)};var Lt=10,un=5,ln=e=>{let t=[],r="",n=false;for(let s of e){if(n){r+=s,n=false;continue}if(s==="\\"){n=true;continue}if(s==="."){t.push(r),r="";continue}r+=s;}return n&&(r+="\\"),t.push(r),t},ve=e=>Array.isArray(e)?[...e]:typeof e=="string"&&!e.includes(".")?[e]:typeof e=="string"?ln(e):[String(e)],nt=e=>{let t=ve(e),r=t.length;return r>Lt?(_(Vt(r,Lt,t)),false):(r>un&&b(jt(r,t)),true)};var ot=(e,t,r)=>{let n=ve(t);if(n.length===0)return e;for(let o of n)if(W.has(o))return P(`Blocked forbidden path segment "${String(o)}" in setStore path "${n.join(".")}".`),e;let s=(o,i)=>{let c=n[i],d=i===n.length-1;if(Array.isArray(o)){let g=Number(c);if(!Number.isInteger(g))return o;let S=[...o];return d?(S[g]=r,S):(S[g]=s(S[g],i+1),S)}if(o&&typeof o=="object"){if(W.has(c))return P(`Blocked unsafe path segment "${String(c)}" while setting "${n.join(".")}".`),o;let g={...o};return d?(g[c]=r,g):(g[c]=s(g[c],i+1),g)}if(o==null&&!d){let g=Number.isInteger(Number(c)),S=g?[]:{};if(g){let w=S,p=Number(c);return w[p]=s(void 0,i+1),w}return S[c]=s(void 0,i+1),S}return d?r:o};return s(e,0)};var it=new Set,dn=()=>{it.clear();};O("options.legacy-warnings",dn,30);var Te=(()=>{let e=new Map;return {getItem:t=>e.has(t)?e.get(t):null,setItem:(t,r)=>{e.set(t,r);},removeItem:t=>{e.delete(t);},type:"memory"}})(),st=e=>{try{return typeof window>"u"?Te:e==="session"||e==="sessionStorage"?window.sessionStorage??Te:window.localStorage??Te}catch{return Te}},ke=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ue=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),qt=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}},fn=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",Bt=e=>{try{e[fn]=!0;}catch{}return e},pn={allowSSRGlobalStore:'scope: "global"',schema:"validate",validator:"validate",version:"persist.version",migrations:"persist.migrations",historyLimit:"devtools.historyLimit",redactor:"devtools.redactor",middleware:"lifecycle.middleware",onCreate:"lifecycle.onCreate",onSet:"lifecycle.onSet",onReset:"lifecycle.onReset",onDelete:"lifecycle.onDelete"},gn=(e,t)=>{if(!e)return null;let r={key:`stroid_${t}`,serialize:JSON.stringify,deserialize:JSON.parse,encrypt:Bt(S=>S),decrypt:Bt(S=>S),allowPlaintext:false,sensitiveData:false,onMigrationFail:"reset",checksum:"hash"};if(e===true)return {driver:st("localStorage"),...r};if(typeof e=="string")return {driver:st(e),...r};let n=e.encrypt||r.encrypt,s=e.decrypt||r.decrypt,o=e.encryptAsync,i=e.decryptAsync,c=e.sensitiveData===true,d=e.allowPlaintext===true,g=e.checksum==="sha256"?"sha256":e.checksum==="none"?"none":"hash";if(o&&!i||!o&&i)throw new Error(`[stroid/persist] Store "${t}" must provide both encryptAsync and decryptAsync when using async crypto.`);if(c&&qt(n)&&!o)throw new Error(`[stroid/persist] Store "${t}" is marked sensitiveData but is configured to persist in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`);return {driver:e.driver||e.storage||st("localStorage"),key:e.key||r.key,serialize:e.serialize||r.serialize,deserialize:e.deserialize||r.deserialize,encrypt:n,decrypt:s,encryptAsync:o,decryptAsync:i,allowPlaintext:d,sensitiveData:c,checksum:g,onMigrationFail:e.onMigrationFail||"reset",onStorageCleared:e.onStorageCleared}},Ut=e=>{if(!ke(e))return [];let t=[];return Object.entries(pn).forEach(([r,n])=>{ue(e,r)&&(it.has(r)||(it.add(r),t.push(`createStore option "${r}" is deprecated. Use "${n}" instead.`)));}),t},Kt=(e={},t,r="deep")=>{let n=e.scope??"request",s=e.lazy===true,o=e.pathCreate===true,i=ke(e.lifecycle)?e.lifecycle:void 0,c=ke(e.persist)?e.persist:void 0,d=ke(e.devtools)?e.devtools:void 0,g=e.validate??e.validator??e.schema,S=e.snapshot==="shallow"||e.snapshot==="ref"?e.snapshot:r==="shallow"||r==="ref"?r:"deep",w=ke(e.features)?{...e.features}:void 0,p=ue(e,"persist"),v=ue(e,"sync"),u=ue(e,"devtools")||ue(e,"historyLimit")||ue(e,"redactor"),a=n==="global"?true:e.allowSSRGlobalStore??false,{persist:f=false,devtools:l=false,onError:m,sync:k}=e;if(c?.sensitiveData===true){let M=c.encrypt,F=c.encryptAsync;if((!M||qt(M))&&!F)throw new Error(`[stroid/persist] Store "${t}" is marked sensitiveData but is configured to persist in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`)}return {scope:n,lazy:s,pathCreate:o,persist:n==="temp"&&!p?null:gn(f,t),devtools:n==="temp"&&!u?false:typeof l=="boolean"?l:d?.enabled??true,middleware:i?.middleware??e.middleware??[],onSet:i?.onSet??e.onSet,onReset:i?.onReset??e.onReset,onDelete:i?.onDelete??e.onDelete,onCreate:i?.onCreate??e.onCreate,onError:m,validate:g,migrations:c?.migrations??e.migrations??{},version:c?.version??e.version??1,redactor:n==="temp"&&!u?void 0:d?.redactor??e.redactor,historyLimit:n==="temp"&&!u?0:d?.historyLimit??e.historyLimit??50,sync:n==="temp"&&!v?false:k??false,features:w,allowSSRGlobalStore:a,snapshot:S,explicitPersist:p,explicitSync:v,explicitDevtools:u}};var Gt=e=>{if(typeof e!="object"||e===null||e.$$typeof||typeof window<"u"&&e instanceof Element||e.constructor&&e.constructor.name!=="Object"&&e.constructor.name!=="Array")return e;let t=[e],r=new WeakSet;for(;t.length>0;){let n=t.pop();if(!r.has(n)){r.add(n),Object.isFrozen(n)||Object.freeze(n);for(let s of Object.keys(n)){let o=n[s];typeof o=="object"&&o!==null&&!r.has(o)&&t.push(o);}}}return e};var at=new Map;var Pe=e=>at.has(e),ct=e=>at.get(e),xe=()=>Array.from(at.keys());var Ne=Symbol("stroid.middleware.abort"),Xt=({name:e,payload:t,middlewares:r,reportIssue:n,warn:s})=>{if(!Array.isArray(r)||r.length===0)return t.next;let o=new WeakSet,i=N(t.next);for(let c of r){if(typeof c!="function")continue;let d,g=i;try{d=c({action:t.action,name:e,prev:t.prev,next:g,path:t.path});}catch(S){let w=`Middleware for "${e}" failed: ${S?.message??S}`;return n(w,"dev"),Ne}if(d&&typeof d.then=="function"){let S=`Middleware for "${e}" must be synchronous. Promise-returning middleware is not supported.`;return n(S,"dev"),Ne}d===void 0?(R()&&!o.has(c)&&(o.add(c),s(`Middleware for "${e}" returned undefined; treating as pass-through. Return the new state to override.`)),i=g):i=d;}return i},Ve=({name:e,label:t,fn:r,args:n,reportIssue:s})=>{if(typeof r=="function")try{r(...n);}catch(o){let i=`${t} for "${e}" failed: ${o?.message??o}`;s(i,"always");}};var ee=(e,t={})=>{let{severity:r="warn",visibility:n="dev",onError:s}=t;if(s?.(e),r==="critical"){n==="dev"&&b(e),P(e);return}if(n==="always"){z(e);return}b(e);};var je=null,Jt=e=>{je=e;},Qt=e=>je?je(e):[];O("computed.order-resolver",()=>{je=null;},105);var Zt=()=>B(ye(Se)),er=()=>Zt().computedEntries,yn=()=>Zt().computedDependents;var tr=e=>Object.prototype.hasOwnProperty.call(er(),e);var mn=e=>{let t=er(),r=yn(),n=new Set,s=[...e];for(;s.length>0;){let S=s.shift(),w=r[S];if(w)for(let p of w)n.has(p)||(n.add(p),s.push(p));}if(n.size===0)return [];let o=S=>{let w=t[S];if(w)for(let p of w.deps)t[p]&&(n.has(p)||(n.add(p),o(p)));};Array.from(n).forEach(S=>o(S));let i=new Map,c=new Map;for(let S of n){let w=t[S];if(!w)continue;let p=0;for(let v of w.deps)n.has(v)&&(p++,c.has(v)||c.set(v,[]),c.get(v).push(S));i.set(S,p);}let d=[];for(let[S,w]of i)w===0&&d.push(S);d.sort();let g=[];for(;d.length>0;){let S=d.shift();g.push(S);let w=c.get(S)??[];for(let p of w){let v=(i.get(p)??1)-1;if(i.set(p,v),v===0){let u=d.findIndex(a=>a>p);u===-1?d.push(p):d.splice(u,0,p);}}}return g};Jt(mn);var $e=new Set,nr=e=>e?$e.has(e):$e.size>0,or=e=>{e&&$e.add(e);},hn=()=>{$e.clear();};O("ssr.warnings",hn,60);var rr=new Set,bn=e=>{let t=Et();return !t||e.includes("::")?e:(R()&&!rr.has(e)&&(rr.add(e),b(`Namespace "${t}" is active; treating store "${e}" as "${t}::${e}". Consider using namespace("${t}").create("...") to be explicit.`)),`${t}::${e}`)},ut=e=>bn(typeof e=="string"?e:e.name),sr=e=>X(e)&&!cr(e)?true:(Xe(e,Object.keys(T)),false),ir=(e,t,r={})=>{ee(t,{...r,onError:h[e]?.options?.onError});},ar=(e,t,r={})=>{ee(e,{...r,onError:t});},le=(e,t,r="dev")=>{ir(e,t,{severity:"warn",visibility:r});},wn=(e,t,r="dev")=>{ar(e,t,{severity:"warn",visibility:r});},Y=(e,t)=>ir(e,t,{severity:"critical",visibility:"always"}),Re=(e,t)=>ar(e,t,{severity:"critical",visibility:"always"}),_e=(e,t,r)=>{let n=`Store "${e}" requested ${t} support, but "${t}" is not registered.
13
- Import "stroid/${t}" before calling createStore("${e}", ...).`;if(wn(n,r,"always"),x().strictMissingFeatures)throw new Error(n)};var Ce=e=>(e??B()).transaction,vn=e=>e instanceof Error?e:typeof e=="string"?new Error(e):e&&typeof e?.message=="string"?new Error(e.message):new Error("setStoreBatch aborted");var C=()=>Ce().depth>0,V=(e,t)=>{let r=Ce(t);r.failed=true,r.error||(r.error=vn(e));},Ie=e=>{let t=B();Ce(t).pending.push(()=>De(t,e));},We=(e,t)=>{let r=Ce();r.stagedValues.set(e,t),r.snapshotCache.delete(e);},te=e=>{let t=Ce();return t.stagedValues.has(e)?{has:true,value:t.stagedValues.get(e)}:{has:false,value:void 0}};var ur=new WeakMap,lr=new WeakMap,kn=500,xn="",Me=e=>{let t=ur.get(e);return t||(t=new Map,ur.set(e,t)),t},lt=e=>{let t=lr.get(e);return t||(t=new Map,lr.set(e,t)),t},Rn=(e,t)=>{let r=lt(e),n=r.get(t);return n||(n=new Map,r.set(t,n)),n},dr=(e,t,r)=>{for(e.has(t)&&e.delete(t),e.set(t,r);e.size>kn;){let n=e.keys().next().value;if(!n)break;let s=e.get(n);e.delete(n),s?.node.verdicts&&(s.node.verdicts.delete(s.type),s.node.verdicts.size===0&&delete s.node.verdicts);}};new Proxy(new Map,{get:(e,t)=>{let r=Me(j());if(t==="size")return r.size;if(t===Symbol.iterator)return r[Symbol.iterator].bind(r);let n=r[t];return typeof n=="function"?n.bind(r):n},set:(e,t,r)=>(Me(j())[t]=r,true)});var fr=(e,t,r,n)=>{let s=h[e];if(!s)return {ok:true};let o=ve(r);if(o.length===0)return {ok:true};let i=K(n),c=j(),d=Me(c),g=Rn(c,e),S=o.join(xn),w=d.get(e);w||(w={children:new Map},d.set(e,w));let p=w;for(let m of o){let k=p.children.get(m);k||(k={children:new Map},p.children.set(m,k)),p=k;}let v=p.verdicts?.get(i);if(v){let m=`${S}|${i}`;return dr(g,m,{node:p,type:i}),v}let u=s.options?.pathCreate===true,a=t,f={ok:true};for(let m=0;m<o.length;m++){let k=o[m],M=m===o.length-1;if(a==null){let y=`Path "${o.join(".")}" is invalid for "${e}" - "${o.slice(0,m).join(".")||"root"}" is ${a===null?"null":"undefined"}.`;P(y),f={ok:false,reason:y};break}if(typeof a!="object"){let y=`Path "${o.join(".")}" is invalid for "${e}" - "${o.slice(0,m).join(".")||"root"}" is not an object.`;P(y),f={ok:false,reason:y};break}if(Array.isArray(a)){let y=Number(k);if(!Number.isInteger(y)||y<0){let E=`Path "${o.join(".")}" targets non-numeric index "${k}" on an array in "${e}".`;P(E),f={ok:false,reason:E};break}let D=a;if(y>=D.length){let E=`Path "${o.join(".")}" is invalid for "${e}" - index ${y} is out of bounds (length ${D.length}).`;P(E),f={ok:false,reason:E};break}if(M){let E=D[y];if(E!=null){let se=K(E);if(se!==i){let ge=`Type mismatch setting "${o.join(".")}" on "${e}": expected ${se}, received ${i}.`;P(ge),f={ok:false,reason:ge};break}}f={ok:true};break}a=D[y];continue}if(!Object.prototype.hasOwnProperty.call(a,k)){if(u&&M){f={ok:true};break}let y=`Path "${o.join(".")}" is invalid for "${e}" - unknown key "${k}" at "${o.slice(0,m).join(".")||"root"}".`;P(y),f={ok:false,reason:y};break}if(M){let y=a[k];if(y!=null){let D=K(y);if(D!==i){let E=`Type mismatch setting "${o.join(".")}" on "${e}": expected ${D}, received ${i}.`;P(E),f={ok:false,reason:E};break}}f={ok:true};break}a=a[k];}p.verdicts||(p.verdicts=new Map);let l=p.verdicts.has(i);if(p.verdicts.set(i,f),!l){let m=`${S}|${i}`;dr(g,m,{node:p,type:i});}return f},fe=(e,t,r,n)=>{try{return n?.reuseInput&&Ze(t)?{ok:!0,value:t}:{ok:!0,value:Q(t)}}catch(s){let o=`Sanitize failed for "${e}": ${s?.message??s}`;return h[e]?.options?.onError?.(o),r?.(o),b(o),{ok:false}}},Cn=(e,t)=>{let r=new Set,n=h[e]?.options?.onError;return typeof n=="function"&&r.add(n),typeof t=="function"&&r.add(t),r},dt=(e,t,r,n)=>{if(!r)return {ok:true,value:t};let s=Cn(e,n),o=(c,d)=>{s.forEach(g=>g(c)),d==="critical"?P(c):b(c);};if(typeof r=="function")try{let c=r(t);return c===!1?(o(`Validation blocked update for "${e}"`,"warn"),{ok:!1}):{ok:!0,value:c===!0?t:c}}catch(c){return o(`Validation for "${e}" failed: ${c?.message??c}`,"critical"),{ok:false}}let i=Qe(r,t);return i.ok?{ok:true,value:i.data??t}:(o(`Validation failed for "${e}": ${i.error}`,"critical"),{ok:false})},ze=(e,t,r,n,s)=>{let o=fe(e,t,n,s);if(!o.ok)return {ok:false};let i=dt(e,o.value,r,n);return i.ok?{ok:true,value:i.value}:{ok:false}},J=e=>{let t=j();Me(t).delete(e),lt(t).delete(e);},Mn=()=>{let e=j();Me(e).clear(),lt(e).clear();};O("validation.path-cache",Mn,50);pr(J);var ft=e=>{if((C()?te(e):{has:false}).has||T[e]!==void 0)return true;let r=de[e];if(!r)return true;try{let n=r(),s=fe(e,n,h[e]?.options?.onError);if(!s.ok)return !1;let o=h[e]?.options?.validate,i=ze(e,s.value,o,h[e]?.options?.onError);if(!i.ok)return !1;if(C()){let c=i.value;We(e,c),Ie(()=>{U(e,c),q[e]=N(c),delete de[e],J(e);});}else U(e,i.value),q[e]=N(i.value),delete de[e],J(e);return !0}catch(n){return Y(e,`Lazy initializer for "${e}" failed: ${n?.message??n}`),false}};var pt=e=>({name:e});var En=()=>j().computedCleanups;var gr=e=>{let t=En(),r=t.get(e);if(!r){R()&&b(`deleteComputed("${e}") -- not found`);return}r(),t.delete(e);};var Sr=e=>{let t=e.stores,r=e.subscribers,n=e.initialStates,s=e.initialFactories,o=e.metaEntries,i=e.snapshotCache,c=e.featureRuntimes,d=e.deletingStores,g=(a,f)=>{ee(f,{onError:o[a]?.options?.onError,severity:"warn",visibility:"dev"});},S=({name:a,prev:f,options:l,initialState:m,getMeta:k,getStoreValue:M,hasStore:F})=>({name:a,options:l,prev:f,getMeta:k,getStoreValue:M,getAllStores:()=>t,getInitialState:()=>m,hasStore:F,setStoreValue:()=>{},applyFeatureState:()=>{},notify:()=>{},reportStoreError:y=>{ee(y,{onError:l.onError,severity:"warn",visibility:"dev"});},warn:b,log:H,hashState:we,deepClone:N,sanitize:Q,validate:()=>({ok:true,value:f}),isDev:R}),w=({name:a,prev:f,options:l,initialState:m,phase:k})=>{let M=S({name:a,prev:f,options:l,initialState:m,getMeta:()=>o[a],getStoreValue:()=>t[a],hasStore:()=>ie(e,a)}),F=S({name:a,prev:f,options:l,initialState:m,getMeta:()=>{},getStoreValue:()=>f,hasStore:()=>false});xe().forEach(y=>{let D=c.get(y);k==="before"?D?.beforeStoreDelete?.(M):D?.afterStoreDelete?.(F);});},p=a=>{if(!ie(e,a))return;let f=t[a],l=o[a].options,m=n[a],k=r[a];d.add(a);try{k?.forEach(y=>{try{y(null);}catch(D){b(`Subscriber for "${a}" threw during delete: ${D?.message??D}`);}}),Ve({name:a,label:"onDelete",fn:l.onDelete,args:[f],reportIssue:(y,D)=>{ee(y,{onError:l.onError,severity:"warn",visibility:D});}}),w({name:a,prev:f,options:l,initialState:m,phase:"before"}),delete t[a],delete r[a],delete n[a],delete s[a],delete o[a],delete i[a],tr(a)&&gr(a);let F=e.computedDependents[a];if(F)for(let y of F)b(`[stroid] source store "${a}" was deleted. Computed store "${y}" depends on it and will return stale data. Call deleteComputed("${y}") to clean up.`);w({name:a,prev:f,options:l,initialState:m,phase:"after"}),H(`Store "${a}" deleted`);}finally{d.delete(a);}};return {deleteExistingStore:p,clearAllStores:()=>{let a=[],l=0,m=Number.POSITIVE_INFINITY;for(;l<20;){let M=Object.keys(t);if(M.length===0)break;M.forEach(y=>{ie(e,y)&&(p(y),a.push(y));}),l+=1;let F=Object.keys(t).length;if(F===0||F>=m)break;m=F;}let k=Object.keys(t).length;return k>0?b(`clearAllStores stopped after ${l} pass${l===1?"":"es"}; ${k} store(s) still registered (likely recreated during deletion).`):b(`All stores cleared (${a.length} stores removed)`),a},clearStores:a=>{let f=Object.keys(t).filter(l=>a?a.endsWith("*")?l.startsWith(a.slice(0,-1)):l===a:true);return f.forEach(l=>p(l)),f},reportStoreError:g}};var Fn=Se,An=ye(Fn),hr=null,yr=new WeakSet,On=e=>{yr.has(e)||(yr.add(e),xe().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=ct(t);r&&e.featureRuntimes.set(t,r());}}));},I=()=>{let e=B(An);return On(e),e};var j=()=>I();function pr(e){hr=e;}var pe=e=>new Proxy(Object.create(null),{get:(t,r)=>e()[r],set:(t,r,n)=>(e()[r]=n,true),deleteProperty:(t,r)=>(delete e()[r],true),has:(t,r)=>r in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(t,r)=>{let n=Object.getOwnPropertyDescriptor(e(),r);if(n)return {...n,configurable:true}}}),Dn=e=>new Proxy(new Map,{get:(t,r)=>{let n=e();if(r==="size")return n.size;if(r===Symbol.iterator)return n[Symbol.iterator].bind(n);let s=n[r];return typeof s=="function"?s.bind(n):s},set:(t,r,n)=>(e()[r]=n,true)}),Tn=e=>new Proxy({},{get:(t,r)=>{let n=e(),s=n[r];return typeof s=="function"?s.bind(n):s},set:(t,r,n)=>(e()[r]=n,true)}),T=pe(()=>I().stores),re=pe(()=>I().subscribers),q=pe(()=>I().initialStates),de=pe(()=>I().initialFactories),h=pe(()=>I().metaEntries),Ee=pe(()=>I().snapshotCache),L=Dn(()=>I().featureRuntimes),mr=new WeakMap,Pn=e=>{let t=mr.get(e);return t||(t=Sr(e),mr.set(e,t)),t};Tn(()=>Pn(I()));var Vn=e=>{let t=L.get(e);if(t)return t;let r=ct(e);if(!r)return;let n=r();return L.set(e,n),n},jn=()=>{xe().forEach(e=>{Vn(e);});};jn();var X=e=>ie(I(),e),gt=e=>{if(C()){let r=te(e);if(r.has)return r.value}let t=Ue();return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:T[e]},U=(e,t)=>{let n=R()?Gt(t):t;T[e]=n;},br=(e,t,r=Date.now())=>{U(e,t),h[e]&&(h[e].updatedAt=new Date(r).toISOString(),h[e].updatedAtMs=r,h[e].updateCount++,hr?.(e));},$n=()=>{Rt(I());},_n=()=>{L.forEach(e=>{try{e.resetAll?.();}catch{}}),L.clear();};O("features.reset",_n,10);O("registries.clear",$n,20);var cr=e=>xt(I(),e);var wr=new WeakMap,vr=e=>{let t=wr.get(e);return t||(t=new Map,wr.set(e,t)),t},In=()=>{vr(j()).clear();};O("features.contexts",In,100);var kr=e=>{let t=j(),r=vr(t),n=r.get(e);if(n)return n;let s=h[e];if(!s)return b(`Internal feature context requested for "${e}" after metadata was cleared.`),null;let o={name:e,options:s.options,getMeta:()=>h[e],getStoreValue:()=>T[e],getAllStores:()=>T,getInitialState:()=>q[e],hasStore:()=>X(e),setStoreValue:i=>{U(e,i);},applyFeatureState:(i,c)=>{br(e,i,c),J(e);},notify:()=>{},reportStoreError:i=>{Y(e,i);},warn:b,log:H,hashState:we,deepClone:N,sanitize:Q,validate:i=>dt(e,i,h[e]?.options?.validate),isDev:R};return r.set(e,o),o},xr=(e,t)=>{let r=kr(e);r&&(r.notify=()=>t(e),L.forEach(n=>{n.onStoreCreate?.(r);}));},Rr=(e,t,r,n,s)=>{let o=kr(e);if(!o)return;o.notify=()=>s(e);let i=Object.assign(Object.create(o),{action:t,prev:r,next:n});L.forEach(c=>{c.onStoreWrite?.(i);});};var Cr=(e,t)=>Xt({name:e,payload:t,middlewares:(()=>{let r=h[e]?.options?.middleware||[],n=x().middleware||[];return r.length===0?n:n.length===0?r:[...r,...n]})(),reportIssue:(r,n)=>{le(e,r,n);},warn:b}),St=(e,t,r,n)=>Ve({name:e,label:t,fn:r,args:n,reportIssue:(s,o)=>{le(e,s,o);}}),Mr=(e,t)=>{let r={...t};return r.persist&&!Pe("persist")&&(r.explicitPersist&&_e(e,"persist",r.onError),r.persist=null),r.sync&&!Pe("sync")&&(r.explicitSync&&_e(e,"sync",r.onError),r.sync=false),Pe("devtools")||(r.explicitDevtools&&_e(e,"devtools",r.onError),r.devtools=false,r.historyLimit=0,r.redactor=void 0),r};var Er=e=>{let t=h[e]?.options?.snapshot??x().defaultSnapshotMode;return t==="shallow"||t==="ref"?t:"deep"},Fr=(e,t)=>t==="ref"?e:t==="shallow"?rt(e):N(e);var He=(e,t)=>{if(t>0&&typeof setTimeout=="function"){setTimeout(e,t);return}if(typeof queueMicrotask=="function"){queueMicrotask(e);return}Promise.resolve().then(e);},Wn=e=>{let{pendingNotifications:t,pendingBuffer:r,orderedNames:n}=e;r.length=0;for(let u of t)r.push(u);t.clear();let s=x().flush,o=s.priorityStores||[],i=new Set(r),c=o.length?new Set(o):null;if(n.length=0,c){for(let u of o)i.has(u)&&n.push(u);for(let u of r)c.has(u)||n.push(u);}else n.push(...r);let d=Qt(n),g=new Set(n);for(let u of d)i.has(u)&&!g.has(u)&&(n.push(u),g.add(u));let S=Number.isFinite(s.chunkSize)&&s.chunkSize>0?s.chunkSize:Number.POSITIVE_INFINITY,w=s.chunkDelayMs,p=S===Number.POSITIVE_INFINITY&&w===0;return {names:n.slice(),sliceSize:S,chunkDelayMs:w,runInline:p,prioritySet:c}},zn=e=>{let t=e.notify,{names:r,sliceSize:n,chunkDelayMs:s,runInline:o,prioritySet:i}=Wn(t),c=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),d=()=>{t.notifyScheduled=false,t.pendingNotifications.size>0&&Ar(e);};if(o){for(let u of r){let a=re[u];if(!a||a.size===0)continue;let f=h[u]?.updateCount??0,l=Er(u),m=Ee[u],k=m&&m.version===f?m.snapshot:(()=>{let E=Fr(T[u],l);return Ee[u]={version:f,snapshot:E},E})(),M=c();for(let E of a)try{E(k);}catch(se){b(`Subscriber for "${u}" threw: ${se?.message??se}`);}let F=c()-M,y=h[u]?.metrics||{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0};y.notifyCount+=1,y.totalNotifyMs+=F,y.lastNotifyMs=F,h[u]&&(h[u].metrics=y),(h[u]?.updateCount??f)!==f&&t.pendingNotifications.add(u);}d();return}let g=u=>{let a=[];for(let f of r){if(u&&!u(f))continue;let l=re[f];if(!l||l.size===0)continue;let m=h[f]?.updateCount??0,k=Er(f),M=Ee[f],F=M&&M.version===m?M.snapshot:(()=>{let y=Fr(T[f],k);return Ee[f]={version:m,snapshot:y},y})();a.push({name:f,subsArray:Array.from(l),index:0,snapshot:F,version:m,notified:new Set,metrics:h[f]?.metrics?{...h[f].metrics}:{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0},totalMs:0});}return a},S=i?g(u=>i.has(u)):[],w=g(u=>!i||!i.has(u)),p=u=>{let a=re[u.name];if(!a||a.size===0){u.subsArray=[],u.index=0;return}u.subsArray=Array.from(a),u.index=0;},v=(u,a)=>{let f=()=>{if(u.length===0){a();return}let l=u.shift();if((h[l.name]?.updateCount??l.version)!==l.version){if(t.pendingNotifications.add(l.name),u.length===0){a();return}o?f():He(f,s);return}if(p(l),l.subsArray.length===0){if(u.length===0){a();return}o?f():He(f,s);return}let k=c(),M=0,F=false;for(;l.index<l.subsArray.length&&M<n;){let E=l.subsArray[l.index++];if(l.notified.has(E))continue;l.notified.add(E);try{E(l.snapshot);}catch(ge){b(`Subscriber for "${l.name}" threw: ${ge?.message??ge}`);}if(M+=1,(h[l.name]?.updateCount??l.version)!==l.version){F=true,t.pendingNotifications.add(l.name);break}}if(l.totalMs+=c()-k,F){if(u.length===0){a();return}o?f():He(f,s);return}let y=re[l.name],D=y?Array.from(y).some(E=>!l.notified.has(E)):false;if(l.index<l.subsArray.length||D?u.push(l):(l.metrics.notifyCount+=1,l.metrics.totalNotifyMs+=l.totalMs,l.metrics.lastNotifyMs=l.totalMs,h[l.name]&&(h[l.name].metrics=l.metrics)),u.length===0){a();return}o?f():He(f,s);};f();};S.length>0?v(S,()=>v(w,d)):v(w,d);},Ar=e=>{let t=e.notify;if(t.notifyScheduled)return;t.notifyScheduled=true;let r=()=>De(e,()=>zn(e));typeof queueMicrotask=="function"?queueMicrotask(r):Promise.resolve().then(r);},Fe=e=>{let t=j(),r=t.notify;r.pendingNotifications.add(e),r.batchDepth===0&&Ar(t);};var Hn=()=>{let e=j().notify;e.pendingNotifications.clear(),e.pendingBuffer.length=0,e.orderedNames.length=0,e.notifyScheduled=false,e.batchDepth=0;};O("notify.reset",Hn,40);var Ln=32,Or=new Set,Dr=new Set,Bn=(e,t)=>{R()&&(t<Ln||Or.has(e)||(Or.add(e),b(`setStore("${e}", mutator) took ${t}ms. Mutator writes clone the entire store; consider path writes or smaller stores for hot paths.`)));},Tr=({name:e,prev:t,next:r,action:n,hookLabel:s,logMessage:o})=>{U(e,r),J(e);let i=Date.now();h[e].updatedAt=new Date(i).toISOString(),h[e].updatedAtMs=i,h[e].updateCount++,Rr(e,n,t,r,Fe),St(e,s,h[e].options[s],[t,r]),Fe(e),H(o);},Pr=e=>{if(C()){We(e.name,e.next),Ie(()=>Tr(e));return}Tr(e);},yt=(e,t,r={})=>{if(C()){let a=`createStore("${String(e)}") cannot be called inside setStoreBatch. Move createStore outside the batch to preserve transaction semantics.`;Re(a,r.onError),V(a);return}if(!et(e)){Re(`createStore("${String(e)}") is not a valid store name.`,r.onError);return}if(!(r.lazy===true&&typeof t=="function")&&!be(t)){Re(`createStore("${e}") received invalid initial data.`,r.onError);return}t===void 0&&R()&&b(`createStore("${e}") received an undefined initial value. This can be indistinguishable from a missing store in some consumers; consider null or an explicit shape if that is intentional.`),Ut(r).forEach(a=>{b(a);});let s=Mr(e,Kt(r,e,x().defaultSnapshotMode));if(s.scope==="temp"&&r.persist){let a=`Store "${e}" has scope: "temp" but persist is enabled. Temp stores are intended to be ephemeral.`;s.onError?.(a),R()||z(a),_(a);}let o=typeof window>"u",i=typeof process<"u"?process.env?.NODE_ENV:void 0,c=o&&i==="production",d=s.allowSSRGlobalStore??false;if(c&&!d){let a=`createStore("${e}") is blocked on the server in production to prevent cross-request memory leaks.
14
- Call createStoreForRequest(...) inside each request scope or pass { scope: "global" } to opt in.`;Re(a,r.onError);return}if(c&&d&&!Dr.has(e)&&(Dr.add(e),z(`createStore("${e}") is allowed on the server in production because allowSSRGlobalStore is true.
15
- This can leak data across concurrent requests. Prefer createStoreForRequest(...) or scope: "request" unless you truly need a global SSR store.`)),X(e)){let a=`Store "${e}" already exists. Call setStore("${e}", data) to update instead.`;return le(e,a),{name:e}}o&&!d&&!nr(e)&&R()&&(or(e),b(`createStore("${e}") called in a server environment. Use createStoreForRequest(...) per request to avoid cross-request leaks or pass { allowSSRGlobalStore: true } if you really want a global store on the server.`));let g=fe(e,t,s.onError);if(!g.ok)return;let S=g.value,w=s.lazy===true&&typeof t=="function",p=(re[e]?.size??0)>0;if(w)T[e]=void 0,de[e]=t;else {let a=ze(e,S,s.validate,s.onError);if(!a.ok)return;U(e,a.value),q[e]=N(a.value);}let v=Date.now(),u=new Date(v).toISOString();return h[e]={createdAt:u,updatedAt:u,updatedAtMs:v,updateCount:0,version:s.version,metrics:{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0},options:s},J(e),xr(e,Fe),St(e,"onCreate",h[e].options.onCreate,[S]),p&&Fe(e),H(`Store "${e}" created -> ${JSON.stringify(S)}`),{name:e}};function Ae(e,t,r){let n=ut(e);if(!ft(n))return {ok:false,reason:"validate"};if(!X(n)){let p=`setStore("${n}") called before createStore(). Create the store first or pass a valid StoreDefinition.`;return Y(n,p),C()&&V(p),{ok:false,reason:"not-found"}}let s,o=C()?te(n):{has:false,value:void 0},i=o.has?o.value:gt(n),c=typeof t=="function"&&r===void 0;if(c){let p=R()?Date.now():0;try{let v=x().mutatorProduce,u=!1,a,f=m=>{let k=t(m);return k!==void 0&&(u=!0,a=k),k},l=v?v(i,f):(()=>{let m=N(i);return f(m),m})();if(u&&x().strictMutatorReturns){let m=`setStore("${n}", mutator) returned a value. Strict mutator mode forbids return values; mutate the draft instead.`;return Y(n,m),C()&&V(m),{ok:!1,reason:"validate"}}u&&R()&&!x().strictMutatorReturns&&b(`setStore("${n}", mutator) returned a value. Return values replace the entire store; return void to apply draft mutations instead.`),s=u&&!x().strictMutatorReturns?a:l;}catch(v){return Y(n,`Mutator for "${n}" failed: ${v?.message??v}`),C()&&V(v),{ok:false,reason:"validate"}}finally{p&&Bn(n,Date.now()-p);}}else if(typeof t=="object"&&!Array.isArray(t)&&r===void 0){if(!be(t))return C()&&V(`setStore("${n}") received invalid data`),{ok:false,reason:"invalid-args"};if(typeof i!="object"||i===null||Array.isArray(i))return _(`setStore("${n}", data) only merges into object stores.
16
- Use setStore("${n}", "path", value) or recreate the store with an object shape.`),C()&&V(`setStore("${n}") attempted object merge on non-object store`),{ok:false,reason:"validate"};let p=fe(n,t);if(!p.ok)return C()&&V(`setStore("${n}") failed sanitize`),{ok:false,reason:"validate"};s={...i,...p.value};}else if(typeof t=="string"||Array.isArray(t)){if(!nt(t))return C()&&V(`setStore("${n}") received invalid path`),{ok:false,reason:"invalid-args"};let p=fe(n,r);if(!p.ok)return C()&&V(`setStore("${n}") failed sanitize`),{ok:false,reason:"validate"};let v=p.value,u=fr(n,i,t,v);if(!u.ok)return h[n]?.options?.onError?.(u.reason??`Invalid path for "${n}".`),C()&&V(u.reason),{ok:false,reason:"path"};s=ot(i,t,v);}else {let p=`setStore("${n}") - invalid arguments.
17
- Usage:
18
- setStore("${n}", "field", value)
19
- setStore("${n}", "nested.field", value)
20
- setStore("${n}", { field: value })
21
- setStore(storeDef, draft => { draft.field = value })
22
- replaceStore("${n}", value) // full-store replace`;return _(p),h[n]?.options?.onError?.(p),C()&&V(p),{ok:false,reason:"invalid-args"}}if(!be(s))return C()&&V(`setStore("${n}") produced invalid data`),{ok:false,reason:"validate"};let d=h[n]?.options?.validate,g=Cr(n,{action:"set",prev:i,next:s,path:t});if(g===Ne)return C()&&V(`setStore("${n}") aborted by middleware`),{ok:false,reason:"middleware"};let w=ze(n,g,d,void 0,c&&g===s?{reuseInput:true}:void 0);return w.ok?(Pr({name:n,prev:i,next:w.value,action:"set",hookLabel:"onSet",logMessage:`Store "${n}" updated`}),{ok:true}):(C()&&V(`setStore("${n}") failed validation`),{ok:false,reason:"validate"})}function mt(e){let t=ut(e);if(!sr(t))return {ok:false,reason:"not-found"};if(!ft(t))return {ok:false,reason:"validate"};if(!q[t]){let o=`resetStore("${t}") has no initial state to reset to. If this is a lazy store, ensure it has been initialized before calling resetStore.`;return le(t,o),C()&&V(o),{ok:false,reason:"not-found"}}let r=C()?te(t):{has:false,value:void 0},n=r.has?r.value:T[t],s=N(q[t]);return Pr({name:t,prev:n,next:s,action:"reset",hookLabel:"onReset",logMessage:`Store "${t}" reset to initial state/value`}),{ok:true}}var Nr=()=>{wt();};var $=()=>j().async,ne=e=>new Proxy(Object.create(null),{get:(t,r)=>e()[r],set:(t,r,n)=>(e()[r]=n,true),deleteProperty:(t,r)=>(delete e()[r],true),has:(t,r)=>r in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(t,r)=>{let n=Object.getOwnPropertyDescriptor(e(),r);if(n)return {...n,configurable:true}}}),oe=e=>new Proxy({},{get:(t,r)=>{let n=e(),s=n[r];return typeof s=="function"?s.bind(n):s},set:(t,r,n)=>(e()[r]=n,true),has:(t,r)=>r in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(t,r)=>{let n=Object.getOwnPropertyDescriptor(e(),r);if(n)return {...n,configurable:true}}});ne(()=>$().inflight);ne(()=>$().requestVersion);ne(()=>$().rateWindowStart);ne(()=>$().rateCount);oe(()=>$().ratePruneState);ne(()=>$().cleanupSubs);ne(()=>$().storeCleanupFns);ne(()=>$().revalidateHandlers);oe(()=>$().noSignalWarned);oe(()=>$().shapeWarned);oe(()=>$().autoCreateWarned);oe(()=>$().mutableResultWarned);oe(()=>$().revalidateKeys);oe(()=>$().asyncMetrics);var Vr=()=>{Oe($());};var jr=[];var ht=()=>{qn(),Vr();},qn=()=>{jr.forEach(e=>e()),jr.length=0;};var ji=(e="mock",t={})=>{let r=pt(e);return yt(e,t),{set:n=>typeof n=="function"?Ae(r,n):Ae(r,n),reset:()=>mt(r),use:()=>r}},$i=(e,t)=>{let r=Date.now;Date.now=()=>e;try{return t()}finally{Date.now=r;}},_i=()=>{Nr(),ht();},Ii=(e,t=1e3,r=n=>({value:n}))=>{let n=typeof performance<"u"&&performance.now?performance.now():Date.now();for(let i=0;i<t;i++)Ae(e,r(i));let o=(typeof performance<"u"&&performance.now?performance.now():Date.now())-n;return {iterations:t,totalMs:o,avgMs:o/t}};
23
- exports.benchmarkStoreSet=Ii;exports.createMockStore=ji;exports.resetAllStoresForTest=_i;exports.withMockedTime=$i;//# sourceMappingURL=testing.cjs.map
24
- //# sourceMappingURL=testing.cjs.map