stroid 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +375 -468
- package/dist/_tsup-dts-rollup.d.cts +2411 -0
- package/dist/_tsup-dts-rollup.d.ts +2411 -0
- package/dist/async.cjs +29 -24
- package/dist/async.cjs.map +1 -0
- package/dist/async.d.cts +9 -40
- package/dist/async.d.ts +9 -40
- package/dist/async.js +29 -24
- package/dist/async.js.map +1 -0
- package/dist/computed.cjs +12 -10
- package/dist/computed.cjs.map +1 -0
- package/dist/computed.d.cts +7 -29
- package/dist/computed.d.ts +7 -29
- package/dist/computed.js +12 -10
- package/dist/computed.js.map +1 -0
- package/dist/core.cjs +17 -23
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +15 -5
- package/dist/core.d.ts +15 -5
- package/dist/core.js +17 -23
- package/dist/core.js.map +1 -0
- package/dist/devtools.cjs +2 -1
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +5 -19
- package/dist/devtools.d.ts +5 -19
- package/dist/devtools.js +2 -1
- package/dist/devtools.js.map +1 -0
- package/dist/feature.cjs +2 -0
- package/dist/feature.cjs.map +1 -0
- package/dist/feature.d.cts +14 -0
- package/dist/feature.d.ts +14 -0
- package/dist/feature.js +2 -0
- package/dist/feature.js.map +1 -0
- package/dist/helpers.cjs +17 -13
- package/dist/helpers.cjs.map +1 -0
- package/dist/helpers.d.cts +3 -29
- package/dist/helpers.d.ts +3 -29
- package/dist/helpers.js +17 -13
- package/dist/helpers.js.map +1 -0
- package/dist/index.cjs +26 -21
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +33 -130
- package/dist/index.d.ts +33 -130
- package/dist/index.js +26 -21
- package/dist/index.js.map +1 -0
- package/dist/install.cjs +2 -0
- package/dist/install.cjs.map +1 -0
- package/dist/install.d.cts +4 -0
- package/dist/install.d.ts +4 -0
- package/dist/install.js +2 -0
- package/dist/install.js.map +1 -0
- package/dist/persist.cjs +2 -1
- package/dist/persist.cjs.map +1 -0
- package/dist/persist.d.cts +1 -2
- package/dist/persist.d.ts +1 -2
- package/dist/persist.js +2 -1
- package/dist/persist.js.map +1 -0
- package/dist/react.cjs +27 -22
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +7 -52
- package/dist/react.d.ts +7 -52
- package/dist/react.js +27 -22
- package/dist/react.js.map +1 -0
- package/dist/runtime-admin.cjs +2 -1
- package/dist/runtime-admin.cjs.map +1 -0
- package/dist/runtime-admin.d.cts +2 -4
- package/dist/runtime-admin.d.ts +2 -4
- package/dist/runtime-admin.js +2 -1
- package/dist/runtime-admin.js.map +1 -0
- package/dist/runtime-tools.cjs +3 -2
- package/dist/runtime-tools.cjs.map +1 -0
- package/dist/runtime-tools.d.cts +9 -39
- package/dist/runtime-tools.d.ts +9 -39
- package/dist/runtime-tools.js +3 -2
- package/dist/runtime-tools.js.map +1 -0
- package/dist/selectors.cjs +2 -1
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +2 -4
- package/dist/selectors.d.ts +2 -4
- package/dist/selectors.js +2 -1
- package/dist/selectors.js.map +1 -0
- package/dist/server.cjs +11 -9
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +2 -14
- package/dist/server.d.ts +2 -14
- package/dist/server.js +11 -9
- package/dist/server.js.map +1 -0
- package/dist/sync.cjs +2 -1
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.d.cts +1 -2
- package/dist/sync.d.ts +1 -2
- package/dist/sync.js +2 -1
- package/dist/sync.js.map +1 -0
- package/dist/testing.cjs +17 -13
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +4 -16
- package/dist/testing.d.ts +4 -16
- package/dist/testing.js +17 -13
- package/dist/testing.js.map +1 -0
- package/package.json +12 -3
- package/dist/async-cache-DFHwcBQL.d.cts +0 -52
- package/dist/async-cache-DFHwcBQL.d.ts +0 -52
- package/dist/computed-BbAZm1Dq.d.cts +0 -17
- package/dist/computed-CccdgY5j.d.ts +0 -17
- package/dist/options-CB35e3Xo.d.cts +0 -245
- package/dist/options-CB35e3Xo.d.ts +0 -245
- package/dist/types/adapters/options.d.ts +0 -247
- package/dist/types/async/clone.d.ts +0 -2
- package/dist/types/async/errors.d.ts +0 -3
- package/dist/types/async/inflight.d.ts +0 -13
- package/dist/types/async/rate.d.ts +0 -5
- package/dist/types/async/request.d.ts +0 -3
- package/dist/types/async-cache.d.ts +0 -57
- package/dist/types/async-fetch.d.ts +0 -37
- package/dist/types/async-registry.d.ts +0 -96
- package/dist/types/async-retry.d.ts +0 -10
- package/dist/types/async.d.ts +0 -2
- package/dist/types/computed-graph.d.ts +0 -31
- package/dist/types/computed.d.ts +0 -15
- package/dist/types/config.d.ts +0 -2
- package/dist/types/core.d.ts +0 -1
- package/dist/types/devfreeze.d.ts +0 -1
- package/dist/types/feature-registry.d.ts +0 -69
- package/dist/types/features/lifecycle.d.ts +0 -28
- package/dist/types/index.d.ts +0 -6
- package/dist/types/integrations/query.d.ts +0 -8
- package/dist/types/internals/config.d.ts +0 -62
- package/dist/types/internals/diagnostics.d.ts +0 -21
- package/dist/types/internals/hooks-warnings.d.ts +0 -6
- package/dist/types/internals/reporting.d.ts +0 -8
- package/dist/types/internals/store-admin.d.ts +0 -7
- package/dist/types/internals/store-ops.d.ts +0 -3
- package/dist/types/runtime-admin.d.ts +0 -2
- package/dist/types/store-lifecycle/bind.d.ts +0 -3
- package/dist/types/store-lifecycle/hooks.d.ts +0 -44
- package/dist/types/store-lifecycle/identity.d.ts +0 -23
- package/dist/types/store-lifecycle/registry.d.ts +0 -39
- package/dist/types/store-lifecycle/types.d.ts +0 -39
- package/dist/types/store-lifecycle/validation.d.ts +0 -45
- package/dist/types/store-lifecycle.d.ts +0 -20
- package/dist/types/store-name.d.ts +0 -19
- package/dist/types/store-notify.d.ts +0 -12
- package/dist/types/store-read.d.ts +0 -12
- package/dist/types/store-registry.d.ts +0 -74
- package/dist/types/store-transaction.d.ts +0 -12
- package/dist/types/store-write.d.ts +0 -45
- package/dist/types/store.d.ts +0 -7
- package/dist/types/utils/clone.d.ts +0 -4
- package/dist/types/utils/hash.d.ts +0 -8
- package/dist/types/utils/path.d.ts +0 -5
- package/dist/types/utils/validation.d.ts +0 -14
- package/dist/types/utils.d.ts +0 -5
- package/dist/types-grvlY4BX.d.cts +0 -37
- package/dist/types-grvlY4BX.d.ts +0 -37
package/dist/selectors.cjs
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
'use strict';var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var de=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 o of Object.keys(n)){let s=n[o];typeof s=="object"&&s!==null&&!r.has(s)&&t.push(s);}}}return e};var He={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}`));}},Be={logSink:He,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",middleware:[],allowUntrustedHydration:false,mutatorProduce:void 0},qe={...Be},w=()=>qe;var Le=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,Ke=typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('selectors.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0,fe=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,Ue="production",Ye=Le??Ke??Ue,U=typeof fe=="boolean"?fe:Ye!=="production",x=()=>U,pe=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},Ge=(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));},Je=(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},Y=(e,t)=>{if((w().logSink.critical??Ge)(e,t),w().assertRuntime)throw new Error(e)},d=(e,t)=>{if(!U)return;if((w().logSink.warn??pe)(e,t),w().assertRuntime)throw new Error(e)},T=(e,t)=>{if((w().logSink.warn??pe)(e,t),w().assertRuntime)throw new Error(e)};var z=(e,t)=>{if(!U)return;(w().logSink.log??Je)(e,t);};var ge=()=>"Date detected; stored as ISO string. Use new Date(value) when reading.",Se=()=>"Map detected; converting to plain object.",ye=()=>"Set detected; converting to array.";var he=(e,t)=>`Path "${e.join(".")}" not found - reached null at "${t}"`,me=e=>`Cannot go deeper at "${e}" - value is not an object`;var O=new Set(["__proto__","constructor","prototype"]);var we=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,Xe=e=>{if(!e||typeof e!="object")return null;let t=globalThis?.WeakRef;return t&&e instanceof t?"WeakRef":typeof WeakMap<"u"&&e instanceof WeakMap?"WeakMap":typeof WeakSet<"u"&&e instanceof WeakSet?"WeakSet":typeof EventTarget<"u"&&e instanceof EventTarget?"EventTarget":typeof ReadableStream<"u"&&e instanceof ReadableStream?"ReadableStream":typeof WritableStream<"u"&&e instanceof WritableStream?"WritableStream":typeof Request<"u"&&e instanceof Request?"Request":typeof Response<"u"&&e instanceof Response?"Response":typeof Headers<"u"&&e instanceof Headers?"Headers":typeof FormData<"u"&&e instanceof FormData?"FormData":null};var H=(e,t)=>{let r=Xe(e);if(r)throw new Error(`${r} values are not supported`);let n=we(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 x()&&d(ge()),e.toISOString();if(n==="map"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e),x()&&d(Se());let o={};for(let[s,a]of e){if(typeof s!="string")throw new Error("Map keys must be strings to remain JSON-safe");o[String(s)]=H(a,t);}return o}if(n==="set"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),x()&&d(ye()),Array.from(e,o=>H(o,t))}if(n==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let o={},s=Object.getOwnPropertyDescriptors(e);for(let[a,c]of Object.entries(s))if(c.enumerable&&!O.has(a)){if("get"in c||"set"in c)throw new Error(`Accessor properties are not supported during sanitize ("${a}")`);o[a]=H(c.value,t);}return o}if(n==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),e.map(o=>H(o,t))}return e},ne=e=>H(e,new WeakSet);var oe=null,Qe=()=>{if(oe)return oe;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 oe=t,t},ke=e=>{let t=Qe(),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},Ze=2166136261,et=2654435761,tt=1e5,F=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},D=(e,t)=>{F(e,t.length);for(let r=0;r<t.length;r++)F(e,t.charCodeAt(r));},f=(e,t)=>{D(e,t);},Re=(e,t)=>{if(Number.isNaN(t)){f(e,"NaN");return}if(!Number.isFinite(t)){f(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){f(e,"-0");return}let r=t|0;if(t===r){f(e,"int"),F(e,r);return}f(e,"num"),D(e,String(t));},A=(e,t)=>{if(e.nodes++>tt){f(e,"[max]");return}if(t===null){f(e,"null");return}let r=typeof t;if(r==="string"){f(e,"string"),D(e,t);return}if(r==="number"){f(e,"number"),Re(e,t);return}if(r==="boolean"){f(e,t?"true":"false");return}if(r==="undefined"){f(e,"undefined");return}if(r==="bigint"){f(e,"bigint"),D(e,t.toString());return}if(r==="symbol"){f(e,"symbol");let u=t;D(e,Symbol.keyFor(u)??u.description??String(u));return}if(r==="function"){f(e,"function"),D(e,t.name||"anonymous");return}let n=t,o=e.seen.get(n);if(o!==void 0){f(e,"ref"),F(e,o);return}let s=e.nextId++;if(e.seen.set(n,s),Array.isArray(n)){f(e,"array"),F(e,n.length);for(let u=0;u<n.length;u++)Object.prototype.hasOwnProperty.call(n,u)?A(e,n[u]):f(e,"hole");return}if(n instanceof Date){f(e,"date"),Re(e,n.getTime());return}if(n instanceof Map){f(e,"map"),F(e,n.size),n.forEach((u,l)=>{A(e,l),A(e,u);});return}if(n instanceof Set){f(e,"set"),F(e,n.size),n.forEach(u=>{A(e,u);});return}f(e,"object");let a=Object.getOwnPropertyDescriptors(n),c=[];Object.entries(a).forEach(([u,l])=>{l?.enumerable&&(O.has(u)||"get"in l||"set"in l||c.push([u,l]));}),F(e,c.length);for(let[u,l]of c)D(e,u),A(e,l.value);},se=e=>{if(typeof e=="string")return ke(JSON.stringify(e));let t={h1:Ze,h2:et,seen:new WeakMap,nextId:1,nodes:0};A(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 rt=typeof globalThis<"u"&&typeof globalThis.structuredClone=="function",B=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,o])=>{o.enumerable&&(O.has(n)||"get"in o||"set"in o||(t[n]=o.value));}),t},V=(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 s=new Map;return t.set(e,s),e.forEach((a,c)=>{s.set(V(c,t),V(a,t));}),s}if(e instanceof Set){let s=new Set;return t.set(e,s),e.forEach(a=>{s.add(V(a,t));}),s}if(Array.isArray(e)){let s=[];return t.set(e,s),e.forEach((a,c)=>{s[c]=V(a,t);}),s}let r=globalThis?.WeakRef;if(r&&e instanceof r)return T("WeakRef values cannot be deep-cloned. Returning the original reference."),e;let n={};t.set(e,n);let o;try{o=Object.getOwnPropertyDescriptors(e);}catch{return T("deepClone failed to read object descriptors (possible Proxy or host object). Returning the original reference."),e}return Object.entries(o).forEach(([s,a])=>{!a.enumerable||O.has(s)||"get"in a||"set"in a||(n[s]=V(a.value,t));}),n},j=e=>{try{if(rt)return structuredClone(e)}catch{}return V(e)};var nt=e=>{let t=[],r="",n=false;for(let o of e){if(n){r+=o,n=false;continue}if(o==="\\"){n=true;continue}if(o==="."){t.push(r),r="";continue}r+=o;}return n&&(r+="\\"),t.push(r),t},xe=e=>Array.isArray(e)?[...e]:typeof e=="string"&&!e.includes(".")?[e]:typeof e=="string"?nt(e):[String(e)];var G=(e,t)=>{let r=xe(t),n=e;for(let o of r){if(n==null){d(he(r,o));return}if(typeof n!="object"){d(me(o));return}n=n[o];}return n};var Ce=()=>({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,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 Me=new Map,ot=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,ie=e=>(ot||e).replace(/\.ts(\?|$)/,".js$1"),_=ie(new URL("./store.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('selectors.cjs', document.baseURI).href))).href);var it=()=>({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,failed:false,error:void 0},async:Ce()}),q=e=>{let t=ie(e),r=Me.get(t);if(r)return r;let n=it();return Me.set(t,n),n},N=(e,t)=>Object.prototype.hasOwnProperty.call(e.stores,t);var Fe=()=>null;var I=e=>e||q(_);var ve=new Map;var ae=e=>ve.get(e),L=()=>Array.from(ve.keys());var Te=({name:e,label:t,fn:r,args:n,reportIssue:o})=>{if(typeof r=="function")try{r(...n);}catch(s){let a=`${t} for "${e}" failed: ${s?.message??s}`;o(a,"always");}};var J=(e,t={})=>{let{severity:r="warn",visibility:n="dev",onError:o}=t;if(o?.(e),r==="critical"){n==="dev"&&d(e),Y(e);return}if(n==="always"){T(e);return}d(e);};var lt=()=>I(q(_)),dt=()=>lt().computedEntries;var De=e=>Object.prototype.hasOwnProperty.call(dt(),e);var je=e=>(e??I()).transaction;var X=()=>je().depth>0;var Oe=e=>{let t=je();return t.stagedValues.has(e)?{has:true,value:t.stagedValues.get(e)}:{has:false,value:void 0}};var ft=e=>{let t=$[e]?.options?.snapshot??w().defaultSnapshotMode;return t==="shallow"||t==="ref"?t:"deep"},Ae=(e,t)=>t==="ref"?e:t==="shallow"?B(e):j(e),ce=(e,t)=>{t!=="deep"&&t!=="ref"||e&&typeof e=="object"&&de(e);};var Ve=e=>{if(!ue(e))return null;let t=$[e]?.updateCount??0,r=ft(e),n=Q[e];if(n&&n.version===t){let a=n.snapshot;return ce(a,r),a}if(X()){let a=Z(e);if(a===void 0)return null;let c=Ae(a,r);return ce(c,r),c}let o=Z(e),s=Ae(o,r);return ce(s,r),Q[e]={version:t,snapshot:s},s};var pt=()=>ee().computedCleanups;var _e=e=>{let t=pt(),r=t.get(e);if(!r){x()&&d(`deleteComputed("${e}") -- not found`);return}r(),t.delete(e);};var Ne=e=>{let t=e.stores,r=e.subscribers,n=e.initialStates,o=e.initialFactories,s=e.metaEntries,a=e.snapshotCache,c=e.featureRuntimes,u=e.deletingStores,l=(i,S)=>{J(S,{onError:s[i]?.options?.onError,severity:"warn",visibility:"dev"});},g=({name:i,prev:S,options:p,initialState:m,getMeta:M,getStoreValue:v,hasStore:b})=>({name:i,options:p,prev:S,getMeta:M,getStoreValue:v,getAllStores:()=>t,getInitialState:()=>m,hasStore:b,setStoreValue:()=>{},applyFeatureState:()=>{},notify:()=>{},reportStoreError:y=>{J(y,{onError:p.onError,severity:"warn",visibility:"dev"});},warn:d,log:z,hashState:se,deepClone:j,sanitize:ne,validate:()=>({ok:true,value:S}),isDev:x}),k=({name:i,prev:S,options:p,initialState:m,phase:M})=>{let v=g({name:i,prev:S,options:p,initialState:m,getMeta:()=>s[i],getStoreValue:()=>t[i],hasStore:()=>N(e,i)}),b=g({name:i,prev:S,options:p,initialState:m,getMeta:()=>{},getStoreValue:()=>S,hasStore:()=>false});L().forEach(y=>{let E=c.get(y);M==="before"?E?.beforeStoreDelete?.(v):E?.afterStoreDelete?.(b);});},h=i=>{if(!N(e,i))return;let S=t[i],p=s[i].options,m=n[i],M=r[i];u.add(i);try{M?.forEach(y=>{try{y(null);}catch(E){d(`Subscriber for "${i}" threw during delete: ${E?.message??E}`);}}),Te({name:i,label:"onDelete",fn:p.onDelete,args:[S],reportIssue:(y,E)=>{J(y,{onError:p.onError,severity:"warn",visibility:E});}}),k({name:i,prev:S,options:p,initialState:m,phase:"before"}),delete t[i],delete r[i],delete n[i],delete o[i],delete s[i],delete a[i],De(i)&&_e(i);let b=e.computedDependents[i];if(b)for(let y of b)d(`[stroid] source store "${i}" was deleted. Computed store "${y}" depends on it and will return stale data. Call deleteComputed("${y}") to clean up.`);k({name:i,prev:S,options:p,initialState:m,phase:"after"}),z(`Store "${i}" deleted`);}finally{u.delete(i);}};return {deleteExistingStore:h,clearAllStores:()=>{let i=[],p=0,m=Number.POSITIVE_INFINITY;for(;p<20;){let v=Object.keys(t);if(v.length===0)break;v.forEach(y=>{N(e,y)&&(h(y),i.push(y));}),p+=1;let b=Object.keys(t).length;if(b===0||b>=m)break;m=b;}let M=Object.keys(t).length;return M>0?d(`clearAllStores stopped after ${p} pass${p===1?"":"es"}; ${M} store(s) still registered (likely recreated during deletion).`):d(`All stores cleared (${i.length} stores removed)`),i},clearStores:i=>{let S=Object.keys(t).filter(p=>i?i.endsWith("*")?p.startsWith(i.slice(0,-1)):p===i:true);return S.forEach(p=>h(p)),S},reportStoreError:l}};var gt=_,St=q(gt);var Ie=new WeakSet,yt=e=>{Ie.has(e)||(Ie.add(e),L().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=ae(t);r&&e.featureRuntimes.set(t,r());}}));},R=()=>{let e=I(St);return yt(e),e};var ee=()=>R();var W=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}}}),ht=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 o=n[r];return typeof o=="function"?o.bind(n):o},set:(t,r,n)=>(e()[r]=n,true)}),mt=e=>new Proxy({},{get:(t,r)=>{let n=e(),o=n[r];return typeof o=="function"?o.bind(n):o},set:(t,r,n)=>(e()[r]=n,true)}),P=W(()=>R().stores),C=W(()=>R().subscribers);W(()=>R().initialStates);W(()=>R().initialFactories);var $=W(()=>R().metaEntries),Q=W(()=>R().snapshotCache),K=ht(()=>R().featureRuntimes),Pe=new WeakMap,Rt=e=>{let t=Pe.get(e);return t||(t=Ne(e),Pe.set(e,t)),t};mt(()=>Rt(R()));var $e=e=>{let t=K.get(e);if(t)return t;let r=ae(e);if(!r)return;let n=r();return K.set(e,n),n},xt=()=>{L().forEach(e=>{$e(e);});};xt();var ue=e=>N(R(),e),Z=e=>{if(X()){let r=Oe(e);if(r.has)return r.value}let t=Fe();return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:P[e]};var le=e=>Object.prototype.hasOwnProperty.call(P,e),We=e=>P[e],ze=(e,t)=>(C[e]||(C[e]=new Set),C[e].add(t),()=>{C[e]?.delete(t),C[e]?.size===0&&delete C[e];});var Ct=(e,t)=>{let r=new WeakMap,n=new Set,o="\0",s=(c,u)=>{if(!c||typeof c!="object")return c;let l=r.get(c);if(l)return l;let g=new Proxy(c,{get(k,h,te){if(typeof h!="string")return Reflect.get(k,h,te);let re=[...u,h],i=Reflect.get(k,h,te);return (!i||typeof i!="object")&&n.add(re.join(o)),s(i,re)}});return r.set(c,g),g};return {result:t(s(e,[])),deps:Array.from(n,c=>c.split(o))}},Mt=(e,t,r)=>r.some(n=>!Object.is(G(e,n),G(t,n))),Ft=(e,t)=>{let r,n,o=[];return ()=>{let s=We(e);if(s===void 0)return null;if(s===r)return n??null;if(r!==void 0&&o.length>0&&!Mt(r,s,o))return r=s,n??null;let a=Ct(s,t);return r=s,o=a.deps,n=a.result,n??null}},vt=(e,t,r=Object.is,n)=>{if(typeof t!="function"||typeof n!="function")return d(`subscribeWithSelector("${e}") requires selector and listener functions.`),()=>{};let o=false,s,a=()=>{let l=$[e]?.options?.snapshot;return l==="shallow"||l==="ref"?l:"deep"},c=l=>{let g=l!==void 0?l:Ve(e);if(g===null||typeof g!="object")return g;let k=a();return k==="ref"?g:k==="shallow"?B(g):j(g)};return le(e)&&(s=t(c()),o=true),ze(e,l=>{if(l===null||!le(e)){o=false,s=void 0;return}let g=t(c(l));if(!o){o=true,s=g,n(g,g);return}if(!r(g,s)){let h=s;s=g,n(g,h);}})};exports.createSelector=Ft;exports.subscribeWithSelector=vt;
|
|
1
|
+
'use strict';var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var ge=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 o of Object.keys(n)){let s=n[o];typeof s=="object"&&s!==null&&!r.has(s)&&t.push(s);}}}return e};var Ze=new Map,w=(e,t,r=0)=>{!e||typeof t!="function"||Ze.set(e,{name:e,order:r,fn:t});};var ye=()=>({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}}),Se=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 ne=new Map,et=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,he,oe=e=>(he||et||e).replace(/\.ts(\?|$)/,".js$1"),H=oe(new URL("./store.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('selectors.cjs', document.baseURI).href))).href);var tt=()=>{he=void 0,ne.clear();};w("registry.scope-override",tt,110);var rt=()=>({pendingNotifications:new Set,pendingBuffer:[],orderedNames:[],notifyScheduled:false,batchDepth:0}),nt=e=>{e.pendingNotifications.clear(),e.pendingBuffer.length=0,e.orderedNames.length=0,e.notifyScheduled=false,e.batchDepth=0;},ot=()=>({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:ye(),notify:rt()}),B=e=>{let t=oe(e),r=ne.get(t);if(r)return r;let n=ot();return ne.set(t,n),n},V=(e,t)=>Object.prototype.hasOwnProperty.call(e.stores,t);var me=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,nt(e.notify),Se(e.async);};var be=()=>null;var T=e=>e||B(H);var at={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}`));}},we={logSink:at,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},ie=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}),se=new WeakMap,Re=ie(we),ct=e=>{let t=se.get(e);return t||(t=ie(Re),se.set(e,t)),t};var C=()=>ct(T());var lt=()=>{se=new WeakMap,Re=ie(we);};w("config.reset",lt,90);var ft=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,pt=typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('selectors.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0,ke=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,gt="production",yt=ft??pt??gt,X=typeof ke=="boolean"?ke:yt!=="production",M=()=>X,xe=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},St=(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));},ht=(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},Q=(e,t)=>{if((C().logSink.critical??St)(e,t),C().assertRuntime)throw new Error(e)},g=(e,t)=>{if(!X)return;if((C().logSink.warn??xe)(e,t),C().assertRuntime)throw new Error(e)},j=(e,t)=>{if((C().logSink.warn??xe)(e,t),C().assertRuntime)throw new Error(e)};var U=(e,t)=>{if(!X)return;(C().logSink.log??ht)(e,t);};var Ce=()=>"Date detected; stored as ISO string. Use new Date(value) when reading.",Me=()=>"Map detected; converting to plain object.",ve=()=>"Set detected; converting to array.";var Te=(e,t)=>`Path "${e.join(".")}" not found - reached null at "${t}"`,Ee=e=>`Cannot go deeper at "${e}" - value is not an object`;var I=new Set(["__proto__","constructor","prototype"]);var De=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,mt=e=>{if(!e||typeof e!="object")return null;let t=globalThis?.WeakRef;return t&&e instanceof t?"WeakRef":typeof WeakMap<"u"&&e instanceof WeakMap?"WeakMap":typeof WeakSet<"u"&&e instanceof WeakSet?"WeakSet":typeof EventTarget<"u"&&e instanceof EventTarget?"EventTarget":typeof ReadableStream<"u"&&e instanceof ReadableStream?"ReadableStream":typeof WritableStream<"u"&&e instanceof WritableStream?"WritableStream":typeof Request<"u"&&e instanceof Request?"Request":typeof Response<"u"&&e instanceof Response?"Response":typeof Headers<"u"&&e instanceof Headers?"Headers":typeof FormData<"u"&&e instanceof FormData?"FormData":null};var q=(e,t)=>{let r=mt(e);if(r)throw new Error(`${r} values are not supported`);let n=De(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 M()&&g(Ce()),e.toISOString();if(n==="map"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e),M()&&g(Me());let o={};for(let[s,c]of e){if(typeof s!="string")throw new Error("Map keys must be strings to remain JSON-safe");o[String(s)]=q(c,t);}return o}if(n==="set"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),M()&&g(ve()),Array.from(e,o=>q(o,t))}if(n==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let o={},s=Object.getOwnPropertyDescriptors(e);for(let[c,d]of Object.entries(s))if(d.enumerable&&!I.has(c)){if("get"in d||"set"in d)throw new Error(`Accessor properties are not supported during sanitize ("${c}")`);o[c]=q(d.value,t);}return o}if(n==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),e.map(o=>q(o,t))}return e},ae=e=>q(e,new WeakSet);var ce=null,bt=()=>{if(ce)return ce;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 ce=t,t},je=e=>{let t=bt(),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},wt=2166136261,Rt=2654435761,kt=1e5,E=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},A=(e,t)=>{E(e,t.length);for(let r=0;r<t.length;r++)E(e,t.charCodeAt(r));},y=(e,t)=>{A(e,t);},Oe=(e,t)=>{if(Number.isNaN(t)){y(e,"NaN");return}if(!Number.isFinite(t)){y(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){y(e,"-0");return}let r=t|0;if(t===r){y(e,"int"),E(e,r);return}y(e,"num"),A(e,String(t));},P=(e,t)=>{if(e.nodes++>kt){y(e,"[max]");return}if(t===null){y(e,"null");return}let r=typeof t;if(r==="string"){y(e,"string"),A(e,t);return}if(r==="number"){y(e,"number"),Oe(e,t);return}if(r==="boolean"){y(e,t?"true":"false");return}if(r==="undefined"){y(e,"undefined");return}if(r==="bigint"){y(e,"bigint"),A(e,t.toString());return}if(r==="symbol"){y(e,"symbol");let u=t;A(e,Symbol.keyFor(u)??u.description??String(u));return}if(r==="function"){y(e,"function"),A(e,t.name||"anonymous");return}let n=t,o=e.seen.get(n);if(o!==void 0){y(e,"ref"),E(e,o);return}let s=e.nextId++;if(e.seen.set(n,s),Array.isArray(n)){y(e,"array"),E(e,n.length);for(let u=0;u<n.length;u++)Object.prototype.hasOwnProperty.call(n,u)?P(e,n[u]):y(e,"hole");return}if(n instanceof Date){y(e,"date"),Oe(e,n.getTime());return}if(n instanceof Map){y(e,"map"),E(e,n.size),n.forEach((u,l)=>{P(e,l),P(e,u);});return}if(n instanceof Set){y(e,"set"),E(e,n.size),n.forEach(u=>{P(e,u);});return}y(e,"object");let c=Object.getOwnPropertyDescriptors(n),d=[];Object.entries(c).forEach(([u,l])=>{l?.enumerable&&(I.has(u)||"get"in l||"set"in l||d.push([u,l]));}),E(e,d.length);for(let[u,l]of d)A(e,u),P(e,l.value);},ue=e=>{if(typeof e=="string")return je(JSON.stringify(e));let t={h1:wt,h2:Rt,seen:new WeakMap,nextId:1,nodes:0};P(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 xt=typeof globalThis<"u"&&typeof globalThis.structuredClone=="function",L=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,o])=>{o.enumerable&&(I.has(n)||"get"in o||"set"in o||(t[n]=o.value));}),t},$=(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 s=new Map;return t.set(e,s),e.forEach((c,d)=>{s.set($(d,t),$(c,t));}),s}if(e instanceof Set){let s=new Set;return t.set(e,s),e.forEach(c=>{s.add($(c,t));}),s}if(Array.isArray(e)){let s=[];return t.set(e,s),e.forEach((c,d)=>{s[d]=$(c,t);}),s}let r=globalThis?.WeakRef;if(r&&e instanceof r)return j("WeakRef values cannot be deep-cloned. Returning the original reference."),e;let n={};t.set(e,n);let o;try{o=Object.getOwnPropertyDescriptors(e);}catch{return j("deepClone failed to read object descriptors (possible Proxy or host object). Returning the original reference."),e}return Object.entries(o).forEach(([s,c])=>{!c.enumerable||I.has(s)||"get"in c||"set"in c||(n[s]=$(c.value,t));}),n},N=e=>{try{if(xt)return structuredClone(e)}catch{}return $(e)};var Ct=e=>{let t=[],r="",n=false;for(let o of e){if(n){r+=o,n=false;continue}if(o==="\\"){n=true;continue}if(o==="."){t.push(r),r="";continue}r+=o;}return n&&(r+="\\"),t.push(r),t},Ae=e=>Array.isArray(e)?[...e]:typeof e=="string"&&!e.includes(".")?[e]:typeof e=="string"?Ct(e):[String(e)];var Z=(e,t)=>{let r=Ae(t),n=e;for(let o of r){if(n==null){g(Te(r,o));return}if(typeof n!="object"){g(Ee(o));return}n=n[o];}return n};var Ne=new Map;var de=e=>Ne.get(e),K=()=>Array.from(Ne.keys());var Ve=({name:e,label:t,fn:r,args:n,reportIssue:o})=>{if(typeof r=="function")try{r(...n);}catch(s){let c=`${t} for "${e}" failed: ${s?.message??s}`;o(c,"always");}};var ee=(e,t={})=>{let{severity:r="warn",visibility:n="dev",onError:o}=t;if(o?.(e),r==="critical"){n==="dev"&&g(e),Q(e);return}if(n==="always"){j(e);return}g(e);};w("computed.order-resolver",()=>{},105);var $e=()=>T(B(H)),We=()=>$e().computedEntries;var ze=e=>Object.prototype.hasOwnProperty.call(We(),e);var He=e=>(e??T()).transaction;var te=()=>He().depth>0;var Be=e=>{let t=He();return t.stagedValues.has(e)?{has:true,value:t.stagedValues.get(e)}:{has:false,value:void 0}};var Et=e=>{let t=J[e]?.options?.snapshot??C().defaultSnapshotMode;return t==="shallow"||t==="ref"?t:"deep"},Ue=(e,t)=>t==="ref"?e:t==="shallow"?L(e):N(e),re=(e,t)=>{t!=="deep"&&t!=="ref"||e&&typeof e=="object"&&ge(e);};var qe=e=>{if(!Le(e))return null;let t=Et(e);if(te()){let d=Y().transaction.snapshotCache,u=fe(e);if(u===void 0)return null;let l=d.get(e);if(l&&l.source===u&&l.mode===t){let p=l.snapshot;return re(p,t),p}let a=Ue(u,t);return d.set(e,{source:u,snapshot:a,mode:t}),re(a,t),a}let r=J[e]?.updateCount??0,n=le[e];if(n&&n.version===r){let c=n.snapshot;return re(c,t),c}let o=fe(e),s=Ue(o,t);return re(s,t),le[e]={version:r,snapshot:s},s};var Ft=()=>{let e=Y().notify;e.pendingNotifications.clear(),e.pendingBuffer.length=0,e.orderedNames.length=0,e.notifyScheduled=false,e.batchDepth=0;};w("notify.reset",Ft,40);var Dt=()=>Y().computedCleanups;var Ke=e=>{let t=Dt(),r=t.get(e);if(!r){M()&&g(`deleteComputed("${e}") -- not found`);return}r(),t.delete(e);};var Ye=e=>{let t=e.stores,r=e.subscribers,n=e.initialStates,o=e.initialFactories,s=e.metaEntries,c=e.snapshotCache,d=e.featureRuntimes,u=e.deletingStores,l=(i,h)=>{ee(h,{onError:s[i]?.options?.onError,severity:"warn",visibility:"dev"});},a=({name:i,prev:h,options:S,initialState:k,getMeta:v,getStoreValue:D,hasStore:x})=>({name:i,options:S,prev:h,getMeta:v,getStoreValue:D,getAllStores:()=>t,getInitialState:()=>k,hasStore:x,setStoreValue:()=>{},applyFeatureState:()=>{},notify:()=>{},reportStoreError:m=>{ee(m,{onError:S.onError,severity:"warn",visibility:"dev"});},warn:g,log:U,hashState:ue,deepClone:N,sanitize:ae,validate:()=>({ok:true,value:h}),isDev:M}),p=({name:i,prev:h,options:S,initialState:k,phase:v})=>{let D=a({name:i,prev:h,options:S,initialState:k,getMeta:()=>s[i],getStoreValue:()=>t[i],hasStore:()=>V(e,i)}),x=a({name:i,prev:h,options:S,initialState:k,getMeta:()=>{},getStoreValue:()=>h,hasStore:()=>false});K().forEach(m=>{let O=d.get(m);v==="before"?O?.beforeStoreDelete?.(D):O?.afterStoreDelete?.(x);});},f=i=>{if(!V(e,i))return;let h=t[i],S=s[i].options,k=n[i],v=r[i];u.add(i);try{v?.forEach(m=>{try{m(null);}catch(O){g(`Subscriber for "${i}" threw during delete: ${O?.message??O}`);}}),Ve({name:i,label:"onDelete",fn:S.onDelete,args:[h],reportIssue:(m,O)=>{ee(m,{onError:S.onError,severity:"warn",visibility:O});}}),p({name:i,prev:h,options:S,initialState:k,phase:"before"}),delete t[i],delete r[i],delete n[i],delete o[i],delete s[i],delete c[i],ze(i)&&Ke(i);let x=e.computedDependents[i];if(x)for(let m of x)g(`[stroid] source store "${i}" was deleted. Computed store "${m}" depends on it and will return stale data. Call deleteComputed("${m}") to clean up.`);p({name:i,prev:h,options:S,initialState:k,phase:"after"}),U(`Store "${i}" deleted`);}finally{u.delete(i);}};return {deleteExistingStore:f,clearAllStores:()=>{let i=[],S=0,k=Number.POSITIVE_INFINITY;for(;S<20;){let D=Object.keys(t);if(D.length===0)break;D.forEach(m=>{V(e,m)&&(f(m),i.push(m));}),S+=1;let x=Object.keys(t).length;if(x===0||x>=k)break;k=x;}let v=Object.keys(t).length;return v>0?g(`clearAllStores stopped after ${S} pass${S===1?"":"es"}; ${v} store(s) still registered (likely recreated during deletion).`):g(`All stores cleared (${i.length} stores removed)`),i},clearStores:i=>{let h=Object.keys(t).filter(S=>i?i.endsWith("*")?S.startsWith(i.slice(0,-1)):S===i:true);return h.forEach(S=>f(S)),h},reportStoreError:l}};var Ot=H,jt=B(Ot);var Ge=new WeakSet,At=e=>{Ge.has(e)||(Ge.add(e),K().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=de(t);r&&e.featureRuntimes.set(t,r());}}));},R=()=>{let e=T(jt);return At(e),e};var Y=()=>R();var z=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}}}),Nt=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 o=n[r];return typeof o=="function"?o.bind(n):o},set:(t,r,n)=>(e()[r]=n,true)}),_t=e=>new Proxy({},{get:(t,r)=>{let n=e(),o=n[r];return typeof o=="function"?o.bind(n):o},set:(t,r,n)=>(e()[r]=n,true)}),G=z(()=>R().stores),F=z(()=>R().subscribers);z(()=>R().initialStates);z(()=>R().initialFactories);var J=z(()=>R().metaEntries),le=z(()=>R().snapshotCache),W=Nt(()=>R().featureRuntimes),Je=new WeakMap,Vt=e=>{let t=Je.get(e);return t||(t=Ye(e),Je.set(e,t)),t};_t(()=>Vt(R()));var It=e=>{let t=W.get(e);if(t)return t;let r=de(e);if(!r)return;let n=r();return W.set(e,n),n},Pt=()=>{K().forEach(e=>{It(e);});};Pt();var Le=e=>V(R(),e),fe=e=>{if(te()){let r=Be(e);if(r.has)return r.value}let t=be();return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:G[e]};var $t=()=>{me(R());},Wt=()=>{W.forEach(e=>{try{e.resetAll?.();}catch{}}),W.clear();};w("features.reset",Wt,10);w("registries.clear",$t,20);var pe=e=>Object.prototype.hasOwnProperty.call(G,e),Xe=e=>G[e],Qe=(e,t)=>(F[e]||(F[e]=new Set),F[e].add(t),()=>{F[e]?.delete(t),F[e]?.size===0&&delete F[e];});var zt=(e,t)=>{let r=new WeakMap,n=new Set,o="\0",s=(d,u)=>{if(!d||typeof d!="object")return d;let l=r.get(d);if(l)return l;let a=new Proxy(d,{get(p,f,b){if(typeof f!="string")return Reflect.get(p,f,b);let _=[...u,f],i=Reflect.get(p,f,b);return (!i||typeof i!="object")&&n.add(_.join(o)),s(i,_)}});return r.set(d,a),a};return {result:t(s(e,[])),deps:Array.from(n,d=>d.split(o))}},Ht=(e,t,r)=>r.some(n=>!Object.is(Z(e,n),Z(t,n))),Bt=(e,t)=>{let r,n,o=[];return ()=>{let s=Xe(e);if(s===void 0)return null;if(s===r)return n??null;if(r!==void 0&&o.length>0&&!Ht(r,s,o))return r=s,n??null;let c=zt(s,t);return r=s,o=c.deps,n=c.result,n??null}},Ut=(e,t,r=Object.is,n)=>{if(typeof t!="function"||typeof n!="function")return g(`subscribeWithSelector("${e}") requires selector and listener functions.`),()=>{};let o=false,s,c=()=>{let l=J[e]?.options?.snapshot;return l==="shallow"||l==="ref"?l:"deep"},d=l=>{let a=l!==void 0?l:qe(e);if(a===null||typeof a!="object")return a;let p=c();return p==="ref"?a:p==="shallow"?L(a):N(a)};return pe(e)&&(s=t(d()),o=true),Qe(e,l=>{if(l===null||!pe(e)){o=false,s=void 0;return}let a=t(d(l));if(!o){o=true,s=a,n(a,a);return}if(!r(a,s)){let f=s;s=a,n(a,f);}})};exports.createSelector=Bt;exports.subscribeWithSelector=Ut;//# sourceMappingURL=selectors.cjs.map
|
|
2
|
+
//# sourceMappingURL=selectors.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/devfreeze.ts","../src/internals/test-reset.ts","../src/async-registry.ts","../src/store-registry.ts","../src/internals/config.ts","../src/internals/diagnostics.ts","../src/utils/validation.ts","../src/utils/hash.ts","../src/utils/clone.ts","../src/utils/path.ts","../src/feature-registry.ts","../src/features/lifecycle.ts","../src/internals/reporting.ts","../src/internals/computed-order.ts","../src/computed-graph.ts","../src/store-transaction.ts","../src/store-notify.ts","../src/computed.ts","../src/internals/store-admin.ts","../src/store-lifecycle/registry.ts","../src/internals/selector-store.ts","../src/selectors.ts"],"names":["devDeepFreeze","value","stack","seen","current","key","next","_resetHooks","registerTestResetHook","name","fn","order","createAsyncRegistry","resetAsyncRegistry","registry","cleanup","unsubscribe","fns","_registries","_registryOverrideEnv","_registryOverrideRuntime","normalizeStoreRegistryScope","scope","defaultRegistryScope","clearRegistryScopeOverrideForTests","createNotifyState","resetNotifyState","notify","createStoreRegistry","getStoreRegistry","normalizedScope","existing","created","hasStoreEntry","clearStoreRegistries","registryPart","getRequestCarrier","getActiveStoreRegistry","fallback","defaultLogSink","msg","meta","defaultConfig","cloneConfig","base","configByRegistry","baseConfig","getRegistryConfig","config","getConfig","resetConfig","_envFromProcess","_envFromImportMeta","_devFlag","_fallbackEnv","_resolvedEnv","__DEV__","isDev","defaultWarn","defaultCritical","defaultLog","critical","warn","warnAlways","log","getSanitizeDateWarningMessage","getSanitizeMapWarningMessage","getSanitizeSetWarningMessage","getPathReachedNullMessage","parts","part","getPathNotObjectMessage","FORBIDDEN_OBJECT_KEYS","getType","getNonSerializableType","WeakRefCtor","_sanitize","blocked","type","clean","entryValue","entry","descriptors","descriptor","sanitize","_crcTable","_getCrcTable","c","table","n","k","crc32","str","crc","i","HASH_SEED_1","HASH_SEED_2","MAX_HASH_NODES","mixHash","state","v","mixString","mixToken","token","hashNumber","asInt","hashValue","sym","obj","seenId","id","entries","hashState","h1","h2","hasStructuredClone","shallowClone","clone","_deepCloneFallback","index","deepClone","_splitPath","path","escaping","ch","parsePath","getByPath","_featureFactories","getStoreFeatureFactory","getRegisteredFeatureNames","runStoreHook","label","args","reportIssue","err","message","options","severity","visibility","onError","getRegistry","getEntries","isComputed","getTransactionState","isTransactionActive","getStagedTransactionValue","resolveSnapshotMode","mode","cloneSnapshot","maybeFreezeSnapshot","snapshot","getStoreSnapshot","hasStoreEntryInternal","snapshotMode","txCache","source","getStoreValueRef","cached","snap","version","snapshotCache","resetNotifyStateForTests","getComputedCleanups","deleteComputed","cleanups","createStoreAdmin","stores","subscribers","initialStates","initialFactories","metaEntries","featureRuntimes","deletingStores","reportStoreError","createDeleteContext","prev","initialState","getMeta","getStoreValue","hasStore","runFeatureDeleteHooks","phase","beforeDeleteContext","afterDeleteContext","featureName","runtime","deleteExistingStore","subs","affected","computedName","removed","pass","previousRemaining","names","remaining","pattern","_scope","_defaultRegistry","initializedRegistries","initializeRegistryFeatureRuntimes","factory","getActiveRegistry","createRegistryObjectProxy","getter","_target","prop","desc","createRegistryMapProxy","target","createRegistryValueProxy","storeAdminByRegistry","getStoreAdminForRegistry","admin","getFeatureRuntime","initializeRegisteredFeatureRuntimes","staged","carrier","clearAllRegistries","resetFeaturesForTests","hasSelectorStoreEntry","getSelectorStoreValueRef","subscribeSelectorStore","trackSelectorDependencies","selectorFn","deps","sep","wrap","proxy","receiver","nextPath","result","selectorDepsChanged","createSelector","storeName","lastRef","lastResult","lastDeps","tracked","subscribeWithSelector","selector","equality","listener","hasPrev","prevSel","getSafeSelectorState","ref","_state","nextSel","last"],"mappings":"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","file":"selectors.cjs","sourcesContent":["/**\r\n * @module devfreeze\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for devfreeze.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nexport const devDeepFreeze = <T>(value: T): T => {\r\n if (typeof value !== \"object\" || value === null) return value;\r\n // Skip React elements, DOM nodes, and complex instances (Maps, Sets, third-party classes, etc.)\r\n if (\r\n (value as any).$$typeof || \r\n (typeof window !== \"undefined\" && value instanceof Element) ||\r\n (value.constructor && value.constructor.name !== \"Object\" && value.constructor.name !== \"Array\")\r\n ) {\r\n return value;\r\n }\r\n const stack: object[] = [value as object];\r\n const seen = new WeakSet<object>();\r\n\r\n while (stack.length > 0) {\r\n const current = stack.pop()!;\r\n if (seen.has(current)) continue;\r\n seen.add(current);\r\n\r\n if (!Object.isFrozen(current)) {\r\n Object.freeze(current);\r\n }\r\n\r\n for (const key of Object.keys(current as Record<string, unknown>)) {\r\n const next = (current as Record<string, unknown>)[key];\r\n if (typeof next === \"object\" && next !== null && !seen.has(next)) {\r\n stack.push(next);\r\n }\r\n }\r\n }\r\n return value;\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 utils/validation\r\n *\r\n * LAYER: Utilities\r\n * OWNS: Module-level behavior and exports for utils/validation.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport {\r\n error,\r\n getDateStoreWarningMessage,\r\n getInvalidFunctionStoreValueMessage,\r\n getInvalidStoreNameMessage,\r\n getForbiddenStoreNameMessage,\r\n getMapSetStoreWarningMessage,\r\n getSanitizeDateWarningMessage,\r\n getSanitizeMapWarningMessage,\r\n getSanitizeSetWarningMessage,\r\n getStoreNameContainsSpacesMessage,\r\n isDev,\r\n warn,\r\n} from \"../internals/diagnostics.js\";\r\n\r\nexport const FORBIDDEN_OBJECT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\r\n\r\nexport const runSchemaValidation = (schema: unknown, value: unknown): { ok: boolean; data?: unknown; error?: unknown } => {\r\n if (!schema) return { ok: true };\r\n try {\r\n if (typeof (schema as { safeParse?: unknown }).safeParse === \"function\") {\r\n const res = (schema as any).safeParse(value);\r\n return res.success ? { ok: true, data: res.data } : { ok: false, error: res.error };\r\n }\r\n if (typeof (schema as { parse?: unknown }).parse === \"function\") {\r\n (schema as any).parse(value);\r\n return { ok: true, data: value };\r\n }\r\n if (typeof (schema as { validateSync?: unknown }).validateSync === \"function\") {\r\n (schema as any).validateSync(value);\r\n return { ok: true, data: value };\r\n }\r\n if (typeof (schema as { isValidSync?: unknown }).isValidSync === \"function\") {\r\n const valid = (schema as any).isValidSync(value);\r\n return valid ? { ok: true, data: value } : { ok: false, error: \"Schema validation failed\" };\r\n }\r\n if (typeof (schema as { validate?: unknown }).validate === \"function\") {\r\n const res = (schema as any).validate(value);\r\n if (res === true) return { ok: true, data: value };\r\n if (res === false) return { ok: false, error: (schema as any).errors || \"Schema validation failed\" };\r\n if (res && typeof res === \"object\") {\r\n const joiError = (res as any).error;\r\n const message =\r\n joiError?.details?.[0]?.message ||\r\n joiError?.message ||\r\n (res as any).message ||\r\n (schema as any).errors;\r\n if (message) return { ok: false, error: message };\r\n if (joiError) return { ok: false, error: joiError };\r\n }\r\n const errMsg = (schema as any).errors || \"Schema validation failed\";\r\n return { ok: false, error: errMsg };\r\n }\r\n if (typeof schema === \"function\") {\r\n const res = (schema as (v: unknown) => unknown | boolean)(value);\r\n if (res === false) return { ok: false, error: \"Schema validation failed\" };\r\n return { ok: true, data: res === true ? value : res };\r\n }\r\n return { ok: true, data: value };\r\n } catch (err) {\r\n return { ok: false, error: (err as { message?: string })?.message ?? err };\r\n }\r\n};\r\n\r\n// --- type helpers ------------------------------------------------------------\r\nconst SUPPORTED_TYPES = [\r\n \"object\",\r\n \"array\",\r\n \"string\",\r\n \"number\",\r\n \"boolean\",\r\n \"null\",\r\n] as const;\r\nexport type SupportedType = typeof SUPPORTED_TYPES[number] | \"function\" | \"map\" | \"set\" | \"date\" | \"undefined\" | \"bigint\" | \"symbol\";\r\n\r\nexport const getType = (value: unknown): SupportedType => {\r\n if (value === null) return \"null\";\r\n if (Array.isArray(value)) return \"array\";\r\n if (value instanceof Map) return \"map\";\r\n if (value instanceof Set) return \"set\";\r\n if (value instanceof Date) return \"date\";\r\n if (typeof value === \"function\") return \"function\";\r\n return typeof value;\r\n};\r\n\r\nconst getNonSerializableType = (value: unknown): string | null => {\r\n if (!value || typeof value !== \"object\") return null;\r\n const WeakRefCtor = (globalThis as any)?.WeakRef as (new (...args: any[]) => any) | undefined;\r\n if (WeakRefCtor && value instanceof WeakRefCtor) return \"WeakRef\";\r\n if (typeof WeakMap !== \"undefined\" && value instanceof WeakMap) return \"WeakMap\";\r\n if (typeof WeakSet !== \"undefined\" && value instanceof WeakSet) return \"WeakSet\";\r\n if (typeof EventTarget !== \"undefined\" && value instanceof EventTarget) return \"EventTarget\";\r\n if (typeof ReadableStream !== \"undefined\" && value instanceof ReadableStream) return \"ReadableStream\";\r\n if (typeof WritableStream !== \"undefined\" && value instanceof WritableStream) return \"WritableStream\";\r\n if (typeof Request !== \"undefined\" && value instanceof Request) return \"Request\";\r\n if (typeof Response !== \"undefined\" && value instanceof Response) return \"Response\";\r\n if (typeof Headers !== \"undefined\" && value instanceof Headers) return \"Headers\";\r\n if (typeof FormData !== \"undefined\" && value instanceof FormData) return \"FormData\";\r\n return null;\r\n};\r\n\r\nexport const isValidData = (value: unknown): boolean => {\r\n const type = getType(value);\r\n if (type === \"function\") {\r\n error(getInvalidFunctionStoreValueMessage());\r\n return false;\r\n }\r\n if (type === \"map\" || type === \"set\") {\r\n warn(getMapSetStoreWarningMessage());\r\n return true;\r\n }\r\n if (type === \"date\") {\r\n warn(getDateStoreWarningMessage());\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nconst _canReuseSanitized = (value: unknown, seen: WeakSet<object>): boolean => {\r\n const blocked = getNonSerializableType(value);\r\n if (blocked) {\r\n throw new Error(`${blocked} values are not supported`);\r\n }\r\n const type = getType(value);\r\n if (type === \"number\") {\r\n if (!Number.isFinite(value as number)) {\r\n throw new Error(\"Non-finite numbers are not supported\");\r\n }\r\n return true;\r\n }\r\n if (type === \"bigint\") {\r\n throw new Error(\"BigInt values are not supported\");\r\n }\r\n if (type === \"symbol\") {\r\n throw new Error(\"Symbol values are not supported\");\r\n }\r\n if (type === \"date\" || type === \"map\" || type === \"set\") {\r\n return false;\r\n }\r\n if (type === \"array\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n const keys = Object.keys(value as unknown[]);\r\n for (const key of keys) {\r\n const idx = Number(key);\r\n if (!Number.isInteger(idx)) return false;\r\n }\r\n for (let i = 0; i < (value as unknown[]).length; i += 1) {\r\n if (!(i in (value as unknown[]))) continue;\r\n if (!_canReuseSanitized((value as unknown[])[i], seen)) return false;\r\n }\r\n return true;\r\n }\r\n if (type === \"object\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n if (Object.getOwnPropertySymbols(value as object).length > 0) return false;\r\n const descriptors = Object.getOwnPropertyDescriptors(value as Record<string, unknown>);\r\n for (const [key, descriptor] of Object.entries(descriptors)) {\r\n if (!descriptor.enumerable) return false;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) return false;\r\n if (\"get\" in descriptor || \"set\" in descriptor) {\r\n throw new Error(`Accessor properties are not supported during sanitize (\"${key}\")`);\r\n }\r\n if (!_canReuseSanitized(descriptor.value, seen)) return false;\r\n }\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const canReuseSanitized = (value: unknown): boolean => _canReuseSanitized(value, new WeakSet<object>());\r\n\r\nconst _sanitize = (value: unknown, seen: WeakSet<object>): unknown => {\r\n const blocked = getNonSerializableType(value);\r\n if (blocked) {\r\n throw new Error(`${blocked} values are not supported`);\r\n }\r\n const type = getType(value);\r\n if (type === \"number\") {\r\n if (!Number.isFinite(value as number)) {\r\n throw new Error(\"Non-finite numbers are not supported\");\r\n }\r\n return value;\r\n }\r\n if (type === \"bigint\") {\r\n throw new Error(\"BigInt values are not supported\");\r\n }\r\n if (type === \"symbol\") {\r\n throw new Error(\"Symbol values are not supported\");\r\n }\r\n if (type === \"date\") {\r\n if (isDev()) warn(getSanitizeDateWarningMessage());\r\n return (value as Date).toISOString();\r\n }\r\n if (type === \"map\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n if (isDev()) warn(getSanitizeMapWarningMessage());\r\n const clean: Record<string, unknown> = {};\r\n for (const [key, entryValue] of value as Map<unknown, unknown>) {\r\n if (typeof key !== \"string\") {\r\n throw new Error(\"Map keys must be strings to remain JSON-safe\");\r\n }\r\n clean[String(key)] = _sanitize(entryValue, seen);\r\n }\r\n return clean;\r\n }\r\n if (type === \"set\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n if (isDev()) warn(getSanitizeSetWarningMessage());\r\n return Array.from(value as Set<unknown>, (entry) => _sanitize(entry, seen));\r\n }\r\n if (type === \"object\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n const clean: Record<string, unknown> = {};\r\n const descriptors = Object.getOwnPropertyDescriptors(value as Record<string, unknown>);\r\n for (const [key, descriptor] of Object.entries(descriptors)) {\r\n if (!descriptor.enumerable) continue;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) continue;\r\n if (\"get\" in descriptor || \"set\" in descriptor) {\r\n throw new Error(`Accessor properties are not supported during sanitize (\"${key}\")`);\r\n }\r\n clean[key] = _sanitize(descriptor.value, seen);\r\n }\r\n return clean;\r\n }\r\n if (type === \"array\") {\r\n if (seen.has(value as object)) {\r\n throw new Error(\"Circular reference detected during sanitize\");\r\n }\r\n seen.add(value as object);\r\n return (value as unknown[]).map((entry) => _sanitize(entry, seen));\r\n }\r\n return value;\r\n};\r\n\r\nexport const sanitize = (value: unknown): unknown => _sanitize(value, new WeakSet<object>());\r\n\r\nexport const isValidStoreName = (name: string): boolean => {\r\n if (typeof name !== \"string\" || name.trim() === \"\") {\r\n error(getInvalidStoreNameMessage(name));\r\n return false;\r\n }\r\n if (FORBIDDEN_OBJECT_KEYS.has(name)) {\r\n error(getForbiddenStoreNameMessage(name));\r\n return false;\r\n }\r\n if (name.includes(\" \")) {\r\n error(getStoreNameContainsSpacesMessage(name));\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\n\r\n","/**\r\n * @module utils/hash\r\n *\r\n * LAYER: Utilities\r\n * OWNS: Module-level behavior and exports for utils/hash.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { FORBIDDEN_OBJECT_KEYS } from \"./validation.js\";\r\n\r\n// --- hashing / checksum ------------------------------------------------------\r\nlet _crcTable: number[] | null = null;\r\nconst _getCrcTable = (): number[] => {\r\n if (_crcTable) return _crcTable;\r\n let c: number;\r\n const table: number[] = [];\r\n for (let n = 0; n < 256; n++) {\r\n c = n;\r\n for (let k = 0; k < 8; k++) {\r\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\r\n }\r\n table[n] = c >>> 0;\r\n }\r\n _crcTable = table;\r\n return table;\r\n};\r\n\r\nexport const crc32 = (str: string): number => {\r\n const table = _getCrcTable();\r\n let crc = 0 ^ (-1);\r\n for (let i = 0; i < str.length; i++) {\r\n crc = (crc >>> 0);\r\n crc = (crc >>> 8) ^ table[(crc ^ str.charCodeAt(i)) & 0xFF];\r\n }\r\n return (crc ^ (-1)) >>> 0;\r\n};\r\n\r\ntype HashState = {\r\n h1: number;\r\n h2: number;\r\n seen: WeakMap<object, number>;\r\n nextId: number;\r\n nodes: number;\r\n};\r\n\r\nconst HASH_SEED_1 = 0x811C9DC5;\r\nconst HASH_SEED_2 = 0x9E3779B1;\r\nconst MAX_HASH_NODES = 100_000;\r\n\r\nconst mixHash = (state: HashState, value: number): void => {\r\n const v = value >>> 0;\r\n state.h1 = Math.imul(state.h1 ^ v, 0x85EBCA6B);\r\n state.h2 = Math.imul(state.h2 ^ v, 0xC2B2AE35);\r\n};\r\n\r\nconst mixString = (state: HashState, value: string): void => {\r\n mixHash(state, value.length);\r\n for (let i = 0; i < value.length; i++) {\r\n mixHash(state, value.charCodeAt(i));\r\n }\r\n};\r\n\r\nconst mixToken = (state: HashState, token: string): void => {\r\n mixString(state, token);\r\n};\r\n\r\nconst hashNumber = (state: HashState, value: number): void => {\r\n if (Number.isNaN(value)) {\r\n mixToken(state, \"NaN\");\r\n return;\r\n }\r\n if (!Number.isFinite(value)) {\r\n mixToken(state, value > 0 ? \"Infinity\" : \"-Infinity\");\r\n return;\r\n }\r\n if (Object.is(value, -0)) {\r\n mixToken(state, \"-0\");\r\n return;\r\n }\r\n const asInt = value | 0;\r\n if (value === asInt) {\r\n mixToken(state, \"int\");\r\n mixHash(state, asInt);\r\n return;\r\n }\r\n mixToken(state, \"num\");\r\n mixString(state, String(value));\r\n};\r\n\r\nconst hashValue = (state: HashState, value: unknown): void => {\r\n if (state.nodes++ > MAX_HASH_NODES) {\r\n mixToken(state, \"[max]\");\r\n return;\r\n }\r\n if (value === null) {\r\n mixToken(state, \"null\");\r\n return;\r\n }\r\n const type = typeof value;\r\n if (type === \"string\") {\r\n mixToken(state, \"string\");\r\n mixString(state, value as string);\r\n return;\r\n }\r\n if (type === \"number\") {\r\n mixToken(state, \"number\");\r\n hashNumber(state, value as number);\r\n return;\r\n }\r\n if (type === \"boolean\") {\r\n mixToken(state, value ? \"true\" : \"false\");\r\n return;\r\n }\r\n if (type === \"undefined\") {\r\n mixToken(state, \"undefined\");\r\n return;\r\n }\r\n if (type === \"bigint\") {\r\n mixToken(state, \"bigint\");\r\n mixString(state, (value as bigint).toString());\r\n return;\r\n }\r\n if (type === \"symbol\") {\r\n mixToken(state, \"symbol\");\r\n const sym = value as symbol;\r\n mixString(state, Symbol.keyFor(sym) ?? sym.description ?? String(sym));\r\n return;\r\n }\r\n if (type === \"function\") {\r\n mixToken(state, \"function\");\r\n mixString(state, (value as Function).name || \"anonymous\");\r\n return;\r\n }\r\n\r\n const obj = value as object;\r\n const seenId = state.seen.get(obj);\r\n if (seenId !== undefined) {\r\n mixToken(state, \"ref\");\r\n mixHash(state, seenId);\r\n return;\r\n }\r\n const id = state.nextId++;\r\n state.seen.set(obj, id);\r\n\r\n if (Array.isArray(obj)) {\r\n mixToken(state, \"array\");\r\n mixHash(state, obj.length);\r\n for (let i = 0; i < obj.length; i++) {\r\n if (Object.prototype.hasOwnProperty.call(obj, i)) {\r\n hashValue(state, (obj as unknown[])[i]);\r\n } else {\r\n mixToken(state, \"hole\");\r\n }\r\n }\r\n return;\r\n }\r\n if (obj instanceof Date) {\r\n mixToken(state, \"date\");\r\n hashNumber(state, obj.getTime());\r\n return;\r\n }\r\n if (obj instanceof Map) {\r\n mixToken(state, \"map\");\r\n mixHash(state, obj.size);\r\n obj.forEach((entryValue, key) => {\r\n hashValue(state, key);\r\n hashValue(state, entryValue);\r\n });\r\n return;\r\n }\r\n if (obj instanceof Set) {\r\n mixToken(state, \"set\");\r\n mixHash(state, obj.size);\r\n obj.forEach((entryValue) => {\r\n hashValue(state, entryValue);\r\n });\r\n return;\r\n }\r\n\r\n mixToken(state, \"object\");\r\n const descriptors = Object.getOwnPropertyDescriptors(obj as Record<string, unknown>);\r\n const entries: Array<[string, PropertyDescriptor]> = [];\r\n Object.entries(descriptors).forEach(([key, descriptor]) => {\r\n if (!descriptor?.enumerable) return;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) return;\r\n if (\"get\" in descriptor || \"set\" in descriptor) return;\r\n entries.push([key, descriptor]);\r\n });\r\n mixHash(state, entries.length);\r\n for (const [key, descriptor] of entries) {\r\n mixString(state, key);\r\n hashValue(state, descriptor.value);\r\n }\r\n};\r\n\r\n/**\r\n * Non-cryptographic checksum for integrity (best-effort). Do not use for security.\r\n * String inputs preserve the legacy CRC32(JSON.stringify(value)) behavior to keep\r\n * persisted checksums stable across versions.\r\n */\r\nexport const hashState = (value: unknown): number => {\r\n if (typeof value === \"string\") {\r\n return crc32(JSON.stringify(value));\r\n }\r\n const state: HashState = {\r\n h1: HASH_SEED_1,\r\n h2: HASH_SEED_2,\r\n seen: new WeakMap(),\r\n nextId: 1,\r\n nodes: 0,\r\n };\r\n hashValue(state, value);\r\n let h1 = state.h1 >>> 0;\r\n let h2 = state.h2 >>> 0;\r\n h1 ^= h1 >>> 16;\r\n h1 = Math.imul(h1, 0x85EBCA6B);\r\n h1 ^= h1 >>> 13;\r\n h1 = Math.imul(h1, 0xC2B2AE35);\r\n h1 ^= h1 >>> 16;\r\n h2 ^= h2 >>> 16;\r\n h2 = Math.imul(h2, 0x27D4EB2D);\r\n h2 ^= h2 >>> 15;\r\n h2 = Math.imul(h2, 0x165667B1);\r\n h2 ^= h2 >>> 16;\r\n return ((h1 & 0x1FFFFF) * 0x100000000) + (h2 >>> 0);\r\n};\r\n\r\nexport const checksumState = hashState; // alias for clarity\r\n\r\n\r\n","/**\r\n * @module utils/clone\r\n *\r\n * LAYER: Utilities\r\n * OWNS: Module-level behavior and exports for utils/clone.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { warnAlways } from \"../internals/diagnostics.js\";\r\nimport { FORBIDDEN_OBJECT_KEYS } from \"./validation.js\";\r\n\r\n// --- cloning / equality helpers ------------------------------------------------\r\nconst hasStructuredClone = typeof globalThis !== \"undefined\" && typeof (globalThis as any).structuredClone === \"function\";\r\n\r\nexport const shallowClone = <T>(value: T): T => {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (value instanceof Date) return new Date(value.getTime()) as T;\r\n if (value instanceof Map) return new Map(value as Map<unknown, unknown>) as T;\r\n if (value instanceof Set) return new Set(value as Set<unknown>) as T;\r\n if (Array.isArray(value)) return (value.slice() as unknown) as T;\r\n\r\n const clone: Record<string, unknown> = {};\r\n const descriptors = Object.getOwnPropertyDescriptors(value as Record<string, unknown>);\r\n Object.entries(descriptors).forEach(([key, descriptor]) => {\r\n if (!descriptor.enumerable) return;\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) return;\r\n if (\"get\" in descriptor || \"set\" in descriptor) return;\r\n clone[key] = descriptor.value;\r\n });\r\n return clone as T;\r\n};\r\n\r\nconst _deepCloneFallback = <T>(value: T, seen = new WeakMap<object, unknown>()): T => {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (seen.has(value as object)) return seen.get(value as object) as T;\r\n\r\n if (value instanceof Date) return new Date(value.getTime()) as T;\r\n if (value instanceof Map) {\r\n const clone = new Map();\r\n seen.set(value, clone);\r\n value.forEach((entryValue, key) => {\r\n clone.set(_deepCloneFallback(key, seen), _deepCloneFallback(entryValue, seen));\r\n });\r\n return clone as T;\r\n }\r\n if (value instanceof Set) {\r\n const clone = new Set();\r\n seen.set(value, clone);\r\n value.forEach((entryValue) => {\r\n clone.add(_deepCloneFallback(entryValue, seen));\r\n });\r\n return clone as T;\r\n }\r\n if (Array.isArray(value)) {\r\n const clone: unknown[] = [];\r\n seen.set(value, clone);\r\n value.forEach((entry, index) => {\r\n clone[index] = _deepCloneFallback(entry, seen);\r\n });\r\n return clone as T;\r\n }\r\n\r\n const WeakRefCtor = (globalThis as any)?.WeakRef as (new (...args: any[]) => any) | undefined;\r\n if (WeakRefCtor && value instanceof WeakRefCtor) {\r\n warnAlways(\"WeakRef values cannot be deep-cloned. Returning the original reference.\");\r\n return value;\r\n }\r\n\r\n const clone: Record<string, unknown> = {};\r\n seen.set(value as object, clone);\r\n let descriptors: Record<string, PropertyDescriptor>;\r\n try {\r\n descriptors = Object.getOwnPropertyDescriptors(value as Record<string, unknown>);\r\n } catch (err) {\r\n warnAlways(\r\n `deepClone failed to read object descriptors (possible Proxy or host object). ` +\r\n `Returning the original reference.`\r\n );\r\n return value;\r\n }\r\n Object.entries(descriptors).forEach(([key, descriptor]) => {\r\n if (!descriptor.enumerable || FORBIDDEN_OBJECT_KEYS.has(key)) return;\r\n if (\"get\" in descriptor || \"set\" in descriptor) return;\r\n clone[key] = _deepCloneFallback(descriptor.value, seen);\r\n });\r\n return clone as T;\r\n};\r\n\r\nexport const deepClone = <T>(value: T): T => {\r\n try {\r\n if (hasStructuredClone) return (structuredClone as <X>(v: X) => X)(value);\r\n } catch (_) {\r\n // Fall through to the manual clone path below.\r\n }\r\n return _deepCloneFallback(value);\r\n};\r\n\r\nexport const shallowEqual = (a: unknown, b: unknown): boolean => {\r\n if (Object.is(a, b)) return true;\r\n if (!a || !b || typeof a !== \"object\" || typeof b !== \"object\") return false;\r\n const aObj = a as Record<string, unknown>;\r\n const bObj = b as Record<string, unknown>;\r\n const aKeys = Object.keys(aObj);\r\n const bKeys = Object.keys(bObj);\r\n if (aKeys.length !== bKeys.length) return false;\r\n for (const k of aKeys) {\r\n if (!Object.prototype.hasOwnProperty.call(bObj, k) || !Object.is(aObj[k], bObj[k])) return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const produceClone = <T>(base: T, recipe: (draft: T) => void): T => {\r\n try {\r\n const draft = deepClone(base);\r\n recipe(draft);\r\n return draft;\r\n } catch (err) {\r\n throw new Error(\r\n `produceClone failed (possible circular reference or unserializable data): ${(err as { message?: string })?.message ?? err}`\r\n );\r\n }\r\n};\r\n\r\n\r\n","/**\r\n * @module utils/path\r\n *\r\n * LAYER: Utilities\r\n * OWNS: Module-level behavior and exports for utils/path.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport {\r\n critical,\r\n error,\r\n getDeepNestingWarningMessage,\r\n getPathDepthExceededMessage,\r\n getPathNotObjectMessage,\r\n getPathReachedNullMessage,\r\n warn,\r\n} from \"../internals/diagnostics.js\";\r\nimport { FORBIDDEN_OBJECT_KEYS } from \"./validation.js\";\r\n\r\nconst MAX_DEPTH = 10;\r\nconst WARN_DEPTH = 5;\r\nexport type PathInput = string | readonly string[] | string[];\r\n\r\nconst _splitPath = (path: string): string[] => {\r\n const parts: string[] = [];\r\n let current = \"\";\r\n let escaping = false;\r\n\r\n for (const ch of path) {\r\n if (escaping) {\r\n current += ch;\r\n escaping = false;\r\n continue;\r\n }\r\n if (ch === \"\\\\\") {\r\n escaping = true;\r\n continue;\r\n }\r\n if (ch === \".\") {\r\n parts.push(current);\r\n current = \"\";\r\n continue;\r\n }\r\n current += ch;\r\n }\r\n\r\n if (escaping) current += \"\\\\\";\r\n parts.push(current);\r\n return parts;\r\n};\r\n\r\nexport const parsePath = (path: PathInput): string[] => {\r\n if (Array.isArray(path)) return [...path] as string[];\r\n if (typeof path === \"string\" && !path.includes(\".\")) return [path];\r\n if (typeof path === \"string\") return _splitPath(path);\r\n return [String(path)];\r\n};\r\n\r\nexport const validateDepth = (path: PathInput): boolean => {\r\n const parts = parsePath(path);\r\n const depth = parts.length;\r\n if (depth > MAX_DEPTH) {\r\n error(getPathDepthExceededMessage(depth, MAX_DEPTH, parts));\r\n return false;\r\n }\r\n if (depth > WARN_DEPTH) {\r\n warn(getDeepNestingWarningMessage(depth, parts));\r\n }\r\n return true;\r\n};\r\n\r\nexport const getByPath = (obj: unknown, path: PathInput): unknown => {\r\n const parts = parsePath(path);\r\n let current: unknown = obj;\r\n for (const part of parts) {\r\n if (current === null || current === undefined) {\r\n warn(getPathReachedNullMessage(parts, part));\r\n return undefined;\r\n }\r\n if (typeof current !== \"object\") {\r\n warn(getPathNotObjectMessage(part));\r\n return undefined;\r\n }\r\n current = (current as Record<string, unknown>)[part];\r\n }\r\n return current;\r\n};\r\n\r\nexport const setByPath = <T extends Record<string, unknown> | unknown[]>(obj: T, path: PathInput, value: unknown): T => {\r\n const parts = parsePath(path);\r\n if (parts.length === 0) return obj;\r\n for (const segment of parts) {\r\n if (FORBIDDEN_OBJECT_KEYS.has(segment)) {\r\n critical(`Blocked forbidden path segment \"${String(segment)}\" in setStore path \"${parts.join(\".\")}\".`);\r\n return obj;\r\n }\r\n }\r\n\r\n const applyAt = (current: unknown, index: number): unknown => {\r\n const key = parts[index];\r\n const isLast = index === parts.length - 1;\r\n\r\n if (Array.isArray(current)) {\r\n const targetIndex = Number(key);\r\n if (!Number.isInteger(targetIndex)) return current;\r\n const clone = [...current];\r\n if (isLast) {\r\n clone[targetIndex] = value;\r\n return clone;\r\n }\r\n clone[targetIndex] = applyAt(clone[targetIndex], index + 1);\r\n return clone;\r\n }\r\n\r\n if (current && typeof current === \"object\") {\r\n if (FORBIDDEN_OBJECT_KEYS.has(key)) {\r\n critical(`Blocked unsafe path segment \"${String(key)}\" while setting \"${parts.join(\".\")}\".`);\r\n return current;\r\n }\r\n const clone: Record<string, unknown> = { ...(current as Record<string, unknown>) };\r\n if (isLast) {\r\n clone[key] = value;\r\n return clone as unknown;\r\n }\r\n clone[key] = applyAt(clone[key], index + 1);\r\n return clone as unknown;\r\n }\r\n\r\n if ((current === null || current === undefined) && !isLast) {\r\n const isIndex = Number.isInteger(Number(key));\r\n const container: Record<string, unknown> | unknown[] = isIndex ? [] : {};\r\n if (isIndex) {\r\n const arr = container as unknown[];\r\n const idx = Number(key);\r\n arr[idx] = applyAt(undefined, index + 1);\r\n return arr;\r\n }\r\n (container as Record<string, unknown>)[key] = applyAt(undefined, index + 1);\r\n return container;\r\n }\r\n\r\n // Fallback: leave unchanged when path cannot be extended.\r\n return isLast ? value : current;\r\n };\r\n\r\n return applyAt(obj, 0) as T;\r\n};\r\n\r\n\r\n","/**\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/lifecycle\r\n *\r\n * LAYER: Feature runtime\r\n * OWNS: Module-level behavior and exports for features/lifecycle.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue } from \"../adapters/options.js\";\r\nimport { deepClone, isDev } from \"../utils.js\";\r\n\r\nexport const MIDDLEWARE_ABORT = Symbol(\"stroid.middleware.abort\");\r\n\r\nexport type LifecycleIssueReporter = (message: string, visibility?: \"dev\" | \"always\") => void;\r\n\r\nexport const runMiddleware = ({\r\n name,\r\n payload,\r\n middlewares,\r\n reportIssue,\r\n warn,\r\n}: {\r\n name: string;\r\n payload: { action: string; prev: StoreValue; next: StoreValue; path: unknown };\r\n middlewares: Array<(ctx: {\r\n action: string;\r\n name: string;\r\n prev: StoreValue;\r\n next: StoreValue;\r\n path: unknown;\r\n }) => StoreValue | void>;\r\n reportIssue: LifecycleIssueReporter;\r\n warn: (message: string) => void;\r\n}): StoreValue | typeof MIDDLEWARE_ABORT => {\r\n if (!Array.isArray(middlewares) || middlewares.length === 0) return payload.next;\r\n const warnedUndefined = new WeakSet<Function>();\r\n let nextState = deepClone(payload.next);\r\n for (const mw of middlewares) {\r\n if (typeof mw !== \"function\") continue;\r\n let result: StoreValue | void;\r\n const middlewareNext = nextState;\r\n try {\r\n result = mw({\r\n action: payload.action,\r\n name,\r\n prev: payload.prev,\r\n next: middlewareNext,\r\n path: payload.path,\r\n });\r\n } catch (err) {\r\n const message = `Middleware for \"${name}\" failed: ${(err as { message?: string })?.message ?? err}`;\r\n reportIssue(message, \"dev\");\r\n return MIDDLEWARE_ABORT;\r\n }\r\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\r\n const message = `Middleware for \"${name}\" must be synchronous. Promise-returning middleware is not supported.`;\r\n reportIssue(message, \"dev\");\r\n return MIDDLEWARE_ABORT;\r\n }\r\n if (result === undefined) {\r\n if (isDev() && !warnedUndefined.has(mw)) {\r\n warnedUndefined.add(mw);\r\n warn(`Middleware for \"${name}\" returned undefined; treating as pass-through. Return the new state to override.`);\r\n }\r\n nextState = middlewareNext;\r\n } else {\r\n nextState = result;\r\n }\r\n }\r\n return nextState;\r\n};\r\n\r\nexport const runStoreHook = ({\r\n name,\r\n label,\r\n fn,\r\n args,\r\n reportIssue,\r\n}: {\r\n name: string;\r\n label: \"onCreate\" | \"onSet\" | \"onReset\" | \"onDelete\";\r\n fn: ((...args: any[]) => void) | undefined;\r\n args: any[];\r\n reportIssue: LifecycleIssueReporter;\r\n}): void => {\r\n if (typeof fn !== \"function\") return;\r\n try {\r\n fn(...args);\r\n } catch (err) {\r\n const message = `${label} for \"${name}\" failed: ${(err as { message?: string })?.message ?? err}`;\r\n reportIssue(message, \"always\");\r\n }\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/reporting\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/reporting.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { critical, warn, warnAlways } from \"./diagnostics.js\";\r\n\r\nexport type IssueSeverity = \"warn\" | \"critical\";\r\nexport type IssueVisibility = \"dev\" | \"always\";\r\n\r\nexport type IssueOptions = {\r\n severity?: IssueSeverity;\r\n visibility?: IssueVisibility;\r\n onError?: (message: string) => void;\r\n};\r\n\r\nexport const reportIssue = (message: string, options: IssueOptions = {}): void => {\r\n const {\r\n severity = \"warn\",\r\n visibility = \"dev\",\r\n onError,\r\n } = options;\r\n\r\n onError?.(message);\r\n\r\n if (severity === \"critical\") {\r\n if (visibility === \"dev\") warn(message);\r\n critical(message);\r\n return;\r\n }\r\n\r\n if (visibility === \"always\") {\r\n warnAlways(message);\r\n return;\r\n }\r\n\r\n warn(message);\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/computed-order\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/computed-order.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { registerTestResetHook } from \"./test-reset.js\";\r\n\r\nexport type ComputedOrderResolver = (names: string[]) => string[];\r\n\r\nlet resolver: ComputedOrderResolver | null = null;\r\n\r\nexport const setComputedOrderResolver = (next: ComputedOrderResolver | null): void => {\r\n resolver = next;\r\n};\r\n\r\nexport const getComputedOrder = (names: string[]): string[] => {\r\n return resolver ? resolver(names) : [];\r\n};\r\n\r\nregisterTestResetHook(\"computed.order-resolver\", () => {\r\n resolver = null;\r\n}, 105);\r\n\r\n\r\n","/**\r\n * @module computed-graph\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for computed-graph.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport {\r\n getStoreRegistry,\r\n getActiveStoreRegistry,\r\n defaultRegistryScope,\r\n type ComputedEntry,\r\n} from \"./store-registry.js\";\r\nimport { error } from \"./utils.js\";\r\nimport { setComputedOrderResolver } from \"./internals/computed-order.js\";\r\n\r\nconst getRegistry = () => getActiveStoreRegistry(getStoreRegistry(defaultRegistryScope));\r\n\r\nconst getEntries = () => getRegistry().computedEntries;\r\nconst getDependents = () => getRegistry().computedDependents;\r\n\r\nexport const detectCycle = (name: string, deps: string[]): string | null => {\r\n const entries = getEntries();\r\n const visited = new Set<string>();\r\n const path: string[] = [];\r\n\r\n const dfs = (current: string): boolean => {\r\n if (current === name) return true;\r\n if (visited.has(current)) return false;\r\n visited.add(current);\r\n path.push(current);\r\n\r\n const currentDeps = entries[current]?.deps ?? [];\r\n for (const dep of currentDeps) {\r\n if (dfs(dep)) return true;\r\n }\r\n\r\n path.pop();\r\n return false;\r\n };\r\n\r\n for (const dep of deps) {\r\n path.length = 0;\r\n if (dfs(dep)) {\r\n return [name, ...path, name].join(\" -> \");\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst removeComputedDependentLinks = (name: string, deps: string[]): void => {\r\n const dependents = getDependents();\r\n for (const dep of deps) {\r\n const links = dependents[dep];\r\n if (!links) continue;\r\n links.delete(name);\r\n if (links.size === 0) delete dependents[dep];\r\n }\r\n};\r\n\r\nexport const registerComputed = (\r\n name: string,\r\n deps: string[],\r\n compute: (...args: unknown[]) => unknown\r\n): boolean => {\r\n const cycleTrace = detectCycle(name, deps);\r\n if (cycleTrace) {\r\n error(\r\n `[stroid] createComputed(\"${name}\") rejected: ` +\r\n `circular dependency detected -> ${cycleTrace}\\n` +\r\n `Define relationships without cycles.`\r\n );\r\n return false;\r\n }\r\n\r\n const entries = getEntries();\r\n const dependents = getDependents();\r\n\r\n if (entries[name]) {\r\n removeComputedDependentLinks(name, entries[name].deps);\r\n }\r\n\r\n entries[name] = { deps, compute, stale: true } as ComputedEntry;\r\n\r\n for (const dep of deps) {\r\n if (!dependents[dep]) dependents[dep] = new Set<string>();\r\n dependents[dep].add(name);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const unregisterComputed = (name: string): void => {\r\n const entries = getEntries();\r\n const entry = entries[name];\r\n if (!entry) return;\r\n\r\n removeComputedDependentLinks(name, entry.deps);\r\n delete entries[name];\r\n};\r\n\r\nexport const markStale = (name: string): void => {\r\n const entries = getEntries();\r\n if (entries[name]) entries[name].stale = true;\r\n};\r\n\r\nexport const isComputed = (name: string): boolean =>\r\n Object.prototype.hasOwnProperty.call(getEntries(), name);\r\n\r\nexport const getComputedEntry = (name: string): ComputedEntry | undefined =>\r\n getEntries()[name];\r\n\r\nexport const getTopoOrderedComputeds = (changedSources: string[]): string[] => {\r\n const entries = getEntries();\r\n const dependents = getDependents();\r\n\r\n const affected = new Set<string>();\r\n const queue = [...changedSources];\r\n\r\n while (queue.length > 0) {\r\n const current = queue.shift()!;\r\n const deps = dependents[current];\r\n if (!deps) continue;\r\n for (const dep of deps) {\r\n if (!affected.has(dep)) {\r\n affected.add(dep);\r\n queue.push(dep);\r\n }\r\n }\r\n }\r\n\r\n if (affected.size === 0) return [];\r\n\r\n const expandComputedDeps = (name: string): void => {\r\n const entry = entries[name];\r\n if (!entry) return;\r\n for (const dep of entry.deps) {\r\n if (!entries[dep]) continue;\r\n if (!affected.has(dep)) {\r\n affected.add(dep);\r\n expandComputedDeps(dep);\r\n }\r\n }\r\n };\r\n\r\n Array.from(affected).forEach((name) => expandComputedDeps(name));\r\n\r\n const inDegree = new Map<string, number>();\r\n const adjList = new Map<string, string[]>();\r\n\r\n for (const name of affected) {\r\n const entry = entries[name];\r\n if (!entry) continue;\r\n\r\n let degree = 0;\r\n for (const dep of entry.deps) {\r\n if (affected.has(dep)) {\r\n degree++;\r\n if (!adjList.has(dep)) adjList.set(dep, []);\r\n adjList.get(dep)!.push(name);\r\n }\r\n }\r\n inDegree.set(name, degree);\r\n }\r\n\r\n const ready: string[] = [];\r\n for (const [name, degree] of inDegree) {\r\n if (degree === 0) ready.push(name);\r\n }\r\n ready.sort();\r\n\r\n const sorted: string[] = [];\r\n while (ready.length > 0) {\r\n const name = ready.shift()!;\r\n sorted.push(name);\r\n\r\n const children = adjList.get(name) ?? [];\r\n for (const child of children) {\r\n const newDegree = (inDegree.get(child) ?? 1) - 1;\r\n inDegree.set(child, newDegree);\r\n if (newDegree === 0) {\r\n const insertAt = ready.findIndex((n) => n > child);\r\n if (insertAt === -1) ready.push(child);\r\n else ready.splice(insertAt, 0, child);\r\n }\r\n }\r\n }\r\n\r\n return sorted;\r\n};\r\n\r\nsetComputedOrderResolver(getTopoOrderedComputeds);\r\n\r\nexport const getFullComputedGraph = (): {\r\n nodes: string[];\r\n edges: Array<{ from: string; to: string }>;\r\n dependencies: Record<string, string[]>;\r\n dependents: Record<string, string[]>;\r\n} => {\r\n const entries = getEntries();\r\n const dependents = getDependents();\r\n\r\n const nodes = Object.keys(entries);\r\n const edges: Array<{ from: string; to: string }> = [];\r\n\r\n for (const [name, entry] of Object.entries(entries)) {\r\n for (const dep of entry.deps) {\r\n edges.push({ from: dep, to: name });\r\n }\r\n }\r\n\r\n return {\r\n nodes,\r\n edges,\r\n dependencies: Object.fromEntries(\r\n Object.entries(entries).map(([k, v]) => [k, [...v.deps]])\r\n ),\r\n dependents: Object.fromEntries(\r\n Object.entries(dependents).map(([k, v]) => [k, [...v]])\r\n ),\r\n };\r\n};\r\n\r\nexport const getComputedDepsFor = (name: string): { deps: string[]; dependents: string[] } | null => {\r\n const entry = getEntries()[name];\r\n if (!entry) return null;\r\n const dependents = getDependents()[name];\r\n return {\r\n deps: [...entry.deps],\r\n dependents: dependents ? [...dependents] : [],\r\n };\r\n};\r\n\r\n\r\n","/**\r\n * @module store-transaction\r\n *\r\n * LAYER: Store runtime\r\n * OWNS: Module-level behavior and exports for store-transaction.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport type { StoreValue } from \"./store-lifecycle/types.js\";\r\nimport {\r\n getActiveStoreRegistry,\r\n runWithRegistry,\r\n type StoreRegistry,\r\n type TransactionState,\r\n} from \"./store-registry.js\";\r\n\r\nconst getTransactionState = (registry?: StoreRegistry): TransactionState =>\r\n (registry ?? getActiveStoreRegistry()).transaction;\r\n\r\nconst coerceError = (err?: unknown): Error => {\r\n if (err instanceof Error) return err;\r\n if (typeof err === \"string\") return new Error(err);\r\n if (err && typeof (err as any)?.message === \"string\") return new Error((err as any).message);\r\n return new Error(\"setStoreBatch aborted\");\r\n};\r\n\r\nexport const beginTransaction = (registry?: StoreRegistry): StoreRegistry => {\r\n const resolvedRegistry = registry ?? getActiveStoreRegistry();\r\n const state = getTransactionState(resolvedRegistry);\r\n state.depth += 1;\r\n if (state.depth === 1) {\r\n state.pending = [];\r\n state.stagedValues.clear();\r\n state.snapshotCache.clear();\r\n state.failed = false;\r\n state.error = undefined;\r\n }\r\n return resolvedRegistry;\r\n};\r\n\r\nexport const isTransactionActive = (): boolean => getTransactionState().depth > 0;\r\n\r\nexport const markTransactionFailed = (err?: unknown, registry?: StoreRegistry): void => {\r\n const state = getTransactionState(registry);\r\n state.failed = true;\r\n if (!state.error) state.error = coerceError(err);\r\n};\r\n\r\nexport const registerTransactionCommit = (fn: () => void): void => {\r\n const registry = getActiveStoreRegistry();\r\n const state = getTransactionState(registry);\r\n state.pending.push(() => runWithRegistry(registry, fn));\r\n};\r\n\r\nexport const stageTransactionValue = (name: string, value: StoreValue): void => {\r\n const state = getTransactionState();\r\n state.stagedValues.set(name, value);\r\n state.snapshotCache.delete(name);\r\n};\r\n\r\nexport const getStagedTransactionValue = (name: string): { has: boolean; value: StoreValue | undefined } => {\r\n const state = getTransactionState();\r\n if (!state.stagedValues.has(name)) return { has: false, value: undefined };\r\n return { has: true, value: state.stagedValues.get(name) };\r\n};\r\n\r\nexport const endTransaction = (err?: unknown, registry?: StoreRegistry): Error | null => {\r\n const state = getTransactionState(registry);\r\n if (state.depth === 0) return null;\r\n if (err) {\r\n markTransactionFailed(err, registry);\r\n }\r\n state.depth = Math.max(0, state.depth - 1);\r\n if (state.depth > 0) return null;\r\n\r\n const finalError = state.failed ? (state.error ?? new Error(\"setStoreBatch aborted\")) : null;\r\n\r\n if (!finalError) {\r\n state.pending.forEach((fn) => fn());\r\n }\r\n\r\n state.pending = [];\r\n state.stagedValues.clear();\r\n state.snapshotCache.clear();\r\n state.failed = false;\r\n state.error = undefined;\r\n\r\n return finalError;\r\n};\r\n\r\n\r\n","/**\r\n * @module store-notify\r\n *\r\n * LAYER: Store runtime\r\n * OWNS: Module-level behavior and exports for store-notify.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { deepClone, shallowClone, warn, warnAlways } from \"./utils.js\";\r\nimport { devDeepFreeze } from \"./devfreeze.js\";\r\nimport { getConfig } from \"./internals/config.js\";\r\nimport { beginTransaction, endTransaction, isTransactionActive } from \"./store-transaction.js\";\r\nimport { runWithRegistry, type StoreRegistry, type NotifyState } from \"./store-registry.js\";\r\nimport { registerTestResetHook } from \"./internals/test-reset.js\";\r\nimport {\r\n meta,\r\n subscribers,\r\n stores,\r\n snapshotCache,\r\n hasStoreEntryInternal,\r\n getStoreValueRef,\r\n getRegistry,\r\n} from \"./store-lifecycle/registry.js\";\r\nimport type { StoreValue, Subscriber } from \"./store-lifecycle/types.js\";\r\nimport { getComputedOrder } from \"./internals/computed-order.js\";\r\nimport type { SnapshotMode } from \"./adapters/options.js\";\r\n\r\nconst resolveSnapshotMode = (name: string): SnapshotMode => {\r\n const mode = meta[name]?.options?.snapshot ?? getConfig().defaultSnapshotMode;\r\n return mode === \"shallow\" || mode === \"ref\" ? mode : \"deep\";\r\n};\r\n\r\nconst cloneSnapshot = (value: StoreValue, mode: SnapshotMode): StoreValue => {\r\n if (mode === \"ref\") return value;\r\n if (mode === \"shallow\") return shallowClone(value);\r\n return deepClone(value);\r\n};\r\n\r\nconst maybeFreezeSnapshot = (snapshot: StoreValue | null, mode: SnapshotMode): void => {\r\n if (mode !== \"deep\" && mode !== \"ref\") return;\r\n if (snapshot && typeof snapshot === \"object\") devDeepFreeze(snapshot);\r\n};\r\n\r\nconst scheduleChunk = (fn: () => void, delayMs: number): void => {\r\n if (delayMs > 0 && typeof setTimeout === \"function\") {\r\n setTimeout(fn, delayMs);\r\n return;\r\n }\r\n if (typeof queueMicrotask === \"function\") {\r\n queueMicrotask(fn);\r\n return;\r\n }\r\n Promise.resolve().then(fn);\r\n};\r\n\r\nconst buildPendingOrder = (state: NotifyState): { names: string[]; sliceSize: number; chunkDelayMs: number; runInline: boolean; prioritySet: Set<string> | null } => {\r\n const { pendingNotifications, pendingBuffer, orderedNames } = state;\r\n pendingBuffer.length = 0;\r\n for (const name of pendingNotifications) pendingBuffer.push(name);\r\n pendingNotifications.clear();\r\n\r\n const cfg = getConfig().flush;\r\n const priority = cfg.priorityStores || [];\r\n const pendingSet = new Set(pendingBuffer);\r\n const prioritySet = priority.length ? new Set(priority) : null;\r\n\r\n orderedNames.length = 0;\r\n if (prioritySet) {\r\n for (const p of priority) {\r\n if (pendingSet.has(p)) orderedNames.push(p);\r\n }\r\n for (const name of pendingBuffer) {\r\n if (!prioritySet.has(name)) orderedNames.push(name);\r\n }\r\n } else {\r\n orderedNames.push(...pendingBuffer);\r\n }\r\n\r\n const computedOrder = getComputedOrder(orderedNames);\r\n const orderedSet = new Set(orderedNames);\r\n for (const computedName of computedOrder) {\r\n if (pendingSet.has(computedName) && !orderedSet.has(computedName)) {\r\n orderedNames.push(computedName);\r\n orderedSet.add(computedName);\r\n }\r\n }\r\n\r\n const sliceSize = Number.isFinite(cfg.chunkSize) && (cfg.chunkSize as number) > 0\r\n ? (cfg.chunkSize as number)\r\n : Number.POSITIVE_INFINITY;\r\n const chunkDelayMs = cfg.chunkDelayMs;\r\n const runInline = sliceSize === Number.POSITIVE_INFINITY && chunkDelayMs === 0;\r\n const names = orderedNames.slice();\r\n return { names, sliceSize, chunkDelayMs, runInline, prioritySet };\r\n};\r\n\r\nconst flush = (registry: StoreRegistry): void => {\r\n const state = registry.notify;\r\n const { names, sliceSize, chunkDelayMs, runInline, prioritySet } = buildPendingOrder(state);\r\n const now = () => (typeof performance !== \"undefined\" && performance.now) ? performance.now() : Date.now();\r\n\r\n const finish = () => {\r\n state.notifyScheduled = false;\r\n if (state.pendingNotifications.size > 0) scheduleFlush(registry);\r\n };\r\n\r\n if (runInline) {\r\n for (const name of names) {\r\n const subs = subscribers[name];\r\n if (!subs || subs.size === 0) continue;\r\n const version = meta[name]?.updateCount ?? 0;\r\n const snapshotMode = resolveSnapshotMode(name);\r\n const cached = snapshotCache[name];\r\n const snapshot = (cached && cached.version === version)\r\n ? cached.snapshot\r\n : (() => {\r\n const nextSnapshot = cloneSnapshot(stores[name], snapshotMode);\r\n snapshotCache[name] = { version, snapshot: nextSnapshot };\r\n return nextSnapshot;\r\n })();\r\n\r\n const start = now();\r\n for (const subscriber of subs) {\r\n try { subscriber(snapshot); }\r\n catch (err) { warn(`Subscriber for \"${name}\" threw: ${(err as { message?: string })?.message ?? err}`); }\r\n }\r\n const elapsed = now() - start;\r\n\r\n const metrics = meta[name]?.metrics || { notifyCount: 0, totalNotifyMs: 0, lastNotifyMs: 0 };\r\n metrics.notifyCount += 1;\r\n metrics.totalNotifyMs += elapsed;\r\n metrics.lastNotifyMs = elapsed;\r\n if (meta[name]) meta[name].metrics = metrics;\r\n\r\n const currentVersion = meta[name]?.updateCount ?? version;\r\n if (currentVersion !== version) {\r\n state.pendingNotifications.add(name);\r\n }\r\n }\r\n finish();\r\n return;\r\n }\r\n\r\n type StoreTask = {\r\n name: string;\r\n subsArray: Subscriber[];\r\n index: number;\r\n snapshot: StoreValue | null;\r\n version: number;\r\n notified: Set<Subscriber>;\r\n metrics: { notifyCount: number; totalNotifyMs: number; lastNotifyMs: number };\r\n totalMs: number;\r\n };\r\n\r\n const buildQueue = (filter?: (name: string) => boolean): StoreTask[] => {\r\n const tasks: StoreTask[] = [];\r\n for (const name of names) {\r\n if (filter && !filter(name)) continue;\r\n const subs = subscribers[name];\r\n if (!subs || subs.size === 0) continue;\r\n const version = meta[name]?.updateCount ?? 0;\r\n const snapshotMode = resolveSnapshotMode(name);\r\n const cached = snapshotCache[name];\r\n const snapshot = (cached && cached.version === version)\r\n ? cached.snapshot\r\n : (() => {\r\n const nextSnapshot = cloneSnapshot(stores[name], snapshotMode);\r\n snapshotCache[name] = { version, snapshot: nextSnapshot };\r\n return nextSnapshot;\r\n })();\r\n tasks.push({\r\n name,\r\n subsArray: Array.from(subs),\r\n index: 0,\r\n snapshot,\r\n version,\r\n notified: new Set(),\r\n metrics: meta[name]?.metrics ? { ...meta[name]!.metrics } : { notifyCount: 0, totalNotifyMs: 0, lastNotifyMs: 0 },\r\n totalMs: 0,\r\n });\r\n }\r\n return tasks;\r\n };\r\n\r\n const priorityQueue = prioritySet ? buildQueue((name) => prioritySet.has(name)) : [];\r\n const regularQueue = buildQueue((name) => !prioritySet || !prioritySet.has(name));\r\n\r\n const refreshTaskSubscribers = (task: StoreTask): void => {\r\n const subs = subscribers[task.name];\r\n if (!subs || subs.size === 0) {\r\n task.subsArray = [];\r\n task.index = 0;\r\n return;\r\n }\r\n task.subsArray = Array.from(subs);\r\n task.index = 0;\r\n };\r\n\r\n const runQueue = (queue: StoreTask[], done: () => void): void => {\r\n const processNext = (): void => {\r\n if (queue.length === 0) {\r\n done();\r\n return;\r\n }\r\n const task = queue.shift()!;\r\n const currentVersion = meta[task.name]?.updateCount ?? task.version;\r\n if (currentVersion !== task.version) {\r\n state.pendingNotifications.add(task.name);\r\n if (queue.length === 0) {\r\n done();\r\n return;\r\n }\r\n if (runInline) processNext();\r\n else scheduleChunk(processNext, chunkDelayMs);\r\n return;\r\n }\r\n\r\n refreshTaskSubscribers(task);\r\n if (task.subsArray.length === 0) {\r\n if (queue.length === 0) {\r\n done();\r\n return;\r\n }\r\n if (runInline) processNext();\r\n else scheduleChunk(processNext, chunkDelayMs);\r\n return;\r\n }\r\n\r\n const start = now();\r\n let sent = 0;\r\n let versionChanged = false;\r\n while (task.index < task.subsArray.length && sent < sliceSize) {\r\n const subscriber = task.subsArray[task.index++];\r\n if (task.notified.has(subscriber)) continue;\r\n task.notified.add(subscriber);\r\n try { subscriber(task.snapshot); }\r\n catch (err) { warn(`Subscriber for \"${task.name}\" threw: ${(err as { message?: string })?.message ?? err}`); }\r\n sent += 1;\r\n const currentVersion = meta[task.name]?.updateCount ?? task.version;\r\n if (currentVersion !== task.version) {\r\n versionChanged = true;\r\n state.pendingNotifications.add(task.name);\r\n break;\r\n }\r\n }\r\n task.totalMs += now() - start;\r\n\r\n if (versionChanged) {\r\n if (queue.length === 0) {\r\n done();\r\n return;\r\n }\r\n if (runInline) processNext();\r\n else scheduleChunk(processNext, chunkDelayMs);\r\n return;\r\n }\r\n\r\n const currentSubs = subscribers[task.name];\r\n const hasUnnotified = currentSubs\r\n ? Array.from(currentSubs).some((sub) => !task.notified.has(sub))\r\n : false;\r\n\r\n if (task.index < task.subsArray.length || hasUnnotified) {\r\n queue.push(task);\r\n } else {\r\n task.metrics.notifyCount += 1;\r\n task.metrics.totalNotifyMs += task.totalMs;\r\n task.metrics.lastNotifyMs = task.totalMs;\r\n if (meta[task.name]) meta[task.name].metrics = task.metrics;\r\n }\r\n\r\n if (queue.length === 0) {\r\n done();\r\n return;\r\n }\r\n if (runInline) processNext();\r\n else scheduleChunk(processNext, chunkDelayMs);\r\n };\r\n\r\n processNext();\r\n };\r\n\r\n if (priorityQueue.length > 0) {\r\n runQueue(priorityQueue, () => runQueue(regularQueue, finish));\r\n } else {\r\n runQueue(regularQueue, finish);\r\n }\r\n};\r\n\r\nconst scheduleFlush = (registry: StoreRegistry): void => {\r\n const state = registry.notify;\r\n if (state.notifyScheduled) return;\r\n state.notifyScheduled = true;\r\n const run = () => runWithRegistry(registry, () => flush(registry));\r\n if (typeof queueMicrotask === \"function\") queueMicrotask(run);\r\n else Promise.resolve().then(run);\r\n};\r\n\r\nexport const notify = (name: string): void => {\r\n const registry = getRegistry();\r\n const state = registry.notify;\r\n state.pendingNotifications.add(name);\r\n if (state.batchDepth === 0) scheduleFlush(registry);\r\n};\r\n\r\nexport const setStoreBatch = (fn: () => unknown): void => {\r\n if (typeof fn !== \"function\") {\r\n warn(\"setStoreBatch requires a synchronous function callback.\");\r\n return;\r\n }\r\n if (Object.prototype.toString.call(fn) === \"[object AsyncFunction]\") {\r\n warnAlways(\"setStoreBatch does not support async functions. Move async work outside and batch only synchronous mutations.\");\r\n return;\r\n }\r\n\r\n const registry = getRegistry();\r\n const state = registry.notify;\r\n state.batchDepth = Math.max(0, state.batchDepth + 1);\r\n beginTransaction(registry);\r\n let batchError: unknown;\r\n try {\r\n const result = runWithRegistry(registry, fn);\r\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\r\n batchError = new Error(\"setStoreBatch does not support promise-returning callbacks. Move async work outside and batch only synchronous mutations.\");\r\n }\r\n } catch (err) {\r\n batchError = err;\r\n } finally {\r\n const txError = endTransaction(batchError, registry);\r\n state.batchDepth = Math.max(0, state.batchDepth - 1);\r\n if (batchError || txError) {\r\n state.pendingNotifications.clear();\r\n state.notifyScheduled = false;\r\n }\r\n if (state.batchDepth === 0 && state.pendingNotifications.size > 0) {\r\n scheduleFlush(registry);\r\n }\r\n if (txError && !batchError) {\r\n batchError = txError;\r\n }\r\n }\r\n\r\n if (batchError) {\r\n const message = batchError instanceof Error ? batchError.message : String(batchError);\r\n warnAlways(`setStoreBatch failed: ${message}`);\r\n }\r\n};\r\n\r\nexport const subscribeStore = (name: string, fn: Subscriber): (() => void) => {\r\n if (!subscribers[name]) subscribers[name] = new Set();\r\n subscribers[name].add(fn);\r\n return () => {\r\n subscribers[name]?.delete(fn); // O(1)\r\n if (subscribers[name]?.size === 0) delete subscribers[name];\r\n };\r\n};\r\n\r\n// Backward compat aliases\r\n/** @deprecated Use subscribeStore instead. */\r\nexport const subscribeInternal = subscribeStore;\r\n/** @deprecated Use subscribeStore instead. */\r\nexport const subscribe = subscribeStore;\r\n\r\nexport const getStoreSnapshot = (name: string): StoreValue | null => {\r\n if (!hasStoreEntryInternal(name)) return null;\r\n const snapshotMode = resolveSnapshotMode(name);\r\n if (isTransactionActive()) {\r\n const registry = getRegistry();\r\n const txCache = registry.transaction.snapshotCache;\r\n const source = getStoreValueRef(name);\r\n if (source === undefined) return null;\r\n const cached = txCache.get(name);\r\n if (cached && cached.source === source && cached.mode === snapshotMode) {\r\n const snap = cached.snapshot;\r\n maybeFreezeSnapshot(snap, snapshotMode);\r\n return snap;\r\n }\r\n const snapshot = cloneSnapshot(source, snapshotMode);\r\n txCache.set(name, { source, snapshot, mode: snapshotMode });\r\n maybeFreezeSnapshot(snapshot, snapshotMode);\r\n return snapshot;\r\n }\r\n\r\n const version = meta[name]?.updateCount ?? 0;\r\n const cached = snapshotCache[name];\r\n if (cached && cached.version === version) {\r\n const snap = cached.snapshot;\r\n maybeFreezeSnapshot(snap, snapshotMode);\r\n return snap;\r\n }\r\n\r\n const source = getStoreValueRef(name);\r\n const snapshot = cloneSnapshot(source, snapshotMode);\r\n maybeFreezeSnapshot(snapshot, snapshotMode);\r\n snapshotCache[name] = { version, snapshot };\r\n return snapshot;\r\n};\r\n// Backward compat alias\r\n/** @deprecated Use getStoreSnapshot instead. */\r\nexport const getSnapshot = getStoreSnapshot;\r\n\r\nexport const resetNotifyStateForTests = (): void => {\r\n const state = getRegistry().notify;\r\n state.pendingNotifications.clear();\r\n state.pendingBuffer.length = 0;\r\n state.orderedNames.length = 0;\r\n state.notifyScheduled = false;\r\n state.batchDepth = 0;\r\n};\r\n\r\nregisterTestResetHook(\"notify.reset\", resetNotifyStateForTests, 40);\r\n\r\n\r\n","/**\r\n * @module computed\r\n *\r\n * LAYER: Module\r\n * OWNS: Module-level behavior and exports for computed.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { store } from \"./store-name.js\";\r\nimport { createStore, replaceStore, getStore, hasStore, subscribeStore } from \"./internals/store-ops.js\";\r\nimport {\r\n registerComputed,\r\n unregisterComputed,\r\n markStale,\r\n getComputedEntry,\r\n isComputed,\r\n} from \"./computed-graph.js\";\r\nimport { warn, isDev, log } from \"./utils.js\";\r\nimport { getRegistry } from \"./store-lifecycle/registry.js\";\r\nimport type { StoreDefinition, StoreKey, StoreName, StateFor, StoreValue } from \"./store-lifecycle/types.js\";\r\n\r\nexport type ComputedOptions = {\r\n autoDispose?: boolean;\r\n onError?: (err: unknown) => void;\r\n};\r\n\r\nconst getComputedCleanups = (): Map<string, () => void> => getRegistry().computedCleanups;\r\n\r\ntype DepHandle = StoreDefinition<string, StoreValue> | StoreKey<string, StoreValue>;\r\ntype DepValue<T> = T extends StoreDefinition<string, infer S>\r\n ? Readonly<S> | null\r\n : T extends StoreKey<string, infer S>\r\n ? Readonly<S> | null\r\n : T extends StoreName\r\n ? Readonly<StateFor<T>> | null\r\n : StoreValue | null;\r\n\r\nexport function createComputed<TResult, Deps extends readonly (StoreName | DepHandle)[]>(\r\n name: string,\r\n deps: Deps,\r\n compute: (...args: { [K in keyof Deps]: DepValue<Deps[K]> }) => TResult,\r\n options: ComputedOptions = {}\r\n): StoreDefinition<string, TResult> | undefined {\r\n if (!name || typeof name !== \"string\") {\r\n warn(\"createComputed requires a store name as first argument\");\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(deps) || deps.length === 0) {\r\n warn(`createComputed(\"${name}\") requires at least one dependency`);\r\n return undefined;\r\n }\r\n\r\n if (typeof compute !== \"function\") {\r\n warn(`createComputed(\"${name}\") requires a compute function as third argument`);\r\n return undefined;\r\n }\r\n\r\n const cleanups = getComputedCleanups();\r\n const existingCleanup = cleanups.get(name);\r\n if (existingCleanup) {\r\n existingCleanup();\r\n cleanups.delete(name);\r\n }\r\n\r\n const depNames = deps.map((dep) => (typeof dep === \"string\" ? dep : dep?.name));\r\n if (depNames.some((dep) => !dep || typeof dep !== \"string\")) {\r\n warn(`createComputed(\"${name}\") dependencies must be store names or store handles.`);\r\n return undefined;\r\n }\r\n if (isDev()) {\r\n const missing = depNames.filter((dep) => !hasStore(dep as string));\r\n if (missing.length > 0) {\r\n warn(\r\n `createComputed(\"${name}\") dependencies not found at registration: ${missing.join(\", \")}. ` +\r\n `Computed values will receive null until those stores are created.`\r\n );\r\n }\r\n }\r\n\r\n const registered = registerComputed(name, depNames as string[], compute as (...args: unknown[]) => unknown);\r\n if (!registered) return undefined;\r\n\r\n const initial = _runCompute(name, deps, compute as (...args: unknown[]) => unknown, options.onError);\r\n\r\n const handle = store<string, TResult>(name);\r\n if (!hasStore(name)) {\r\n createStore(name, initial as TResult);\r\n } else {\r\n replaceStore(handle, initial as TResult);\r\n }\r\n\r\n const unsubscribers: Array<() => void> = [];\r\n for (const dep of depNames) {\r\n const unsub = subscribeStore(dep as string, () => {\r\n _recomputeAndFlush(name, depNames as string[], compute as (...args: unknown[]) => unknown, options.onError);\r\n });\r\n unsubscribers.push(unsub);\r\n }\r\n\r\n getComputedCleanups().set(name, () => {\r\n unsubscribers.forEach((fn) => fn());\r\n unregisterComputed(name);\r\n });\r\n\r\n if (isDev()) {\r\n log(`computed store \"${name}\" created, deps: [${depNames.join(\", \")}]`);\r\n }\r\n\r\n return handle as StoreDefinition<string, TResult>;\r\n}\r\n\r\nconst _runCompute = (\r\n name: string,\r\n deps: Array<string | DepHandle>,\r\n compute: (...args: unknown[]) => unknown,\r\n onError?: (err: unknown) => void\r\n): unknown => {\r\n const args = deps.map((dep) => {\r\n if (typeof dep === \"string\") return getStore(store(dep));\r\n return getStore(dep as StoreDefinition<string, StoreValue>);\r\n });\r\n\r\n try {\r\n return compute(...args);\r\n } catch (err) {\r\n warn(`createComputed(\"${name}\") compute function threw: ${(err as { message?: string })?.message ?? err}`);\r\n onError?.(err);\r\n const handle = store(name);\r\n return hasStore(name) ? getStore(handle) : null;\r\n }\r\n};\r\n\r\nconst _recomputeAndFlush = (\r\n name: string,\r\n deps: string[],\r\n compute: (...args: unknown[]) => unknown,\r\n onError?: (err: unknown) => void\r\n): void => {\r\n const entry = getComputedEntry(name);\r\n if (!entry) return;\r\n\r\n const next = _runCompute(name, deps, compute, onError);\r\n const handle = store(name);\r\n const current = getStore(handle);\r\n if (Object.is(next, current)) return;\r\n\r\n replaceStore(handle, next);\r\n markStale(name);\r\n};\r\n\r\nexport const invalidateComputed = (name: string): void => {\r\n const entry = getComputedEntry(name);\r\n if (!entry) {\r\n warn(`invalidateComputed(\"${name}\") -- \"${name}\" is not a computed store`);\r\n return;\r\n }\r\n markStale(name);\r\n _recomputeAndFlush(name, entry.deps, entry.compute);\r\n};\r\n\r\nexport const deleteComputed = (name: string): void => {\r\n const cleanups = getComputedCleanups();\r\n const cleanup = cleanups.get(name);\r\n if (!cleanup) {\r\n if (isDev()) warn(`deleteComputed(\"${name}\") -- not found`);\r\n return;\r\n }\r\n cleanup();\r\n cleanups.delete(name);\r\n};\r\n\r\nexport const isComputedStore = (name: string): boolean => isComputed(name);\r\n\r\nexport const _resetComputedForTests = (): void => {\r\n const cleanups = getComputedCleanups();\r\n cleanups.forEach((fn) => fn());\r\n cleanups.clear();\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/store-admin\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/store-admin.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { runStoreHook } from \"../features/lifecycle.js\";\r\nimport { getRegisteredFeatureNames, type FeatureDeleteContext, type StoreFeatureMeta } from \"../feature-registry.js\";\r\nimport { hasStoreEntry, type StoreRegistry } from \"../store-registry.js\";\r\nimport { deepClone, hashState, sanitize } from \"../utils.js\";\r\nimport { isDev, log, warn } from \"./diagnostics.js\";\r\nimport { reportIssue } from \"./reporting.js\";\r\nimport { isComputed } from \"../computed-graph.js\";\r\nimport { deleteComputed } from \"../computed.js\";\r\n\r\ntype MetaEntry = StoreFeatureMeta;\r\n\r\nexport const createStoreAdmin = (registry: StoreRegistry) => {\r\n const stores = registry.stores as Record<string, unknown>;\r\n const subscribers = registry.subscribers as Record<string, Set<(value: unknown | null) => void>>;\r\n const initialStates = registry.initialStates as Record<string, unknown>;\r\n const initialFactories = registry.initialFactories as Record<string, (() => unknown) | undefined>;\r\n const metaEntries = registry.metaEntries as Record<string, MetaEntry>;\r\n const snapshotCache = registry.snapshotCache as Record<string, { version: number; snapshot: unknown | null }>;\r\n const featureRuntimes = registry.featureRuntimes;\r\n const deletingStores = registry.deletingStores;\r\n\r\n const reportStoreError = (name: string, message: string): void => {\r\n reportIssue(message, {\r\n onError: metaEntries[name]?.options?.onError,\r\n severity: \"warn\",\r\n visibility: \"dev\",\r\n });\r\n };\r\n\r\n const createDeleteContext = ({\r\n name,\r\n prev,\r\n options,\r\n initialState,\r\n getMeta,\r\n getStoreValue,\r\n hasStore,\r\n }: {\r\n name: string;\r\n prev: unknown;\r\n options: MetaEntry[\"options\"];\r\n initialState: unknown;\r\n getMeta: () => MetaEntry | undefined;\r\n getStoreValue: () => unknown;\r\n hasStore: () => boolean;\r\n }): FeatureDeleteContext => ({\r\n name,\r\n options,\r\n prev,\r\n getMeta,\r\n getStoreValue,\r\n getAllStores: () => stores,\r\n getInitialState: () => initialState,\r\n hasStore,\r\n setStoreValue: () => undefined,\r\n applyFeatureState: () => undefined,\r\n notify: () => undefined,\r\n reportStoreError: (message: string) => {\r\n reportIssue(message, {\r\n onError: options.onError,\r\n severity: \"warn\",\r\n visibility: \"dev\",\r\n });\r\n },\r\n warn,\r\n log,\r\n hashState,\r\n deepClone,\r\n sanitize,\r\n validate: () => ({ ok: true, value: prev }),\r\n isDev,\r\n });\r\n\r\n const runFeatureDeleteHooks = ({\r\n name,\r\n prev,\r\n options,\r\n initialState,\r\n phase,\r\n }: {\r\n name: string;\r\n prev: unknown;\r\n options: MetaEntry[\"options\"];\r\n initialState: unknown;\r\n phase: \"before\" | \"after\";\r\n }): void => {\r\n const beforeDeleteContext = createDeleteContext({\r\n name,\r\n prev,\r\n options,\r\n initialState,\r\n getMeta: () => metaEntries[name],\r\n getStoreValue: () => stores[name],\r\n hasStore: () => hasStoreEntry(registry, name),\r\n });\r\n\r\n const afterDeleteContext = createDeleteContext({\r\n name,\r\n prev,\r\n options,\r\n initialState,\r\n getMeta: () => undefined,\r\n getStoreValue: () => prev,\r\n hasStore: () => false,\r\n });\r\n\r\n getRegisteredFeatureNames().forEach((featureName) => {\r\n const runtime = featureRuntimes.get(featureName);\r\n if (phase === \"before\") runtime?.beforeStoreDelete?.(beforeDeleteContext);\r\n else runtime?.afterStoreDelete?.(afterDeleteContext);\r\n });\r\n };\r\n\r\n const deleteExistingStore = (name: string): void => {\r\n if (!hasStoreEntry(registry, name)) return;\r\n\r\n const prev = stores[name];\r\n const options = metaEntries[name].options;\r\n const initialState = initialStates[name];\r\n const subs = subscribers[name];\r\n deletingStores.add(name);\r\n\r\n try {\r\n subs?.forEach((fn) => {\r\n try {\r\n fn(null);\r\n } catch (err) {\r\n warn(`Subscriber for \"${name}\" threw during delete: ${(err as { message?: string })?.message ?? err}`);\r\n }\r\n });\r\n\r\n runStoreHook({\r\n name,\r\n label: \"onDelete\",\r\n fn: options.onDelete,\r\n args: [prev],\r\n reportIssue: (message, visibility) => {\r\n reportIssue(message, {\r\n onError: options.onError,\r\n severity: \"warn\",\r\n visibility,\r\n });\r\n },\r\n });\r\n\r\n runFeatureDeleteHooks({\r\n name,\r\n prev,\r\n options,\r\n initialState,\r\n phase: \"before\",\r\n });\r\n\r\n delete stores[name];\r\n delete subscribers[name];\r\n delete initialStates[name];\r\n delete initialFactories[name];\r\n delete metaEntries[name];\r\n delete snapshotCache[name];\r\n\r\n if (isComputed(name)) {\r\n deleteComputed(name);\r\n }\r\n\r\n const dependents = registry.computedDependents;\r\n const affected = dependents[name];\r\n if (affected) {\r\n for (const computedName of affected) {\r\n warn(\r\n `[stroid] source store \"${name}\" was deleted. ` +\r\n `Computed store \"${computedName}\" depends on it and will return stale data. ` +\r\n `Call deleteComputed(\"${computedName}\") to clean up.`\r\n );\r\n }\r\n }\r\n\r\n runFeatureDeleteHooks({\r\n name,\r\n prev,\r\n options,\r\n initialState,\r\n phase: \"after\",\r\n });\r\n log(`Store \"${name}\" deleted`);\r\n } finally {\r\n deletingStores.delete(name);\r\n }\r\n };\r\n\r\n const clearAllStores = (): string[] => {\r\n const removed: string[] = [];\r\n const maxPasses = 20;\r\n let pass = 0;\r\n let previousRemaining = Number.POSITIVE_INFINITY;\r\n while (pass < maxPasses) {\r\n const names = Object.keys(stores);\r\n if (names.length === 0) break;\r\n names.forEach((name) => {\r\n if (hasStoreEntry(registry, name)) {\r\n deleteExistingStore(name);\r\n removed.push(name);\r\n }\r\n });\r\n pass += 1;\r\n const remaining = Object.keys(stores).length;\r\n if (remaining === 0) break;\r\n if (remaining >= previousRemaining) break;\r\n previousRemaining = remaining;\r\n }\r\n const remaining = Object.keys(stores).length;\r\n if (remaining > 0) {\r\n warn(\r\n `clearAllStores stopped after ${pass} pass${pass === 1 ? \"\" : \"es\"}; ` +\r\n `${remaining} store(s) still registered (likely recreated during deletion).`\r\n );\r\n } else {\r\n warn(`All stores cleared (${removed.length} stores removed)`);\r\n }\r\n return removed;\r\n };\r\n\r\n const clearStores = (pattern?: string): string[] => {\r\n const names = Object.keys(stores).filter((n) => {\r\n if (!pattern) return true;\r\n if (pattern.endsWith(\"*\")) return n.startsWith(pattern.slice(0, -1));\r\n return n === pattern;\r\n });\r\n names.forEach((name) => deleteExistingStore(name));\r\n return names;\r\n };\r\n\r\n return {\r\n deleteExistingStore,\r\n clearAllStores,\r\n clearStores,\r\n reportStoreError,\r\n };\r\n};\r\n\r\n\r\n","/**\r\n * @module store-lifecycle/registry\r\n *\r\n * LAYER: Store lifecycle\r\n * OWNS: Module-level behavior and exports for store-lifecycle/registry.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport { devDeepFreeze } from \"../devfreeze.js\";\r\nimport { isDev } from \"../utils.js\";\r\nimport {\r\n getStoreRegistry,\r\n hasStoreEntry as _hasStoreEntry,\r\n isStoreDeleting,\r\n clearStoreRegistries,\r\n normalizeStoreRegistryScope,\r\n defaultRegistryScope,\r\n getRequestCarrier,\r\n getActiveStoreRegistry,\r\n enterRegistry,\r\n type StoreRegistry,\r\n} from \"../store-registry.js\";\r\nimport { registerTestResetHook } from \"../internals/test-reset.js\";\r\nimport {\r\n getStoreFeatureFactory,\r\n getRegisteredFeatureNames,\r\n setFeatureRegistrationHook,\r\n type FeatureName,\r\n type StoreFeatureRuntime,\r\n type StoreFeatureMeta,\r\n} from \"../feature-registry.js\";\r\nimport { createStoreAdmin } from \"../internals/store-admin.js\";\r\nimport type { StoreValue, Subscriber } from \"./types.js\";\r\nimport { getStagedTransactionValue, isTransactionActive } from \"../store-transaction.js\";\r\n\r\nexport { defaultRegistryScope } from \"../store-registry.js\";\r\n\r\nlet _scope = defaultRegistryScope;\r\nlet _defaultRegistry = getStoreRegistry(_scope);\r\nvar _invalidatePathCache: ((name: string) => void) | null = null;\r\nconst initializedRegistries = new WeakSet<StoreRegistry>();\r\nconst initializeRegistryFeatureRuntimes = (registry: StoreRegistry): void => {\r\n if (initializedRegistries.has(registry)) return;\r\n initializedRegistries.add(registry);\r\n getRegisteredFeatureNames().forEach((name) => {\r\n if (!registry.featureRuntimes.get(name)) {\r\n const factory = getStoreFeatureFactory(name);\r\n if (factory) registry.featureRuntimes.set(name, factory());\r\n }\r\n });\r\n};\r\n\r\nconst getActiveRegistry = (): StoreRegistry => {\r\n const registry = getActiveStoreRegistry(_defaultRegistry);\r\n initializeRegistryFeatureRuntimes(registry);\r\n return registry;\r\n};\r\n\r\nexport const setRegistryContext = (scope: string, registry: StoreRegistry): void => {\r\n _scope = scope;\r\n _defaultRegistry = registry;\r\n enterRegistry(registry);\r\n};\r\n\r\nexport const getRegistry = (): StoreRegistry => getActiveRegistry();\r\n\r\nexport function setPathCacheInvalidator(fn: (name: string) => void): void {\r\n _invalidatePathCache = fn;\r\n}\r\n\r\nconst createRegistryObjectProxy = <T extends object>(getter: () => T): T =>\r\n new Proxy(Object.create(null), {\r\n get: (_target, prop) => (getter() as any)[prop],\r\n set: (_target, prop, value) => {\r\n (getter() as any)[prop] = value;\r\n return true;\r\n },\r\n deleteProperty: (_target, prop) => {\r\n delete (getter() as any)[prop];\r\n return true;\r\n },\r\n has: (_target, prop) => prop in (getter() as any),\r\n ownKeys: () => Reflect.ownKeys(getter()),\r\n getOwnPropertyDescriptor: (_target, prop) => {\r\n const desc = Object.getOwnPropertyDescriptor(getter(), prop);\r\n if (!desc) return undefined;\r\n return { ...desc, configurable: true };\r\n },\r\n }) as T;\r\n\r\nconst createRegistryMapProxy = <T extends Map<any, any>>(getter: () => T): T =>\r\n new Proxy(new Map(), {\r\n get: (_target, prop) => {\r\n const target = getter() as any;\r\n if (prop === \"size\") return target.size;\r\n if (prop === Symbol.iterator) return target[Symbol.iterator].bind(target);\r\n const value = target[prop];\r\n return typeof value === \"function\" ? value.bind(target) : value;\r\n },\r\n set: (_target, prop, value) => {\r\n (getter() as any)[prop] = value;\r\n return true;\r\n },\r\n }) as T;\r\n\r\nconst createRegistryValueProxy = <T extends object>(getter: () => T): T =>\r\n new Proxy({} as T, {\r\n get: (_target, prop) => {\r\n const target = getter() as any;\r\n const value = target[prop];\r\n return typeof value === \"function\" ? value.bind(target) : value;\r\n },\r\n set: (_target, prop, value) => {\r\n (getter() as any)[prop] = value;\r\n return true;\r\n },\r\n });\r\n\r\nexport const stores = createRegistryObjectProxy(() => getActiveRegistry().stores as Record<string, StoreValue>);\r\nexport const subscribers = createRegistryObjectProxy(() => getActiveRegistry().subscribers as Record<string, Set<Subscriber>>);\r\nexport const initialStates = createRegistryObjectProxy(() => getActiveRegistry().initialStates as Record<string, StoreValue>);\r\nexport const initialFactories = createRegistryObjectProxy(() => getActiveRegistry().initialFactories as Record<string, (() => StoreValue) | undefined>);\r\nexport const meta = createRegistryObjectProxy(() => getActiveRegistry().metaEntries as Record<string, StoreFeatureMeta>);\r\nexport const snapshotCache = createRegistryObjectProxy(() => getActiveRegistry().snapshotCache as Record<string, { version: number; snapshot: StoreValue | null }>);\r\nexport const featureRuntimes = createRegistryMapProxy(() => getActiveRegistry().featureRuntimes as Map<FeatureName, StoreFeatureRuntime>);\r\n\r\nconst storeAdminByRegistry = new WeakMap<StoreRegistry, ReturnType<typeof createStoreAdmin>>();\r\nconst getStoreAdminForRegistry = (registry: StoreRegistry): ReturnType<typeof createStoreAdmin> => {\r\n let admin = storeAdminByRegistry.get(registry);\r\n if (!admin) {\r\n admin = createStoreAdmin(registry);\r\n storeAdminByRegistry.set(registry, admin);\r\n }\r\n return admin;\r\n};\r\nexport const storeAdmin = createRegistryValueProxy(() => getStoreAdminForRegistry(getActiveRegistry()));\r\nexport const getStoreAdmin = (): ReturnType<typeof createStoreAdmin> =>\r\n getStoreAdminForRegistry(getActiveRegistry());\r\n\r\nexport const getFeatureRuntime = (name: FeatureName): StoreFeatureRuntime | undefined => {\r\n const existing = featureRuntimes.get(name);\r\n if (existing) return existing;\r\n const factory = getStoreFeatureFactory(name);\r\n if (!factory) return undefined;\r\n const runtime = factory();\r\n featureRuntimes.set(name, runtime);\r\n return runtime;\r\n};\r\n\r\nexport const initializeRegisteredFeatureRuntimes = (): void => {\r\n getRegisteredFeatureNames().forEach((name) => {\r\n getFeatureRuntime(name);\r\n });\r\n};\r\n\r\nsetFeatureRegistrationHook((name, factory) => {\r\n if (!featureRuntimes.get(name)) {\r\n featureRuntimes.set(name, factory());\r\n }\r\n});\r\ninitializeRegisteredFeatureRuntimes();\r\n\r\nexport const hasStoreEntryInternal = (name: string): boolean => _hasStoreEntry(getActiveRegistry(), name);\r\n\r\nexport const getStoreValueRef = (name: string): StoreValue | undefined => {\r\n if (isTransactionActive()) {\r\n const staged = getStagedTransactionValue(name);\r\n if (staged.has) return staged.value;\r\n }\r\n const carrier = getRequestCarrier();\r\n if (carrier && Object.prototype.hasOwnProperty.call(carrier, name)) {\r\n return carrier[name] as StoreValue;\r\n }\r\n return stores[name];\r\n};\r\n\r\nexport const setStoreValueInternal = (name: string, value: StoreValue): void => {\r\n const carrier = getRequestCarrier();\r\n const frozen = isDev() ? devDeepFreeze(value) : value;\r\n if (carrier) {\r\n carrier[name] = frozen;\r\n if (!Object.prototype.hasOwnProperty.call(stores, name)) {\r\n stores[name] = undefined;\r\n }\r\n } else {\r\n stores[name] = frozen;\r\n }\r\n};\r\n\r\nexport const applyFeatureState = (name: string, value: StoreValue, updatedAtMs = Date.now()): void => {\r\n setStoreValueInternal(name, value);\r\n if (!meta[name]) return;\r\n meta[name].updatedAt = new Date(updatedAtMs).toISOString();\r\n meta[name].updatedAtMs = updatedAtMs;\r\n meta[name].updateCount++;\r\n _invalidatePathCache?.(name);\r\n};\r\n\r\nexport const clearAllRegistries = (): void => {\r\n clearStoreRegistries(getActiveRegistry());\r\n};\r\n\r\nexport const resetFeaturesForTests = (): void => {\r\n featureRuntimes.forEach((runtime) => {\r\n try { runtime.resetAll?.(); } catch (_) { /* ignore cleanup errors */ }\r\n });\r\n featureRuntimes.clear();\r\n};\r\n\r\nregisterTestResetHook(\"features.reset\", resetFeaturesForTests, 10);\r\nregisterTestResetHook(\"registries.clear\", clearAllRegistries, 20);\r\n\r\nexport const getMetaEntry = (name: string): StoreFeatureMeta | undefined => meta[name];\r\n\r\nexport const isDeleting = (name: string): boolean =>\r\n isStoreDeleting(getActiveRegistry(), name);\r\n\r\nexport const resolveScope = (scopeOrRegistry?: string | ReturnType<typeof getStoreRegistry>): { scope: string; registry: StoreRegistry } => {\r\n const resolvedScope = typeof scopeOrRegistry === \"string\"\r\n ? normalizeStoreRegistryScope(scopeOrRegistry)\r\n : _scope;\r\n const registry = typeof scopeOrRegistry === \"string\"\r\n ? getStoreRegistry(resolvedScope)\r\n : scopeOrRegistry ?? getStoreRegistry(_scope);\r\n return { scope: resolvedScope, registry };\r\n};\r\n\r\n\r\n","/**\r\n * @module internals/selector-store\r\n *\r\n * LAYER: Internal subsystem\r\n * OWNS: Module-level behavior and exports for internals/selector-store.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport {\r\n stores as _stores,\r\n subscribers as _subscribers,\r\n} from \"../store-lifecycle/registry.js\";\r\nimport type { StoreValue as SelectorStoreValue } from \"../store-lifecycle/types.js\";\r\n\r\ntype SelectorSubscriber = (value: SelectorStoreValue | null) => void;\r\n\r\nexport type { SelectorStoreValue };\r\n\r\nexport const hasSelectorStoreEntry = (name: string): boolean =>\r\n Object.prototype.hasOwnProperty.call(_stores, name);\r\n\r\nexport const getSelectorStoreValueRef = (name: string): SelectorStoreValue | undefined =>\r\n _stores[name];\r\n\r\nexport const subscribeSelectorStore = (name: string, fn: SelectorSubscriber): (() => void) => {\r\n if (!_subscribers[name]) _subscribers[name] = new Set();\r\n _subscribers[name].add(fn);\r\n return () => {\r\n _subscribers[name]?.delete(fn);\r\n if (_subscribers[name]?.size === 0) delete _subscribers[name];\r\n };\r\n};\r\n\r\n\r\n","/**\r\n * @module selectors\r\n *\r\n * LAYER: Selectors\r\n * OWNS: Module-level behavior and exports for selectors.\r\n *\r\n * Consumers: Internal imports and public API.\r\n */\r\nimport {\r\n getSelectorStoreValueRef,\r\n hasSelectorStoreEntry,\r\n subscribeSelectorStore,\r\n type SelectorStoreValue as StoreValue,\r\n} from \"./internals/selector-store.js\";\r\nimport { deepClone, shallowClone, getByPath, warn } from \"./utils.js\";\r\nimport { getStoreSnapshot } from \"./store-notify.js\";\r\nimport { meta } from \"./store-lifecycle/registry.js\";\r\nimport type { SnapshotMode } from \"./adapters/options.js\";\r\n\r\ntype SelectorDependency = string[];\r\n\r\nconst trackSelectorDependencies = <TState, TResult>(\r\n state: TState,\r\n selectorFn: (state: TState) => TResult\r\n): { result: TResult; deps: SelectorDependency[] } => {\r\n const seen = new WeakMap<object, unknown>();\r\n const deps = new Set<string>();\r\n const sep = \"\\u0000\";\r\n\r\n const wrap = (value: unknown, path: string[]): unknown => {\r\n if (!value || typeof value !== \"object\") return value;\r\n const cached = seen.get(value as object);\r\n if (cached) return cached;\r\n\r\n const proxy = new Proxy(value as object, {\r\n get(target, prop, receiver) {\r\n if (typeof prop !== \"string\") {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n const nextPath = [...path, prop];\r\n const result = Reflect.get(target, prop, receiver);\r\n if (!result || typeof result !== \"object\") {\r\n deps.add(nextPath.join(sep));\r\n }\r\n return wrap(result, nextPath);\r\n },\r\n });\r\n\r\n seen.set(value as object, proxy);\r\n return proxy;\r\n };\r\n\r\n const result = selectorFn(wrap(state, []) as TState);\r\n return {\r\n result,\r\n deps: Array.from(deps, (entry) => entry.split(sep)),\r\n };\r\n};\r\n\r\nconst selectorDepsChanged = <TState>(prev: TState, next: TState, deps: SelectorDependency[]): boolean =>\r\n deps.some((path) => !Object.is(getByPath(prev, path), getByPath(next, path)));\r\n\r\nexport const createSelector = <TState, TResult>(storeName: string, selectorFn: (state: TState) => TResult) => {\r\n let lastRef: TState | undefined;\r\n let lastResult: TResult | undefined;\r\n let lastDeps: SelectorDependency[] = [];\r\n return () => {\r\n const state = getSelectorStoreValueRef(storeName) as TState | undefined;\r\n if (state === undefined) return null;\r\n if (state === lastRef) return lastResult ?? null;\r\n if (lastRef !== undefined && lastDeps.length > 0 && !selectorDepsChanged(lastRef, state, lastDeps)) {\r\n lastRef = state;\r\n return lastResult ?? null;\r\n }\r\n const tracked = trackSelectorDependencies(state, selectorFn);\r\n lastRef = state;\r\n lastDeps = tracked.deps;\r\n lastResult = tracked.result;\r\n return lastResult ?? null;\r\n };\r\n};\r\n\r\nexport const subscribeWithSelector = <R>(\r\n name: string,\r\n selector: (state: any) => R,\r\n equality: (a: R, b: R) => boolean = Object.is,\r\n listener: (next: R, prev: R) => void\r\n): (() => void) => {\r\n if (typeof selector !== \"function\" || typeof listener !== \"function\") {\r\n warn(`subscribeWithSelector(\"${name}\") requires selector and listener functions.`);\r\n return () => {};\r\n }\r\n let hasPrev = false;\r\n let prevSel = undefined as R;\r\n\r\n const resolveSnapshotMode = (): SnapshotMode => {\r\n const mode = meta[name]?.options?.snapshot;\r\n return mode === \"shallow\" || mode === \"ref\" ? mode : \"deep\";\r\n };\r\n\r\n const getSafeSelectorState = (snapshot?: StoreValue | null): unknown => {\r\n const ref = snapshot !== undefined ? snapshot : getStoreSnapshot(name);\r\n if (ref === null || typeof ref !== \"object\") return ref;\r\n const mode = resolveSnapshotMode();\r\n if (mode === \"ref\") return ref;\r\n if (mode === \"shallow\") return shallowClone(ref);\r\n return deepClone(ref);\r\n };\r\n\r\n if (hasSelectorStoreEntry(name)) {\r\n prevSel = selector(getSafeSelectorState());\r\n hasPrev = true;\r\n }\r\n\r\n const wrapped = (_state: StoreValue | null) => {\r\n if (_state === null || !hasSelectorStoreEntry(name)) {\r\n hasPrev = false;\r\n prevSel = undefined as R;\r\n return;\r\n }\r\n const nextSel = selector(getSafeSelectorState(_state));\r\n if (!hasPrev) {\r\n hasPrev = true;\r\n prevSel = nextSel;\r\n listener(nextSel, nextSel);\r\n return;\r\n }\r\n const matches = equality(nextSel, prevSel);\r\n if (!matches) {\r\n const last = prevSel;\r\n prevSel = nextSel;\r\n listener(nextSel, last);\r\n }\r\n };\r\n return subscribeSelectorStore(name, wrapped);\r\n};\r\n\r\n\r\n"]}
|
package/dist/selectors.d.cts
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export { createSelector, subscribeWithSelector };
|
|
1
|
+
export { createSelector } from './_tsup-dts-rollup.cjs';
|
|
2
|
+
export { subscribeWithSelector } from './_tsup-dts-rollup.cjs';
|
package/dist/selectors.d.ts
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export { createSelector, subscribeWithSelector };
|
|
1
|
+
export { createSelector } from './_tsup-dts-rollup.js';
|
|
2
|
+
export { subscribeWithSelector } from './_tsup-dts-rollup.js';
|