@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 +56 -9
- package/README.md +55 -9
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +455 -374
- package/dist/index.mjs.map +1 -1
- package/dist/types/createYoltra.d.ts +64 -3
- package/dist/types/hooks/createHooks.d.ts +11 -1
- package/dist/types/hooks/hooks.d.ts +11 -1
- package/dist/types/index.d.ts +2 -2
- package/package.json +5 -4
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
|
-
](https://www.npmjs.com/package/@yoltra/react)
|
|
9
|
+
[](https://www.npmjs.com/package/@yoltra/react)
|
|
10
|
+
[](https://www.npmjs.com/package/@yoltra/react)
|
|
11
|
+
[](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
|
-
- `'
|
|
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 `
|
|
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](
|
|
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)](
|
|
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)](
|
|
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)
|
|
6
6
|
> | 👉 🇺🇸 English Version
|
|
7
7
|
|
|
8
|
-
](https://www.npmjs.com/package/@yoltra/react)
|
|
9
|
+
[](https://www.npmjs.com/package/@yoltra/react)
|
|
10
|
+
[](https://www.npmjs.com/package/@yoltra/react)
|
|
11
|
+
[](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
|
-
- `'
|
|
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 `
|
|
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](
|
|
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)](
|
|
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)](
|
|
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.
|
|
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
|
|
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
|