stroid 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +97 -1
  2. package/README.md +436 -884
  3. package/dist/async-cache-DFHwcBQL.d.cts +52 -0
  4. package/dist/async-cache-DFHwcBQL.d.ts +52 -0
  5. package/dist/async.cjs +29 -0
  6. package/dist/async.d.cts +40 -0
  7. package/dist/async.d.ts +30 -20
  8. package/dist/async.js +29 -1
  9. package/dist/computed-BbAZm1Dq.d.cts +17 -0
  10. package/dist/computed-CccdgY5j.d.ts +17 -0
  11. package/dist/computed.cjs +11 -0
  12. package/dist/computed.d.cts +29 -0
  13. package/dist/computed.d.ts +29 -0
  14. package/dist/computed.js +11 -0
  15. package/dist/core.cjs +30 -0
  16. package/dist/core.d.cts +5 -0
  17. package/dist/core.d.ts +5 -1
  18. package/dist/core.js +30 -1
  19. package/dist/devtools.cjs +1 -0
  20. package/dist/devtools.d.cts +19 -0
  21. package/dist/devtools.d.ts +19 -0
  22. package/dist/devtools.js +1 -0
  23. package/dist/helpers.cjs +20 -0
  24. package/dist/helpers.d.cts +29 -0
  25. package/dist/helpers.d.ts +29 -0
  26. package/dist/helpers.js +20 -0
  27. package/dist/index.cjs +30 -0
  28. package/dist/index.d.cts +130 -0
  29. package/dist/index.d.ts +125 -13
  30. package/dist/index.js +30 -1
  31. package/dist/options-CB35e3Xo.d.cts +245 -0
  32. package/dist/options-CB35e3Xo.d.ts +245 -0
  33. package/dist/persist.cjs +1 -0
  34. package/dist/persist.d.cts +2 -0
  35. package/dist/persist.d.ts +2 -0
  36. package/dist/persist.js +1 -0
  37. package/dist/react.cjs +31 -0
  38. package/dist/react.d.cts +52 -0
  39. package/dist/react.d.ts +51 -6
  40. package/dist/react.js +31 -1
  41. package/dist/runtime-admin.cjs +1 -0
  42. package/dist/runtime-admin.d.cts +4 -0
  43. package/dist/runtime-admin.d.ts +4 -0
  44. package/dist/runtime-admin.js +1 -0
  45. package/dist/runtime-tools.cjs +3 -0
  46. package/dist/runtime-tools.d.cts +39 -0
  47. package/dist/runtime-tools.d.ts +39 -0
  48. package/dist/runtime-tools.js +3 -0
  49. package/dist/selectors.cjs +1 -0
  50. package/dist/selectors.d.cts +4 -0
  51. package/dist/selectors.d.ts +4 -0
  52. package/dist/selectors.js +1 -0
  53. package/dist/server.cjs +10 -0
  54. package/dist/server.d.cts +14 -0
  55. package/dist/server.d.ts +14 -0
  56. package/dist/server.js +10 -0
  57. package/dist/sync.cjs +1 -0
  58. package/dist/sync.d.cts +2 -0
  59. package/dist/sync.d.ts +2 -0
  60. package/dist/sync.js +1 -0
  61. package/dist/testing.cjs +20 -0
  62. package/dist/testing.d.cts +16 -0
  63. package/dist/testing.d.ts +7 -7
  64. package/dist/testing.js +20 -1
  65. package/dist/types/adapters/options.d.ts +247 -0
  66. package/dist/types/async/clone.d.ts +2 -0
  67. package/dist/types/async/errors.d.ts +3 -0
  68. package/dist/types/async/inflight.d.ts +13 -0
  69. package/dist/types/async/rate.d.ts +5 -0
  70. package/dist/types/async/request.d.ts +3 -0
  71. package/dist/types/async-cache.d.ts +57 -0
  72. package/dist/types/async-fetch.d.ts +37 -0
  73. package/dist/types/async-registry.d.ts +96 -0
  74. package/dist/types/async-retry.d.ts +10 -0
  75. package/dist/types/async.d.ts +2 -0
  76. package/dist/types/computed-graph.d.ts +31 -0
  77. package/dist/types/computed.d.ts +15 -0
  78. package/dist/types/config.d.ts +2 -0
  79. package/dist/types/core.d.ts +1 -0
  80. package/dist/types/devfreeze.d.ts +1 -0
  81. package/dist/types/feature-registry.d.ts +69 -0
  82. package/dist/types/features/lifecycle.d.ts +28 -0
  83. package/dist/types/index.d.ts +6 -0
  84. package/dist/types/integrations/query.d.ts +8 -0
  85. package/dist/types/internals/config.d.ts +62 -0
  86. package/dist/types/internals/diagnostics.d.ts +21 -0
  87. package/dist/types/internals/hooks-warnings.d.ts +6 -0
  88. package/dist/types/internals/reporting.d.ts +8 -0
  89. package/dist/types/internals/store-admin.d.ts +7 -0
  90. package/dist/types/internals/store-ops.d.ts +3 -0
  91. package/dist/types/runtime-admin.d.ts +2 -0
  92. package/dist/types/store-lifecycle/bind.d.ts +3 -0
  93. package/dist/types/store-lifecycle/hooks.d.ts +44 -0
  94. package/dist/types/store-lifecycle/identity.d.ts +23 -0
  95. package/dist/types/store-lifecycle/registry.d.ts +39 -0
  96. package/dist/types/store-lifecycle/types.d.ts +39 -0
  97. package/dist/types/store-lifecycle/validation.d.ts +45 -0
  98. package/dist/types/store-lifecycle.d.ts +20 -0
  99. package/dist/types/store-name.d.ts +19 -0
  100. package/dist/types/store-notify.d.ts +12 -0
  101. package/dist/types/store-read.d.ts +12 -0
  102. package/dist/types/store-registry.d.ts +74 -0
  103. package/dist/types/store-transaction.d.ts +12 -0
  104. package/dist/types/store-write.d.ts +45 -0
  105. package/dist/types/store.d.ts +7 -0
  106. package/dist/types/utils/clone.d.ts +4 -0
  107. package/dist/types/utils/hash.d.ts +8 -0
  108. package/dist/types/utils/path.d.ts +5 -0
  109. package/dist/types/utils/validation.d.ts +14 -0
  110. package/dist/types/utils.d.ts +5 -0
  111. package/dist/types-grvlY4BX.d.cts +37 -0
  112. package/dist/types-grvlY4BX.d.ts +37 -0
  113. package/package.json +77 -6
  114. package/dist/chunk-3CAQKMKY.js +0 -5
  115. package/dist/chunk-KYAUSC7J.js +0 -1
  116. package/dist/chunk-VNLWP332.js +0 -17
  117. package/dist/chunk-Y52AULFH.js +0 -3
  118. package/dist/core-CLIi-SLm.d.ts +0 -205
@@ -0,0 +1,20 @@
1
+ var Fr={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}`));}},Er={logSink:Fr,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},wt={...Er},M=()=>wt;var kt=()=>wt.namespace;var Vr=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,Dr=typeof import.meta<"u"&&import.meta?.env?.MODE?import.meta.env.MODE:void 0,xt=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,Or="production",Pr=Vr??Dr??Or,we=typeof xt=="boolean"?xt:Pr!=="production",R=()=>we,Ue=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},Nr=(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));},Tr=(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},P=(e,t)=>{if((M().logSink.critical??Nr)(e,t),M().assertRuntime)throw new Error(e)},v=(e,t)=>{if(!we)return;if((M().logSink.warn??Ue)(e,t),M().assertRuntime)throw new Error(e)},K=(e,t)=>{if((M().logSink.warn??Ue)(e,t),M().assertRuntime)throw new Error(e)},T=(e,t)=>{if(we&&(M().logSink.warn??Ue)(e,t),P(e,t),M().assertRuntime)throw new Error(e)},A=(e,t)=>{if(!we)return;(M().logSink.log??Tr)(e,t);},Rt=()=>`Functions cannot be stored in stroid.
2
+ Store data only - handle functions outside the store.`,Ct=()=>`Map/Set detected. stroid converts these to plain objects.
3
+ Use arrays or plain objects for best results.`,Mt=()=>`Date object detected. stroid stores it as ISO string.
4
+ Use new Date(value) to convert back when reading.`,Ft=()=>"Date detected; stored as ISO string. Use new Date(value) when reading.",Et=()=>"Map detected; converting to plain object.",Vt=()=>"Set detected; converting to array.",Dt=(e,t,r)=>`Path depth of ${e} exceeded maximum of ${t}.
5
+ "${r.join(".")}"
6
+ This is a data design issue. Split into separate stores:
7
+ createStore("${r[0]}", ...) and createStore("${r[1]}", ...)`,Ot=(e,t)=>`Deep nesting detected (${e} levels): "${t.join(".")}"
8
+ Consider splitting into separate stores for better readability.`,Pt=(e,t)=>`Path "${e.join(".")}" not found - reached null at "${t}"`,Nt=e=>`Cannot go deeper at "${e}" - value is not an object`,Tt=e=>`Store name must be a non-empty string. Got: ${JSON.stringify(e)}`,At=e=>`Store name "${e}" contains spaces.
9
+ Use camelCase or kebab-case: "userName" or "user-name"`,jt=e=>`Store name "${e}" is not allowed.
10
+ Reserved names: "__proto__", "constructor", "prototype".`,Ar=128,jr=(e,t)=>Math.abs(e.length-t.length)>2?false:Math.max(e.length,t.length)<=Ar,$r=(e,t)=>{if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let r=Array.from({length:e.length+1},(o,s)=>s),n=new Array(e.length+1);for(let o=1;o<=t.length;o++){n[0]=o;for(let s=1;s<=e.length;s++)n[s]=t[o-1]===e[s-1]?r[s-1]:Math.min(r[s-1],n[s-1],r[s])+1;[r,n]=[n,r];}return r[e.length]},Ke=(e,t)=>{let r=t.find(n=>{let o=n.toLowerCase(),s=e.toLowerCase();return o.includes(s)||s.includes(o)||jr(o,s)&&$r(o,s)<=2});if(r){v(`Store "${e}" not found. Did you mean "${r}"?`);return}T(`Store "${e}" not found.
11
+ Available stores: [${t.join(", ")}]
12
+ Call createStore("${e}", data) first.`);};var _=new Set(["__proto__","constructor","prototype"]),Ge=(e,t)=>{if(!e)return {ok:true};try{if(typeof e.safeParse=="function"){let r=e.safeParse(t);return r.success?{ok:!0,data:r.data}:{ok:!1,error:r.error}}if(typeof e.parse=="function")return e.parse(t),{ok:!0,data:t};if(typeof e.validateSync=="function")return e.validateSync(t),{ok:!0,data:t};if(typeof e.isValidSync=="function")return e.isValidSync(t)?{ok:!0,data:t}:{ok:!1,error:"Schema validation failed"};if(typeof e.validate=="function"){let r=e.validate(t);if(r===!0)return {ok:!0,data:t};if(r===!1)return {ok:!1,error:e.errors||"Schema validation failed"};if(r&&typeof r=="object"){let o=r.error,s=o?.details?.[0]?.message||o?.message||r.message||e.errors;if(s)return {ok:!1,error:s};if(o)return {ok:!1,error:o}}return {ok:!1,error:e.errors||"Schema validation failed"}}if(typeof e=="function"){let r=e(t);return r===!1?{ok:!1,error:"Schema validation failed"}:{ok:!0,data:r===!0?t:r}}return {ok:!0,data:t}}catch(r){return {ok:false,error:r?.message??r}}};var Y=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,$t=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},xe=e=>{let t=Y(e);return t==="function"?(T(Rt()),false):t==="map"||t==="set"?(v(Ct()),true):(t==="date"&&v(Mt()),true)},qe=(e,t)=>{let r=$t(e);if(r)throw new Error(`${r} values are not supported`);let n=Y(e);if(n==="number"){if(!Number.isFinite(e))throw new Error("Non-finite numbers are not supported");return true}if(n==="bigint")throw new Error("BigInt values are not supported");if(n==="symbol")throw new Error("Symbol values are not supported");if(n==="date"||n==="map"||n==="set")return false;if(n==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let o=Object.keys(e);for(let s of o){let i=Number(s);if(!Number.isInteger(i))return false}for(let s=0;s<e.length;s+=1)if(s in e&&!qe(e[s],t))return false;return true}if(n==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");if(t.add(e),Object.getOwnPropertySymbols(e).length>0)return false;let o=Object.getOwnPropertyDescriptors(e);for(let[s,i]of Object.entries(o)){if(!i.enumerable||_.has(s))return false;if("get"in i||"set"in i)throw new Error(`Accessor properties are not supported during sanitize ("${s}")`);if(!qe(i.value,t))return false}return true}return true},Ye=e=>qe(e,new WeakSet),ke=(e,t)=>{let r=$t(e);if(r)throw new Error(`${r} values are not supported`);let n=Y(e);if(n==="number"){if(!Number.isFinite(e))throw new Error("Non-finite numbers are not supported");return e}if(n==="bigint")throw new Error("BigInt values are not supported");if(n==="symbol")throw new Error("Symbol values are not supported");if(n==="date")return R()&&v(Ft()),e.toISOString();if(n==="map"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e),R()&&v(Et());let o={};for(let[s,i]of e){if(typeof s!="string")throw new Error("Map keys must be strings to remain JSON-safe");o[String(s)]=ke(i,t);}return o}if(n==="set"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),R()&&v(Vt()),Array.from(e,o=>ke(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[i,u]of Object.entries(s))if(u.enumerable&&!_.has(i)){if("get"in u||"set"in u)throw new Error(`Accessor properties are not supported during sanitize ("${i}")`);o[i]=ke(u.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=>ke(o,t))}return e},Q=e=>ke(e,new WeakSet),Je=e=>typeof e!="string"||e.trim()===""?(T(Tt(e)),false):_.has(e)?(T(jt(e)),false):e.includes(" ")?(T(At(e)),false):true;var Xe=null,Ir=()=>{if(Xe)return Xe;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 Xe=t,t},_t=e=>{let t=Ir(),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},_r=2166136261,zr=2654435761,Wr=1e5,J=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},Z=(e,t)=>{J(e,t.length);for(let r=0;r<t.length;r++)J(e,t.charCodeAt(r));},F=(e,t)=>{Z(e,t);},It=(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"),J(e,r);return}F(e,"num"),Z(e,String(t));},ce=(e,t)=>{if(e.nodes++>Wr){F(e,"[max]");return}if(t===null){F(e,"null");return}let r=typeof t;if(r==="string"){F(e,"string"),Z(e,t);return}if(r==="number"){F(e,"number"),It(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"),Z(e,t.toString());return}if(r==="symbol"){F(e,"symbol");let l=t;Z(e,Symbol.keyFor(l)??l.description??String(l));return}if(r==="function"){F(e,"function"),Z(e,t.name||"anonymous");return}let n=t,o=e.seen.get(n);if(o!==void 0){F(e,"ref"),J(e,o);return}let s=e.nextId++;if(e.seen.set(n,s),Array.isArray(n)){F(e,"array"),J(e,n.length);for(let l=0;l<n.length;l++)Object.prototype.hasOwnProperty.call(n,l)?ce(e,n[l]):F(e,"hole");return}if(n instanceof Date){F(e,"date"),It(e,n.getTime());return}if(n instanceof Map){F(e,"map"),J(e,n.size),n.forEach((l,f)=>{ce(e,f),ce(e,l);});return}if(n instanceof Set){F(e,"set"),J(e,n.size),n.forEach(l=>{ce(e,l);});return}F(e,"object");let i=Object.getOwnPropertyDescriptors(n),u=[];Object.entries(i).forEach(([l,f])=>{f?.enumerable&&(_.has(l)||"get"in f||"set"in f||u.push([l,f]));}),J(e,u.length);for(let[l,f]of u)Z(e,l),ce(e,f.value);},Re=e=>{if(typeof e=="string")return _t(JSON.stringify(e));let t={h1:_r,h2:zr,seen:new WeakMap,nextId:1,nodes:0};ce(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 Hr=typeof globalThis<"u"&&typeof globalThis.structuredClone=="function",Qe=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&&(_.has(n)||"get"in o||"set"in o||(t[n]=o.value));}),t},ue=(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((i,u)=>{s.set(ue(u,t),ue(i,t));}),s}if(e instanceof Set){let s=new Set;return t.set(e,s),e.forEach(i=>{s.add(ue(i,t));}),s}if(Array.isArray(e)){let s=[];return t.set(e,s),e.forEach((i,u)=>{s[u]=ue(i,t);}),s}let r=globalThis?.WeakRef;if(r&&e instanceof r)return K("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 K("deepClone failed to read object descriptors (possible Proxy or host object). Returning the original reference."),e}return Object.entries(o).forEach(([s,i])=>{!i.enumerable||_.has(s)||"get"in i||"set"in i||(n[s]=ue(i.value,t));}),n},E=e=>{try{if(Hr)return structuredClone(e)}catch{}return ue(e)};var zt=10,Br=5,Lr=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},le=e=>Array.isArray(e)?[...e]:typeof e=="string"&&!e.includes(".")?[e]:typeof e=="string"?Lr(e):[String(e)],Ce=e=>{let t=le(e),r=t.length;return r>zt?(T(Dt(r,zt,t)),false):(r>Br&&v(Ot(r,t)),true)},Ze=(e,t)=>{let r=le(t),n=e;for(let o of r){if(n==null){v(Pt(r,o));return}if(typeof n!="object"){v(Nt(o));return}n=n[o];}return n},et=(e,t,r)=>{let n=le(t);if(n.length===0)return e;for(let s of n)if(_.has(s))return P(`Blocked forbidden path segment "${String(s)}" in setStore path "${n.join(".")}".`),e;let o=(s,i)=>{let u=n[i],l=i===n.length-1;if(Array.isArray(s)){let f=Number(u);if(!Number.isInteger(f))return s;let g=[...s];return l?(g[f]=r,g):(g[f]=o(g[f],i+1),g)}if(s&&typeof s=="object"){if(_.has(u))return P(`Blocked unsafe path segment "${String(u)}" while setting "${n.join(".")}".`),s;let f={...s};return l?(f[u]=r,f):(f[u]=o(f[u],i+1),f)}if(s==null&&!l){let f=Number.isInteger(Number(u)),g=f?[]:{};if(f){let p=g,c=Number(u);return p[c]=o(void 0,i+1),p}return g[u]=o(void 0,i+1),g}return l?r:s};return o(e,0)};var Wt=new Set;var je=(()=>{let e=new Map;return {getItem:t=>e.has(t)?e.get(t):null,setItem:(t,r)=>{e.set(t,r);},removeItem:t=>{e.delete(t);},type:"memory"}})(),tt=e=>{try{return typeof window>"u"?je:e==="session"||e==="sessionStorage"?window.sessionStorage??je:window.localStorage??je}catch{return je}},$e=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),de=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),Bt=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,r=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(r)===r}catch{return false}},Ur=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",Ht=e=>{try{e[Ur]=!0;}catch{}return e},Kr={allowSSRGlobalStore:'scope: "global"',schema:"validate",validator:"validate",version:"persist.version",migrations:"persist.migrations",historyLimit:"devtools.historyLimit",redactor:"devtools.redactor",middleware:"lifecycle.middleware",onCreate:"lifecycle.onCreate",onSet:"lifecycle.onSet",onReset:"lifecycle.onReset",onDelete:"lifecycle.onDelete"},qr=(e,t)=>{if(!e)return null;let r={key:`stroid_${t}`,serialize:JSON.stringify,deserialize:JSON.parse,encrypt:Ht(g=>g),decrypt:Ht(g=>g),allowPlaintext:false,sensitiveData:false,onMigrationFail:"reset",checksum:"hash"};if(e===true)return {driver:tt("localStorage"),...r};if(typeof e=="string")return {driver:tt(e),...r};let n=e.encrypt||r.encrypt,o=e.decrypt||r.decrypt,s=e.encryptAsync,i=e.decryptAsync,u=e.sensitiveData===true,l=e.allowPlaintext===true,f=e.checksum==="sha256"?"sha256":e.checksum==="none"?"none":"hash";if(s&&!i||!s&&i)throw new Error(`[stroid/persist] Store "${t}" must provide both encryptAsync and decryptAsync when using async crypto.`);if(u&&Bt(n)&&!s)throw new Error(`[stroid/persist] Store "${t}" is marked sensitiveData but is configured to persist in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`);return {driver:e.driver||e.storage||tt("localStorage"),key:e.key||r.key,serialize:e.serialize||r.serialize,deserialize:e.deserialize||r.deserialize,encrypt:n,decrypt:o,encryptAsync:s,decryptAsync:i,allowPlaintext:l,sensitiveData:u,checksum:f,onMigrationFail:e.onMigrationFail||"reset",onStorageCleared:e.onStorageCleared}},Lt=e=>{if(!$e(e))return [];let t=[];return Object.entries(Kr).forEach(([r,n])=>{de(e,r)&&(Wt.has(r)||(Wt.add(r),t.push(`createStore option "${r}" is deprecated. Use "${n}" instead.`)));}),t},Ut=(e={},t)=>{let r=e.scope??"request",n=e.lazy===true,o=e.pathCreate===true,s=$e(e.lifecycle)?e.lifecycle:void 0,i=$e(e.persist)?e.persist:void 0,u=$e(e.devtools)?e.devtools:void 0,l=e.validate??e.validator??e.schema,f=e.snapshot==="shallow"||e.snapshot==="ref"?e.snapshot:"deep",g=de(e,"persist"),p=de(e,"sync"),c=de(e,"devtools")||de(e,"historyLimit")||de(e,"redactor"),y=r==="global"?true:e.allowSSRGlobalStore??false,{persist:S=false,devtools:a=false,onError:h,sync:k}=e;if(i?.sensitiveData===true){let m=i.encrypt,w=i.encryptAsync;if((!m||Bt(m))&&!w)throw new Error(`[stroid/persist] Store "${t}" is marked sensitiveData but is configured to persist in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`)}return {scope:r,lazy:n,pathCreate:o,persist:r==="temp"&&!g?null:qr(S,t),devtools:r==="temp"&&!c?false:typeof a=="boolean"?a:u?.enabled??true,middleware:s?.middleware??e.middleware??[],onSet:s?.onSet??e.onSet,onReset:s?.onReset??e.onReset,onDelete:s?.onDelete??e.onDelete,onCreate:s?.onCreate??e.onCreate,onError:h,validate:l,migrations:i?.migrations??e.migrations??{},version:i?.version??e.version??1,redactor:r==="temp"&&!c?void 0:u?.redactor??e.redactor,historyLimit:r==="temp"&&!c?0:u?.historyLimit??e.historyLimit??50,sync:r==="temp"&&!p?false:k??false,allowSSRGlobalStore:y,snapshot:f,explicitPersist:g,explicitSync:p,explicitDevtools:c}};var Kt=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 qt=()=>({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 Gt=new Map,Gr=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,nt=e=>(Gr||e).replace(/\.ts(\?|$)/,".js$1"),ee=nt(new URL("./store.js",import.meta.url).href);var Jr=()=>({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:qt()}),Me=e=>{let t=nt(e),r=Gt.get(t);if(r)return r;let n=Jr();return Gt.set(t,n),n},pe=(e,t)=>Object.prototype.hasOwnProperty.call(e.stores,t),Yt=(e,t)=>e.deletingStores.has(t);var ot=()=>null;var Jt=(e,t)=>t(),te=e=>e||Me(ee);var st=new Map;var Ie=e=>st.has(e),it=e=>st.get(e),Fe=()=>Array.from(st.keys());var _e=Symbol("stroid.middleware.abort"),Qt=({name:e,payload:t,middlewares:r,reportIssue:n,warn:o})=>{if(!Array.isArray(r)||r.length===0)return t.next;let s=new WeakSet,i=E(t.next);for(let u of r){if(typeof u!="function")continue;let l,f=i;try{l=u({action:t.action,name:e,prev:t.prev,next:f,path:t.path});}catch(g){let p=`Middleware for "${e}" failed: ${g?.message??g}`;return n(p,"dev"),_e}if(l&&typeof l.then=="function"){let g=`Middleware for "${e}" must be synchronous. Promise-returning middleware is not supported.`;return n(g,"dev"),_e}l===void 0?(R()&&!s.has(u)&&(s.add(u),o(`Middleware for "${e}" returned undefined; treating as pass-through. Return the new state to override.`)),i=f):i=l;}return i},ze=({name:e,label:t,fn:r,args:n,reportIssue:o})=>{if(typeof r=="function")try{r(...n);}catch(s){let i=`${t} for "${e}" failed: ${s?.message??s}`;o(i,"always");}};var re=(e,t={})=>{let{severity:r="warn",visibility:n="dev",onError:o}=t;if(o?.(e),r==="critical"){n==="dev"&&v(e),P(e);return}if(n==="always"){K(e);return}v(e);};var Zt=()=>te(Me(ee)),er=()=>Zt().computedEntries,Zr=()=>Zt().computedDependents;var tr=e=>Object.prototype.hasOwnProperty.call(er(),e);var rr=e=>{let t=er(),r=Zr(),n=new Set,o=[...e];for(;o.length>0;){let g=o.shift(),p=r[g];if(p)for(let c of p)n.has(c)||(n.add(c),o.push(c));}if(n.size===0)return [];let s=g=>{let p=t[g];if(p)for(let c of p.deps)t[c]&&(n.has(c)||(n.add(c),s(c)));};Array.from(n).forEach(g=>s(g));let i=new Map,u=new Map;for(let g of n){let p=t[g];if(!p)continue;let c=0;for(let y of p.deps)n.has(y)&&(c++,u.has(y)||u.set(y,[]),u.get(y).push(g));i.set(g,c);}let l=[];for(let[g,p]of i)p===0&&l.push(g);l.sort();let f=[];for(;l.length>0;){let g=l.shift();f.push(g);let p=u.get(g)??[];for(let c of p){let y=(i.get(c)??1)-1;if(i.set(c,y),y===0){let S=l.findIndex(a=>a>c);S===-1?l.push(c):l.splice(S,0,c);}}}return f};function Ee(e,t){let r=ge(e);if(!Ve(r)||!Se(r))return null;let n=fe(r);if(t===void 0)return n===null||typeof n!="object"?n:E(n);if(!Ce(t))return null;let o=Ze(n,t);return o===null||typeof o!="object"?o:E(o)}var We=e=>({name:e});var De=e=>(e??te()).transaction,tn=e=>e instanceof Error?e:typeof e=="string"?new Error(e):e&&typeof e?.message=="string"?new Error(e.message):new Error("setStoreBatch aborted");var x=()=>De().depth>0,N=(e,t)=>{let r=De(t);r.failed=true,r.error||(r.error=tn(e));},Oe=e=>{let t=te();De(t).pending.push(()=>Jt(t,e));},Pe=(e,t)=>{De().stagedValues.set(e,t);},ne=e=>{let t=De();return t.stagedValues.has(e)?{has:true,value:t.stagedValues.get(e)}:{has:false,value:void 0}};var me=new Set,Ne=[],ct=false,nr=e=>{let t=d[e]?.options?.snapshot??M().defaultSnapshotMode;return t==="shallow"||t==="ref"?t:"deep"},or=(e,t)=>t==="ref"?e:t==="shallow"?Qe(e):E(e);var at=(e,t)=>{if(t>0&&typeof setTimeout=="function"){setTimeout(e,t);return}if(typeof queueMicrotask=="function"){queueMicrotask(e);return}Promise.resolve().then(e);},nn=()=>{Ne.length=0;for(let p of me)Ne.push(p);me.clear();let e=M().flush,t=e.priorityStores||[],r=new Set(Ne),n=t.length?new Set(t):null,o=[];if(n){for(let p of t)r.has(p)&&o.push(p);for(let p of Ne)n.has(p)||o.push(p);}else o.push(...Ne);let s=rr(o),i=new Set(o);for(let p of s)r.has(p)&&!i.has(p)&&(o.push(p),i.add(p));let u=Number.isFinite(e.chunkSize)&&e.chunkSize>0?e.chunkSize:Number.POSITIVE_INFINITY,l=e.chunkDelayMs,f=u===Number.POSITIVE_INFINITY&&l===0;return {names:o.slice(),sliceSize:u,chunkDelayMs:l,runInline:f,prioritySet:n}},sr=()=>{let{names:e,sliceSize:t,chunkDelayMs:r,runInline:n,prioritySet:o}=nn(),s=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),i=()=>{ct=false,me.size>0&&ir();};if(n){for(let c of e){let y=X[c];if(!y||y.size===0)continue;let S=d[c]?.updateCount??0,a=nr(c),h=ye[c],k=h&&h.version===S?h.snapshot:(()=>{let b=or(O[c],a);return ye[c]={version:S,snapshot:b},b})(),m=s();for(let b of y)try{b(k);}catch(D){v(`Subscriber for "${c}" threw: ${D?.message??D}`);}let w=s()-m,C=d[c]?.metrics||{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0};C.notifyCount+=1,C.totalNotifyMs+=w,C.lastNotifyMs=w,d[c]&&(d[c].metrics=C),(d[c]?.updateCount??S)!==S&&me.add(c);}i();return}let u=c=>{let y=[];for(let S of e){if(c&&!c(S))continue;let a=X[S];if(!a||a.size===0)continue;let h=d[S]?.updateCount??0,k=nr(S),m=ye[S],w=m&&m.version===h?m.snapshot:(()=>{let C=or(O[S],k);return ye[S]={version:h,snapshot:C},C})();y.push({name:S,subsArray:Array.from(a),index:0,snapshot:w,version:h,notified:new Set,metrics:d[S]?.metrics?{...d[S].metrics}:{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0},totalMs:0});}return y},l=o?u(c=>o.has(c)):[],f=u(c=>!o||!o.has(c)),g=c=>{let y=X[c.name];if(!y||y.size===0){c.subsArray=[],c.index=0;return}c.subsArray=Array.from(y),c.index=0;},p=(c,y)=>{let S=()=>{if(c.length===0){y();return}let a=c.shift();if((d[a.name]?.updateCount??a.version)!==a.version){if(me.add(a.name),c.length===0){y();return}n?S():at(S,r);return}if(g(a),a.subsArray.length===0){if(c.length===0){y();return}n?S():at(S,r);return}let k=s(),m=0;for(;a.index<a.subsArray.length&&m<t;){let V=a.subsArray[a.index++];if(!a.notified.has(V)){a.notified.add(V);try{V(a.snapshot);}catch(b){v(`Subscriber for "${a.name}" threw: ${b?.message??b}`);}m+=1;}}a.totalMs+=s()-k;let w=X[a.name],C=w?Array.from(w).some(V=>!a.notified.has(V)):false;if(a.index<a.subsArray.length||C?c.push(a):(a.metrics.notifyCount+=1,a.metrics.totalNotifyMs+=a.totalMs,a.metrics.lastNotifyMs=a.totalMs,d[a.name]&&(d[a.name].metrics=a.metrics)),c.length===0){y();return}n?S():at(S,r);};S();};l.length>0?p(l,()=>p(f,i)):p(f,i);},ir=()=>{ct||(ct=true,typeof queueMicrotask=="function"?queueMicrotask(sr):Promise.resolve().then(sr));},W=e=>{me.add(e),ir();};var on=()=>H().computedCleanups;var ar=e=>{let t=on(),r=t.get(e);if(!r){R()&&v(`deleteComputed("${e}") -- not found`);return}r(),t.delete(e);};var cr=e=>{let t=e.stores,r=e.subscribers,n=e.initialStates,o=e.initialFactories,s=e.metaEntries,i=e.snapshotCache,u=e.featureRuntimes,l=e.deletingStores,f=(a,h)=>{re(h,{onError:s[a]?.options?.onError,severity:"warn",visibility:"dev"});},g=({name:a,prev:h,options:k,initialState:m,getMeta:w,getStoreValue:C,hasStore:V})=>({name:a,options:k,prev:h,getMeta:w,getStoreValue:C,getAllStores:()=>t,getInitialState:()=>m,hasStore:V,setStoreValue:()=>{},applyFeatureState:()=>{},notify:()=>{},reportStoreError:b=>{re(b,{onError:k.onError,severity:"warn",visibility:"dev"});},warn:v,log:A,hashState:Re,deepClone:E,sanitize:Q,validate:()=>({ok:true,value:h}),isDev:R}),p=({name:a,prev:h,options:k,initialState:m,phase:w})=>{let C=g({name:a,prev:h,options:k,initialState:m,getMeta:()=>s[a],getStoreValue:()=>t[a],hasStore:()=>pe(e,a)}),V=g({name:a,prev:h,options:k,initialState:m,getMeta:()=>{},getStoreValue:()=>h,hasStore:()=>false});Fe().forEach(b=>{let D=u.get(b);w==="before"?D?.beforeStoreDelete?.(C):D?.afterStoreDelete?.(V);});},c=a=>{if(!pe(e,a))return;let h=t[a],k=s[a].options,m=n[a],w=r[a];l.add(a);try{w?.forEach(b=>{try{b(null);}catch(D){v(`Subscriber for "${a}" threw during delete: ${D?.message??D}`);}}),ze({name:a,label:"onDelete",fn:k.onDelete,args:[h],reportIssue:(b,D)=>{re(b,{onError:k.onError,severity:"warn",visibility:D});}}),p({name:a,prev:h,options:k,initialState:m,phase:"before"}),delete t[a],delete r[a],delete n[a],delete o[a],delete s[a],delete i[a],tr(a)&&ar(a);let V=e.computedDependents[a];if(V)for(let b of V)v(`[stroid] source store "${a}" was deleted. Computed store "${b}" depends on it and will return stale data. Call deleteComputed("${b}") to clean up.`);p({name:a,prev:h,options:k,initialState:m,phase:"after"}),A(`Store "${a}" deleted`);}finally{l.delete(a);}};return {deleteExistingStore:c,clearAllStores:()=>{let a=[],k=0,m=Number.POSITIVE_INFINITY;for(;k<20;){let C=Object.keys(t);if(C.length===0)break;C.forEach(b=>{pe(e,b)&&(c(b),a.push(b));}),k+=1;let V=Object.keys(t).length;if(V===0||V>=m)break;m=V;}let w=Object.keys(t).length;return w>0?v(`clearAllStores stopped after ${k} pass${k===1?"":"es"}; ${w} store(s) still registered (likely recreated during deletion).`):v(`All stores cleared (${a.length} stores removed)`),a},clearStores:a=>{let h=Object.keys(t).filter(k=>a?a.endsWith("*")?k.startsWith(a.slice(0,-1)):k===a:true);return h.forEach(k=>c(k)),h},reportStoreError:f}};var sn=ee,an=Me(sn),dr=null,ur=new WeakSet,cn=e=>{ur.has(e)||(ur.add(e),Fe().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=it(t);r&&e.featureRuntimes.set(t,r());}}));},B=()=>{let e=te(an);return cn(e),e};var H=()=>B(),pr=e=>{dr=e;},he=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}}}),un=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)}),ln=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)}),O=he(()=>B().stores),X=he(()=>B().subscribers),z=he(()=>B().initialStates),oe=he(()=>B().initialFactories),d=he(()=>B().metaEntries),ye=he(()=>B().snapshotCache),q=un(()=>B().featureRuntimes),lr=new WeakMap,dn=e=>{let t=lr.get(e);return t||(t=cr(e),lr.set(e,t)),t};ln(()=>dn(B()));var gr=e=>{let t=q.get(e);if(t)return t;let r=it(e);if(!r)return;let n=r();return q.set(e,n),n},pn=()=>{Fe().forEach(e=>{gr(e);});};pn();var L=e=>pe(B(),e),fe=e=>{if(x()){let r=ne(e);if(r.has)return r.value}let t=ot();return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:O[e]},j=(e,t)=>{let n=R()?Kt(t):t;O[e]=n;},ut=(e,t,r=Date.now())=>{j(e,t),d[e]&&(d[e].updatedAt=new Date(r).toISOString(),d[e].updatedAtMs=r,d[e].updateCount++,dr?.(e));};var Sr=e=>Yt(B(),e);var lt=new Set,dt=e=>e?lt.has(e):lt.size>0,pt=e=>{e&&lt.add(e);};var yr=new Set,mr=e=>{let t=kt();return !t||e.includes("::")?e:(R()&&!yr.has(e)&&(yr.add(e),v(`Namespace "${t}" is active; treating store "${e}" as "${t}::${e}". Consider using namespace("${t}").create("...") to be explicit.`)),`${t}::${e}`)},ge=e=>mr(typeof e=="string"?e:e.name),Ve=e=>L(e)&&!Sr(e)?true:(Ke(e,Object.keys(O)),false),hr=(e,t,r={})=>{re(t,{...r,onError:d[e]?.options?.onError});},br=(e,t,r={})=>{re(e,{...r,onError:t});},se=(e,t,r="dev")=>{hr(e,t,{severity:"warn",visibility:r});},vr=(e,t,r="dev")=>{br(e,t,{severity:"warn",visibility:r});},G=(e,t)=>hr(e,t,{severity:"critical",visibility:"always"}),be=(e,t)=>br(e,t,{severity:"critical",visibility:"always"}),Te=(e,t,r)=>{let n=`Store "${e}" requested ${t} support, but "${t}" is not registered.
13
+ Import "stroid/${t}" before calling createStore("${e}", ...).`;if(vr(n,r,"always"),M().strictMissingFeatures)throw new Error(n)};var wr=new WeakMap,kr=new WeakMap,fn=500,gn="",He=e=>{let t=wr.get(e);return t||(t=new Map,wr.set(e,t)),t},Rr=e=>{let t=kr.get(e);return t||(t=new Map,kr.set(e,t)),t},Sn=(e,t)=>{let r=Rr(e),n=r.get(t);return n||(n=new Map,r.set(t,n)),n},xr=(e,t,r)=>{for(e.has(t)&&e.delete(t),e.set(t,r);e.size>fn;){let n=e.keys().next().value;if(!n)break;let o=e.get(n);e.delete(n),o?.node.verdicts&&(o.node.verdicts.delete(o.type),o.node.verdicts.size===0&&delete o.node.verdicts);}};new Proxy(new Map,{get:(e,t)=>{let r=He(H());if(t==="size")return r.size;if(t===Symbol.iterator)return r[Symbol.iterator].bind(r);let n=r[t];return typeof n=="function"?n.bind(r):n},set:(e,t,r)=>(He(H())[t]=r,true)});var ft=(e,t,r,n)=>{let o=d[e];if(!o)return {ok:true};let s=le(r);if(s.length===0)return {ok:true};let i=Y(n),u=H(),l=He(u),f=Sn(u,e),g=s.join(gn),p=l.get(e);p||(p={children:new Map},l.set(e,p));let c=p;for(let m of s){let w=c.children.get(m);w||(w={children:new Map},c.children.set(m,w)),c=w;}let y=c.verdicts?.get(i);if(y){let m=`${g}|${i}`;return xr(f,m,{node:c,type:i}),y}let S=o.options?.pathCreate===true,a=t,h={ok:true};for(let m=0;m<s.length;m++){let w=s[m],C=m===s.length-1;if(a==null){let b=`Path "${s.join(".")}" is invalid for "${e}" - "${s.slice(0,m).join(".")||"root"}" is ${a===null?"null":"undefined"}.`;P(b),h={ok:false,reason:b};break}if(typeof a!="object"){let b=`Path "${s.join(".")}" is invalid for "${e}" - "${s.slice(0,m).join(".")||"root"}" is not an object.`;P(b),h={ok:false,reason:b};break}if(Array.isArray(a)){let b=Number(w);if(!Number.isInteger(b)||b<0){let $=`Path "${s.join(".")}" targets non-numeric index "${w}" on an array in "${e}".`;P($),h={ok:false,reason:$};break}let D=a;if(b>=D.length){let $=`Path "${s.join(".")}" is invalid for "${e}" - index ${b} is out of bounds (length ${D.length}).`;P($),h={ok:false,reason:$};break}if(C){let $=D[b];if($!=null){let bt=Y($);if(bt!==i){let vt=`Type mismatch setting "${s.join(".")}" on "${e}": expected ${bt}, received ${i}.`;P(vt),h={ok:false,reason:vt};break}}h={ok:true};break}a=D[b];continue}if(!Object.prototype.hasOwnProperty.call(a,w)){if(S&&C){h={ok:true};break}let b=`Path "${s.join(".")}" is invalid for "${e}" - unknown key "${w}" at "${s.slice(0,m).join(".")||"root"}".`;P(b),h={ok:false,reason:b};break}if(C){let b=a[w];if(b!=null){let D=Y(b);if(D!==i){let $=`Type mismatch setting "${s.join(".")}" on "${e}": expected ${D}, received ${i}.`;P($),h={ok:false,reason:$};break}}h={ok:true};break}a=a[w];}c.verdicts||(c.verdicts=new Map);let k=c.verdicts.has(i);if(c.verdicts.set(i,h),!k){let m=`${g}|${i}`;xr(f,m,{node:c,type:i});}return h},ie=(e,t,r,n)=>{try{return n?.reuseInput&&Ye(t)?{ok:!0,value:t}:{ok:!0,value:Q(t)}}catch(o){let s=`Sanitize failed for "${e}": ${o?.message??o}`;return d[e]?.options?.onError?.(s),r?.(s),v(s),{ok:false}}},mn=(e,t)=>{let r=new Set,n=d[e]?.options?.onError;return typeof n=="function"&&r.add(n),typeof t=="function"&&r.add(t),r},Be=(e,t,r,n)=>{if(!r)return {ok:true,value:t};let o=mn(e,n),s=(u,l)=>{o.forEach(f=>f(u)),l==="critical"?P(u):v(u);};if(typeof r=="function")try{let u=r(t);return u===!1?(s(`Validation blocked update for "${e}"`,"warn"),{ok:!1}):{ok:!0,value:u===!0?t:u}}catch(u){return s(`Validation for "${e}" failed: ${u?.message??u}`,"critical"),{ok:false}}let i=Ge(r,t);return i.ok?{ok:true,value:i.data??t}:(s(`Validation failed for "${e}": ${i.error}`,"critical"),{ok:false})},Ae=(e,t,r,n,o)=>{let s=ie(e,t,n,o);if(!s.ok)return {ok:false};let i=Be(e,s.value,r,n);return i.ok?{ok:true,value:i.value}:{ok:false}},I=e=>{let t=H();He(t).delete(e),Rr(t).delete(e);};pr(I);var Se=e=>{if((x()?ne(e):{has:false}).has||O[e]!==void 0)return true;let r=oe[e];if(!r)return true;try{let n=r(),o=ie(e,n,d[e]?.options?.onError);if(!o.ok)return !1;let s=d[e]?.options?.validate,i=Ae(e,o.value,s,d[e]?.options?.onError);if(!i.ok)return !1;if(x()){let u=i.value;Pe(e,u),Oe(()=>{j(e,u),z[e]=E(u),delete oe[e],I(e);});}else j(e,i.value),z[e]=E(i.value),delete oe[e],I(e);return !0}catch(n){return G(e,`Lazy initializer for "${e}" failed: ${n?.message??n}`),false}};var Cr=new WeakMap,hn=e=>{let t=Cr.get(e);return t||(t=new Map,Cr.set(e,t)),t};var gt=e=>{let t=H(),r=hn(t),n=r.get(e);if(n)return n;let o=d[e];if(!o)return v(`Internal feature context requested for "${e}" after metadata was cleared.`),null;let s={name:e,options:o.options,getMeta:()=>d[e],getStoreValue:()=>O[e],getAllStores:()=>O,getInitialState:()=>z[e],hasStore:()=>L(e),setStoreValue:i=>{j(e,i);},applyFeatureState:(i,u)=>{ut(e,i,u),I(e);},notify:()=>{},reportStoreError:i=>{G(e,i);},warn:v,log:A,hashState:Re,deepClone:E,sanitize:Q,validate:i=>Be(e,i,d[e]?.options?.validate),isDev:R};return r.set(e,s),s},St=(e,t)=>{let r=gt(e);r&&(r.notify=()=>t(e),q.forEach(n=>{n.onStoreCreate?.(r);}));},ve=(e,t,r,n,o)=>{let s=gt(e);if(!s)return;s.notify=()=>o(e);let i=Object.assign(Object.create(s),{action:t,prev:r,next:n});q.forEach(u=>{u.onStoreWrite?.(i);});};var yt=(e,t)=>Qt({name:e,payload:t,middlewares:(()=>{let r=d[e]?.options?.middleware||[],n=M().middleware||[];return r.length===0?n:n.length===0?r:[...r,...n]})(),reportIssue:(r,n)=>{se(e,r,n);},warn:v}),ae=(e,t,r,n)=>ze({name:e,label:t,fn:r,args:n,reportIssue:(o,s)=>{se(e,o,s);}}),mt=(e,t)=>{let r={...t};return r.persist&&!Ie("persist")&&(r.explicitPersist&&Te(e,"persist",r.onError),r.persist=null),r.sync&&!Ie("sync")&&(r.explicitSync&&Te(e,"sync",r.onError),r.sync=false),Ie("devtools")||(r.explicitDevtools&&Te(e,"devtools",r.onError),r.devtools=false,r.historyLimit=0,r.redactor=void 0),r};var Rn=32,Mr=new Set,Cn=(e,t)=>{R()&&(t<Rn||Mr.has(e)||(Mr.add(e),v(`setStore("${e}", mutator) took ${t}ms. Mutator writes clone the entire store; consider path writes or smaller stores for hot paths.`)));},Le=(e,t,r={})=>{if(x()){let a=`createStore("${String(e)}") cannot be called inside setStoreBatch. Move createStore outside the batch to preserve transaction semantics.`;be(a,r.onError),N(a);return}if(!Je(e)){be(`createStore("${String(e)}") is not a valid store name.`,r.onError);return}if(!(r.lazy===true&&typeof t=="function")&&!xe(t)){be(`createStore("${e}") received invalid initial data.`,r.onError);return}t===void 0&&R()&&v(`createStore("${e}") received an undefined initial value. This can be indistinguishable from a missing store in some consumers; consider null or an explicit shape if that is intentional.`),Lt(r).forEach(a=>{v(a);});let o=mt(e,Ut(r,e));if(o.scope==="temp"&&r.persist){let a=`Store "${e}" has scope: "temp" but persist is enabled. Temp stores are intended to be ephemeral.`;o.onError?.(a),R()||K(a),T(a);}let s=typeof window>"u",i=typeof process<"u"?process.env?.NODE_ENV:void 0,u=s&&i==="production",l=o.allowSSRGlobalStore??false;if(u&&!l){let a=`createStore("${e}") is blocked on the server in production to prevent cross-request memory leaks.
14
+ Call createStoreForRequest(...) inside each request scope or pass { scope: "global" } to opt in.`;be(a,r.onError);return}if(L(e)){let a=`Store "${e}" already exists. Call setStore("${e}", data) to update instead.`;return se(e,a),{name:e}}s&&!l&&!dt(e)&&R()&&(pt(e),v(`createStore("${e}") called in a server environment. Use createStoreForRequest(...) per request to avoid cross-request leaks or pass { allowSSRGlobalStore: true } if you really want a global store on the server.`));let f=ie(e,t,o.onError);if(!f.ok)return;let g=f.value,p=o.lazy===true&&typeof t=="function",c=(X[e]?.size??0)>0;if(p)O[e]=void 0,oe[e]=t;else {let a=Ae(e,g,o.validate,o.onError);if(!a.ok)return;j(e,a.value),z[e]=E(a.value);}let y=Date.now(),S=new Date(y).toISOString();return d[e]={createdAt:S,updatedAt:S,updatedAtMs:y,updateCount:0,version:o.version,metrics:{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0},options:o},I(e),St(e,W),ae(e,"onCreate",d[e].options.onCreate,[g]),c&&W(e),A(`Store "${e}" created -> ${JSON.stringify(g)}`),{name:e}};function U(e,t,r){let n=ge(e);if(!Se(n))return {ok:false,reason:"validate"};if(!L(n)){let c=`setStore("${n}") called before createStore(). Create the store first or pass a valid StoreDefinition.`;return G(n,c),x()&&N(c),{ok:false,reason:"not-found"}}let o,s=x()?ne(n):{has:false,value:void 0},i=s.has?s.value:fe(n),u=typeof t=="function"&&r===void 0;if(u){let c=R()?Date.now():0;try{let y=M().mutatorProduce,S=!1,a,h=m=>{let w=t(m);return w!==void 0&&(S=!0,a=w),w},k=y?y(i,h):(()=>{let m=E(i);return h(m),m})();if(S&&M().strictMutatorReturns){let m=`setStore("${n}", mutator) returned a value. Strict mutator mode forbids return values; mutate the draft instead.`;return G(n,m),x()&&N(m),{ok:!1,reason:"validate"}}S&&R()&&!M().strictMutatorReturns&&v(`setStore("${n}", mutator) returned a value. Return values replace the entire store; return void to apply draft mutations instead.`),o=S&&!M().strictMutatorReturns?a:k;}catch(y){return G(n,`Mutator for "${n}" failed: ${y?.message??y}`),x()&&N(y),{ok:false,reason:"validate"}}finally{c&&Cn(n,Date.now()-c);}}else if(typeof t=="object"&&!Array.isArray(t)&&r===void 0){if(!xe(t))return x()&&N(`setStore("${n}") received invalid data`),{ok:false,reason:"invalid-args"};if(typeof i!="object"||i===null||Array.isArray(i))return T(`setStore("${n}", data) only merges into object stores.
15
+ Use setStore("${n}", "path", value) or recreate the store with an object shape.`),x()&&N(`setStore("${n}") attempted object merge on non-object store`),{ok:false,reason:"validate"};let c=ie(n,t);if(!c.ok)return x()&&N(`setStore("${n}") failed sanitize`),{ok:false,reason:"validate"};o={...i,...c.value};}else if(typeof t=="string"||Array.isArray(t)){if(!Ce(t))return x()&&N(`setStore("${n}") received invalid path`),{ok:false,reason:"invalid-args"};let c=ie(n,r);if(!c.ok)return x()&&N(`setStore("${n}") failed sanitize`),{ok:false,reason:"validate"};let y=c.value,S=ft(n,i,t,y);if(!S.ok)return d[n]?.options?.onError?.(S.reason??`Invalid path for "${n}".`),x()&&N(S.reason),{ok:false,reason:"path"};o=et(i,t,y);}else {let c=`setStore("${n}") - invalid arguments.
16
+ Usage:
17
+ setStore("${n}", "field", value)
18
+ setStore("${n}", "nested.field", value)
19
+ setStore("${n}", { field: value })
20
+ setStore(storeDef, draft => { draft.field = value })`;return T(c),d[n]?.options?.onError?.(c),x()&&N(c),{ok:false,reason:"invalid-args"}}if(!xe(o))return x()&&N(`setStore("${n}") produced invalid data`),{ok:false,reason:"validate"};let l=d[n]?.options?.validate,f=yt(n,{action:"set",prev:i,next:o,path:t});if(f===_e)return x()&&N(`setStore("${n}") aborted by middleware`),{ok:false,reason:"middleware"};let p=Ae(n,f,l,void 0,u&&f===o?{reuseInput:true}:void 0);if(!p.ok)return x()&&N(`setStore("${n}") failed validation`),{ok:false,reason:"validate"};if(x()){let c=p.value,y=i;Pe(n,c),Oe(()=>{j(n,c),I(n);let S=Date.now();d[n].updatedAt=new Date(S).toISOString(),d[n].updatedAtMs=S,d[n].updateCount++,ve(n,"set",y,c,W),ae(n,"onSet",d[n].options.onSet,[y,c]),W(n),A(`Store "${n}" updated`);});}else {j(n,p.value),I(n);let c=Date.now();d[n].updatedAt=new Date(c).toISOString(),d[n].updatedAtMs=c,d[n].updateCount++,ve(n,"set",i,p.value,W),ae(n,"onSet",d[n].options.onSet,[i,p.value]),W(n);}return x()||A(`Store "${n}" updated`),{ok:true}}function ht(e){let t=ge(e);if(!Ve(t))return {ok:false,reason:"not-found"};if(!Se(t))return {ok:false,reason:"validate"};if(!z[t]){let i=`resetStore("${t}") has no initial state to reset to. If this is a lazy store, ensure it has been initialized before calling resetStore.`;return se(t,i),x()&&N(i),{ok:false,reason:"not-found"}}let r=x()?ne(t):{has:false,value:void 0},n=r.has?r.value:O[t],o=E(z[t]);if(x())return Pe(t,o),Oe(()=>{j(t,o),I(t);let i=Date.now();d[t].updatedAt=new Date(i).toISOString(),d[t].updatedAtMs=i,d[t].updateCount++,ve(t,"reset",n,o,W),ae(t,"onReset",d[t].options.onReset,[n,o]),W(t),A(`Store "${t}" reset to initial state/value`);}),{ok:true};j(t,o),I(t);let s=Date.now();return d[t].updatedAt=new Date(s).toISOString(),d[t].updatedAtMs=s,d[t].updateCount++,ve(t,"reset",n,o,W),ae(t,"onReset",d[t].options.onReset,[n,o]),W(t),A(`Store "${t}" reset to initial state/value`),{ok:true}}var Mn=0,Ns=(e,t=0,r={})=>{let n=We(e);return Le(e,{value:t},r),{inc:(o=1)=>U(n,s=>{s.value+=o;}),dec:(o=1)=>U(n,s=>{s.value-=o;}),set:o=>U(n,"value",o),reset:()=>ht(n),get:()=>Ee(n,"value")}},Ts=(e,t=[],r={})=>{let n=We(e);return Le(e,{items:t},r),{push:o=>U(n,s=>{s.items.push(o);}),removeAt:o=>U(n,s=>{s.items.splice(o,1);}),clear:()=>U(n,o=>{o.items=[];}),replace:o=>U(n,s=>{s.items=o;}),all:()=>{let o=Ee(n,"items");return o?[...o]:[]}}},As=(e,t={})=>{let r=We(e);return Le(e,{entities:{},ids:[]},t),{upsert:n=>U(r,o=>{let s=n.id??n._id??(typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`e_${++Mn}_${Date.now()}`);o.ids.includes(s)||o.ids.push(s),o.entities[s]=n;}),remove:n=>U(r,o=>{o.ids=o.ids.filter(s=>s!==n),delete o.entities[n];}),all:()=>{let o=Ee(r);return o?o.ids.map(s=>o.entities[s]):[]},get:n=>{let o=Ee(r,"entities");return o?o[n]??null:null},clear:()=>ht(r)}};export{Ns as createCounterStore,As as createEntityStore,Ts as createListStore};
package/dist/index.cjs ADDED
@@ -0,0 +1,30 @@
1
+ 'use strict';var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Co=Object.defineProperty;var Mo=(e,t)=>{for(var r in t)Co(e,r,{get:t[r],enumerable:true});};var Fo={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}`));}},Eo={logSink:Fo,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},v={...Eo},F=()=>v,Dr=e=>{e&&(e.logSink&&(v={...v,logSink:{log:e.logSink.log??v.logSink.log,warn:e.logSink.warn??v.logSink.warn,critical:e.logSink.critical??v.logSink.critical}}),e.flush&&(v={...v,flush:{chunkSize:Number.isFinite(e.flush.chunkSize??v.flush.chunkSize)?e.flush.chunkSize:v.flush.chunkSize,chunkDelayMs:Number.isFinite(e.flush.chunkDelayMs??v.flush.chunkDelayMs)?e.flush.chunkDelayMs:v.flush.chunkDelayMs,priorityStores:Array.isArray(e.flush.priorityStores)?e.flush.priorityStores:v.flush.priorityStores}}),e.revalidateOnFocus&&(v={...v,revalidateOnFocus:{debounceMs:Number.isFinite(e.revalidateOnFocus.debounceMs??v.revalidateOnFocus.debounceMs)?e.revalidateOnFocus.debounceMs:v.revalidateOnFocus.debounceMs,maxConcurrent:Number.isFinite(e.revalidateOnFocus.maxConcurrent??v.revalidateOnFocus.maxConcurrent)?Math.max(1,e.revalidateOnFocus.maxConcurrent):v.revalidateOnFocus.maxConcurrent,staggerMs:Number.isFinite(e.revalidateOnFocus.staggerMs??v.revalidateOnFocus.staggerMs)?Math.max(0,e.revalidateOnFocus.staggerMs):v.revalidateOnFocus.staggerMs}}),typeof e.namespace=="string"&&(v={...v,namespace:e.namespace.trim()}),typeof e.strictMissingFeatures=="boolean"&&(v={...v,strictMissingFeatures:e.strictMissingFeatures}),typeof e.strictFeatures=="boolean"&&(v={...v,strictMissingFeatures:e.strictFeatures}),typeof e.assertRuntime=="boolean"&&(v={...v,assertRuntime:e.assertRuntime}),typeof e.strictMutatorReturns=="boolean"&&(v={...v,strictMutatorReturns:e.strictMutatorReturns}),typeof e.asyncAutoCreate=="boolean"&&(v={...v,asyncAutoCreate:e.asyncAutoCreate}),(e.asyncCloneResult==="none"||e.asyncCloneResult==="shallow"||e.asyncCloneResult==="deep")&&(v={...v,asyncCloneResult:e.asyncCloneResult}),(e.defaultSnapshotMode==="shallow"||e.defaultSnapshotMode==="ref"||e.defaultSnapshotMode==="deep")&&(v={...v,defaultSnapshotMode:e.defaultSnapshotMode}),Array.isArray(e.middleware)&&(v={...v,middleware:e.middleware}),typeof e.allowUntrustedHydration=="boolean"&&(v={...v,allowUntrustedHydration:e.allowUntrustedHydration}),typeof e.mutatorProduce=="function"&&(v={...v,mutatorProduce:e.mutatorProduce}));};var Vr=()=>v.namespace;var Ao=typeof process<"u"&&typeof process.env?.NODE_ENV=="string"?process.env.NODE_ENV:void 0,Po=typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)) })<"u"&&undefined?.MODE?undefined.MODE:void 0,Tr=typeof globalThis<"u"&&typeof globalThis.__STROID_DEV__=="boolean"?globalThis.__STROID_DEV__:void 0,Oo="production",Do=Ao??Po??Oo,et=typeof Tr=="boolean"?Tr:Do!=="production",C=()=>et,qt=(e,t)=>{typeof console<"u"&&typeof console.warn=="function"&&(t?console.warn(`[stroid] ${e}`,t):console.warn(`[stroid] ${e}`));},Vo=(e,t)=>{typeof console<"u"&&typeof console.error=="function"&&(t?console.error(`[stroid] ${e}`,t):console.error(`[stroid] ${e}`));},To=(e,t)=>{typeof console<"u"&&typeof console.log=="function"&&(t?console.log(`[stroid] ${e}`,t):console.log(`[stroid] ${e}`));},j=(e,t)=>{if((F().logSink.critical??Vo)(e,t),F().assertRuntime)throw new Error(e)},f=(e,t)=>{if(!et)return;if((F().logSink.warn??qt)(e,t),F().assertRuntime)throw new Error(e)},W=(e,t)=>{if((F().logSink.warn??qt)(e,t),F().assertRuntime)throw new Error(e)},P=(e,t)=>{if(et&&(F().logSink.warn??qt)(e,t),j(e,t),F().assertRuntime)throw new Error(e)},I=(e,t)=>{if(!et)return;(F().logSink.log??To)(e,t);},Nr=()=>`Functions cannot be stored in stroid.
2
+ Store data only - handle functions outside the store.`,jr=()=>`Map/Set detected. stroid converts these to plain objects.
3
+ Use arrays or plain objects for best results.`,$r=()=>`Date object detected. stroid stores it as ISO string.
4
+ Use new Date(value) to convert back when reading.`,_r=()=>"Date detected; stored as ISO string. Use new Date(value) when reading.",Ir=()=>"Map detected; converting to plain object.",Wr=()=>"Set detected; converting to array.",zr=(e,t,r)=>`Path depth of ${e} exceeded maximum of ${t}.
5
+ "${r.join(".")}"
6
+ This is a data design issue. Split into separate stores:
7
+ createStore("${r[0]}", ...) and createStore("${r[1]}", ...)`,Hr=(e,t)=>`Deep nesting detected (${e} levels): "${t.join(".")}"
8
+ Consider splitting into separate stores for better readability.`,Br=(e,t)=>`Path "${e.join(".")}" not found - reached null at "${t}"`,Lr=e=>`Cannot go deeper at "${e}" - value is not an object`,qr=e=>`Store name must be a non-empty string. Got: ${JSON.stringify(e)}`,Kr=e=>`Store name "${e}" contains spaces.
9
+ Use camelCase or kebab-case: "userName" or "user-name"`,Ur=e=>`Store name "${e}" is not allowed.
10
+ Reserved names: "__proto__", "constructor", "prototype".`,No=128,jo=(e,t)=>Math.abs(e.length-t.length)>2?false:Math.max(e.length,t.length)<=No,$o=(e,t)=>{if(e===t)return 0;if(e.length===0)return t.length;if(t.length===0)return e.length;let r=Array.from({length:e.length+1},(o,s)=>s),n=new Array(e.length+1);for(let o=1;o<=t.length;o++){n[0]=o;for(let s=1;s<=e.length;s++)n[s]=t[o-1]===e[s-1]?r[s-1]:Math.min(r[s-1],n[s-1],r[s])+1;[r,n]=[n,r];}return r[e.length]},Kt=(e,t)=>{let r=t.find(n=>{let o=n.toLowerCase(),s=e.toLowerCase();return o.includes(s)||s.includes(o)||jo(o,s)&&$o(o,s)<=2});if(r){f(`Store "${e}" not found. Did you mean "${r}"?`);return}P(`Store "${e}" not found.
11
+ Available stores: [${t.join(", ")}]
12
+ Call createStore("${e}", data) first.`);};var X=new Set(["__proto__","constructor","prototype"]),Yt=(e,t)=>{if(!e)return {ok:true};try{if(typeof e.safeParse=="function"){let r=e.safeParse(t);return r.success?{ok:!0,data:r.data}:{ok:!1,error:r.error}}if(typeof e.parse=="function")return e.parse(t),{ok:!0,data:t};if(typeof e.validateSync=="function")return e.validateSync(t),{ok:!0,data:t};if(typeof e.isValidSync=="function")return e.isValidSync(t)?{ok:!0,data:t}:{ok:!1,error:"Schema validation failed"};if(typeof e.validate=="function"){let r=e.validate(t);if(r===!0)return {ok:!0,data:t};if(r===!1)return {ok:!1,error:e.errors||"Schema validation failed"};if(r&&typeof r=="object"){let o=r.error,s=o?.details?.[0]?.message||o?.message||r.message||e.errors;if(s)return {ok:!1,error:s};if(o)return {ok:!1,error:o}}return {ok:!1,error:e.errors||"Schema validation failed"}}if(typeof e=="function"){let r=e(t);return r===!1?{ok:!1,error:"Schema validation failed"}:{ok:!0,data:r===!0?t:r}}return {ok:!0,data:t}}catch(r){return {ok:false,error:r?.message??r}}};var fe=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,Yr=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},rt=e=>{let t=fe(e);return t==="function"?(P(Nr()),false):t==="map"||t==="set"?(f(jr()),true):(t==="date"&&f($r()),true)},Ut=(e,t)=>{let r=Yr(e);if(r)throw new Error(`${r} values are not supported`);let n=fe(e);if(n==="number"){if(!Number.isFinite(e))throw new Error("Non-finite numbers are not supported");return true}if(n==="bigint")throw new Error("BigInt values are not supported");if(n==="symbol")throw new Error("Symbol values are not supported");if(n==="date"||n==="map"||n==="set")return false;if(n==="array"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e);let o=Object.keys(e);for(let s of o){let i=Number(s);if(!Number.isInteger(i))return false}for(let s=0;s<e.length;s+=1)if(s in e&&!Ut(e[s],t))return false;return true}if(n==="object"){if(t.has(e))throw new Error("Circular reference detected during sanitize");if(t.add(e),Object.getOwnPropertySymbols(e).length>0)return false;let o=Object.getOwnPropertyDescriptors(e);for(let[s,i]of Object.entries(o)){if(!i.enumerable||X.has(s))return false;if("get"in i||"set"in i)throw new Error(`Accessor properties are not supported during sanitize ("${s}")`);if(!Ut(i.value,t))return false}return true}return true},Gt=e=>Ut(e,new WeakSet),tt=(e,t)=>{let r=Yr(e);if(r)throw new Error(`${r} values are not supported`);let n=fe(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 C()&&f(_r()),e.toISOString();if(n==="map"){if(t.has(e))throw new Error("Circular reference detected during sanitize");t.add(e),C()&&f(Ir());let o={};for(let[s,i]of e){if(typeof s!="string")throw new Error("Map keys must be strings to remain JSON-safe");o[String(s)]=tt(i,t);}return o}if(n==="set"){if(t.has(e))throw new Error("Circular reference detected during sanitize");return t.add(e),C()&&f(Wr()),Array.from(e,o=>tt(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[i,u]of Object.entries(s))if(u.enumerable&&!X.has(i)){if("get"in u||"set"in u)throw new Error(`Accessor properties are not supported during sanitize ("${i}")`);o[i]=tt(u.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=>tt(o,t))}return e},ve=e=>tt(e,new WeakSet),kt=e=>typeof e!="string"||e.trim()===""?(P(qr(e)),false):X.has(e)?(P(Ur(e)),false):e.includes(" ")?(P(Kr(e)),false):true;var Xt=null,_o=()=>{if(Xt)return Xt;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 Xt=t,t},Xr=e=>{let t=_o(),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},Io=2166136261,Wo=2654435761,zo=1e5,pe=(e,t)=>{let r=t>>>0;e.h1=Math.imul(e.h1^r,2246822507),e.h2=Math.imul(e.h2^r,3266489909);},xe=(e,t)=>{pe(e,t.length);for(let r=0;r<t.length;r++)pe(e,t.charCodeAt(r));},O=(e,t)=>{xe(e,t);},Gr=(e,t)=>{if(Number.isNaN(t)){O(e,"NaN");return}if(!Number.isFinite(t)){O(e,t>0?"Infinity":"-Infinity");return}if(Object.is(t,-0)){O(e,"-0");return}let r=t|0;if(t===r){O(e,"int"),pe(e,r);return}O(e,"num"),xe(e,String(t));},$e=(e,t)=>{if(e.nodes++>zo){O(e,"[max]");return}if(t===null){O(e,"null");return}let r=typeof t;if(r==="string"){O(e,"string"),xe(e,t);return}if(r==="number"){O(e,"number"),Gr(e,t);return}if(r==="boolean"){O(e,t?"true":"false");return}if(r==="undefined"){O(e,"undefined");return}if(r==="bigint"){O(e,"bigint"),xe(e,t.toString());return}if(r==="symbol"){O(e,"symbol");let l=t;xe(e,Symbol.keyFor(l)??l.description??String(l));return}if(r==="function"){O(e,"function"),xe(e,t.name||"anonymous");return}let n=t,o=e.seen.get(n);if(o!==void 0){O(e,"ref"),pe(e,o);return}let s=e.nextId++;if(e.seen.set(n,s),Array.isArray(n)){O(e,"array"),pe(e,n.length);for(let l=0;l<n.length;l++)Object.prototype.hasOwnProperty.call(n,l)?$e(e,n[l]):O(e,"hole");return}if(n instanceof Date){O(e,"date"),Gr(e,n.getTime());return}if(n instanceof Map){O(e,"map"),pe(e,n.size),n.forEach((l,g)=>{$e(e,g),$e(e,l);});return}if(n instanceof Set){O(e,"set"),pe(e,n.size),n.forEach(l=>{$e(e,l);});return}O(e,"object");let i=Object.getOwnPropertyDescriptors(n),u=[];Object.entries(i).forEach(([l,g])=>{g?.enumerable&&(X.has(l)||"get"in g||"set"in g||u.push([l,g]));}),pe(e,u.length);for(let[l,g]of u)xe(e,l),$e(e,g.value);},nt=e=>{if(typeof e=="string")return Xr(JSON.stringify(e));let t={h1:Io,h2:Wo,seen:new WeakMap,nextId:1,nodes:0};$e(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 Ho=typeof globalThis<"u"&&typeof globalThis.structuredClone=="function",ot=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&&(X.has(n)||"get"in o||"set"in o||(t[n]=o.value));}),t},_e=(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((i,u)=>{s.set(_e(u,t),_e(i,t));}),s}if(e instanceof Set){let s=new Set;return t.set(e,s),e.forEach(i=>{s.add(_e(i,t));}),s}if(Array.isArray(e)){let s=[];return t.set(e,s),e.forEach((i,u)=>{s[u]=_e(i,t);}),s}let r=globalThis?.WeakRef;if(r&&e instanceof r)return W("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 W("deepClone failed to read object descriptors (possible Proxy or host object). Returning the original reference."),e}return Object.entries(o).forEach(([s,i])=>{!i.enumerable||X.has(s)||"get"in i||"set"in i||(n[s]=_e(i.value,t));}),n},D=e=>{try{if(Ho)return structuredClone(e)}catch{}return _e(e)};var Jr=10,Bo=5,Lo=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},Ie=e=>Array.isArray(e)?[...e]:typeof e=="string"&&!e.includes(".")?[e]:typeof e=="string"?Lo(e):[String(e)],st=e=>{let t=Ie(e),r=t.length;return r>Jr?(P(zr(r,Jr,t)),false):(r>Bo&&f(Hr(r,t)),true)},Jt=(e,t)=>{let r=Ie(t),n=e;for(let o of r){if(n==null){f(Br(r,o));return}if(typeof n!="object"){f(Lr(o));return}n=n[o];}return n},Qt=(e,t,r)=>{let n=Ie(t);if(n.length===0)return e;for(let s of n)if(X.has(s))return j(`Blocked forbidden path segment "${String(s)}" in setStore path "${n.join(".")}".`),e;let o=(s,i)=>{let u=n[i],l=i===n.length-1;if(Array.isArray(s)){let g=Number(u);if(!Number.isInteger(g))return s;let S=[...s];return l?(S[g]=r,S):(S[g]=o(S[g],i+1),S)}if(s&&typeof s=="object"){if(X.has(u))return j(`Blocked unsafe path segment "${String(u)}" while setting "${n.join(".")}".`),s;let g={...s};return l?(g[u]=r,g):(g[u]=o(g[u],i+1),g)}if(s==null&&!l){let g=Number.isInteger(Number(u)),S=g?[]:{};if(g){let d=S,c=Number(u);return d[c]=o(void 0,i+1),d}return S[u]=o(void 0,i+1),S}return l?r:s};return o(e,0)};var Qr=new Set;var Rt=(()=>{let e=new Map;return {getItem:t=>e.has(t)?e.get(t):null,setItem:(t,r)=>{e.set(t,r);},removeItem:t=>{e.delete(t);},type:"memory"}})(),Zt=e=>{try{return typeof window>"u"?Rt:e==="session"||e==="sessionStorage"?window.sessionStorage??Rt:window.localStorage??Rt}catch{return Rt}},Ct=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),We=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),en=e=>{try{let t=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`,r=`__stroid_plaintext_probe_${Math.random().toString(36).slice(2)}__`;return e(t)!==t?!1:e(r)===r}catch{return false}},qo=typeof Symbol=="function"?Symbol.for("stroid.persist.defaultCrypto"):"__stroid_persist_defaultCrypto__",Zr=e=>{try{e[qo]=!0;}catch{}return e},Ko={allowSSRGlobalStore:'scope: "global"',schema:"validate",validator:"validate",version:"persist.version",migrations:"persist.migrations",historyLimit:"devtools.historyLimit",redactor:"devtools.redactor",middleware:"lifecycle.middleware",onCreate:"lifecycle.onCreate",onSet:"lifecycle.onSet",onReset:"lifecycle.onReset",onDelete:"lifecycle.onDelete"},Uo=(e,t)=>{if(!e)return null;let r={key:`stroid_${t}`,serialize:JSON.stringify,deserialize:JSON.parse,encrypt:Zr(S=>S),decrypt:Zr(S=>S),allowPlaintext:false,sensitiveData:false,onMigrationFail:"reset",checksum:"hash"};if(e===true)return {driver:Zt("localStorage"),...r};if(typeof e=="string")return {driver:Zt(e),...r};let n=e.encrypt||r.encrypt,o=e.decrypt||r.decrypt,s=e.encryptAsync,i=e.decryptAsync,u=e.sensitiveData===true,l=e.allowPlaintext===true,g=e.checksum==="sha256"?"sha256":e.checksum==="none"?"none":"hash";if(s&&!i||!s&&i)throw new Error(`[stroid/persist] Store "${t}" must provide both encryptAsync and decryptAsync when using async crypto.`);if(u&&en(n)&&!s)throw new Error(`[stroid/persist] Store "${t}" is marked sensitiveData but is configured to persist in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`);return {driver:e.driver||e.storage||Zt("localStorage"),key:e.key||r.key,serialize:e.serialize||r.serialize,deserialize:e.deserialize||r.deserialize,encrypt:n,decrypt:o,encryptAsync:s,decryptAsync:i,allowPlaintext:l,sensitiveData:u,checksum:g,onMigrationFail:e.onMigrationFail||"reset",onStorageCleared:e.onStorageCleared}},tn=e=>{if(!Ct(e))return [];let t=[];return Object.entries(Ko).forEach(([r,n])=>{We(e,r)&&(Qr.has(r)||(Qr.add(r),t.push(`createStore option "${r}" is deprecated. Use "${n}" instead.`)));}),t},rn=(e={},t)=>{let r=e.scope??"request",n=e.lazy===true,o=e.pathCreate===true,s=Ct(e.lifecycle)?e.lifecycle:void 0,i=Ct(e.persist)?e.persist:void 0,u=Ct(e.devtools)?e.devtools:void 0,l=e.validate??e.validator??e.schema,g=e.snapshot==="shallow"||e.snapshot==="ref"?e.snapshot:"deep",S=We(e,"persist"),d=We(e,"sync"),c=We(e,"devtools")||We(e,"historyLimit")||We(e,"redactor"),h=r==="global"?true:e.allowSSRGlobalStore??false,{persist:b=false,devtools:a=false,onError:w,sync:R}=e;if(i?.sensitiveData===true){let m=i.encrypt,x=i.encryptAsync;if((!m||en(m))&&!x)throw new Error(`[stroid/persist] Store "${t}" is marked sensitiveData but is configured to persist in plaintext. Provide encrypt/decrypt hooks to protect sensitive data.`)}return {scope:r,lazy:n,pathCreate:o,persist:r==="temp"&&!S?null:Uo(b,t),devtools:r==="temp"&&!c?false:typeof a=="boolean"?a:u?.enabled??true,middleware:s?.middleware??e.middleware??[],onSet:s?.onSet??e.onSet,onReset:s?.onReset??e.onReset,onDelete:s?.onDelete??e.onDelete,onCreate:s?.onCreate??e.onCreate,onError:w,validate:l,migrations:i?.migrations??e.migrations??{},version:i?.version??e.version??1,redactor:r==="temp"&&!c?void 0:u?.redactor??e.redactor,historyLimit:r==="temp"&&!c?0:u?.historyLimit??e.historyLimit??50,sync:r==="temp"&&!d?false:R??false,allowSSRGlobalStore:h,snapshot:g,explicitPersist:S,explicitSync:d,explicitDevtools:c}};var nn=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 on=()=>({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 sn=new Map,Yo=typeof __STROID_REGISTRY_ID__<"u"&&__STROID_REGISTRY_ID__||typeof process<"u"&&process.env?.STROID_REGISTRY_ID||void 0,tr=e=>(Yo||e).replace(/\.ts(\?|$)/,".js$1"),ke=tr(new URL("./store.js",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).href);var Xo=()=>({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:on()}),it=e=>{let t=tr(e),r=sn.get(t);if(r)return r;let n=Xo();return sn.set(t,n),n},ze=(e,t)=>Object.prototype.hasOwnProperty.call(e.stores,t),an=(e,t)=>e.deletingStores.has(t);var rr=()=>null;var Mt=(e,t)=>t(),ge=e=>e||it(ke);var nr=new Map;var Ft=e=>nr.has(e),or=e=>nr.get(e),at=()=>Array.from(nr.keys());var ct=Symbol("stroid.middleware.abort"),un=({name:e,payload:t,middlewares:r,reportIssue:n,warn:o})=>{if(!Array.isArray(r)||r.length===0)return t.next;let s=new WeakSet,i=D(t.next);for(let u of r){if(typeof u!="function")continue;let l,g=i;try{l=u({action:t.action,name:e,prev:t.prev,next:g,path:t.path});}catch(S){let d=`Middleware for "${e}" failed: ${S?.message??S}`;return n(d,"dev"),ct}if(l&&typeof l.then=="function"){let S=`Middleware for "${e}" must be synchronous. Promise-returning middleware is not supported.`;return n(S,"dev"),ct}l===void 0?(C()&&!s.has(u)&&(s.add(u),o(`Middleware for "${e}" returned undefined; treating as pass-through. Return the new state to override.`)),i=g):i=l;}return i},Et=({name:e,label:t,fn:r,args:n,reportIssue:o})=>{if(typeof r=="function")try{r(...n);}catch(s){let i=`${t} for "${e}" failed: ${s?.message??s}`;o(i,"always");}};var Re=(e,t={})=>{let{severity:r="warn",visibility:n="dev",onError:o}=t;if(o?.(e),r==="critical"){n==="dev"&&f(e),j(e);return}if(n==="always"){W(e);return}f(e);};var ln=()=>ge(it(ke)),Ce=()=>ln().computedEntries,sr=()=>ln().computedDependents,Zo=(e,t)=>{let r=Ce(),n=new Set,o=[],s=i=>{if(i===e)return true;if(n.has(i))return false;n.add(i),o.push(i);let u=r[i]?.deps??[];for(let l of u)if(s(l))return true;return o.pop(),false};for(let i of t)if(o.length=0,s(i))return [e,...o,e].join(" -> ");return null},dn=(e,t)=>{let r=sr();for(let n of t){let o=r[n];o&&(o.delete(e),o.size===0&&delete r[n]);}},fn=(e,t,r)=>{let n=Zo(e,t);if(n)return P(`[stroid] createComputed("${e}") rejected: circular dependency detected -> ${n}
13
+ Define relationships without cycles.`),false;let o=Ce(),s=sr();o[e]&&dn(e,o[e].deps),o[e]={deps:t,compute:r,stale:true};for(let i of t)s[i]||(s[i]=new Set),s[i].add(e);return true},pn=e=>{let t=Ce(),r=t[e];r&&(dn(e,r.deps),delete t[e]);},ir=e=>{let t=Ce();t[e]&&(t[e].stale=true);},At=e=>Object.prototype.hasOwnProperty.call(Ce(),e),ar=e=>Ce()[e],gn=e=>{let t=Ce(),r=sr(),n=new Set,o=[...e];for(;o.length>0;){let S=o.shift(),d=r[S];if(d)for(let c of d)n.has(c)||(n.add(c),o.push(c));}if(n.size===0)return [];let s=S=>{let d=t[S];if(d)for(let c of d.deps)t[c]&&(n.has(c)||(n.add(c),s(c)));};Array.from(n).forEach(S=>s(S));let i=new Map,u=new Map;for(let S of n){let d=t[S];if(!d)continue;let c=0;for(let h of d.deps)n.has(h)&&(c++,u.has(h)||u.set(h,[]),u.get(h).push(S));i.set(S,c);}let l=[];for(let[S,d]of i)d===0&&l.push(S);l.sort();let g=[];for(;l.length>0;){let S=l.shift();g.push(S);let d=u.get(S)??[];for(let c of d){let h=(i.get(c)??1)-1;if(i.set(c,h),h===0){let b=l.findIndex(a=>a>c);b===-1?l.push(c):l.splice(b,0,c);}}}return g};function K(e,t){let r=te(e);if(!Fe(r)||!Ee(r))return null;let n=Me(r);if(t===void 0)return n===null||typeof n!="object"?n:D(n);if(!st(t))return null;let o=Jt(n,t);return o===null||typeof o!="object"?o:D(o)}var z=e=>U(e);var Se=e=>({name:e}),yn=e=>{let t=`${e}::`,r=o=>o.includes("::")?o:`${t}${o}`,n=o=>typeof o=="string"?Se(r(o)):{...o,name:r(o.name)};return {store:o=>({name:r(o)}),create:(o,s,i)=>Q(r(o),s,i),createStrict:(o,s,i)=>Pt(r(o),s,i),set:(o,...s)=>{let i=s;return Ae(n(o),...i)},get:(o,...s)=>{let i=s;return K(n(o),...i)},delete:o=>Ot(n(o)),reset:o=>Dt(n(o))}};var Pe=e=>(e??ge()).transaction,es=e=>e instanceof Error?e:typeof e=="string"?new Error(e):e&&typeof e?.message=="string"?new Error(e.message):new Error("setStoreBatch aborted"),mn=e=>{let t=e??ge(),r=Pe(t);return r.depth+=1,r.depth===1&&(r.pending=[],r.stagedValues.clear(),r.failed=false,r.error=void 0),t},M=()=>Pe().depth>0,T=(e,t)=>{let r=Pe(t);r.failed=true,r.error||(r.error=es(e));},ut=e=>{let t=ge();Pe(t).pending.push(()=>Mt(t,e));},lt=(e,t)=>{Pe().stagedValues.set(e,t);},Oe=e=>{let t=Pe();return t.stagedValues.has(e)?{has:true,value:t.stagedValues.get(e)}:{has:false,value:void 0}},hn=(e,t)=>{let r=Pe(t);if(r.depth===0||(e&&T(e,t),r.depth=Math.max(0,r.depth-1),r.depth>0))return null;let n=r.failed?r.error??new Error("setStoreBatch aborted"):null;return n||r.pending.forEach(o=>o()),r.pending=[],r.stagedValues.clear(),r.failed=false,r.error=void 0,n};var ye=new Set,dt=[],Vt=false,He=0,bn=e=>{let t=p[e]?.options?.snapshot??F().defaultSnapshotMode;return t==="shallow"||t==="ref"?t:"deep"},wn=(e,t)=>t==="ref"?e:t==="shallow"?ot(e):D(e);var cr=(e,t)=>{if(t>0&&typeof setTimeout=="function"){setTimeout(e,t);return}if(typeof queueMicrotask=="function"){queueMicrotask(e);return}Promise.resolve().then(e);},ts=()=>{dt.length=0;for(let d of ye)dt.push(d);ye.clear();let e=F().flush,t=e.priorityStores||[],r=new Set(dt),n=t.length?new Set(t):null,o=[];if(n){for(let d of t)r.has(d)&&o.push(d);for(let d of dt)n.has(d)||o.push(d);}else o.push(...dt);let s=gn(o),i=new Set(o);for(let d of s)r.has(d)&&!i.has(d)&&(o.push(d),i.add(d));let u=Number.isFinite(e.chunkSize)&&e.chunkSize>0?e.chunkSize:Number.POSITIVE_INFINITY,l=e.chunkDelayMs,g=u===Number.POSITIVE_INFINITY&&l===0;return {names:o.slice(),sliceSize:u,chunkDelayMs:l,runInline:g,prioritySet:n}},vn=()=>{let{names:e,sliceSize:t,chunkDelayMs:r,runInline:n,prioritySet:o}=ts(),s=()=>typeof performance<"u"&&performance.now?performance.now():Date.now(),i=()=>{Vt=false,ye.size>0&&ur();};if(n){for(let c of e){let h=H[c];if(!h||h.size===0)continue;let b=p[c]?.updateCount??0,a=bn(c),w=Be[c],R=w&&w.version===b?w.snapshot:(()=>{let y=wn(N[c],a);return Be[c]={version:b,snapshot:y},y})(),m=s();for(let y of h)try{y(R);}catch(A){f(`Subscriber for "${c}" threw: ${A?.message??A}`);}let x=s()-m,E=p[c]?.metrics||{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0};E.notifyCount+=1,E.totalNotifyMs+=x,E.lastNotifyMs=x,p[c]&&(p[c].metrics=E),(p[c]?.updateCount??b)!==b&&ye.add(c);}i();return}let u=c=>{let h=[];for(let b of e){if(c&&!c(b))continue;let a=H[b];if(!a||a.size===0)continue;let w=p[b]?.updateCount??0,R=bn(b),m=Be[b],x=m&&m.version===w?m.snapshot:(()=>{let E=wn(N[b],R);return Be[b]={version:w,snapshot:E},E})();h.push({name:b,subsArray:Array.from(a),index:0,snapshot:x,version:w,notified:new Set,metrics:p[b]?.metrics?{...p[b].metrics}:{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0},totalMs:0});}return h},l=o?u(c=>o.has(c)):[],g=u(c=>!o||!o.has(c)),S=c=>{let h=H[c.name];if(!h||h.size===0){c.subsArray=[],c.index=0;return}c.subsArray=Array.from(h),c.index=0;},d=(c,h)=>{let b=()=>{if(c.length===0){h();return}let a=c.shift();if((p[a.name]?.updateCount??a.version)!==a.version){if(ye.add(a.name),c.length===0){h();return}n?b():cr(b,r);return}if(S(a),a.subsArray.length===0){if(c.length===0){h();return}n?b():cr(b,r);return}let R=s(),m=0;for(;a.index<a.subsArray.length&&m<t;){let k=a.subsArray[a.index++];if(!a.notified.has(k)){a.notified.add(k);try{k(a.snapshot);}catch(y){f(`Subscriber for "${a.name}" threw: ${y?.message??y}`);}m+=1;}}a.totalMs+=s()-R;let x=H[a.name],E=x?Array.from(x).some(k=>!a.notified.has(k)):false;if(a.index<a.subsArray.length||E?c.push(a):(a.metrics.notifyCount+=1,a.metrics.totalNotifyMs+=a.totalMs,a.metrics.lastNotifyMs=a.totalMs,p[a.name]&&(p[a.name].metrics=a.metrics)),c.length===0){h();return}n?b():cr(b,r);};b();};l.length>0?d(l,()=>d(g,i)):d(g,i);},ur=()=>{Vt||(Vt=true,typeof queueMicrotask=="function"?queueMicrotask(vn):Promise.resolve().then(vn));},Y=e=>{ye.add(e),He===0&&ur();},xn=e=>{if(typeof e!="function"){f("setStoreBatch requires a synchronous function callback.");return}if(Object.prototype.toString.call(e)==="[object AsyncFunction]"){W("setStoreBatch does not support async functions. Move async work outside and batch only synchronous mutations.");return}He=Math.max(0,He+1);let t=B();mn(t);let r;try{let n=Mt(t,e);n&&typeof n.then=="function"&&(r=new Error("setStoreBatch does not support promise-returning callbacks. Move async work outside and batch only synchronous mutations."));}catch(n){r=n;}finally{let n=hn(r,t);He=Math.max(0,He-1),(r||n)&&(ye.clear(),Vt=false),He===0&&ye.size>0&&ur(),n&&!r&&(r=n);}if(r){let n=r instanceof Error?r.message:String(r);W(`setStoreBatch failed: ${n}`);}},ft=(e,t)=>(H[e]||(H[e]=new Set),H[e].add(t),()=>{H[e]?.delete(t),H[e]?.size===0&&delete H[e];});var lr=ft;var dr=()=>B().computedCleanups;function rs(e,t,r,n={}){if(!e||typeof e!="string"){f("createComputed requires a store name as first argument");return}if(!Array.isArray(t)||t.length===0){f(`createComputed("${e}") requires at least one dependency`);return}if(typeof r!="function"){f(`createComputed("${e}") requires a compute function as third argument`);return}let o=dr(),s=o.get(e);s&&(s(),o.delete(e));let i=t.map(d=>typeof d=="string"?d:d?.name);if(i.some(d=>!d||typeof d!="string")){f(`createComputed("${e}") dependencies must be store names or store handles.`);return}if(C()){let d=i.filter(c=>!z(c));d.length>0&&f(`createComputed("${e}") dependencies not found at registration: ${d.join(", ")}. Computed values will receive null until those stores are created.`);}if(!fn(e,i,r))return;let l=kn(e,t,r,n.onError),g=Se(e);z(e)?pt(g,l):Q(e,l);let S=[];for(let d of i){let c=ft(d,()=>{Rn(e,i,r,n.onError);});S.push(c);}return dr().set(e,()=>{S.forEach(d=>d()),pn(e);}),C()&&I(`computed store "${e}" created, deps: [${i.join(", ")}]`),g}var kn=(e,t,r,n)=>{let o=t.map(s=>typeof s=="string"?K(Se(s)):K(s));try{return r(...o)}catch(s){f(`createComputed("${e}") compute function threw: ${s?.message??s}`),n?.(s);let i=Se(e);return z(e)?K(i):null}},Rn=(e,t,r,n)=>{if(!ar(e))return;let s=kn(e,t,r,n),i=Se(e),u=K(i);Object.is(s,u)||(pt(i,s),ir(e));},ns=e=>{let t=ar(e);if(!t){f(`invalidateComputed("${e}") -- "${e}" is not a computed store`);return}ir(e),Rn(e,t.deps,t.compute);},fr=e=>{let t=dr(),r=t.get(e);if(!r){C()&&f(`deleteComputed("${e}") -- not found`);return}r(),t.delete(e);},os=e=>At(e);var Cn=e=>{let t=e.stores,r=e.subscribers,n=e.initialStates,o=e.initialFactories,s=e.metaEntries,i=e.snapshotCache,u=e.featureRuntimes,l=e.deletingStores,g=(a,w)=>{Re(w,{onError:s[a]?.options?.onError,severity:"warn",visibility:"dev"});},S=({name:a,prev:w,options:R,initialState:m,getMeta:x,getStoreValue:E,hasStore:k})=>({name:a,options:R,prev:w,getMeta:x,getStoreValue:E,getAllStores:()=>t,getInitialState:()=>m,hasStore:k,setStoreValue:()=>{},applyFeatureState:()=>{},notify:()=>{},reportStoreError:y=>{Re(y,{onError:R.onError,severity:"warn",visibility:"dev"});},warn:f,log:I,hashState:nt,deepClone:D,sanitize:ve,validate:()=>({ok:true,value:w}),isDev:C}),d=({name:a,prev:w,options:R,initialState:m,phase:x})=>{let E=S({name:a,prev:w,options:R,initialState:m,getMeta:()=>s[a],getStoreValue:()=>t[a],hasStore:()=>ze(e,a)}),k=S({name:a,prev:w,options:R,initialState:m,getMeta:()=>{},getStoreValue:()=>w,hasStore:()=>false});at().forEach(y=>{let A=u.get(y);x==="before"?A?.beforeStoreDelete?.(E):A?.afterStoreDelete?.(k);});},c=a=>{if(!ze(e,a))return;let w=t[a],R=s[a].options,m=n[a],x=r[a];l.add(a);try{x?.forEach(y=>{try{y(null);}catch(A){f(`Subscriber for "${a}" threw during delete: ${A?.message??A}`);}}),Et({name:a,label:"onDelete",fn:R.onDelete,args:[w],reportIssue:(y,A)=>{Re(y,{onError:R.onError,severity:"warn",visibility:A});}}),d({name:a,prev:w,options:R,initialState:m,phase:"before"}),delete t[a],delete r[a],delete n[a],delete o[a],delete s[a],delete i[a],At(a)&&fr(a);let k=e.computedDependents[a];if(k)for(let y of k)f(`[stroid] source store "${a}" was deleted. Computed store "${y}" depends on it and will return stale data. Call deleteComputed("${y}") to clean up.`);d({name:a,prev:w,options:R,initialState:m,phase:"after"}),I(`Store "${a}" deleted`);}finally{l.delete(a);}};return {deleteExistingStore:c,clearAllStores:()=>{let a=[],R=0,m=Number.POSITIVE_INFINITY;for(;R<20;){let E=Object.keys(t);if(E.length===0)break;E.forEach(y=>{ze(e,y)&&(c(y),a.push(y));}),R+=1;let k=Object.keys(t).length;if(k===0||k>=m)break;m=k;}let x=Object.keys(t).length;return x>0?f(`clearAllStores stopped after ${R} pass${R===1?"":"es"}; ${x} store(s) still registered (likely recreated during deletion).`):f(`All stores cleared (${a.length} stores removed)`),a},clearStores:a=>{let w=Object.keys(t).filter(R=>a?a.endsWith("*")?R.startsWith(a.slice(0,-1)):R===a:true);return w.forEach(R=>c(R)),w},reportStoreError:g}};var ss=ke,is=it(ss),En=null,Mn=new WeakSet,as=e=>{Mn.has(e)||(Mn.add(e),at().forEach(t=>{if(!e.featureRuntimes.get(t)){let r=or(t);r&&e.featureRuntimes.set(t,r());}}));},Z=()=>{let e=ge(is);return as(e),e};var B=()=>Z(),An=e=>{En=e;},Le=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}}}),cs=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)}),us=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)}),N=Le(()=>Z().stores),H=Le(()=>Z().subscribers),J=Le(()=>Z().initialStates),De=Le(()=>Z().initialFactories),p=Le(()=>Z().metaEntries),Be=Le(()=>Z().snapshotCache),se=cs(()=>Z().featureRuntimes),Fn=new WeakMap,ls=e=>{let t=Fn.get(e);return t||(t=Cn(e),Fn.set(e,t)),t},pr=us(()=>ls(Z()));var Pn=e=>{let t=se.get(e);if(t)return t;let r=or(e);if(!r)return;let n=r();return se.set(e,n),n},ds=()=>{at().forEach(e=>{Pn(e);});};ds();var U=e=>ze(Z(),e),Me=e=>{if(M()){let r=Oe(e);if(r.has)return r.value}let t=rr();return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:N[e]},L=(e,t)=>{let n=C()?nn(t):t;N[e]=n;},gr=(e,t,r=Date.now())=>{L(e,t),p[e]&&(p[e].updatedAt=new Date(r).toISOString(),p[e].updatedAtMs=r,p[e].updateCount++,En?.(e));};var On=e=>an(Z(),e);var Sr=new Set,yr=e=>e?Sr.has(e):Sr.size>0,mr=e=>{e&&Sr.add(e);};var Dn=new Set,Vn=e=>{let t=Vr();return !t||e.includes("::")?e:(C()&&!Dn.has(e)&&(Dn.add(e),f(`Namespace "${t}" is active; treating store "${e}" as "${t}::${e}". Consider using namespace("${t}").create("...") to be explicit.`)),`${t}::${e}`)},te=e=>Vn(typeof e=="string"?e:e.name),Fe=e=>U(e)&&!On(e)?true:(Kt(e,Object.keys(N)),false),Tn=(e,t,r={})=>{Re(t,{...r,onError:p[e]?.options?.onError});},Nn=(e,t,r={})=>{Re(e,{...r,onError:t});},ie=(e,t,r="dev")=>{Tn(e,t,{severity:"warn",visibility:r});},jn=(e,t,r="dev")=>{Nn(e,t,{severity:"warn",visibility:r});},ae=(e,t)=>Tn(e,t,{severity:"critical",visibility:"always"}),qe=(e,t)=>Nn(e,t,{severity:"critical",visibility:"always"}),gt=(e,t,r)=>{let n=`Store "${e}" requested ${t} support, but "${t}" is not registered.
14
+ Import "stroid/${t}" before calling createStore("${e}", ...).`;if(jn(n,r,"always"),F().strictMissingFeatures)throw new Error(n)};var $n=new WeakMap,_n=new WeakMap,fs=500,ps="",Tt=e=>{let t=$n.get(e);return t||(t=new Map,$n.set(e,t)),t},Wn=e=>{let t=_n.get(e);return t||(t=new Map,_n.set(e,t)),t},gs=(e,t)=>{let r=Wn(e),n=r.get(t);return n||(n=new Map,r.set(t,n)),n},In=(e,t,r)=>{for(e.has(t)&&e.delete(t),e.set(t,r);e.size>fs;){let n=e.keys().next().value;if(!n)break;let o=e.get(n);e.delete(n),o?.node.verdicts&&(o.node.verdicts.delete(o.type),o.node.verdicts.size===0&&delete o.node.verdicts);}};new Proxy(new Map,{get:(e,t)=>{let r=Tt(B());if(t==="size")return r.size;if(t===Symbol.iterator)return r[Symbol.iterator].bind(r);let n=r[t];return typeof n=="function"?n.bind(r):n},set:(e,t,r)=>(Tt(B())[t]=r,true)});var hr=(e,t,r,n)=>{let o=p[e];if(!o)return {ok:true};let s=Ie(r);if(s.length===0)return {ok:true};let i=fe(n),u=B(),l=Tt(u),g=gs(u,e),S=s.join(ps),d=l.get(e);d||(d={children:new Map},l.set(e,d));let c=d;for(let m of s){let x=c.children.get(m);x||(x={children:new Map},c.children.set(m,x)),c=x;}let h=c.verdicts?.get(i);if(h){let m=`${S}|${i}`;return In(g,m,{node:c,type:i}),h}let b=o.options?.pathCreate===true,a=t,w={ok:true};for(let m=0;m<s.length;m++){let x=s[m],E=m===s.length-1;if(a==null){let y=`Path "${s.join(".")}" is invalid for "${e}" - "${s.slice(0,m).join(".")||"root"}" is ${a===null?"null":"undefined"}.`;j(y),w={ok:false,reason:y};break}if(typeof a!="object"){let y=`Path "${s.join(".")}" is invalid for "${e}" - "${s.slice(0,m).join(".")||"root"}" is not an object.`;j(y),w={ok:false,reason:y};break}if(Array.isArray(a)){let y=Number(x);if(!Number.isInteger(y)||y<0){let _=`Path "${s.join(".")}" targets non-numeric index "${x}" on an array in "${e}".`;j(_),w={ok:false,reason:_};break}let A=a;if(y>=A.length){let _=`Path "${s.join(".")}" is invalid for "${e}" - index ${y} is out of bounds (length ${A.length}).`;j(_),w={ok:false,reason:_};break}if(E){let _=A[y];if(_!=null){let Qe=fe(_);if(Qe!==i){let ht=`Type mismatch setting "${s.join(".")}" on "${e}": expected ${Qe}, received ${i}.`;j(ht),w={ok:false,reason:ht};break}}w={ok:true};break}a=A[y];continue}if(!Object.prototype.hasOwnProperty.call(a,x)){if(b&&E){w={ok:true};break}let y=`Path "${s.join(".")}" is invalid for "${e}" - unknown key "${x}" at "${s.slice(0,m).join(".")||"root"}".`;j(y),w={ok:false,reason:y};break}if(E){let y=a[x];if(y!=null){let A=fe(y);if(A!==i){let _=`Type mismatch setting "${s.join(".")}" on "${e}": expected ${A}, received ${i}.`;j(_),w={ok:false,reason:_};break}}w={ok:true};break}a=a[x];}c.verdicts||(c.verdicts=new Map);let R=c.verdicts.has(i);if(c.verdicts.set(i,w),!R){let m=`${S}|${i}`;In(g,m,{node:c,type:i});}return w},me=(e,t,r,n)=>{try{return n?.reuseInput&&Gt(t)?{ok:!0,value:t}:{ok:!0,value:ve(t)}}catch(o){let s=`Sanitize failed for "${e}": ${o?.message??o}`;return p[e]?.options?.onError?.(s),r?.(s),f(s),{ok:false}}},ys=(e,t)=>{let r=new Set,n=p[e]?.options?.onError;return typeof n=="function"&&r.add(n),typeof t=="function"&&r.add(t),r},Nt=(e,t,r,n)=>{if(!r)return {ok:true,value:t};let o=ys(e,n),s=(u,l)=>{o.forEach(g=>g(u)),l==="critical"?j(u):f(u);};if(typeof r=="function")try{let u=r(t);return u===!1?(s(`Validation blocked update for "${e}"`,"warn"),{ok:!1}):{ok:!0,value:u===!0?t:u}}catch(u){return s(`Validation for "${e}" failed: ${u?.message??u}`,"critical"),{ok:false}}let i=Yt(r,t);return i.ok?{ok:true,value:i.data??t}:(s(`Validation failed for "${e}": ${i.error}`,"critical"),{ok:false})},Ke=(e,t,r,n,o)=>{let s=me(e,t,n,o);if(!s.ok)return {ok:false};let i=Nt(e,s.value,r,n);return i.ok?{ok:true,value:i.value}:{ok:false}},q=e=>{let t=B();Tt(t).delete(e),Wn(t).delete(e);};An(q);var Ee=e=>{if((M()?Oe(e):{has:false}).has||N[e]!==void 0)return true;let r=De[e];if(!r)return true;try{let n=r(),o=me(e,n,p[e]?.options?.onError);if(!o.ok)return !1;let s=p[e]?.options?.validate,i=Ke(e,o.value,s,p[e]?.options?.onError);if(!i.ok)return !1;if(M()){let u=i.value;lt(e,u),ut(()=>{L(e,u),J[e]=D(u),delete De[e],q(e);});}else L(e,i.value),J[e]=D(i.value),delete De[e],q(e);return !0}catch(n){return ae(e,`Lazy initializer for "${e}" failed: ${n?.message??n}`),false}};var zn=new WeakMap,ms=e=>{let t=zn.get(e);return t||(t=new Map,zn.set(e,t)),t};var br=e=>{let t=B(),r=ms(t),n=r.get(e);if(n)return n;let o=p[e];if(!o)return f(`Internal feature context requested for "${e}" after metadata was cleared.`),null;let s={name:e,options:o.options,getMeta:()=>p[e],getStoreValue:()=>N[e],getAllStores:()=>N,getInitialState:()=>J[e],hasStore:()=>U(e),setStoreValue:i=>{L(e,i);},applyFeatureState:(i,u)=>{gr(e,i,u),q(e);},notify:()=>{},reportStoreError:i=>{ae(e,i);},warn:f,log:I,hashState:nt,deepClone:D,sanitize:ve,validate:i=>Nt(e,i,p[e]?.options?.validate),isDev:C};return r.set(e,s),s},wr=(e,t)=>{let r=br(e);r&&(r.notify=()=>t(e),se.forEach(n=>{n.onStoreCreate?.(r);}));},Ve=(e,t,r,n,o)=>{let s=br(e);if(!s)return;s.notify=()=>o(e);let i=Object.assign(Object.create(s),{action:t,prev:r,next:n});se.forEach(u=>{u.onStoreWrite?.(i);});};var jt=(e,t)=>un({name:e,payload:t,middlewares:(()=>{let r=p[e]?.options?.middleware||[],n=F().middleware||[];return r.length===0?n:n.length===0?r:[...r,...n]})(),reportIssue:(r,n)=>{ie(e,r,n);},warn:f}),he=(e,t,r,n)=>Et({name:e,label:t,fn:r,args:n,reportIssue:(o,s)=>{ie(e,o,s);}}),vr=(e,t)=>{let r={...t};return r.persist&&!Ft("persist")&&(r.explicitPersist&&gt(e,"persist",r.onError),r.persist=null),r.sync&&!Ft("sync")&&(r.explicitSync&&gt(e,"sync",r.onError),r.sync=false),Ft("devtools")||(r.explicitDevtools&&gt(e,"devtools",r.onError),r.devtools=false,r.historyLimit=0,r.redactor=void 0),r};var Rs=32,Hn=new Set,Cs=(e,t)=>{C()&&(t<Rs||Hn.has(e)||(Hn.add(e),f(`setStore("${e}", mutator) took ${t}ms. Mutator writes clone the entire store; consider path writes or smaller stores for hot paths.`)));},Q=(e,t,r={})=>{if(M()){let a=`createStore("${String(e)}") cannot be called inside setStoreBatch. Move createStore outside the batch to preserve transaction semantics.`;qe(a,r.onError),T(a);return}if(!kt(e)){qe(`createStore("${String(e)}") is not a valid store name.`,r.onError);return}if(!(r.lazy===true&&typeof t=="function")&&!rt(t)){qe(`createStore("${e}") received invalid initial data.`,r.onError);return}t===void 0&&C()&&f(`createStore("${e}") received an undefined initial value. This can be indistinguishable from a missing store in some consumers; consider null or an explicit shape if that is intentional.`),tn(r).forEach(a=>{f(a);});let o=vr(e,rn(r,e));if(o.scope==="temp"&&r.persist){let a=`Store "${e}" has scope: "temp" but persist is enabled. Temp stores are intended to be ephemeral.`;o.onError?.(a),C()||W(a),P(a);}let s=typeof window>"u",i=typeof process<"u"?process.env?.NODE_ENV:void 0,u=s&&i==="production",l=o.allowSSRGlobalStore??false;if(u&&!l){let a=`createStore("${e}") is blocked on the server in production to prevent cross-request memory leaks.
15
+ Call createStoreForRequest(...) inside each request scope or pass { scope: "global" } to opt in.`;qe(a,r.onError);return}if(U(e)){let a=`Store "${e}" already exists. Call setStore("${e}", data) to update instead.`;return ie(e,a),{name:e}}s&&!l&&!yr(e)&&C()&&(mr(e),f(`createStore("${e}") called in a server environment. Use createStoreForRequest(...) per request to avoid cross-request leaks or pass { allowSSRGlobalStore: true } if you really want a global store on the server.`));let g=me(e,t,o.onError);if(!g.ok)return;let S=g.value,d=o.lazy===true&&typeof t=="function",c=(H[e]?.size??0)>0;if(d)N[e]=void 0,De[e]=t;else {let a=Ke(e,S,o.validate,o.onError);if(!a.ok)return;L(e,a.value),J[e]=D(a.value);}let h=Date.now(),b=new Date(h).toISOString();return p[e]={createdAt:b,updatedAt:b,updatedAtMs:h,updateCount:0,version:o.version,metrics:{notifyCount:0,totalNotifyMs:0,lastNotifyMs:0},options:o},q(e),wr(e,Y),he(e,"onCreate",p[e].options.onCreate,[S]),c&&Y(e),I(`Store "${e}" created -> ${JSON.stringify(S)}`),{name:e}},Pt=(e,t,r={})=>{let n=Q(e,t,r);if(n)return n;throw new Error(`createStoreStrict("${String(e)}") failed. See earlier warnings/errors or onError callbacks for the cause.`)};function Ae(e,t,r){let n=te(e);if(!Ee(n))return {ok:false,reason:"validate"};if(!U(n)){let c=`setStore("${n}") called before createStore(). Create the store first or pass a valid StoreDefinition.`;return ae(n,c),M()&&T(c),{ok:false,reason:"not-found"}}let o,s=M()?Oe(n):{has:false,value:void 0},i=s.has?s.value:Me(n),u=typeof t=="function"&&r===void 0;if(u){let c=C()?Date.now():0;try{let h=F().mutatorProduce,b=!1,a,w=m=>{let x=t(m);return x!==void 0&&(b=!0,a=x),x},R=h?h(i,w):(()=>{let m=D(i);return w(m),m})();if(b&&F().strictMutatorReturns){let m=`setStore("${n}", mutator) returned a value. Strict mutator mode forbids return values; mutate the draft instead.`;return ae(n,m),M()&&T(m),{ok:!1,reason:"validate"}}b&&C()&&!F().strictMutatorReturns&&f(`setStore("${n}", mutator) returned a value. Return values replace the entire store; return void to apply draft mutations instead.`),o=b&&!F().strictMutatorReturns?a:R;}catch(h){return ae(n,`Mutator for "${n}" failed: ${h?.message??h}`),M()&&T(h),{ok:false,reason:"validate"}}finally{c&&Cs(n,Date.now()-c);}}else if(typeof t=="object"&&!Array.isArray(t)&&r===void 0){if(!rt(t))return M()&&T(`setStore("${n}") received invalid data`),{ok:false,reason:"invalid-args"};if(typeof i!="object"||i===null||Array.isArray(i))return P(`setStore("${n}", data) only merges into object stores.
16
+ Use setStore("${n}", "path", value) or recreate the store with an object shape.`),M()&&T(`setStore("${n}") attempted object merge on non-object store`),{ok:false,reason:"validate"};let c=me(n,t);if(!c.ok)return M()&&T(`setStore("${n}") failed sanitize`),{ok:false,reason:"validate"};o={...i,...c.value};}else if(typeof t=="string"||Array.isArray(t)){if(!st(t))return M()&&T(`setStore("${n}") received invalid path`),{ok:false,reason:"invalid-args"};let c=me(n,r);if(!c.ok)return M()&&T(`setStore("${n}") failed sanitize`),{ok:false,reason:"validate"};let h=c.value,b=hr(n,i,t,h);if(!b.ok)return p[n]?.options?.onError?.(b.reason??`Invalid path for "${n}".`),M()&&T(b.reason),{ok:false,reason:"path"};o=Qt(i,t,h);}else {let c=`setStore("${n}") - invalid arguments.
17
+ Usage:
18
+ setStore("${n}", "field", value)
19
+ setStore("${n}", "nested.field", value)
20
+ setStore("${n}", { field: value })
21
+ setStore(storeDef, draft => { draft.field = value })`;return P(c),p[n]?.options?.onError?.(c),M()&&T(c),{ok:false,reason:"invalid-args"}}if(!rt(o))return M()&&T(`setStore("${n}") produced invalid data`),{ok:false,reason:"validate"};let l=p[n]?.options?.validate,g=jt(n,{action:"set",prev:i,next:o,path:t});if(g===ct)return M()&&T(`setStore("${n}") aborted by middleware`),{ok:false,reason:"middleware"};let d=Ke(n,g,l,void 0,u&&g===o?{reuseInput:true}:void 0);if(!d.ok)return M()&&T(`setStore("${n}") failed validation`),{ok:false,reason:"validate"};if(M()){let c=d.value,h=i;lt(n,c),ut(()=>{L(n,c),q(n);let b=Date.now();p[n].updatedAt=new Date(b).toISOString(),p[n].updatedAtMs=b,p[n].updateCount++,Ve(n,"set",h,c,Y),he(n,"onSet",p[n].options.onSet,[h,c]),Y(n),I(`Store "${n}" updated`);});}else {L(n,d.value),q(n);let c=Date.now();p[n].updatedAt=new Date(c).toISOString(),p[n].updatedAtMs=c,p[n].updateCount++,Ve(n,"set",i,d.value,Y),he(n,"onSet",p[n].options.onSet,[i,d.value]),Y(n);}return M()||I(`Store "${n}" updated`),{ok:true}}function pt(e,t){if(M()){let o="replaceStore(...) cannot be called inside setStoreBatch.";return f(o),T(o),{ok:false,reason:"invalid-args"}}let r=te(e);if(!r)return {ok:false,reason:"invalid-args"};let n=Bn(r,t,"replace");return n.ok?{ok:true}:n.reason==="not-found"?{ok:false,reason:"not-found"}:n.reason==="middleware"?{ok:false,reason:"middleware"}:{ok:false,reason:"validate"}}function Ot(e){let t=te(e);if(Fe(t)&&Ee(t)){if(M()){let r=`deleteStore("${t}") cannot be called inside setStoreBatch. Move deleteStore outside the batch to preserve transaction semantics.`;ie(t,r),T(r);return}pr.deleteExistingStore(t),q(t);}}function Dt(e){let t=te(e);if(!Fe(t))return {ok:false,reason:"not-found"};if(!Ee(t))return {ok:false,reason:"validate"};if(!J[t]){let i=`resetStore("${t}") has no initial state to reset to. If this is a lazy store, ensure it has been initialized before calling resetStore.`;return ie(t,i),M()&&T(i),{ok:false,reason:"not-found"}}let r=M()?Oe(t):{has:false,value:void 0},n=r.has?r.value:N[t],o=D(J[t]);if(M())return lt(t,o),ut(()=>{L(t,o),q(t);let i=Date.now();p[t].updatedAt=new Date(i).toISOString(),p[t].updatedAtMs=i,p[t].updateCount++,Ve(t,"reset",n,o,Y),he(t,"onReset",p[t].options.onReset,[n,o]),Y(t),I(`Store "${t}" reset to initial state/value`);}),{ok:true};L(t,o),q(t);let s=Date.now();return p[t].updatedAt=new Date(s).toISOString(),p[t].updatedAtMs=s,p[t].updateCount++,Ve(t,"reset",n,o,Y),he(t,"onReset",p[t].options.onReset,[n,o]),Y(t),I(`Store "${t}" reset to initial state/value`),{ok:true}}var Bn=(e,t,r="hydrate")=>{if(!Fe(e))return {ok:false,reason:"not-found"};let n=N[e],o=me(e,t);if(!o.ok)return {ok:false,reason:"sanitize"};let s=o.value;if(s===void 0){let S=`Whole-store undefined replacement is blocked for "${e}". Use null for intentional empty state.`;return ie(e,S),{ok:false,reason:"undefined"}}let i=p[e]?.options?.validate,u=jt(e,{action:r,prev:n,next:s,path:null});if(u===ct)return {ok:false,reason:"middleware"};let l=Ke(e,u,i);if(!l.ok)return {ok:false,reason:"validate"};L(e,l.value),q(e);let g=Date.now();return p[e].updatedAt=new Date(g).toISOString(),p[e].updatedAtMs=g,p[e].updateCount++,Ve(e,r,n,l.value,Y),he(e,"onSet",p[e].options.onSet,[n,l.value]),Y(e),I(`Store "${e}" ${r==="hydrate"?"hydrated":"replaced"}`),{ok:true}};var Ln=(e,t={},r={})=>{if(M()){let s="hydrateStores(...) cannot be called inside setStoreBatch.";return f(s),T(s),{hydrated:[],created:[],failed:{_batch:"transaction"}}}let n={hydrated:[],created:[],failed:Object.create(null)};if(!e||typeof e!="object")return n;if(!(r.allowUntrusted===true||F().allowUntrustedHydration===true))return W("hydrateStores(...) requires explicit trust. Pass { allowUntrusted: true } as the third argument or configureStroid({ allowUntrustedHydration: true })."),n.failed._hydration="untrusted",n;if(typeof r.validate=="function"){let s=false;try{s=!!r.validate(e);}catch(i){return W(`hydrateStores(...) trust validation threw: ${i?.message??i}`),n.failed._hydration="validation-error",n}if(!s)return W("hydrateStores(...) rejected by trust validation."),n.failed._hydration="validation-failed",n}return Object.entries(e).forEach(([s,i])=>{if(!kt(s)){n.failed[s]="invalid-name";return}if(U(s)){let u=Bn(s,i,"hydrate");u.ok?n.hydrated.push(s):n.failed[s]=u.reason??"hydrate-failed";}else {let u=t;Q(s,i,u[s]||u.default||{})?n.created.push(s):n.failed[s]="create-failed";}}),n};var qn=100,xr=100,Ms=1e3,$=()=>B().async,ue=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}}}),Ye=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),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}}}),yt=ue(()=>$().fetchRegistry),be=ue(()=>$().inflight),ce=ue(()=>$().requestVersion),re=ue(()=>$().cacheMeta),St=ue(()=>$().rateWindowStart),Ue=ue(()=>$().rateCount);Ye(()=>$().ratePruneState);var $t=ue(()=>$().cleanupSubs),Te=ue(()=>$().storeCleanupFns);ue(()=>$().revalidateHandlers);var _t=Ye(()=>$().noSignalWarned),It=Ye(()=>$().shapeWarned),Wt=Ye(()=>$().autoCreateWarned);Ye(()=>$().revalidateKeys);var G=Ye(()=>$().asyncMetrics),zt=(e,t)=>{if(e.has(t)||(e.add(t),e.size<=Ms))return;let r=e.values().next().value;r!==void 0&&e.delete(r);};var Kn=(e,t)=>{if(!t)return false;let r=re[e];return r?r.expiresAt!==null&&r.expiresAt<=Date.now()?(delete re[e],false):Date.now()-r.timestamp<t:false},As=e=>{delete yt[e],_t.delete(e),It.delete(e),Wt.delete(e);let t=r=>r===e||r.startsWith(`${e}:`);Object.keys(be).forEach(r=>{t(r)&&delete be[r];}),Object.keys(ce).forEach(r=>{t(r)&&delete ce[r];}),Object.keys(re).forEach(r=>{t(r)&&delete re[r];}),Object.keys(St).forEach(r=>{t(r)&&delete St[r];}),Object.keys(Ue).forEach(r=>{t(r)&&delete Ue[r];});},Un=e=>{let t=`${e}:`,r=Object.entries(re).filter(([o,s])=>o!==e&&!o.startsWith(t)?false:s.expiresAt!==null&&s.expiresAt<=Date.now()?(delete re[o],false):true).sort((o,s)=>o[1].timestamp-s[1].timestamp);if(r.length<=qn)return;let n=r.length-qn;r.slice(0,n).forEach(([o])=>{delete re[o],delete ce[o];});},Yn=e=>{let t=`${e}:`,r=0;return Object.keys(be).forEach(n=>{(n===e||n.startsWith(t))&&(r+=1);}),r},Gn=(e,t)=>{Te[e]||(Te[e]=new Set),Te[e].add(t),kr(e);},Xn=(e,t)=>{let r=Te[e];r&&(r.delete(t),r.size===0&&delete Te[e]);},kr=e=>{$t[e]||($t[e]=lr(e,t=>{if(t!==null)return;let r=Te[e];r&&(r.forEach(n=>{try{n();}catch{}}),delete Te[e]),$t[e]?.(),delete $t[e],As(e);}));};var yo={};Mo(yo,{createReactQueryFetcher:()=>Ns,createSwrFetcher:()=>$s,reactQueryKey:()=>So,swrKey:()=>js});var Jn=10,Ps=10,Rr=3e4,Os=8,Zn=(e,t)=>new Promise(r=>{if(t?.aborted){r();return}let n=setTimeout(()=>{t?.removeEventListener("abort",o),r();},e),o=()=>{clearTimeout(n),t?.removeEventListener("abort",o),r();};t?.addEventListener("abort",o,{once:true});}),Qn=(e,t,r,n)=>Number.isFinite(r)?r:(f(`fetchStore("${e}") received non-finite ${t}; using ${n}.`),n),eo=(e,t,r,n)=>{let o=Number.isFinite(t)?t:t>0?Jn:0,s=Math.min(Jn,Math.max(0,Math.trunc(o)));Number.isFinite(t)||f(`fetchStore("${e}") received non-finite retry; using ${s}.`);let i=Math.min(Rr,Math.max(Ps,Qn(e,"retryDelay",r,400))),u=Math.min(Os,Math.max(1,Qn(e,"retryBackoff",n,1.7)));return s!==t&&f(`fetchStore("${e}") clamped retry attempts to ${s}.`),i!==r&&f(`fetchStore("${e}") clamped retryDelay to ${i}ms.`),u!==n&&f(`fetchStore("${e}") clamped retryBackoff to ${u}.`),{retry:s,retryDelay:i,retryBackoff:u}};var to=(e,t)=>!t||t==="none"||e===null||typeof e!="object"?e:t==="shallow"?ot(e):D(e);var mt=(e,t,r,n)=>{if(typeof r=="function")try{r(n);}catch(o){f(`fetchStore("${e}") ${t} callback failed: ${o?.message??o}`);}},ee=(e,t,r)=>(mt(e,"onError",r,t),C()?(P(t),null):(j(t),null));var Ht=(e,t)=>(ce[e]??0)===t,ro=e=>{let t=(ce[e]??0)+1;return ce[e]=t,t},no=(e,t)=>{ce[e]===t&&delete ce[e];},oo=(e,t)=>{be[e]=t;},so=e=>{delete be[e];},io=e=>!!be[e],ao=(e,t,r,n)=>{let o=be[t];if(o)return G.dedupes+=1,r&&o.transform&&o.transform!==r?(ee(e,`fetchStore("${e}") cannot dedupe callers that use different transform functions for cacheSlot "${t}".`,n),null):!r||o.transform===r?o.promise:o.raw.then(s=>r(s))};var Ge=1e3,Cr=100,co=(e,t)=>{t-e.ratePruneState.lastAt<Ge||(e.ratePruneState.lastAt=t,Object.keys(e.rateWindowStart).forEach(r=>{t-(e.rateWindowStart[r]??0)>Ge&&(delete e.rateWindowStart[r],delete e.rateCount[r]);}));},uo=e=>{co($(),e);},lo=(e=Ge)=>{let t=$();t.ratePruneTimer||typeof setTimeout=="function"&&(t.ratePruneTimer=setTimeout(()=>{t.ratePruneTimer=null,co(t,Date.now());},e));},fo=(e,t)=>{let r=St[e],n=Ue[e]??0;return r!==void 0&&t-r<Ge?n>=Cr?true:(Ue[e]=n+1,false):(St[e]=t,Ue[e]=1,false)};var po=e=>{let t={};return e.method&&(t.method=e.method.toUpperCase()),e.headers?t.headers=e.headers:t.headers={"Content-Type":"application/json"},e.body&&(t.body=typeof e.body=="string"?e.body:JSON.stringify(e.body)),e.signal&&(t.signal=e.signal),t},go=async(e,t)=>{let r=t??"auto";if(r==="json")return e.json();if(r==="text")return e.text();if(r==="arrayBuffer")return e.arrayBuffer();if(r==="blob")return e.blob();if(r==="formData")return e.formData();let n=e.headers.get("content-type")||"";return n.includes("application/json")||n.includes("+json")?e.json():n.startsWith("text/")||n.includes("xml")||n.includes("html")?e.text():n.includes("form-data")?e.formData():e.arrayBuffer()};var Ds=e=>{if(!e||typeof e!="object")return false;let t=e;return "data"in t&&"loading"in t&&"error"in t&&"status"in t},Vs=(e,t,r,n)=>{if(z(e)){if(n.stateAdapter){try{let o=K({name:e}),s=i=>{Ae(t,i);};n.stateAdapter({name:e,prev:o,next:r,set:s});}catch(o){f(`fetchStore("${e}") stateAdapter failed: ${o?.message??o}`);}return}Ae(t,r);}},Xe=(e,t,r,n)=>(f(`fetchStore("${e}") aborted`),Ht(t,r)&&z(e)&&n({loading:false,error:"aborted",status:"aborted",revalidating:false}),null);async function Je(e,t,r={}){let n=te(e);if(!n||typeof n!="string"){P("fetchStore requires a store name as first argument");return}let o={name:n};if(!t){P(`fetchStore("${n}") requires a URL, Promise, or Promise factory as second argument`);return}let{transform:s,onSuccess:i,onError:u,stateAdapter:l,method:g,headers:S,body:d,ttl:c,staleWhileRevalidate:h=false,dedupe:b=true,retry:a=0,retryDelay:w=400,retryBackoff:R=1.7,signal:m,cacheKey:x,responseType:E="auto"}=r;!m&&C()&&!_t.has(n)&&(zt(_t,n),f(`fetchStore("${n}") called without an AbortSignal. Provide "signal" to enable cancellation (recommended).`));let k=x?`${n}:${x}`:n,y=V=>Vs(n,o,V,r),A=typeof t!="string"&&typeof t!="function"&&typeof t?.then=="function",_=eo(n,a,w,R),Qe=false,ht=A&&a>0,mo=typeof window>"u"&&(typeof process<"u"?process.env?.NODE_ENV:void 0)==="production",ho=r.autoCreate??F().asyncAutoCreate,bo=r.cloneResult??F().asyncCloneResult;if(l&&!z(n))return ee(n,`fetchStore("${n}") with stateAdapter requires an existing backing store.
22
+ Call createStore("${n}", ...) first or omit stateAdapter to use the default AsyncState shape.`,u);if(!z(n)&&mo)return ee(n,`fetchStore("${n}") cannot create a backing store on the server in production.
23
+ Use createStoreForRequest(...) inside the request scope or create the store ahead of time with { allowSSRGlobalStore: true }.`,u);if(!z(n)){if(!ho)return ee(n,`fetchStore("${n}") requires an existing backing store when autoCreate is disabled.
24
+ Call createStore("${n}", ...) first or enable autoCreate.`,u);if(C()&&!Wt.has(n)){zt(Wt,n);let V=`fetchStore("${n}") auto-created its backing store.
25
+ Call createStore("${n}", ...) first to avoid typos creating phantom stores.`;u?.(V),f(V);}if(Q(n,{data:null,loading:false,error:null,status:"idle"}),!z(n))return ee(n,`fetchStore("${n}") could not initialize its backing store.
26
+ On the server in production, use createStoreForRequest(...) inside the request scope or create the store with { allowSSRGlobalStore: true } before calling fetchStore.`,u)}if(!l){let V=K({name:n});if(V&&!Ds(V))return It.has(n)||zt(It,n),ee(n,`fetchStore("${n}") cannot write AsyncState into an existing non-async store. Provide a stateAdapter or create the store with the async shape to avoid overwriting fields.`,u)}kr(n);let Bt=null,Ne=false,Lt=()=>re[k]?.data??null;if(Kn(k,c)){if(G.cacheHits+=1,Bt=Lt(),y({data:Bt,loading:h,error:null,status:"success",cached:true,revalidating:h}),!h)return Bt;Ne=true;}else G.cacheMisses+=1;if(b){let V=ao(n,k,s,u);if(V!==void 0)return V}let Mr=Date.now();if(uo(Mr),lo(),fo(k,Mr))return ee(n,`fetchStore("${n}") rate limited: ${Cr} requests per ${Ge}ms window for cacheSlot "${k}".`,u);if(!io(k)&&Yn(n)>=xr)return ee(n,`fetchStore("${n}") exceeded ${xr} concurrent request slots. Reuse cacheKey values, wait for pending requests, or delete the store to clear async state.`,u);let ne=ro(k);Ne||y({loading:true,error:null,status:"loading",cached:false,revalidating:false}),G.requests+=1;let wo=Date.now(),bt=!m&&typeof AbortController<"u"?new AbortController:null,we=m||bt?.signal,wt=bt?()=>{bt.signal.aborted||bt.abort();}:null;wt&&Gn(n,wt);let vo=async()=>{let V=0,oe=_.retryDelay;for(;;){if(we?.aborted)return Xe(n,k,ne,y);let je=typeof t=="function"?t():t,Ar=A||typeof je!="string"&&typeof je?.then=="function",Pr=Ar?{..._,retry:0}:_;Ar&&(a>0||ht)&&!Qe&&(f(`fetchStore("${n}") ignores retry settings for direct Promise inputs; pass a URL string or factory to use retries.`),Qe=true);try{let le;if(typeof je=="string"){let Ro=po({method:g,headers:S,body:d,signal:we,...r}),xt=await fetch(je,Ro);if(!xt.ok)throw new Error(`HTTP ${xt.status}: ${xt.statusText}`);le=await go(xt,E);}else if(typeof je.then=="function")le=await je;else return P(`fetchStore("${n}") - second argument must be a URL string, Promise, or Promise factory.
27
+ Examples:
28
+ fetchStore("users", "https://api.example.com/users")
29
+ fetchStore("users", () => fetch("https://api.example.com/users"))`),null;if(we?.aborted)return Xe(n,k,ne,y);let vt=s?s(le):le;if(vt&&typeof vt.then=="function")return ee(n,`fetchStore("${n}") transform must be synchronous. Return the transformed value directly instead of a Promise.`,u);let de=to(vt,bo);if(we?.aborted)return Xe(n,k,ne,y);if(!Ht(k,ne))return null;re[k]={timestamp:Date.now(),expiresAt:c?Date.now()+c:null,data:de},Un(n),y({data:de,loading:!1,error:null,status:"success",cached:!1,revalidating:!1}),mt(n,"onSuccess",i,de);let Or=Date.now()-wo;return G.lastMs=Or,G.avgMs=(G.avgMs*(G.requests-1)+Or)/G.requests,{raw:le,transformed:de}}catch(le){if(V+=1,le?.name==="AbortError")return Xe(n,k,ne,y);if(V<=Pr.retry){if(we?.aborted||(await Zn(oe,we),we?.aborted))return Xe(n,k,ne,y);oe=Math.min(Rr,oe*Pr.retryBackoff);continue}if(!Ht(k,ne))return null;let de=le?.message||"Something went wrong";return y({data:Ne?Lt():null,loading:false,error:de,status:"error",cached:Ne,revalidating:false}),mt(n,"onError",u,de),G.failures+=1,f(`fetchStore("${n}") failed: ${de}`),null}}},Ze=null,xo=new Promise((V,oe)=>{m||(Ze=setTimeout(()=>{Ze=null,oe(new Error("Timeout: async request hung for 60 seconds without an AbortSignal"));},6e4));}),Fr=Promise.race([vo().finally(()=>{Ze&&(clearTimeout(Ze),Ze=null);}),xo]).catch(V=>{let oe=V?.message||"Request timed out";return y({data:Ne?Lt():null,loading:false,error:oe,status:"error",cached:Ne,revalidating:false}),mt(n,"onError",u,oe),G.failures+=1,f(`fetchStore("${n}") failed: ${oe}`),null}),Er=Fr.then(V=>V?.transformed??null).finally(()=>{so(k),no(k,ne),wt&&Xn(n,wt);}),ko=Fr.then(V=>V?.raw);return oo(k,{promise:Er,raw:ko,transform:s}),typeof t=="function"?yt[n]={kind:"factory",factory:t,options:{...r,cacheKey:x}}:typeof t=="string"?yt[n]={kind:"url",url:t,options:{...r,cacheKey:x}}:delete yt[n],Er}var Ts=e=>typeof e=="string"?e:e.name,So=(e,t)=>{let r=Ts(e);return t!==void 0?["stroid",r,t]:["stroid",r]},Ns=(e,t,r={})=>async()=>typeof e=="string"?Je(e,t,r):Je(e,t,r),js=So,$s=(e,t,r={})=>async()=>typeof e=="string"?Je(e,t,r):Je(e,t,r);
30
+ exports.configureStroid=Dr;exports.createComputed=rs;exports.createStore=Q;exports.createStoreStrict=Pt;exports.deleteComputed=fr;exports.deleteStore=Ot;exports.getStore=K;exports.hasStore=z;exports.hydrateStores=Ln;exports.invalidateComputed=ns;exports.isComputedStore=os;exports.namespace=yn;exports.queryIntegrations=yo;exports.resetStore=Dt;exports.setStore=Ae;exports.setStoreBatch=xn;exports.store=Se;
@@ -0,0 +1,130 @@
1
+ import { a as StoreDefinition, c as StoreKey, S as StoreName, d as StateFor, W as WriteResult, e as Path, f as PathValue, P as PartialDeep, b as StoreValue } from './types-grvlY4BX.cjs';
2
+ export { g as StoreStateMap, h as StrictStoreMap } from './types-grvlY4BX.cjs';
3
+ import { S as StoreOptions, b as SnapshotMode, M as MiddlewareCtx, a as StoreValue$1 } from './options-CB35e3Xo.cjs';
4
+ export { P as PersistOptions, c as SyncOptions } from './options-CB35e3Xo.cjs';
5
+ export { c as createComputed, d as deleteComputed, i as invalidateComputed, a as isComputedStore } from './computed-BbAZm1Dq.cjs';
6
+ import { a as FetchInput, F as FetchOptions } from './async-cache-DFHwcBQL.cjs';
7
+
8
+ type LooseStoreNames = string extends StoreName ? true : false;
9
+ type StorePathFor<Name extends StoreName> = LooseStoreNames extends true ? string | string[] : Path<StateFor<Name>>;
10
+ type StorePathValueFor<Name extends StoreName, P extends StorePathFor<Name>> = LooseStoreNames extends true ? unknown : (P extends Path<StateFor<Name>> ? PathValue<StateFor<Name>, P> : never);
11
+ type HydrateSnapshot = Partial<{
12
+ [K in StoreName]: StateFor<K>;
13
+ }>;
14
+ type HydrateOptions<Snapshot extends Record<string, unknown>> = Partial<{
15
+ [K in keyof Snapshot]: StoreOptions<Snapshot[K]>;
16
+ }> & {
17
+ default?: StoreOptions;
18
+ };
19
+ type HydrationTrust<Snapshot extends Record<string, unknown>> = {
20
+ allowUntrusted?: boolean;
21
+ validate?: (snapshot: Snapshot) => boolean;
22
+ };
23
+ declare const createStore: <Name extends string, State>(name: Name, initialData: State, option?: StoreOptions<State>) => StoreDefinition<Name, State> | undefined;
24
+ declare const createStoreStrict: <Name extends string, State>(name: Name, initialData: State, option?: StoreOptions<State>) => StoreDefinition<Name, State>;
25
+ declare function setStore<Name extends string, State, P extends Path<State>>(name: StoreDefinition<Name, State>, path: P, value: PathValue<State, P>): WriteResult;
26
+ declare function setStore<Name extends string, State>(name: StoreDefinition<Name, State>, mutator: (draft: State) => void): WriteResult;
27
+ declare function setStore<Name extends string, State>(name: StoreDefinition<Name, State>, data: PartialDeep<State>): WriteResult;
28
+ declare function setStore<Name extends string, State, P extends Path<State>>(name: StoreKey<Name, State>, path: P, value: PathValue<State, P>): WriteResult;
29
+ declare function setStore<Name extends string, State>(name: StoreKey<Name, State>, mutator: (draft: State) => void): WriteResult;
30
+ declare function setStore<Name extends string, State>(name: StoreKey<Name, State>, data: PartialDeep<State>): WriteResult;
31
+ declare function setStore<Name extends StoreName, P extends StorePathFor<Name>>(name: Name, path: P, value: StorePathValueFor<Name, P>): WriteResult;
32
+ declare function setStore<Name extends StoreName>(name: Name, mutator: (draft: StateFor<Name>) => void): WriteResult;
33
+ declare function setStore<Name extends StoreName>(name: Name, data: PartialDeep<StateFor<Name>>): WriteResult;
34
+ declare function deleteStore<Name extends string, State>(name: StoreDefinition<Name, State>): void;
35
+ declare function deleteStore<Name extends string, State>(name: StoreKey<Name, State>): void;
36
+ declare function deleteStore<Name extends StoreName>(name: Name): void;
37
+ declare function resetStore<Name extends string, State>(name: StoreDefinition<Name, State>): WriteResult;
38
+ declare function resetStore<Name extends string, State>(name: StoreKey<Name, State>): WriteResult;
39
+ declare function resetStore<Name extends StoreName>(name: Name): WriteResult;
40
+ declare const hydrateStores: <Snapshot extends Record<string, unknown> = HydrateSnapshot>(snapshot: Snapshot, options?: HydrateOptions<Snapshot>, trust?: HydrationTrust<Snapshot>) => {
41
+ hydrated: string[];
42
+ created: string[];
43
+ failed: Record<string, string>;
44
+ };
45
+
46
+ declare const setStoreBatch: (fn: () => unknown) => void;
47
+
48
+ type StoreSnapshot<T> = T extends object ? Readonly<T> : T;
49
+ declare function getStore<Name extends string, State, P extends Path<State>>(name: StoreDefinition<Name, State>, path: P): StoreSnapshot<PathValue<State, P>> | null;
50
+ declare function getStore<Name extends string, State>(name: StoreDefinition<Name, State>, path?: undefined): StoreSnapshot<State> | null;
51
+ declare function getStore<Name extends string, State, P extends Path<State>>(name: StoreKey<Name, State>, path: P): StoreSnapshot<PathValue<State, P>> | null;
52
+ declare function getStore<Name extends string, State>(name: StoreKey<Name, State>, path?: undefined): StoreSnapshot<State> | null;
53
+ declare function getStore<Name extends StoreName, P extends Path<StateFor<Name>>>(name: Name, path: P): StoreSnapshot<PathValue<StateFor<Name>, P>> | null;
54
+ declare function getStore<Name extends StoreName>(name: Name, path?: undefined): StoreSnapshot<StateFor<Name>> | null;
55
+ declare const hasStore: (name: string) => boolean;
56
+
57
+ /**
58
+ * Helper to get an auto-completable, literal-typed store handle without creating it.
59
+ *
60
+ * Example:
61
+ * const user = store("user");
62
+ * setStore(user, "name", "Alex");
63
+ */
64
+ declare const store: <Name extends string, State = StoreValue>(name: Name) => StoreKey<Name, State>;
65
+ declare const namespace: (ns: string) => {
66
+ store: <Name extends string, State = unknown>(name: Name) => StoreKey<Name, State>;
67
+ create: <Name extends string, State>(name: Name, data: State, options?: Parameters<typeof createStore>[2]) => StoreDefinition<string, unknown> | undefined;
68
+ createStrict: <Name extends string, State>(name: Name, data: State, options?: Parameters<typeof createStore>[2]) => StoreDefinition<string, unknown>;
69
+ set: (name: any, ...rest: any[]) => any;
70
+ get: (name: any, ...rest: any[]) => any;
71
+ delete: (name: string) => void;
72
+ reset: (name: string) => WriteResult;
73
+ };
74
+
75
+ type LogSink = {
76
+ log?: (msg: string, meta?: Record<string, unknown>) => void;
77
+ warn?: (msg: string, meta?: Record<string, unknown>) => void;
78
+ critical?: (msg: string, meta?: Record<string, unknown>) => void;
79
+ };
80
+ type AsyncCloneMode = "none" | "shallow" | "deep";
81
+ type FlushConfig = {
82
+ chunkSize?: number;
83
+ chunkDelayMs?: number;
84
+ priorityStores?: string[];
85
+ };
86
+ type RevalidateOnFocusConfig = {
87
+ debounceMs?: number;
88
+ maxConcurrent?: number;
89
+ staggerMs?: number;
90
+ };
91
+ type StroidConfig = {
92
+ logSink?: LogSink;
93
+ flush?: FlushConfig;
94
+ revalidateOnFocus?: RevalidateOnFocusConfig;
95
+ namespace?: string;
96
+ strictMissingFeatures?: boolean;
97
+ strictFeatures?: boolean;
98
+ assertRuntime?: boolean;
99
+ strictMutatorReturns?: boolean;
100
+ asyncAutoCreate?: boolean;
101
+ asyncCloneResult?: AsyncCloneMode;
102
+ defaultSnapshotMode?: SnapshotMode;
103
+ middleware?: Array<(ctx: MiddlewareCtx) => StoreValue$1 | void>;
104
+ /**
105
+ * Allow hydrateStores to accept untrusted snapshots without explicit opt-in.
106
+ * Default: false (hydration requires an explicit trust opt-in).
107
+ */
108
+ allowUntrustedHydration?: boolean;
109
+ /**
110
+ * Optional custom mutator engine (e.g. Immer's produce) to enable structural sharing.
111
+ */
112
+ mutatorProduce?: <T>(base: T, recipe: (draft: T) => void) => T;
113
+ };
114
+ declare const configureStroid: (next?: StroidConfig) => void;
115
+
116
+ type StoreTarget = StoreDefinition<string, unknown> | StoreKey<string, unknown> | StoreName;
117
+ declare const reactQueryKey: (storeName: StoreTarget, cacheKey?: string | number) => (string | number)[];
118
+ declare const createReactQueryFetcher: (storeName: StoreTarget, input: FetchInput, options?: FetchOptions) => () => Promise<unknown>;
119
+ declare const swrKey: (storeName: StoreTarget, cacheKey?: string | number) => (string | number)[];
120
+ declare const createSwrFetcher: (storeName: StoreTarget, input: FetchInput, options?: FetchOptions) => () => Promise<unknown>;
121
+
122
+ declare const query_createReactQueryFetcher: typeof createReactQueryFetcher;
123
+ declare const query_createSwrFetcher: typeof createSwrFetcher;
124
+ declare const query_reactQueryKey: typeof reactQueryKey;
125
+ declare const query_swrKey: typeof swrKey;
126
+ declare namespace query {
127
+ export { query_createReactQueryFetcher as createReactQueryFetcher, query_createSwrFetcher as createSwrFetcher, query_reactQueryKey as reactQueryKey, query_swrKey as swrKey };
128
+ }
129
+
130
+ export { PartialDeep, Path, PathValue, StateFor, StoreDefinition, StoreKey, StoreName, StoreOptions, StoreValue, WriteResult, configureStroid, createStore, createStoreStrict, deleteStore, getStore, hasStore, hydrateStores, namespace, query as queryIntegrations, resetStore, setStore, setStoreBatch, store };
package/dist/index.d.ts CHANGED
@@ -1,18 +1,130 @@
1
- export { c as chain, a as clearAllStores, b as clearHistory, d as createCounterStore, e as createEntityStore, f as createListStore, g as createSelector, h as createStore, i as createStoreForRequest, j as createZustandCompatStore, k as deleteStore, l as getHistory, m as getInitialState, n as getMetrics, o as getStore, p as getStoreMeta, q as hasStore, r as hydrateStores, s as listStores, t as mergeStore, u as resetStore, v as setStore, w as setStoreBatch, x as subscribeWithSelector } from './core-CLIi-SLm.js';
2
- export { enableRevalidateOnFocus, fetchStore, getAsyncMetrics, refetchStore } from './async.js';
3
- export { useSelector, useStore, useStoreField, useStoreStatic } from './react.js';
1
+ import { a as StoreDefinition, c as StoreKey, S as StoreName, d as StateFor, W as WriteResult, e as Path, f as PathValue, P as PartialDeep, b as StoreValue } from './types-grvlY4BX.js';
2
+ export { g as StoreStateMap, h as StrictStoreMap } from './types-grvlY4BX.js';
3
+ import { S as StoreOptions, b as SnapshotMode, M as MiddlewareCtx, a as StoreValue$1 } from './options-CB35e3Xo.js';
4
+ export { P as PersistOptions, c as SyncOptions } from './options-CB35e3Xo.js';
5
+ export { c as createComputed, d as deleteComputed, i as invalidateComputed, a as isComputedStore } from './computed-CccdgY5j.js';
6
+ import { a as FetchInput, F as FetchOptions } from './async-cache-DFHwcBQL.js';
4
7
 
5
- declare const useAsyncStore: (name: string) => {
6
- data: any;
7
- loading: any;
8
- error: any;
9
- status: any;
10
- isEmpty: boolean;
8
+ type LooseStoreNames = string extends StoreName ? true : false;
9
+ type StorePathFor<Name extends StoreName> = LooseStoreNames extends true ? string | string[] : Path<StateFor<Name>>;
10
+ type StorePathValueFor<Name extends StoreName, P extends StorePathFor<Name>> = LooseStoreNames extends true ? unknown : (P extends Path<StateFor<Name>> ? PathValue<StateFor<Name>, P> : never);
11
+ type HydrateSnapshot = Partial<{
12
+ [K in StoreName]: StateFor<K>;
13
+ }>;
14
+ type HydrateOptions<Snapshot extends Record<string, unknown>> = Partial<{
15
+ [K in keyof Snapshot]: StoreOptions<Snapshot[K]>;
16
+ }> & {
17
+ default?: StoreOptions;
18
+ };
19
+ type HydrationTrust<Snapshot extends Record<string, unknown>> = {
20
+ allowUntrusted?: boolean;
21
+ validate?: (snapshot: Snapshot) => boolean;
22
+ };
23
+ declare const createStore: <Name extends string, State>(name: Name, initialData: State, option?: StoreOptions<State>) => StoreDefinition<Name, State> | undefined;
24
+ declare const createStoreStrict: <Name extends string, State>(name: Name, initialData: State, option?: StoreOptions<State>) => StoreDefinition<Name, State>;
25
+ declare function setStore<Name extends string, State, P extends Path<State>>(name: StoreDefinition<Name, State>, path: P, value: PathValue<State, P>): WriteResult;
26
+ declare function setStore<Name extends string, State>(name: StoreDefinition<Name, State>, mutator: (draft: State) => void): WriteResult;
27
+ declare function setStore<Name extends string, State>(name: StoreDefinition<Name, State>, data: PartialDeep<State>): WriteResult;
28
+ declare function setStore<Name extends string, State, P extends Path<State>>(name: StoreKey<Name, State>, path: P, value: PathValue<State, P>): WriteResult;
29
+ declare function setStore<Name extends string, State>(name: StoreKey<Name, State>, mutator: (draft: State) => void): WriteResult;
30
+ declare function setStore<Name extends string, State>(name: StoreKey<Name, State>, data: PartialDeep<State>): WriteResult;
31
+ declare function setStore<Name extends StoreName, P extends StorePathFor<Name>>(name: Name, path: P, value: StorePathValueFor<Name, P>): WriteResult;
32
+ declare function setStore<Name extends StoreName>(name: Name, mutator: (draft: StateFor<Name>) => void): WriteResult;
33
+ declare function setStore<Name extends StoreName>(name: Name, data: PartialDeep<StateFor<Name>>): WriteResult;
34
+ declare function deleteStore<Name extends string, State>(name: StoreDefinition<Name, State>): void;
35
+ declare function deleteStore<Name extends string, State>(name: StoreKey<Name, State>): void;
36
+ declare function deleteStore<Name extends StoreName>(name: Name): void;
37
+ declare function resetStore<Name extends string, State>(name: StoreDefinition<Name, State>): WriteResult;
38
+ declare function resetStore<Name extends string, State>(name: StoreKey<Name, State>): WriteResult;
39
+ declare function resetStore<Name extends StoreName>(name: Name): WriteResult;
40
+ declare const hydrateStores: <Snapshot extends Record<string, unknown> = HydrateSnapshot>(snapshot: Snapshot, options?: HydrateOptions<Snapshot>, trust?: HydrationTrust<Snapshot>) => {
41
+ hydrated: string[];
42
+ created: string[];
43
+ failed: Record<string, string>;
44
+ };
45
+
46
+ declare const setStoreBatch: (fn: () => unknown) => void;
47
+
48
+ type StoreSnapshot<T> = T extends object ? Readonly<T> : T;
49
+ declare function getStore<Name extends string, State, P extends Path<State>>(name: StoreDefinition<Name, State>, path: P): StoreSnapshot<PathValue<State, P>> | null;
50
+ declare function getStore<Name extends string, State>(name: StoreDefinition<Name, State>, path?: undefined): StoreSnapshot<State> | null;
51
+ declare function getStore<Name extends string, State, P extends Path<State>>(name: StoreKey<Name, State>, path: P): StoreSnapshot<PathValue<State, P>> | null;
52
+ declare function getStore<Name extends string, State>(name: StoreKey<Name, State>, path?: undefined): StoreSnapshot<State> | null;
53
+ declare function getStore<Name extends StoreName, P extends Path<StateFor<Name>>>(name: Name, path: P): StoreSnapshot<PathValue<StateFor<Name>, P>> | null;
54
+ declare function getStore<Name extends StoreName>(name: Name, path?: undefined): StoreSnapshot<StateFor<Name>> | null;
55
+ declare const hasStore: (name: string) => boolean;
56
+
57
+ /**
58
+ * Helper to get an auto-completable, literal-typed store handle without creating it.
59
+ *
60
+ * Example:
61
+ * const user = store("user");
62
+ * setStore(user, "name", "Alex");
63
+ */
64
+ declare const store: <Name extends string, State = StoreValue>(name: Name) => StoreKey<Name, State>;
65
+ declare const namespace: (ns: string) => {
66
+ store: <Name extends string, State = unknown>(name: Name) => StoreKey<Name, State>;
67
+ create: <Name extends string, State>(name: Name, data: State, options?: Parameters<typeof createStore>[2]) => StoreDefinition<string, unknown> | undefined;
68
+ createStrict: <Name extends string, State>(name: Name, data: State, options?: Parameters<typeof createStore>[2]) => StoreDefinition<string, unknown>;
69
+ set: (name: any, ...rest: any[]) => any;
70
+ get: (name: any, ...rest: any[]) => any;
71
+ delete: (name: string) => void;
72
+ reset: (name: string) => WriteResult;
11
73
  };
12
74
 
13
- declare const useFormStore: <T = any>(storeName: string, field: string) => {
14
- value: T | null;
15
- onChange: (eOrValue: any) => void;
75
+ type LogSink = {
76
+ log?: (msg: string, meta?: Record<string, unknown>) => void;
77
+ warn?: (msg: string, meta?: Record<string, unknown>) => void;
78
+ critical?: (msg: string, meta?: Record<string, unknown>) => void;
16
79
  };
80
+ type AsyncCloneMode = "none" | "shallow" | "deep";
81
+ type FlushConfig = {
82
+ chunkSize?: number;
83
+ chunkDelayMs?: number;
84
+ priorityStores?: string[];
85
+ };
86
+ type RevalidateOnFocusConfig = {
87
+ debounceMs?: number;
88
+ maxConcurrent?: number;
89
+ staggerMs?: number;
90
+ };
91
+ type StroidConfig = {
92
+ logSink?: LogSink;
93
+ flush?: FlushConfig;
94
+ revalidateOnFocus?: RevalidateOnFocusConfig;
95
+ namespace?: string;
96
+ strictMissingFeatures?: boolean;
97
+ strictFeatures?: boolean;
98
+ assertRuntime?: boolean;
99
+ strictMutatorReturns?: boolean;
100
+ asyncAutoCreate?: boolean;
101
+ asyncCloneResult?: AsyncCloneMode;
102
+ defaultSnapshotMode?: SnapshotMode;
103
+ middleware?: Array<(ctx: MiddlewareCtx) => StoreValue$1 | void>;
104
+ /**
105
+ * Allow hydrateStores to accept untrusted snapshots without explicit opt-in.
106
+ * Default: false (hydration requires an explicit trust opt-in).
107
+ */
108
+ allowUntrustedHydration?: boolean;
109
+ /**
110
+ * Optional custom mutator engine (e.g. Immer's produce) to enable structural sharing.
111
+ */
112
+ mutatorProduce?: <T>(base: T, recipe: (draft: T) => void) => T;
113
+ };
114
+ declare const configureStroid: (next?: StroidConfig) => void;
115
+
116
+ type StoreTarget = StoreDefinition<string, unknown> | StoreKey<string, unknown> | StoreName;
117
+ declare const reactQueryKey: (storeName: StoreTarget, cacheKey?: string | number) => (string | number)[];
118
+ declare const createReactQueryFetcher: (storeName: StoreTarget, input: FetchInput, options?: FetchOptions) => () => Promise<unknown>;
119
+ declare const swrKey: (storeName: StoreTarget, cacheKey?: string | number) => (string | number)[];
120
+ declare const createSwrFetcher: (storeName: StoreTarget, input: FetchInput, options?: FetchOptions) => () => Promise<unknown>;
121
+
122
+ declare const query_createReactQueryFetcher: typeof createReactQueryFetcher;
123
+ declare const query_createSwrFetcher: typeof createSwrFetcher;
124
+ declare const query_reactQueryKey: typeof reactQueryKey;
125
+ declare const query_swrKey: typeof swrKey;
126
+ declare namespace query {
127
+ export { query_createReactQueryFetcher as createReactQueryFetcher, query_createSwrFetcher as createSwrFetcher, query_reactQueryKey as reactQueryKey, query_swrKey as swrKey };
128
+ }
17
129
 
18
- export { useAsyncStore, useFormStore };
130
+ export { PartialDeep, Path, PathValue, StateFor, StoreDefinition, StoreKey, StoreName, StoreOptions, StoreValue, WriteResult, configureStroid, createStore, createStoreStrict, deleteStore, getStore, hasStore, hydrateStores, namespace, query as queryIntegrations, resetStore, setStore, setStoreBatch, store };