@yoltra/react 0.6.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 +120 -74
- package/README.md +85 -39
- package/dist/index.cjs +4 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +509 -440
- 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 +8 -6
package/README.md
CHANGED
|
@@ -5,13 +5,15 @@
|
|
|
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.**
|
|
13
15
|
|
|
14
|
-
Subscribe to `"items.0.title"` or `"items.*.done"
|
|
16
|
+
Subscribe to `"items.0.title"` or `"items.*.done"`. The component re-renders only when that
|
|
15
17
|
exact path changes. No selectors, no memoization, no manual optimization.
|
|
16
18
|
|
|
17
19
|
[See the flamegraph comparison (Redux vs yoltra).](https://github.com/yoltra/yoltra/blob/main/examples/v0/yoltra-in-react/redux-yoltra-profiler.md)
|
|
@@ -30,7 +32,7 @@ npm install @yoltra/core @yoltra/react
|
|
|
30
32
|
|
|
31
33
|
## Setup with `createYoltra` (recommended)
|
|
32
34
|
|
|
33
|
-
`createYoltra` creates the store **and** every fully-typed hook in one call
|
|
35
|
+
`createYoltra` creates the store **and** every fully-typed hook in one call, with no separate context
|
|
34
36
|
file, no `createHooks` wiring, no required provider. All type parameters are inferred from your
|
|
35
37
|
reducer, so components need no explicit generics.
|
|
36
38
|
|
|
@@ -74,7 +76,7 @@ export const { store, useAtomicProp, useEmit, StoreProvider } = createYoltra({
|
|
|
74
76
|
});
|
|
75
77
|
```
|
|
76
78
|
|
|
77
|
-
### 2. Use the hooks
|
|
79
|
+
### 2. Use the hooks, no provider required
|
|
78
80
|
|
|
79
81
|
The hooks default to the store above, so you can render components directly. Subscribe with a
|
|
80
82
|
**`{ reducer, property }`** spec: the dotted `property` names the exact path to read.
|
|
@@ -84,7 +86,7 @@ The hooks default to the store above, so you can render components directly. Sub
|
|
|
84
86
|
import { useAtomicProp, useEmit } from "./yoltra";
|
|
85
87
|
|
|
86
88
|
export function Counter() {
|
|
87
|
-
// Object form
|
|
89
|
+
// Object form: re-renders only when counter.value changes. No selectors, no memo.
|
|
88
90
|
const value = useAtomicProp({ reducer: "counter", property: "value" });
|
|
89
91
|
const emit = useEmit();
|
|
90
92
|
|
|
@@ -100,7 +102,7 @@ export function Counter() {
|
|
|
100
102
|
```
|
|
101
103
|
|
|
102
104
|
A `<StoreProvider>` is only needed to scope a **different** store instance to a subtree (e.g. a
|
|
103
|
-
fresh store per test)
|
|
105
|
+
fresh store per test). `createYoltra` returns one for exactly that.
|
|
104
106
|
|
|
105
107
|
---
|
|
106
108
|
|
|
@@ -138,24 +140,58 @@ 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?)`
|
|
144
180
|
|
|
145
181
|
Fine-grained single-path selector. Re-renders only when the specified leaf changes. The dotted
|
|
146
|
-
`property` names the exact path
|
|
182
|
+
`property` names the exact path, including dynamic (`` `items.${id}.title` ``) and wildcard paths.
|
|
147
183
|
|
|
148
184
|
```tsx
|
|
149
|
-
// Object form (recommended)
|
|
185
|
+
// Object form (recommended): subscribe to the exact path
|
|
150
186
|
const title = useAtomicProp({ reducer: "todos", property: "items.0.title" });
|
|
151
187
|
|
|
152
|
-
// Dynamic path
|
|
188
|
+
// Dynamic path: interpolate the key
|
|
153
189
|
const byId = useAtomicProp({ reducer: "todos", property: `items.${id}.title` });
|
|
154
190
|
|
|
155
|
-
// With mapper
|
|
191
|
+
// With mapper: derive a value from the path
|
|
156
192
|
const count = useAtomicProp({ reducer: "todos", property: "items" }, (items) => items.length);
|
|
157
193
|
|
|
158
|
-
// Wildcard pattern
|
|
194
|
+
// Wildcard pattern: re-renders when any item changes
|
|
159
195
|
const allTitles = useAtomicProp(
|
|
160
196
|
{ reducer: "todos", property: "items.**" },
|
|
161
197
|
(state) => state.items.map((t) => t.title),
|
|
@@ -163,14 +199,14 @@ const allTitles = useAtomicProp(
|
|
|
163
199
|
);
|
|
164
200
|
```
|
|
165
201
|
|
|
166
|
-
> A typed-accessor overload
|
|
202
|
+
> A typed-accessor overload, `useAtomicProp("todos", (s) => s.items[0].title)`, is also available
|
|
167
203
|
> for static paths; it autocompletes the state shape and infers the return type.
|
|
168
204
|
|
|
169
205
|
**Supported patterns:**
|
|
170
206
|
|
|
171
|
-
- `"items.0.title"
|
|
172
|
-
- `"items.*.title"
|
|
173
|
-
- `"items.**"
|
|
207
|
+
- `"items.0.title"`: exact path (including numeric array indices)
|
|
208
|
+
- `"items.*.title"`: `*` matches one segment
|
|
209
|
+
- `"items.**"`: `**` matches zero or more segments
|
|
174
210
|
|
|
175
211
|
---
|
|
176
212
|
|
|
@@ -191,17 +227,17 @@ 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
|
-
Subscribe to store events from a component. Does not affect event flow
|
|
232
|
+
Subscribe to store events from a component. Does not affect event flow. Fire-and-forget.
|
|
197
233
|
|
|
198
234
|
```tsx
|
|
199
|
-
// Committed events (default)
|
|
235
|
+
// Committed events (default): events that passed middleware
|
|
200
236
|
useEvent("ui", "save", (event) => {
|
|
201
237
|
showToast("Saved!");
|
|
202
238
|
});
|
|
203
239
|
|
|
204
|
-
// Uncommitted events
|
|
240
|
+
// Uncommitted events: events rejected by middleware
|
|
205
241
|
useEvent(
|
|
206
242
|
"ui",
|
|
207
243
|
"delete",
|
|
@@ -211,7 +247,7 @@ useEvent(
|
|
|
211
247
|
"uncommitted",
|
|
212
248
|
);
|
|
213
249
|
|
|
214
|
-
// All events
|
|
250
|
+
// All events: distinguish by phase
|
|
215
251
|
useEvent(
|
|
216
252
|
"ui",
|
|
217
253
|
"action",
|
|
@@ -224,9 +260,19 @@ useEvent(
|
|
|
224
260
|
|
|
225
261
|
**Phases:**
|
|
226
262
|
|
|
227
|
-
- `'committed'` (default)
|
|
228
|
-
- `'uncommitted'
|
|
229
|
-
- `'
|
|
263
|
+
- `'committed'` (default): events that passed middleware and reached reducers
|
|
264
|
+
- `'uncommitted'`: events rejected by middleware
|
|
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
|
|
|
@@ -266,7 +312,7 @@ const value = store.getState().counter.value;
|
|
|
266
312
|
```
|
|
267
313
|
|
|
268
314
|
`getState()` is a read, not a subscription. Called while rendering, the component renders once
|
|
269
|
-
with that value and never again
|
|
315
|
+
with that value and never again, because nothing told it the value moved. It looks like it works right
|
|
270
316
|
up until the state changes and the screen does not. Read what you render with `useAtomicProp` or
|
|
271
317
|
`useSelector`, and keep `getState()` for callbacks and effects, which is what it is for.
|
|
272
318
|
|
|
@@ -315,8 +361,8 @@ 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 `
|
|
319
|
-
whenever the context it reads was never filled
|
|
364
|
+
identical in shape and still throw `[yoltra] No store in context` at runtime
|
|
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.
|
|
322
368
|
|
|
@@ -430,41 +476,41 @@ 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
|
|
|
441
487
|
## Documentation
|
|
442
488
|
|
|
443
|
-
- **[yoltra Root README](../../README.md)
|
|
489
|
+
- **[yoltra Root README](../../README.md)**: Overview and
|
|
444
490
|
quick start
|
|
445
|
-
- **[@yoltra/core API](../core/README.md)
|
|
491
|
+
- **[@yoltra/core API](../core/README.md)**:
|
|
446
492
|
Store, middleware, effects, `When` matchers
|
|
447
|
-
- **[Quick Start Guide](https://github.com/yoltra/yoltra/blob/main/docs/en/QUICK_START_GUIDE.md)
|
|
448
|
-
|
|
449
|
-
- **[Library Comparison](https://github.com/yoltra/yoltra/blob/main/docs/en/design/state-management-library-comparison.md)
|
|
450
|
-
|
|
493
|
+
- **[Quick Start Guide](https://github.com/yoltra/yoltra/blob/main/docs/en/QUICK_START_GUIDE.md)**:
|
|
494
|
+
Five steps to a working app
|
|
495
|
+
- **[Library Comparison](https://github.com/yoltra/yoltra/blob/main/docs/en/design/state-management-library-comparison.md)**:
|
|
496
|
+
Architectural comparison
|
|
451
497
|
|
|
452
498
|
---
|
|
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
|
---
|
|
460
506
|
|
|
461
507
|
## Status
|
|
462
508
|
|
|
463
|
-
**Release Candidate
|
|
509
|
+
**Release Candidate**. APIs are stable, used in production, minor changes possible before
|
|
464
510
|
v1.0.0.
|
|
465
511
|
|
|
466
512
|
---
|
|
467
513
|
|
|
468
514
|
## License
|
|
469
515
|
|
|
470
|
-
**MIT
|
|
516
|
+
**MIT**. Free to use in commercial and open-source projects.
|
package/dist/index.cjs
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @yoltra/react v0.
|
|
2
|
+
* @yoltra/react v0.8.0
|
|
3
3
|
* (c) 2026 Manu Ramirez <@pixerael>
|
|
4
|
-
* License: MIT
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
* This source code is licensed under the MIT license found in the
|
|
8
|
-
* LICENSE file in the root directory of this source tree
|
|
9
|
-
*/
|
|
10
|
-
"use strict";var Ee=Object.defineProperty;var Re=(t,e,n)=>e in t?Ee(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var ce=(t,e,n)=>Re(t,typeof e!="symbol"?e+"":e,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react"),Ae=require("@yoltra/core"),K=u.createContext(null);var W={exports:{}},D={};var ue;function Pe(){if(ue)return D;ue=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(o,s,c){var a=null;if(c!==void 0&&(a=""+c),s.key!==void 0&&(a=""+s.key),"key"in s){c={};for(var h in s)h!=="key"&&(c[h]=s[h])}else c=s;return s=c.ref,{$$typeof:t,type:o,key:a,ref:s!==void 0?s:null,props:c}}return D.Fragment=e,D.jsx=n,D.jsxs=n,D}var F={};var ae;function ge(){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===V?null:r.displayName||r.name||null;if(typeof r=="string")return r;switch(r){case y:return"Fragment";case k:return"Profiler";case b: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 P: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 A:i=r._payload,r=r._init;try{return t(r(i))}catch{}}return null}function e(r){return""+r}function n(r){try{e(r);var i=!1}catch{i=!0}if(i){i=console;var p=i.error,E=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.",E),e(r)}}function o(r){if(r===y)return"<>";if(typeof r=="object"&&r!==null&&r.$$typeof===A)return"<...>";try{var i=t(r);return i?"<"+i+">":"<...>"}catch{return"<...>"}}function s(){var r=w.A;return r===null?null:r.getOwner()}function c(){return Error("react-stack-top-frame")}function a(r){if(B.call(r,"key")){var i=Object.getOwnPropertyDescriptor(r,"key").get;if(i&&i.isReactWarning)return!1}return r.key!==void 0}function h(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 S(){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,E,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:S}):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,E,C,x,X,H){var R=i.children;if(R!==void 0)if(E)if(J(R)){for(E=0;E<R.length;E++)l(R[E]);Object.freeze&&Object.freeze(R)}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(R);if(B.call(i,"key")){R=t(r);var Y=Object.keys(i).filter(function(be){return be!=="key"});E=0<Y.length?"{key: someKey, "+Y.join(": ..., ")+": ...}":"{key: someKey}",se[R+E]||(Y=0<Y.length?"{"+Y.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
|
|
4
|
+
* License: MIT */
|
|
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:
|
|
11
6
|
let props = %s;
|
|
12
7
|
<%s {...props} />
|
|
13
8
|
React keys must be passed directly to JSX without using spread:
|
|
14
9
|
let props = %s;
|
|
15
|
-
<%s key={someKey} {...props} />`,E,R,Y,R),se[R+E]=!0)}if(R=null,p!==void 0&&(n(p),R=""+p),a(i)&&(n(i.key),R=""+i.key),"key"in i){p={};for(var Z in i)Z!=="key"&&(p[Z]=i[Z])}else p=i;return R&&h(p,typeof r=="function"?r.displayName||r.name||"Unknown":r),g(r,R,x,C,s(),p,X,H)}function l(r){typeof r=="object"&&r!==null&&r.$$typeof===f&&r._store&&(r._store.validated=1)}var m=u,f=Symbol.for("react.transitional.element"),v=Symbol.for("react.portal"),y=Symbol.for("react.fragment"),b=Symbol.for("react.strict_mode"),k=Symbol.for("react.profiler"),_=Symbol.for("react.consumer"),P=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"),A=Symbol.for("react.lazy"),O=Symbol.for("react.activity"),V=Symbol.for("react.client.reference"),w=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,B=Object.prototype.hasOwnProperty,J=Array.isArray,q=console.createTask?console.createTask:function(){return null};m={react_stack_bottom_frame:function(r){return r()}};var te,re={},ne=m.react_stack_bottom_frame.bind(m,c)(),oe=q(o(c)),se={};F.Fragment=y,F.jsx=function(r,i,p,E,C){var x=1e4>w.recentlyCreatedOwnerStacks++;return d(r,i,p,!1,E,C,x?Error("react-stack-top-frame"):ne,x?q(o(r)):oe)},F.jsxs=function(r,i,p,E,C){var x=1e4>w.recentlyCreatedOwnerStacks++;return d(r,i,p,!0,E,C,x?Error("react-stack-top-frame"):ne,x?q(o(r)):oe)}})()),F}var ie;function _e(){return ie||(ie=1,process.env.NODE_ENV==="production"?W.exports=Pe():W.exports=ge()),W.exports}var de=_e();const we=({store:t,children:e})=>de.jsx(K.Provider,{value:t,children:e}),le=new Set;function xe(t,e){process.env.NODE_ENV!=="production"&&(le.has(t)||(le.add(t),console.warn(e)))}function G(t){return t.includes("*")}function T(t){return t.replace(/^\./,"")}function Te(t){return T(t).split(".").filter(Boolean)}function ke(t){const e=n=>`${n.length}:${n}`;return t.map(n=>{const o=Array.isArray(n.property)?n.property:[n.property];return e(n.reducer)+e(String(o.length))+o.map(e).join("")}).join("")}const me=Symbol("yoltra.pathSegments");function he(t){const e=()=>{};return new Proxy(e,{get(n,o){if(o===me)return t;if(typeof o!="symbol")return he([...t,String(o)])},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 je(t){const e=t(he([])),n=e!=null?e[me]:void 0,s=(Array.isArray(n)?n:[]).join(".");return s===""&&xe("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 L(t,e){if(!e)return t;let n=t;for(const o of Te(e)){if(n==null)return;n=n[o]}return n}function U(t,e,n){const o=u.useRef(t);o.current=t;const s=u.useRef(e);s.current=e;const c=u.useMemo(()=>({has:!1,value:void 0}),n);return u.useCallback(()=>{const a=o.current();return(!c.has||!s.current(c.value,a))&&(c.has=!0,c.value=a),c.value},[c])}function ye(t,e){if(Object.is(t,e))return!0;if(!t||!e)return!1;const n=Object.keys(t),o=Object.keys(e);if(n.length!==o.length)return!1;for(const s of n)if(!Object.is(t[s],e[s]))return!1;return!0}function z(){const t=u.useContext(K);if(!t)throw new Error("useStore must be used inside <StoreProvider>");return t}function Oe(){return z().emit}function Ce(t,e=Object.is){const n=z(),o=u.useMemo(()=>c=>n.subscribe(c),[n]),s=U(()=>t(n.getState()),e,[n]);return u.useSyncExternalStore(o,s,s)}function Ne(t,e,n=Object.is){const o=z(),s=u.useMemo(()=>{const S=T(t.property);return{reducer:t.reducer,property:S}},[t.reducer,t.property]),c=u.useMemo(()=>S=>o.connect({reducer:s.reducer,property:s.property},()=>S()),[o,s]),a=G(s.property),h=U(()=>{const g=o.getState()[s.reducer];return a?g:L(g,s.property)},n,[o,s]);return u.useSyncExternalStore(c,h,h)}function Q(t,e,n=Object.is){return Ne(t,e,n)}function Me(t,e,n,o="committed"){const s=z(),c=u.useRef(n);c.current=n,u.useEffect(()=>s.onEvent(t,e,(a,h,S,g)=>{c.current(a,h,S,g)},o),[s,t,e,o])}function $e(t){return t==null||t<=0?null:Date.now()+t}function Ie(t){return t===null?null:t===void 0||t<=0?0:Date.now()+t}const Ye=2e3;class De{constructor(){ce(this,"store",new Map)}touch(e){this.store.has(e)&&this.store.delete(e)}evict(){for(;this.store.size>Ye;){const e=this.store.keys().next();if(e.done===!0)return;const n=this.store.get(e.value);if((n==null?void 0: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,o,s){const c=Date.now(),a=this.store.get(e);if(a&&a.status==="ready"&&(a.expiresAt==null||a.expiresAt>c))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>c)throw a.error;this.store.delete(e)}const h=Promise.resolve().then(n).then(S=>{this.store.set(e,{status:"ready",value:S,expiresAt:$e(o)})}).catch(S=>{this.store.set(e,{status:"error",error:S,expiresAt:Ie(s)})});throw this.store.set(e,{status:"pending",promise:h,expiresAt:null}),this.evict(),h}invalidate(e){this.store.delete(e)}invalidatePathKey(e){for(const n of this.store.keys())pe(n)===e&&this.store.delete(n)}invalidateReducer(e){const n=`${e}::`;for(const o of this.store.keys())pe(o).split("||").some(s=>s.startsWith(n))&&this.store.delete(o)}clear(){this.store.clear()}}const N=new De,fe=new WeakMap;let Fe=0;function Se(t){let e=fe.get(t);return e===void 0&&(e=`s${++Fe}`,fe.set(t,e)),e}function pe(t){return t.slice(t.indexOf("::")+2)}function ee(t,e,n){const o=Array.isArray(e)?e.map(T).sort().join("|"):T(e);return n?`${t}::${o}::${n}`:`${t}::${o}`}function ze(t,e,n){const o=t(),s=e.reducer,c=T(e.property),a=`${Se(o)}::${ee(s,c,n.key)}`,h=u.useMemo(()=>l=>o.connect({reducer:s,property:c},()=>{N.invalidate(a),l()}),[o,s,c,a]),S=u.useRef(n);S.current=n;const g=u.useMemo(()=>{const l=G(c);return()=>{var b;const f=o.getState()[s],v=l?f:L(f,c),y=S.current;return N.read(a,()=>y.load(v,f),(b=y.staleTime)!=null?b:0,y.errorTtlMs)}},[o,s,c,a]),d=u.useMemo(()=>{const l=G(c);return()=>{const f=o.getState()[s];return l?f:L(f,c)}},[o,s,c]);return u.useSyncExternalStore(h,g,d)}function We(t,e,n){const o=t(),s=u.useMemo(()=>e.map(d=>({reducer:d.reducer,property:Array.isArray(d.property)?d.property.map(l=>T(l)):T(d.property)})),[JSON.stringify(e)]),c=u.useMemo(()=>{const d=s.map(l=>ee(l.reducer,l.property)).sort().join("||");return`${Se(o)}::${n.key?`${d}::${n.key}`:d}`},[o,s,n.key]),a=u.useMemo(()=>d=>{const l=()=>{N.invalidate(c),d()},m=s.map(f=>o.connect(f,l));return()=>{for(const f of m)f()}},[o,s,c]),h=u.useRef(n);h.current=n;const S=u.useMemo(()=>()=>{var m;const d=o.getState(),l=h.current;return N.read(c,()=>l.load(d),(m=l.staleTime)!=null?m:0,l.errorTtlMs)},[o,c]),g=()=>{const d=h.current.load(o.getState());return d instanceof Promise?void 0:d};return u.useSyncExternalStore(a,S,g)}function Ge(t,e,n){N.invalidatePathKey(ee(t,e,n))}function Le(t){N.invalidateReducer(t)}function Ue(){N.clear()}function Ve(t){return{useSuspenseAtomicProp:(o,s)=>ze(t,o,s),useSuspenseAtomicProps:(o,s)=>We(t,o,s)}}function ve(t){function e(){const l=u.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 n(){return e().emit}function o(l,m=Object.is){const f=e(),v=u.useMemo(()=>b=>f.subscribe(b),[f]),y=U(()=>l(f.getState()),m,[f]);return u.useSyncExternalStore(v,y,y)}const c=(l,m,f)=>{const v=e(),y=typeof l=="string",b=y?l:l.reducer,k=y?je(m):l.property,_=y?void 0:m,P=u.useMemo(()=>({reducer:b,property:T(k)}),[b,k]),j=u.useMemo(()=>M=>v.connect({reducer:P.reducer,property:P.property},()=>M()),[v,P]),$=G(P.property),I=U(()=>{const A=v.getState()[P.reducer],O=$?A:L(A,P.property);return _?_(O):O},f!=null?f:Object.is,[v,P]);return u.useSyncExternalStore(j,I,I)},h=(l,m,f=Object.is)=>{const v=e(),y=u.useRef(0),b=u.useRef(void 0),k=u.useRef(-1),_=u.useRef(!1),P=u.useRef(m);P.current=m;const j=u.useRef(f);j.current=f;const $=u.useMemo(()=>l.map(A=>({reducer:A.reducer,property:Array.isArray(A.property)?A.property.map(O=>T(O)):T(A.property)})),[ke(l)]),I=u.useMemo(()=>A=>{const O=()=>{y.current++,A()},V=$.flatMap(w=>(Array.isArray(w.property)?w.property:[w.property]).map(J=>v.connect({reducer:w.reducer,property:J},O)));return()=>{for(const w of V)w()}},[v,$]),M=u.useCallback(()=>{if(k.current!==y.current||!_.current){const A=P.current(v.getState());(!_.current||!j.current(b.current,A))&&(b.current=A,_.current=!0),k.current=y.current}return b.current},[v]);return u.useSyncExternalStore(I,M,M)},S=(l,m,f,v="committed")=>{const y=e(),b=u.useRef(f);b.current=f,u.useEffect(()=>y.onEvent(l,m,(k,_,P,j)=>{b.current(k,_,P,j)},v),[y,l,m,v])},{useSuspenseAtomicProp:g,useSuspenseAtomicProps:d}=Ve(e);return{useStore:e,useEmit:n,useSelector:o,useAtomicProp:c,useAtomicProps:h,useEvent:S,useSuspenseAtomicProp:g,useSuspenseAtomicProps:d,shallowEqual:ye}}function Be(t){const e=Ae.createStore(t),n=u.createContext(e),o=ve(n);return{store:e,StoreContext:n,StoreProvider:({store:c,children:a})=>de.jsx(n.Provider,{value:c!=null?c:e,children:a}),...o}}function Je(t,e){return Q({reducer:t,property:e.idsPath})}function qe(t,e,n){return Q({reducer:t,property:e.pathTo(n)})}function Xe(t,e,n,o){return Q({reducer:t,property:e.pathTo(n,o)})}exports.StoreContext=K;exports.StoreProvider=we;exports.clearSuspenseCache=Ue;exports.createHooks=ve;exports.createYoltra=Be;exports.invalidateAtomicProp=Ge;exports.invalidateAtomicPropsByReducer=Le;exports.shallowEqual=ye;exports.suspenseCache=N;exports.useEmit=Oe;exports.useEntity=qe;exports.useEntityField=Xe;exports.useEntityIds=Je;exports.useEvent=Me;exports.useSelector=Ce;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;
|
|
16
11
|
//# sourceMappingURL=index.cjs.map
|