@yoltra/react 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.es.md CHANGED
@@ -5,8 +5,10 @@
5
5
  > 👉 🇲🇽 Versión en Español  |
6
6
  >  [ 🇺🇸 English Versión](./README.md) 
7
7
 
8
- ![npm downloads](https://badgen.net/npm/dm/@yoltra/react)
9
- ![License](https://badgen.net/npm/license/@yoltra/react)
8
+ [![versión npm](https://img.shields.io/npm/v/@yoltra/react)](https://www.npmjs.com/package/@yoltra/react)
9
+ [![descargas npm](https://img.shields.io/npm/dm/@yoltra/react)](https://www.npmjs.com/package/@yoltra/react)
10
+ [![tipos](https://img.shields.io/npm/types/@yoltra/react)](https://www.npmjs.com/package/@yoltra/react)
11
+ [![Licencia](https://img.shields.io/npm/l/@yoltra/react)](https://github.com/yoltra/yoltra/blob/main/LICENSE)
10
12
 
11
13
  **Hooks de React para [yoltra](../../README.md) con
12
14
  suscripciones de grano fino por ruta.**
@@ -139,6 +141,40 @@ Provee el store con `<AppStoreContext.Provider value={store}>` en tu raíz.
139
141
 
140
142
  ---
141
143
 
144
+ ## Agregar a un store, con sus tipos
145
+
146
+ Una librería puede montar una slice en un store que no creó, y los hooks crecen para conocerla.
147
+ `withSlice`, `withMiddleware` y `withEffect` devuelven un `Yoltra` cuyos tipos se ampliaron.
148
+
149
+ ```tsx
150
+ import { defineSlice } from "@yoltra/core";
151
+
152
+ // Ámbito de módulo, una sola vez, antes del primer render.
153
+ export const app = createYoltra({ name: "App", reducer: { counter } })
154
+ .withSlice("transfers", defineSlice<TransferEM>()({ ... }));
155
+
156
+ export const { useAtomicProp, useEmit } = app;
157
+
158
+ // Tipado, sobre una slice que la aplicación nunca declaró.
159
+ const granted = useAtomicProp({ reducer: "transfers", property: "granted" });
160
+ ```
161
+
162
+ Tres cosas que conviene saber:
163
+
164
+ - **Ámbito de módulo, una vez, antes del primer render.** Cada llamada construye un conjunto
165
+ nuevo de hooks, porque `createHooks` asigna funciones nuevas. Llamarla dentro de un componente
166
+ le daría a React un `useAtomicProp` distinto en cada render.
167
+ - **El store y el contexto son los mismos objetos.** Solo cambian los tipos, así que un
168
+ `<StoreProvider>` de cualquier vista de la cadena sirve a los hooks de todas las demás, y la
169
+ caché de Suspense se comparte.
170
+ - **También existen las funciones libres**, para una librería que recibe un `Yoltra` que no creó:
171
+ `withSlice(yoltra, name, spec)`.
172
+
173
+ El contrato completo, incluido qué hacer con la disposición, está en la
174
+ [guía de decoración](https://github.com/yoltra/yoltra/blob/main/docs/es/DECORATION_GUIDE.md).
175
+
176
+ ---
177
+
142
178
  ## API de Hooks
143
179
 
144
180
  ### `useAtomicProp({ reducer, property }, map?, isEqual?)`
@@ -193,7 +229,7 @@ const filtered = useAtomicProps(
193
229
 
194
230
  ---
195
231
 
196
- ### `useEvent(channel, type, handler, phase?)`
232
+ ### `useEvent(channel, type, handler, phase?, options?)`
197
233
 
198
234
  Suscríbete a eventos del store desde un componente. No afecta el flujo de eventos. Es fire-and-forget.
199
235
 
@@ -228,7 +264,18 @@ useEvent(
228
264
 
229
265
  - `'committed'` (por defecto): eventos que pasaron el middleware y llegaron a los reducers
230
266
  - `'uncommitted'`: eventos rechazados por el middleware
231
- - `'all'`: ambos, con parámetro `phase` para distinguir
267
+ - `'written'`: eventos que de verdad cambiaron el estado
268
+ - `'all'`: committed y uncommitted, con parámetro `phase` para distinguir
269
+
270
+ **Viaje en el tiempo.** Un handler **no** se ejecuta mientras DevTools está haciendo replay.
271
+ Recorrer una línea de tiempo volvía a ejecutar cada handler igual que un evento real, lo que
272
+ significaba volver a publicar, volver a escribir y volver a disparar analítica por eventos que no
273
+ estaban ocurriendo de nuevo. Actívalo solo para un handler que derive estado de vista del flujo
274
+ de eventos y no haga E/S:
275
+
276
+ ```tsx
277
+ useEvent("ui", "save", handler, "committed", { duringReplay: true });
278
+ ```
232
279
 
233
280
  ---
234
281
 
@@ -318,7 +365,7 @@ const stats = useSuspenseAtomicProps(
318
365
 
319
366
  `createYoltra` y `createHooks` devuelven estos dos junto con el resto, ligados al mismo contexto.
320
367
  Deliberadamente **no** se exportan desde el barrel del paquete: una copia a nivel de paquete sería
321
- idéntica en forma y aun así lanzaría `useStore must be used inside <StoreProvider>` en tiempo de
368
+ idéntica en forma y aun así lanzaría `[yoltra] No store in context` en tiempo de
322
369
  ejecución cuando el contexto que lee nunca se lleno, un error que los tipos no podian atrapar.
323
370
  Importarlos desde cualquier sitio que no sea el resultado de tu propio `createYoltra`/`createHooks`
324
371
  es ahora un error de compilación, que es el mismo aviso llegando en el momento correcto.
@@ -415,11 +462,11 @@ function TodoItem({ index }: { index: number }) {
415
462
 
416
463
  ## Ejemplos
417
464
 
418
- - **[App de Tareas con Profiler](../../examples/v0/yoltra-in-react)**: CRUD completo con
465
+ - **[App de Tareas con Profiler](https://github.com/yoltra/yoltra/tree/main/examples/v0/yoltra-in-react)**: CRUD completo con
419
466
  comparación de flamegraph · [▶ Abrir la demo en vivo](https://yoltra.dev/es/demos/in-react)
420
- - **[Logo Cinético (3000 particulas)](../../examples/v0/yoltra-kinetic-logo)**: Suscripciones
467
+ - **[Logo Cinético (3000 particulas)](https://github.com/yoltra/yoltra/tree/main/examples/v0/yoltra-kinetic-logo)**: Suscripciones
421
468
  independientes por circulo SVG · [▶ Abrir la demo en vivo](https://yoltra.dev/es/demos/kinetic-logo)
422
- - **[Next.js (Pages Router)](../../examples/v0/yoltra-in-nextjs)**: estado de cliente + cambio de tema · [▶ Abrir la demo en vivo](https://yoltra.dev/es/demos/in-nextjs)
469
+ - **[Next.js (Pages Router)](https://github.com/yoltra/yoltra/tree/main/examples/v0/yoltra-in-nextjs)**: estado de cliente + cambio de tema · [▶ Abrir la demo en vivo](https://yoltra.dev/es/demos/in-nextjs)
423
470
 
424
471
  ---
425
472
 
@@ -438,7 +485,7 @@ function TodoItem({ index }: { index: number }) {
438
485
 
439
486
  ## Contribuir
440
487
 
441
- - [Raíz del Monorepo](../../)
488
+ - [Raíz del Monorepo](https://github.com/yoltra/yoltra)
442
489
  - [Guia de Contribución](../../CONTRIBUTING.md)
443
490
 
444
491
  ---
package/README.md CHANGED
@@ -5,8 +5,10 @@
5
5
  > [ 🇲🇽 Versión en Español](./README.es.md)&nbsp;
6
6
  > | &nbsp; 👉 🇺🇸 English Version
7
7
 
8
- ![npm downloads](https://badgen.net/npm/dm/@yoltra/react)
9
- ![License](https://badgen.net/npm/license/@yoltra/react)
8
+ [![npm version](https://img.shields.io/npm/v/@yoltra/react)](https://www.npmjs.com/package/@yoltra/react)
9
+ [![npm downloads](https://img.shields.io/npm/dm/@yoltra/react)](https://www.npmjs.com/package/@yoltra/react)
10
+ [![types](https://img.shields.io/npm/types/@yoltra/react)](https://www.npmjs.com/package/@yoltra/react)
11
+ [![License](https://img.shields.io/npm/l/@yoltra/react)](https://github.com/yoltra/yoltra/blob/main/LICENSE)
10
12
 
11
13
  **React hooks for [yoltra](../../README.md) with
12
14
  fine-grained path subscriptions.**
@@ -138,6 +140,40 @@ Provide the store with `<AppStoreContext.Provider value={store}>` at your root.
138
140
 
139
141
  ---
140
142
 
143
+ ## Adding to a store, with its types
144
+
145
+ A library can mount a slice on a store it did not create, and the hooks grow to know about it.
146
+ `withSlice`, `withMiddleware` and `withEffect` return a `Yoltra` whose types have widened.
147
+
148
+ ```tsx
149
+ import { defineSlice } from "@yoltra/core";
150
+
151
+ // Module scope, once, before the first render.
152
+ export const app = createYoltra({ name: "App", reducer: { counter } })
153
+ .withSlice("transfers", defineSlice<TransferEM>()({ ... }));
154
+
155
+ export const { useAtomicProp, useEmit } = app;
156
+
157
+ // Typed, on a slice the application never declared.
158
+ const granted = useAtomicProp({ reducer: "transfers", property: "granted" });
159
+ ```
160
+
161
+ Three things to know:
162
+
163
+ - **Module scope, once, before the first render.** Each call builds a new hook set, because
164
+ `createHooks` allocates fresh function objects. Calling one inside a component would hand React
165
+ a different `useAtomicProp` on every render.
166
+ - **The store and the context are the same objects.** Only the types change, so a
167
+ `<StoreProvider>` from any view in the chain serves the hooks of every other, and the Suspense
168
+ cache is shared.
169
+ - **Free functions exist too**, for a library handed a `Yoltra` it did not create:
170
+ `withSlice(yoltra, name, spec)`.
171
+
172
+ The full contract, including what to do about disposal, is in the
173
+ [decoration guide](https://github.com/yoltra/yoltra/blob/main/docs/en/DECORATION_GUIDE.md).
174
+
175
+ ---
176
+
141
177
  ## Hooks API
142
178
 
143
179
  ### `useAtomicProp({ reducer, property }, map?, isEqual?)`
@@ -191,7 +227,7 @@ const filtered = useAtomicProps(
191
227
 
192
228
  ---
193
229
 
194
- ### `useEvent(channel, type, handler, phase?)`
230
+ ### `useEvent(channel, type, handler, phase?, options?)`
195
231
 
196
232
  Subscribe to store events from a component. Does not affect event flow. Fire-and-forget.
197
233
 
@@ -226,7 +262,17 @@ useEvent(
226
262
 
227
263
  - `'committed'` (default): events that passed middleware and reached reducers
228
264
  - `'uncommitted'`: events rejected by middleware
229
- - `'all'`: both, with `phase` parameter to distinguish
265
+ - `'written'`: events that actually changed state
266
+ - `'all'`: committed and uncommitted, with `phase` parameter to distinguish
267
+
268
+ **Time travel.** A handler does **not** run while DevTools is replaying. Scrubbing a timeline
269
+ used to re-run every handler exactly as a live event would, which meant re-publishing, re-writing
270
+ and re-firing analytics for events that were not happening again. Opt in only for a handler that
271
+ derives view state from the event stream and performs no I/O:
272
+
273
+ ```tsx
274
+ useEvent("ui", "save", handler, "committed", { duringReplay: true });
275
+ ```
230
276
 
231
277
  ---
232
278
 
@@ -315,7 +361,7 @@ const stats = useSuspenseAtomicProps(
315
361
 
316
362
  `createYoltra` and `createHooks` return these two alongside the rest, bound to the same context.
317
363
  They are deliberately **not** exported from the package barrel: a package-level copy would be
318
- identical in shape and still throw `useStore must be used inside <StoreProvider>` at runtime
364
+ identical in shape and still throw `[yoltra] No store in context` at runtime
319
365
  whenever the context it reads was never filled, a mistake the types could not catch. Importing
320
366
  them from anywhere but your own `createYoltra`/`createHooks` result is now a compile error,
321
367
  which is the same warning arriving at the right time.
@@ -430,11 +476,11 @@ function Row({ id }: { id: string }) {
430
476
 
431
477
  ## Examples
432
478
 
433
- - **[Todo App with Profiler](../../examples/v0/yoltra-in-react)**: Full CRUD with flamegraph
479
+ - **[Todo App with Profiler](https://github.com/yoltra/yoltra/tree/main/examples/v0/yoltra-in-react)**: Full CRUD with flamegraph
434
480
  comparison · [▶ Open the live demo](https://yoltra.dev/en/demos/in-react)
435
- - **[Kinetic Logo (3000 particles)](../../examples/v0/yoltra-kinetic-logo)**: Independent
481
+ - **[Kinetic Logo (3000 particles)](https://github.com/yoltra/yoltra/tree/main/examples/v0/yoltra-kinetic-logo)**: Independent
436
482
  subscriptions per circle · [▶ Open the live demo](https://yoltra.dev/en/demos/kinetic-logo)
437
- - **[Next.js (Pages Router)](../../examples/v0/yoltra-in-nextjs)**: client-side state + theme switcher · [▶ Open the live demo](https://yoltra.dev/en/demos/in-nextjs)
483
+ - **[Next.js (Pages Router)](https://github.com/yoltra/yoltra/tree/main/examples/v0/yoltra-in-nextjs)**: client-side state + theme switcher · [▶ Open the live demo](https://yoltra.dev/en/demos/in-nextjs)
438
484
 
439
485
  ---
440
486
 
@@ -453,7 +499,7 @@ function Row({ id }: { id: string }) {
453
499
 
454
500
  ## Contributing
455
501
 
456
- - [Monorepo Root](../../)
502
+ - [Monorepo Root](https://github.com/yoltra/yoltra)
457
503
  - [Contributing Guide](../../CONTRIBUTING.md)
458
504
 
459
505
  ---
package/dist/index.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  /*!
2
- * @yoltra/react v0.7.0
2
+ * @yoltra/react v0.8.0
3
3
  * (c) 2026 Manu Ramirez <@pixerael>
4
4
  * License: MIT */
5
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react"),be=require("@yoltra/core"),K=c.createContext(null);var W={exports:{}},D={};var ue;function Ee(){if(ue)return D;ue=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function o(n,s,u){var a=null;if(u!==void 0&&(a=""+u),s.key!==void 0&&(a=""+s.key),"key"in s){u={};for(var m in s)m!=="key"&&(u[m]=s[m])}else u=s;return s=u.ref,{$$typeof:t,type:n,key:a,ref:s!==void 0?s:null,props:u}}return D.Fragment=e,D.jsx=o,D.jsxs=o,D}var F={};var ce;function Re(){return ce||(ce=1,process.env.NODE_ENV!=="production"&&(function(){function t(r){if(r==null)return null;if(typeof r=="function")return r.$$typeof===U?null:r.displayName||r.name||null;if(typeof r=="string")return r;switch(r){case h:return"Fragment";case k:return"Profiler";case P:return"StrictMode";case $:return"Suspense";case I:return"SuspenseList";case O:return"Activity"}if(typeof r=="object")switch(typeof r.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),r.$$typeof){case v:return"Portal";case A:return(r.displayName||"Context")+".Provider";case _:return(r._context.displayName||"Context")+".Consumer";case j:var i=r.render;return r=r.displayName,r||(r=i.displayName||i.name||"",r=r!==""?"ForwardRef("+r+")":"ForwardRef"),r;case M:return i=r.displayName||null,i!==null?i:t(r.type)||"Memo";case R:i=r._payload,r=r._init;try{return t(r(i))}catch{}}return null}function e(r){return""+r}function o(r){try{e(r);var i=!1}catch{i=!0}if(i){i=console;var p=i.error,b=typeof Symbol=="function"&&Symbol.toStringTag&&r[Symbol.toStringTag]||r.constructor.name||"Object";return p.call(i,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",b),e(r)}}function n(r){if(r===h)return"<>";if(typeof r=="object"&&r!==null&&r.$$typeof===R)return"<...>";try{var i=t(r);return i?"<"+i+">":"<...>"}catch{return"<...>"}}function s(){var r=w.A;return r===null?null:r.getOwner()}function u(){return Error("react-stack-top-frame")}function a(r){if(V.call(r,"key")){var i=Object.getOwnPropertyDescriptor(r,"key").get;if(i&&i.isReactWarning)return!1}return r.key!==void 0}function m(r,i){function p(){te||(te=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",i))}p.isReactWarning=!0,Object.defineProperty(r,"key",{get:p,configurable:!0})}function y(){var r=t(this.type);return re[r]||(re[r]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),r=this.props.ref,r!==void 0?r:null}function g(r,i,p,b,C,x,X,H){return p=x.ref,r={$$typeof:f,type:r,key:i,props:x,_owner:C},(p!==void 0?p:null)!==null?Object.defineProperty(r,"ref",{enumerable:!1,get:y}):Object.defineProperty(r,"ref",{enumerable:!1,value:null}),r._store={},Object.defineProperty(r._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(r,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(r,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:X}),Object.defineProperty(r,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:H}),Object.freeze&&(Object.freeze(r.props),Object.freeze(r)),r}function d(r,i,p,b,C,x,X,H){var E=i.children;if(E!==void 0)if(b)if(B(E)){for(b=0;b<E.length;b++)l(E[b]);Object.freeze&&Object.freeze(E)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else l(E);if(V.call(i,"key")){E=t(r);var Y=Object.keys(i).filter(function(ve){return ve!=="key"});b=0<Y.length?"{key: someKey, "+Y.join(": ..., ")+": ...}":"{key: someKey}",se[E+b]||(Y=0<Y.length?"{"+Y.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
5
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),Re=require("@yoltra/core"),K=l.createContext(null);var G={exports:{}},q={};var ie;function Pe(){if(ie)return q;ie=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(c,o,s){var u=null;if(s!==void 0&&(u=""+s),o.key!==void 0&&(u=""+o.key),"key"in o){s={};for(var i in o)i!=="key"&&(s[i]=o[i])}else s=o;return o=s.ref,{$$typeof:t,type:c,key:u,ref:o!==void 0?o:null,props:s}}return q.Fragment=e,q.jsx=n,q.jsxs=n,q}var L={};var ae;function _e(){return ae||(ae=1,process.env.NODE_ENV!=="production"&&(function(){function t(r){if(r==null)return null;if(typeof r=="function")return r.$$typeof===k?null:r.displayName||r.name||null;if(typeof r=="string")return r;switch(r){case y:return"Fragment";case _:return"Profiler";case R:return"StrictMode";case T:return"Suspense";case M:return"SuspenseList";case S:return"Activity"}if(typeof r=="object")switch(typeof r.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),r.$$typeof){case E:return"Portal";case A:return(r.displayName||"Context")+".Provider";case P:return(r._context.displayName||"Context")+".Consumer";case N:var a=r.render;return r=r.displayName,r||(r=a.displayName||a.name||"",r=r!==""?"ForwardRef("+r+")":"ForwardRef"),r;case $:return a=r.displayName||null,a!==null?a:t(r.type)||"Memo";case C:a=r._payload,r=r._init;try{return t(r(a))}catch{}}return null}function e(r){return""+r}function n(r){try{e(r);var a=!1}catch{a=!0}if(a){a=console;var h=a.error,g=typeof Symbol=="function"&&Symbol.toStringTag&&r[Symbol.toStringTag]||r.constructor.name||"Object";return h.call(a,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",g),e(r)}}function c(r){if(r===y)return"<>";if(typeof r=="object"&&r!==null&&r.$$typeof===C)return"<...>";try{var a=t(r);return a?"<"+a+">":"<...>"}catch{return"<...>"}}function o(){var r=I.A;return r===null?null:r.getOwner()}function s(){return Error("react-stack-top-frame")}function u(r){if(O.call(r,"key")){var a=Object.getOwnPropertyDescriptor(r,"key").get;if(a&&a.isReactWarning)return!1}return r.key!==void 0}function i(r,a){function h(){ne||(ne=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",a))}h.isReactWarning=!0,Object.defineProperty(r,"key",{get:h,configurable:!0})}function m(){var r=t(this.type);return oe[r]||(oe[r]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),r=this.props.ref,r!==void 0?r:null}function v(r,a,h,g,Y,j,B,H){return h=j.ref,r={$$typeof:d,type:r,key:a,props:j,_owner:Y},(h!==void 0?h:null)!==null?Object.defineProperty(r,"ref",{enumerable:!1,get:m}):Object.defineProperty(r,"ref",{enumerable:!1,value:null}),r._store={},Object.defineProperty(r._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(r,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(r,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:B}),Object.defineProperty(r,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:H}),Object.freeze&&(Object.freeze(r.props),Object.freeze(r)),r}function p(r,a,h,g,Y,j,B,H){var w=a.children;if(w!==void 0)if(g)if(re(w)){for(g=0;g<w.length;g++)f(w[g]);Object.freeze&&Object.freeze(w)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else f(w);if(O.call(a,"key")){w=t(r);var W=Object.keys(a).filter(function(Ae){return Ae!=="key"});g=0<W.length?"{key: someKey, "+W.join(": ..., ")+": ...}":"{key: someKey}",ue[w+g]||(W=0<W.length?"{"+W.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
6
6
  let props = %s;
7
7
  <%s {...props} />
8
8
  React keys must be passed directly to JSX without using spread:
9
9
  let props = %s;
10
- <%s key={someKey} {...props} />`,b,E,Y,E),se[E+b]=!0)}if(E=null,p!==void 0&&(o(p),E=""+p),a(i)&&(o(i.key),E=""+i.key),"key"in i){p={};for(var Z in i)Z!=="key"&&(p[Z]=i[Z])}else p=i;return E&&m(p,typeof r=="function"?r.displayName||r.name||"Unknown":r),g(r,E,x,C,s(),p,X,H)}function l(r){typeof r=="object"&&r!==null&&r.$$typeof===f&&r._store&&(r._store.validated=1)}var S=c,f=Symbol.for("react.transitional.element"),v=Symbol.for("react.portal"),h=Symbol.for("react.fragment"),P=Symbol.for("react.strict_mode"),k=Symbol.for("react.profiler"),_=Symbol.for("react.consumer"),A=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),$=Symbol.for("react.suspense"),I=Symbol.for("react.suspense_list"),M=Symbol.for("react.memo"),R=Symbol.for("react.lazy"),O=Symbol.for("react.activity"),U=Symbol.for("react.client.reference"),w=S.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,V=Object.prototype.hasOwnProperty,B=Array.isArray,J=console.createTask?console.createTask:function(){return null};S={react_stack_bottom_frame:function(r){return r()}};var te,re={},oe=S.react_stack_bottom_frame.bind(S,u)(),ne=J(n(u)),se={};F.Fragment=h,F.jsx=function(r,i,p,b,C){var x=1e4>w.recentlyCreatedOwnerStacks++;return d(r,i,p,!1,b,C,x?Error("react-stack-top-frame"):oe,x?J(n(r)):ne)},F.jsxs=function(r,i,p,b,C){var x=1e4>w.recentlyCreatedOwnerStacks++;return d(r,i,p,!0,b,C,x?Error("react-stack-top-frame"):oe,x?J(n(r)):ne)}})()),F}var ae;function Ae(){return ae||(ae=1,process.env.NODE_ENV==="production"?W.exports=Ee():W.exports=Re()),W.exports}var pe=Ae();const Pe=({store:t,children:e})=>pe.jsx(K.Provider,{value:t,children:e}),ie=new Set;function ge(t,e){process.env.NODE_ENV!=="production"&&(ie.has(t)||(ie.add(t),console.warn(e)))}function q(t){return t.includes("*")}function T(t){return t.replace(/^\./,"")}function _e(t){return T(t).split(".").filter(Boolean)}function we(t){const e=o=>`${o.length}:${o}`;return t.map(o=>{const n=Array.isArray(o.property)?o.property:[o.property];return e(o.reducer)+e(String(n.length))+n.map(e).join("")}).join("")}const de=Symbol("yoltra.pathSegments");function me(t){const e=()=>{};return new Proxy(e,{get(o,n){if(n===de)return t;if(typeof n!="symbol")return me([...t,String(n)])},apply(){throw new Error(`[yoltra] A typed path accessor called a method (near "${t.join(".")}"). The accessor must be a plain member chain like \`p => p.items[0].title\` — it cannot call functions such as \`.map()\` or \`.toString()\`. Compute derived values in the component or a selector, or use the \`{ reducer, property }\` string form.`)}})}function xe(t){const e=t(me([])),o=e?.[de],s=(Array.isArray(o)?o:[]).join(".");return s===""&&ge("yoltra.toDottedPath.empty","[yoltra] A typed path accessor recorded no property access, so it subscribed to the slice root. That fires only when the slice's whole value is replaced — which for a slice holding an object means never, since its changes are reported at their leaves. The accessor must be a plain member chain like `p => p.items[0].title` and cannot return a computed value or a default. For a dynamic subscription, or for a slice whose state is a single value, use the `{ reducer, property }` string form instead."),s}function G(t,e){if(!e)return t;let o=t;for(const n of _e(e)){if(o==null)return;o=o[n]}return o}function L(t,e,o){const n=c.useRef(t);n.current=t;const s=c.useRef(e);s.current=e;const u=c.useMemo(()=>({has:!1,value:void 0}),o);return c.useCallback(()=>{const a=n.current();return(!u.has||!s.current(u.value,a))&&(u.has=!0,u.value=a),u.value},[u])}function he(t,e){if(Object.is(t,e))return!0;if(!t||!e)return!1;const o=Object.keys(t),n=Object.keys(e);if(o.length!==n.length)return!1;for(const s of o)if(!Object.is(t[s],e[s]))return!1;return!0}function z(){const t=c.useContext(K);if(!t)throw new Error("useStore must be used inside <StoreProvider>");return t}function Te(){return z().emit}function ke(t,e=Object.is){const o=z(),n=c.useMemo(()=>u=>o.subscribe(u),[o]),s=L(()=>t(o.getState()),e,[o]);return c.useSyncExternalStore(n,s,s)}function je(t,e,o=Object.is){const n=z(),s=c.useMemo(()=>{const y=T(t.property);return{reducer:t.reducer,property:y}},[t.reducer,t.property]),u=c.useMemo(()=>y=>n.connect({reducer:s.reducer,property:s.property},()=>y()),[n,s]),a=q(s.property),m=L(()=>{const g=n.getState()[s.reducer];return a?g:G(g,s.property)},o,[n,s]);return c.useSyncExternalStore(u,m,m)}function Q(t,e,o=Object.is){return je(t,e,o)}function Oe(t,e,o,n="committed"){const s=z(),u=c.useRef(o);u.current=o,c.useEffect(()=>s.onEvent(t,e,(a,m,y,g)=>{u.current(a,m,y,g)},n),[s,t,e,n])}function Ce(t){return t==null||t<=0?null:Date.now()+t}function Ne(t){return t===null?null:t===void 0||t<=0?0:Date.now()+t}const Me=2e3;class $e{store=new Map;touch(e){this.store.has(e)&&this.store.delete(e)}evict(){for(;this.store.size>Me;){const e=this.store.keys().next();if(e.done===!0)return;const o=this.store.get(e.value);if(o?.status==="pending"){this.store.delete(e.value),this.store.set(e.value,o);continue}this.store.delete(e.value)}}get size(){return this.store.size}read(e,o,n,s){const u=Date.now(),a=this.store.get(e);if(a&&a.status==="ready"&&(a.expiresAt==null||a.expiresAt>u))return this.touch(e),this.store.set(e,a),a.value;if(a&&a.status==="pending")throw a.promise;if(a&&a.status==="error"){if(a.delivered!==!0)throw this.store.set(e,{...a,delivered:!0}),a.error;if(a.expiresAt===null||a.expiresAt>u)throw a.error;this.store.delete(e)}const m=Promise.resolve().then(o).then(y=>{this.store.set(e,{status:"ready",value:y,expiresAt:Ce(n)})}).catch(y=>{this.store.set(e,{status:"error",error:y,expiresAt:Ne(s)})});throw this.store.set(e,{status:"pending",promise:m,expiresAt:null}),this.evict(),m}invalidate(e){this.store.delete(e)}invalidatePathKey(e){for(const o of this.store.keys())fe(o)===e&&this.store.delete(o)}invalidateReducer(e){const o=`${e}::`;for(const n of this.store.keys())fe(n).split("||").some(s=>s.startsWith(o))&&this.store.delete(n)}clear(){this.store.clear()}}const N=new $e,le=new WeakMap;let Ie=0;function ye(t){let e=le.get(t);return e===void 0&&(e=`s${++Ie}`,le.set(t,e)),e}function fe(t){return t.slice(t.indexOf("::")+2)}function ee(t,e,o){const n=Array.isArray(e)?e.map(T).sort().join("|"):T(e);return o?`${t}::${n}::${o}`:`${t}::${n}`}function Ye(t,e,o){const n=t(),s=e.reducer,u=T(e.property),a=`${ye(n)}::${ee(s,u,o.key)}`,m=c.useMemo(()=>l=>n.connect({reducer:s,property:u},()=>{N.invalidate(a),l()}),[n,s,u,a]),y=c.useRef(o);y.current=o;const g=c.useMemo(()=>{const l=q(u);return()=>{const f=n.getState()[s],v=l?f:G(f,u),h=y.current;return N.read(a,()=>h.load(v,f),h.staleTime??0,h.errorTtlMs)}},[n,s,u,a]),d=c.useMemo(()=>{const l=q(u);return()=>{const f=n.getState()[s];return l?f:G(f,u)}},[n,s,u]);return c.useSyncExternalStore(m,g,d)}function De(t,e,o){const n=t(),s=c.useMemo(()=>e.map(d=>({reducer:d.reducer,property:Array.isArray(d.property)?d.property.map(l=>T(l)):T(d.property)})),[JSON.stringify(e)]),u=c.useMemo(()=>{const d=s.map(l=>ee(l.reducer,l.property)).sort().join("||");return`${ye(n)}::${o.key?`${d}::${o.key}`:d}`},[n,s,o.key]),a=c.useMemo(()=>d=>{const l=()=>{N.invalidate(u),d()},S=s.map(f=>n.connect(f,l));return()=>{for(const f of S)f()}},[n,s,u]),m=c.useRef(o);m.current=o;const y=c.useMemo(()=>()=>{const d=n.getState(),l=m.current;return N.read(u,()=>l.load(d),l.staleTime??0,l.errorTtlMs)},[n,u]),g=()=>{const d=m.current.load(n.getState());return d instanceof Promise?void 0:d};return c.useSyncExternalStore(a,y,g)}function Fe(t,e,o){N.invalidatePathKey(ee(t,e,o))}function ze(t){N.invalidateReducer(t)}function We(){N.clear()}function qe(t){return{useSuspenseAtomicProp:(n,s)=>Ye(t,n,s),useSuspenseAtomicProps:(n,s)=>De(t,n,s)}}function Se(t){function e(){const l=c.useContext(t);if(!l)throw new Error("[yoltra] No store in context. Wrap your tree in <StoreProvider store={...}>, or use the hooks returned by createYoltra (which default to their own store).");return l}function o(){return e().emit}function n(l,S=Object.is){const f=e(),v=c.useMemo(()=>P=>f.subscribe(P),[f]),h=L(()=>l(f.getState()),S,[f]);return c.useSyncExternalStore(v,h,h)}const u=(l,S,f)=>{const v=e(),h=typeof l=="string",P=h?l:l.reducer,k=h?xe(S):l.property,_=h?void 0:S,A=c.useMemo(()=>({reducer:P,property:T(k)}),[P,k]),j=c.useMemo(()=>M=>v.connect({reducer:A.reducer,property:A.property},()=>M()),[v,A]),$=q(A.property),I=L(()=>{const R=v.getState()[A.reducer],O=$?R:G(R,A.property);return _?_(O):O},f??Object.is,[v,A]);return c.useSyncExternalStore(j,I,I)},m=(l,S,f=Object.is)=>{const v=e(),h=c.useRef(0),P=c.useRef(void 0),k=c.useRef(-1),_=c.useRef(!1),A=c.useRef(S);A.current=S;const j=c.useRef(f);j.current=f;const $=c.useMemo(()=>l.map(R=>({reducer:R.reducer,property:Array.isArray(R.property)?R.property.map(O=>T(O)):T(R.property)})),[we(l)]),I=c.useMemo(()=>R=>{const O=()=>{h.current++,R()},U=$.flatMap(w=>(Array.isArray(w.property)?w.property:[w.property]).map(B=>v.connect({reducer:w.reducer,property:B},O)));return()=>{for(const w of U)w()}},[v,$]),M=c.useCallback(()=>{if(k.current!==h.current||!_.current){const R=A.current(v.getState());(!_.current||!j.current(P.current,R))&&(P.current=R,_.current=!0),k.current=h.current}return P.current},[v]);return c.useSyncExternalStore(I,M,M)},y=(l,S,f,v="committed")=>{const h=e(),P=c.useRef(f);P.current=f,c.useEffect(()=>h.onEvent(l,S,(k,_,A,j)=>{P.current(k,_,A,j)},v),[h,l,S,v])},{useSuspenseAtomicProp:g,useSuspenseAtomicProps:d}=qe(e);return{useStore:e,useEmit:o,useSelector:n,useAtomicProp:u,useAtomicProps:m,useEvent:y,useSuspenseAtomicProp:g,useSuspenseAtomicProps:d,shallowEqual:he}}function Ge(t){const e=be.createStore(t),o=c.createContext(e),n=Se(o);return{store:e,StoreContext:o,StoreProvider:({store:u,children:a})=>pe.jsx(o.Provider,{value:u??e,children:a}),...n}}function Le(t,e){return Q({reducer:t,property:e.idsPath})}function Ue(t,e,o){return Q({reducer:t,property:e.pathTo(o)})}function Ve(t,e,o,n){return Q({reducer:t,property:e.pathTo(o,n)})}exports.StoreContext=K;exports.StoreProvider=Pe;exports.clearSuspenseCache=We;exports.createHooks=Se;exports.createYoltra=Ge;exports.invalidateAtomicProp=Fe;exports.invalidateAtomicPropsByReducer=ze;exports.shallowEqual=he;exports.suspenseCache=N;exports.useEmit=Te;exports.useEntity=Ue;exports.useEntityField=Ve;exports.useEntityIds=Le;exports.useEvent=Oe;exports.useSelector=ke;exports.useStore=z;
10
+ <%s key={someKey} {...props} />`,g,w,W,w),ue[w+g]=!0)}if(w=null,h!==void 0&&(n(h),w=""+h),u(a)&&(n(a.key),w=""+a.key),"key"in a){h={};for(var X in a)X!=="key"&&(h[X]=a[X])}else h=a;return w&&i(h,typeof r=="function"?r.displayName||r.name||"Unknown":r),v(r,w,j,Y,o(),h,B,H)}function f(r){typeof r=="object"&&r!==null&&r.$$typeof===d&&r._store&&(r._store.validated=1)}var b=l,d=Symbol.for("react.transitional.element"),E=Symbol.for("react.portal"),y=Symbol.for("react.fragment"),R=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),P=Symbol.for("react.consumer"),A=Symbol.for("react.context"),N=Symbol.for("react.forward_ref"),T=Symbol.for("react.suspense"),M=Symbol.for("react.suspense_list"),$=Symbol.for("react.memo"),C=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),k=Symbol.for("react.client.reference"),I=b.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,O=Object.prototype.hasOwnProperty,re=Array.isArray,z=console.createTask?console.createTask:function(){return null};b={react_stack_bottom_frame:function(r){return r()}};var ne,oe={},se=b.react_stack_bottom_frame.bind(b,s)(),ce=z(c(s)),ue={};L.Fragment=y,L.jsx=function(r,a,h,g,Y){var j=1e4>I.recentlyCreatedOwnerStacks++;return p(r,a,h,!1,g,Y,j?Error("react-stack-top-frame"):se,j?z(c(r)):ce)},L.jsxs=function(r,a,h,g,Y){var j=1e4>I.recentlyCreatedOwnerStacks++;return p(r,a,h,!0,g,Y,j?Error("react-stack-top-frame"):se,j?z(c(r)):ce)}})()),L}var le;function Te(){return le||(le=1,process.env.NODE_ENV==="production"?G.exports=Pe():G.exports=_e()),G.exports}var ye=Te();const je=({store:t,children:e})=>ye.jsx(K.Provider,{value:t,children:e}),fe=new Set;function ke(t,e){process.env.NODE_ENV!=="production"&&(fe.has(t)||(fe.add(t),console.warn(e)))}function J(t){return t.includes("*")}function x(t){return t.replace(/^\./,"")}function Oe(t){return x(t).split(".").filter(Boolean)}function xe(t){const e=n=>`${n.length}:${n}`;return t.map(n=>{const c=Array.isArray(n.property)?n.property:[n.property];return e(n.reducer)+e(String(c.length))+c.map(e).join("")}).join("")}const ve=Symbol("yoltra.pathSegments");function be(t){const e=()=>{};return new Proxy(e,{get(n,c){if(c===ve)return t;if(typeof c!="symbol")return be([...t,String(c)])},apply(){throw new Error(`[yoltra] A typed path accessor called a method (near "${t.join(".")}"). The accessor must be a plain member chain like \`p => p.items[0].title\` — it cannot call functions such as \`.map()\` or \`.toString()\`. Compute derived values in the component or a selector, or use the \`{ reducer, property }\` string form.`)}})}function Ne(t){const e=t(be([])),n=e?.[ve],o=(Array.isArray(n)?n:[]).join(".");return o===""&&ke("yoltra.toDottedPath.empty","[yoltra] A typed path accessor recorded no property access, so it subscribed to the slice root. That fires only when the slice's whole value is replaced — which for a slice holding an object means never, since its changes are reported at their leaves. The accessor must be a plain member chain like `p => p.items[0].title` and cannot return a computed value or a default. For a dynamic subscription, or for a slice whose state is a single value, use the `{ reducer, property }` string form instead."),o}function U(t,e){if(!e)return t;let n=t;for(const c of Oe(e)){if(n==null)return;n=n[c]}return n}function F(t){return typeof t=="object"&&t!==null}function Me(t,e){const n=e.split("."),c=[],o=(s,u,i)=>{if(u===n.length){c.push(i.join("."));return}const m=n[u];if(m==="**"){if(o(s,u+1,i),!F(s))return;for(const v of Object.keys(s))o(s[v],u,[...i,v]);return}if(m==="*"){if(!F(s))return;for(const v of Object.keys(s))o(s[v],u+1,[...i,v]);return}F(s)&&Object.prototype.hasOwnProperty.call(s,m)&&o(s[m],u+1,[...i,m])};return o(t,0,[]),c}const Z=new WeakSet;function $e(t,e,n,c){if(n.length===0)return;let o=t,s=e;for(let u=0;u<n.length-1;u++){const i=n[u],m=F(s)?s[i]:void 0,v=o[i];if(F(v)){if(!Z.has(v)){const p=Array.isArray(v)?[...v]:{...v};Z.add(p),o[i]=p}}else{const p=Array.isArray(m)?[]:{};Z.add(p),o[i]=p}o=o[i],s=m}o[n[n.length-1]]=c}function Ce(t,e){const n={};for(const{reducer:c,property:o}of e){const s=F(t)?t[c]:void 0;if(o===""){n[c]=s;continue}const u=J(o)?Me(s,o):[o];for(const i of u)$e(n,t,[c,...i.split(".")],U(s,i))}return n}function Se(t,e,n=[]){const c=()=>e.map(o=>`{ reducer: "${o.reducer}", property: "${o.property}" }`).join(", ");return new Proxy(t,{get(o,s,u){if(typeof s=="symbol"||s==="toJSON"||s==="constructor")return Reflect.get(o,s,u);if(!Object.prototype.hasOwnProperty.call(o,s)){const m=[...n,String(s)].join(".");throw new Error(`[yoltra] useAtomicProps read "${m}", which it did not subscribe to. The selector only receives the paths declared alongside it, so this read would be \`undefined\` in production and the component would never re-render when it changed. Declared: [${c()}]. Add "${m}" to the list, or stop reading it.`)}const i=Reflect.get(o,s,u);return F(i)&&!Array.isArray(i)?Se(i,e,[...n,String(s)]):i},has:(o,s)=>Reflect.has(o,s)})}function Ee(t,e){if(Object.is(t,e))return!0;if(!t||!e)return!1;const n=Object.keys(t),c=Object.keys(e);if(n.length!==c.length)return!1;for(const o of n)if(!Object.is(t[o],e[o]))return!1;return!0}function pe(t,e,n){const c=l.useRef(t);c.current=t;const o=l.useRef(e);o.current=e;const s=l.useMemo(()=>({has:!1,value:void 0}),n);return l.useCallback(()=>{const u=c.current();return(!s.has||!o.current(s.value,u))&&(s.has=!0,s.value=u),s.value},[s])}function Ie(t){return t==null||t<=0?null:Date.now()+t}function Ye(t){return t===null?null:t===void 0||t<=0?0:Date.now()+t}const De=2e3;class Fe{store=new Map;touch(e){this.store.has(e)&&this.store.delete(e)}evict(){for(;this.store.size>De;){const e=this.store.keys().next();if(e.done===!0)return;const n=this.store.get(e.value);if(n?.status==="pending"){this.store.delete(e.value),this.store.set(e.value,n);continue}this.store.delete(e.value)}}get size(){return this.store.size}read(e,n,c,o){const s=Date.now(),u=this.store.get(e);if(u&&u.status==="ready"&&(u.expiresAt==null||u.expiresAt>s))return this.touch(e),this.store.set(e,u),u.value;if(u&&u.status==="pending")throw u.promise;if(u&&u.status==="error"){if(u.delivered!==!0)throw this.store.set(e,{...u,delivered:!0}),u.error;if(u.expiresAt===null||u.expiresAt>s)throw u.error;this.store.delete(e)}const i=Promise.resolve().then(n).then(m=>{this.store.set(e,{status:"ready",value:m,expiresAt:Ie(c)})}).catch(m=>{this.store.set(e,{status:"error",error:m,expiresAt:Ye(o)})});throw this.store.set(e,{status:"pending",promise:i,expiresAt:null}),this.evict(),i}invalidate(e){this.store.delete(e)}invalidatePathKey(e){for(const n of this.store.keys())me(n)===e&&this.store.delete(n)}invalidateReducer(e){const n=`${e}::`;for(const c of this.store.keys())me(c).split("||").some(o=>o.startsWith(n))&&this.store.delete(c)}clear(){this.store.clear()}}const D=new Fe,de=new WeakMap;let We=0;function ge(t){let e=de.get(t);return e===void 0&&(e=`s${++We}`,de.set(t,e)),e}function me(t){return t.slice(t.indexOf("::")+2)}function Q(t,e,n){const c=Array.isArray(e)?e.map(x).sort().join("|"):x(e);return n?`${t}::${c}::${n}`:`${t}::${c}`}function ze(t,e,n){const c=t(),o=e.reducer,s=x(e.property),u=`${ge(c)}::${Q(o,s,n.key)}`,i=l.useMemo(()=>f=>c.connect({reducer:o,property:s},()=>{D.invalidate(u),f()}),[c,o,s,u]),m=l.useRef(n);m.current=n;const v=l.useMemo(()=>{const f=J(s);return()=>{const d=c.getState()[o],E=f?d:U(d,s),y=m.current;return D.read(u,()=>y.load(E,d),y.staleTime??0,y.errorTtlMs)}},[c,o,s,u]),p=l.useMemo(()=>{const f=J(s);return()=>{const d=c.getState()[o];return f?d:U(d,s)}},[c,o,s]);return l.useSyncExternalStore(i,v,p)}function qe(t,e,n){const c=t(),o=l.useMemo(()=>e.map(p=>({reducer:p.reducer,property:Array.isArray(p.property)?p.property.map(f=>x(f)):x(p.property)})),[JSON.stringify(e)]),s=l.useMemo(()=>{const p=o.map(f=>Q(f.reducer,f.property)).sort().join("||");return`${ge(c)}::${n.key?`${p}::${n.key}`:p}`},[c,o,n.key]),u=l.useMemo(()=>p=>{const f=()=>{D.invalidate(s),p()},b=o.map(d=>c.connect(d,f));return()=>{for(const d of b)d()}},[c,o,s]),i=l.useRef(n);i.current=n;const m=l.useMemo(()=>()=>{const p=c.getState(),f=i.current;return D.read(s,()=>f.load(p),f.staleTime??0,f.errorTtlMs)},[c,s]),v=()=>{const p=i.current.load(c.getState());return p instanceof Promise?void 0:p};return l.useSyncExternalStore(u,m,v)}function Le(t,e,n){D.invalidatePathKey(Q(t,e,n))}function Ve(t){D.invalidateReducer(t)}function Ge(){D.clear()}function Je(t){return{useSuspenseAtomicProp:(c,o)=>ze(t,c,o),useSuspenseAtomicProps:(c,o)=>qe(t,c,o)}}function ee(t){function e(){const f=l.useContext(t);if(!f)throw new Error("[yoltra] No store in context. Wrap your tree in <StoreProvider store={...}>, or use the hooks returned by createYoltra (which default to their own store).");return f}function n(){return e().emit}function c(f,b=Object.is){const d=e(),E=l.useMemo(()=>R=>d.subscribe(R),[d]),y=pe(()=>f(d.getState()),b,[d]);return l.useSyncExternalStore(E,y,y)}const s=(f,b,d)=>{const E=e(),y=typeof f=="string",R=y?f:f.reducer,_=y?Ne(b):f.property,P=y?void 0:b,A=l.useMemo(()=>({reducer:R,property:x(_)}),[R,_]),N=l.useMemo(()=>$=>E.connect({reducer:A.reducer,property:A.property},()=>$()),[E,A]),T=J(A.property),M=pe(()=>{const C=E.getState()[A.reducer],S=T?C:U(C,A.property);return P?P(S):S},d??Object.is,[E,A]);return l.useSyncExternalStore(N,M,M)},i=(f,b,d=Object.is)=>{const E=e(),y=l.useRef(0),R=l.useRef(void 0),_=l.useRef(-1),P=l.useRef(!1),A=l.useRef(b);A.current=b;const N=l.useRef(d);N.current=d;const T=l.useMemo(()=>f.map(S=>({reducer:S.reducer,property:Array.isArray(S.property)?S.property.map(k=>x(k)):x(S.property)})),[xe(f)]),M=l.useMemo(()=>S=>{const k=()=>{y.current++,S()},I=T.flatMap(O=>(Array.isArray(O.property)?O.property:[O.property]).map(z=>E.connect({reducer:O.reducer,property:z},k)));return()=>{for(const O of I)O()}},[E,T]),$=l.useMemo(()=>T.flatMap(S=>(Array.isArray(S.property)?S.property:[S.property]).map(k=>({reducer:S.reducer,property:k}))),[T]),C=l.useCallback(()=>{if(_.current!==y.current||!P.current){const S=Ce(E.getState(),$),k=process.env.NODE_ENV!=="production"?Se(S,$):S,I=A.current(k);(!P.current||!N.current(R.current,I))&&(R.current=I,P.current=!0),_.current=y.current}return R.current},[E,$]);return l.useSyncExternalStore(M,C,C)},m=(f,b,d,E="committed",y)=>{const R=e(),_=l.useRef(d);_.current=d;const P=y?.duringReplay===!0;l.useEffect(()=>R.onEvent(f,b,(A,N,T,M)=>{_.current(A,N,T,M)},E,{duringReplay:P}),[R,f,b,E,P])},{useSuspenseAtomicProp:v,useSuspenseAtomicProps:p}=Je(e);return{useStore:e,useEmit:n,useSelector:c,useAtomicProp:s,useAtomicProps:i,useEvent:m,useSuspenseAtomicProp:v,useSuspenseAtomicProps:p,shallowEqual:Ee}}let he=null;function V(){return he??=ee(K),he}function Ue(){return V().useStore()}function Be(){return V().useEmit()}function He(t,e=Object.is){return V().useSelector(t,e)}function te(t,e,n=Object.is){return V().useAtomicProp(t,e,n)}function Xe(t,e,n,c="committed",o){V().useEvent(t,e,n,c,o)}function Ze(t){const e=Re.createStore(t),n=l.createContext(e);return we(e,n)}function we(t,e){const n=ee(e),c=({store:s,children:u})=>ye.jsx(e.Provider,{value:s??t,children:u}),o=()=>we(t,e);return{store:t,StoreContext:e,StoreProvider:c,...n,withSlice:(s,u,i)=>(t.registerSlice(s,u,i),o()),withMiddleware:s=>(t.registerMiddleware(s),o()),withEffect:s=>(t.registerEffect(s),o())}}function Ke(t,e,n,c){return t.withSlice(e,n,c)}function Qe(t,e){return t.withMiddleware(e)}function et(t,e){return t.withEffect(e)}function tt(t,e){return te({reducer:t,property:e.idsPath})}function rt(t,e,n){return te({reducer:t,property:e.pathTo(n)})}function nt(t,e,n,c){return te({reducer:t,property:e.pathTo(n,c)})}exports.StoreContext=K;exports.StoreProvider=je;exports.clearSuspenseCache=Ge;exports.createHooks=ee;exports.createYoltra=Ze;exports.invalidateAtomicProp=Le;exports.invalidateAtomicPropsByReducer=Ve;exports.shallowEqual=Ee;exports.suspenseCache=D;exports.useEmit=Be;exports.useEntity=rt;exports.useEntityField=nt;exports.useEntityIds=tt;exports.useEvent=Xe;exports.useSelector=He;exports.useStore=Ue;exports.withEffect=et;exports.withMiddleware=Qe;exports.withSlice=Ke;
11
11
  //# sourceMappingURL=index.cjs.map