@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.md CHANGED
@@ -5,13 +5,15 @@
5
5
  > [ πŸ‡²πŸ‡½ VersiΓ³n en EspaΓ±ol](./README.es.md) 
6
6
  > |   πŸ‘‰ πŸ‡ΊπŸ‡Έ 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.**
13
15
 
14
- Subscribe to `"items.0.title"` or `"items.*.done"` β€” the component re-renders only when that
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 β€” no separate context
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 β€” no provider required
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 β€” re-renders only when counter.value changes. No selectors, no memo.
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) β€” `createYoltra` returns one for exactly that.
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 β€” including dynamic (`` `items.${id}.title` ``) and wildcard paths.
182
+ `property` names the exact path, including dynamic (`` `items.${id}.title` ``) and wildcard paths.
147
183
 
148
184
  ```tsx
149
- // Object form (recommended) β€” subscribe to the exact path
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 β€” interpolate the key
188
+ // Dynamic path: interpolate the key
153
189
  const byId = useAtomicProp({ reducer: "todos", property: `items.${id}.title` });
154
190
 
155
- // With mapper β€” derive a value from the path
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 β€” re-renders when any item changes
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 β€” `useAtomicProp("todos", (s) => s.items[0].title)` β€” is also available
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"` β€” exact path (including numeric array indices)
172
- - `"items.*.title"` β€” `*` matches one segment
173
- - `"items.**"` β€” `**` matches zero or more segments
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 β€” fire-and-forget.
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) β€” events that passed middleware
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 β€” events rejected by middleware
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 β€” distinguish by phase
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) β€” events that passed middleware and reached reducers
228
- - `'uncommitted'` β€” events rejected by middleware
229
- - `'all'` β€” both, with `phase` parameter to distinguish
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 β€” nothing told it the value moved. It looks like it works right
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 `useStore must be used inside <StoreProvider>` at runtime
319
- whenever the context it reads was never filled β€” a mistake the types could not catch. Importing
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](../../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
 
441
487
  ## Documentation
442
488
 
443
- - **[yoltra Root README](../../README.md)** β€” Overview and
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
- β€” Five steps to a working app
449
- - **[Library Comparison](https://github.com/yoltra/yoltra/blob/main/docs/en/design/state-management-library-comparison.md)**
450
- β€” Architectural comparison
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** β€” APIs are stable, used in production, minor changes possible before
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** β€” Free to use in commercial and open-source projects.
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.6.0
2
+ * @yoltra/react v0.8.0
3
3
  * (c) 2026 Manu Ramirez <@pixerael>
4
- * License: MIT
5
- * Homepage: https://yoltra.dev
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