march-hare 0.6.0 → 0.7.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 +148 -59
- package/dist/march-hare.js +6 -6
- package/dist/march-hare.umd.cjs +1 -1
- package/dist/src/library/action/index.d.ts +17 -13
- package/dist/src/library/boundary/components/store/index.d.ts +41 -0
- package/dist/src/library/boundary/components/store/types.d.ts +11 -0
- package/dist/src/library/boundary/components/store/utils.d.ts +64 -0
- package/dist/src/library/boundary/components/tasks/types.d.ts +3 -3
- package/dist/src/library/boundary/index.d.ts +8 -7
- package/dist/src/library/boundary/types.d.ts +18 -0
- package/dist/src/library/cache/index.d.ts +44 -0
- package/dist/src/library/cache/types.d.ts +54 -0
- package/dist/src/library/index.d.ts +7 -4
- package/dist/src/library/resource/index.d.ts +82 -79
- package/dist/src/library/resource/types.d.ts +27 -0
- package/dist/src/library/resource/utils.d.ts +37 -0
- package/dist/src/library/types/index.d.ts +160 -44
- package/dist/src/library/utils/index.d.ts +32 -22
- package/dist/src/library/utils/types.d.ts +18 -0
- package/dist/src/library/utils/utils.d.ts +33 -2
- package/package.json +3 -3
- package/dist/src/library/boundary/components/mode/index.d.ts +0 -15
- package/dist/src/library/boundary/components/mode/types.d.ts +0 -7
- package/dist/src/library/boundary/components/mode/utils.d.ts +0 -55
package/README.md
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<img src="/media/logo-v3.png" width="475" />
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
<i>❝We're all <ins>mad</ins> here.❞</i>
|
|
5
|
+
<br />
|
|
6
|
+
<sub><strong>M</strong>odel,</sub>
|
|
7
|
+
<sub><strong>A</strong>ctions,</sub>
|
|
8
|
+
<sub><strong>D</strong>ata</sub>
|
|
9
|
+
|
|
10
|
+
[](https://github.com/Wildhoney/MarchHare/actions/workflows/checks.yml)
|
|
5
11
|
|
|
6
12
|
</div>
|
|
7
13
|
|
|
8
|
-
Strongly typed React framework using generators and efficiently updated views alongside the publish-subscribe pattern.
|
|
14
|
+
> Strongly typed React framework using generators and efficiently updated views alongside the publish-subscribe pattern.
|
|
9
15
|
|
|
10
|
-
**[View Live Demo →](https://wildhoney.github.io/
|
|
16
|
+
> **[View Live Demo →](https://wildhoney.github.io/MarchHare/)**
|
|
11
17
|
|
|
12
18
|
## Contents
|
|
13
19
|
|
|
@@ -70,35 +76,49 @@ export default function Profile(): React.ReactElement {
|
|
|
70
76
|
}
|
|
71
77
|
```
|
|
72
78
|
|
|
73
|
-
When you need to do more than just assign the payload – such as making an API request – expand `useAction` to a full function. It can be synchronous, asynchronous, or even a generator
|
|
79
|
+
When you need to do more than just assign the payload – such as making an API request – expand `useAction` to a full function. It can be synchronous, asynchronous, or even a generator. Remote data goes through `Resource` rather than a bare `fetch` – declare the resource at module scope, fetch from handlers via `context.actions.resource(...)`:
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
// resources.ts
|
|
83
|
+
import { Resource } from "march-hare";
|
|
84
|
+
|
|
85
|
+
export const user = Resource(({ controller }) =>
|
|
86
|
+
ky.get(api.user(), { signal: controller.signal }).json<User>(),
|
|
87
|
+
);
|
|
88
|
+
```
|
|
74
89
|
|
|
75
90
|
```tsx
|
|
76
91
|
actions.useAction(Actions.Name, async (context) => {
|
|
77
92
|
context.actions.produce(
|
|
78
|
-
(
|
|
79
|
-
void (
|
|
93
|
+
({ model }) =>
|
|
94
|
+
void (model.name = context.actions.annotate(model.name, Op.Update)),
|
|
80
95
|
);
|
|
81
96
|
|
|
82
|
-
|
|
97
|
+
// Auto-threads context.task.controller and the Store snapshot.
|
|
98
|
+
const data = await context.actions.resource(user());
|
|
83
99
|
|
|
84
|
-
context.actions.produce((
|
|
100
|
+
context.actions.produce(({ model }) => void (model.name = data.name));
|
|
85
101
|
});
|
|
86
102
|
```
|
|
87
103
|
|
|
88
|
-
Notice we're using `annotate` which you can read more about in the [Immertation documentation](https://github.com/Wildhoney/Immertation).
|
|
104
|
+
Notice we're using `annotate` which you can read more about in the [Immertation documentation](https://github.com/Wildhoney/Immertation). Once the request is finished we update the model again with the name fetched from the response and re-render the React component. `Resource` caches the most recent successful payload and exposes typed params – the full API is covered [further down](#remote-data).
|
|
89
105
|
|
|
90
106
|
If you need to access external reactive values (like props or `useState` from parent components) that always reflect the latest value even after `await` operations, pass a data callback to `useActions`:
|
|
91
107
|
|
|
92
108
|
```tsx
|
|
93
109
|
const actions = useActions<Model, typeof Actions, { query: string }>(
|
|
94
110
|
model,
|
|
95
|
-
() => ({
|
|
111
|
+
() => ({
|
|
112
|
+
query: props.query,
|
|
113
|
+
}),
|
|
96
114
|
);
|
|
97
115
|
|
|
98
116
|
actions.useAction(Actions.Search, async (context) => {
|
|
99
|
-
await
|
|
100
|
-
|
|
101
|
-
|
|
117
|
+
const results = await context.actions.resource(
|
|
118
|
+
search({ query: context.data.query }),
|
|
119
|
+
);
|
|
120
|
+
// context.data.query is always the latest value, even after await
|
|
121
|
+
console.log(context.data.query, results);
|
|
102
122
|
});
|
|
103
123
|
```
|
|
104
124
|
|
|
@@ -158,15 +178,15 @@ class Actions {
|
|
|
158
178
|
```tsx
|
|
159
179
|
actions.useAction(Actions.Profile, async (context) => {
|
|
160
180
|
context.actions.produce(
|
|
161
|
-
(
|
|
162
|
-
void (
|
|
181
|
+
({ model }) =>
|
|
182
|
+
void (model.name = context.actions.annotate(model.name, Op.Update)),
|
|
163
183
|
);
|
|
164
184
|
|
|
165
|
-
const
|
|
185
|
+
const data = await context.actions.resource(user());
|
|
166
186
|
|
|
167
|
-
context.actions.produce((
|
|
187
|
+
context.actions.produce(({ model }) => void (model.name = data.name));
|
|
168
188
|
|
|
169
|
-
context.actions.dispatch(Actions.Broadcast.Name, name);
|
|
189
|
+
context.actions.dispatch(Actions.Broadcast.Name, data.name);
|
|
170
190
|
});
|
|
171
191
|
```
|
|
172
192
|
|
|
@@ -174,9 +194,9 @@ Once we have the broadcast action, if we want to listen for it and perform anoth
|
|
|
174
194
|
|
|
175
195
|
```tsx
|
|
176
196
|
actions.useAction(Actions.Broadcast.Name, async (context, name) => {
|
|
177
|
-
const
|
|
197
|
+
const data = await context.actions.resource(friends({ name }));
|
|
178
198
|
|
|
179
|
-
context.actions.produce((
|
|
199
|
+
context.actions.produce(({ model }) => void (model.friends = data));
|
|
180
200
|
});
|
|
181
201
|
```
|
|
182
202
|
|
|
@@ -186,8 +206,8 @@ Both `read` and `peek` access the latest cached broadcast value without subscrib
|
|
|
186
206
|
actions.useAction(Actions.FetchFriends, async (context) => {
|
|
187
207
|
const name = await context.actions.resolution(Actions.Broadcast.Name);
|
|
188
208
|
if (!name) return;
|
|
189
|
-
const
|
|
190
|
-
context.actions.produce(({ model }) => void (model.friends =
|
|
209
|
+
const data = await context.actions.resource(friends({ name }));
|
|
210
|
+
context.actions.produce(({ model }) => void (model.friends = data));
|
|
191
211
|
});
|
|
192
212
|
```
|
|
193
213
|
|
|
@@ -233,62 +253,84 @@ function Dashboard() {
|
|
|
233
253
|
|
|
234
254
|
Components that mount after a broadcast has already been dispatched automatically receive the cached value via their `useAction` handler. If you also fetch data in `Lifecycle.Mount()`, see the [mount deduplication recipe](./recipes/mount-broadcast-deduplication.md) to avoid duplicate requests.
|
|
235
255
|
|
|
236
|
-
|
|
256
|
+
<a id="remote-data"></a>
|
|
257
|
+
|
|
258
|
+
For remote data, declare a `Resource` at module scope and use it directly. `user(params)` is the unified call form — it returns the sync cache read (`User | null`) and primes a slot that `context.actions.resource(user(params))` consumes for the fetch path (with auto-threaded abort controller and Store snapshot). Every successful fetch caches the response in a module-level slot keyed by the fetcher and the stringified params, so different param-sets are independent. Keep all resources in `resources.ts` and pull them in with named imports:
|
|
237
259
|
|
|
238
260
|
```ts
|
|
239
261
|
// resources.ts
|
|
240
262
|
import { Resource } from "march-hare";
|
|
241
263
|
|
|
242
|
-
export const user = Resource(
|
|
264
|
+
export const user = Resource(({ controller }) =>
|
|
265
|
+
ky.get("/api/user", { signal: controller.signal }).json<User>(),
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
export const pay = Resource<Receipt, Body>(({ controller, params }) =>
|
|
269
|
+
ky
|
|
270
|
+
.post("/api/pay", { json: params, signal: controller.signal })
|
|
271
|
+
.json<Receipt>(),
|
|
272
|
+
);
|
|
243
273
|
```
|
|
244
274
|
|
|
245
275
|
```tsx
|
|
246
276
|
// actions.ts
|
|
247
|
-
import
|
|
248
|
-
import
|
|
277
|
+
import { useActions } from "march-hare";
|
|
278
|
+
import { user, pay } from "./resources";
|
|
249
279
|
|
|
250
280
|
export function useActions() {
|
|
251
|
-
const actions =
|
|
252
|
-
|
|
253
|
-
|
|
281
|
+
const actions = useActions<Model, typeof Actions>({
|
|
282
|
+
// Sync cache read at the model literal — returns null when nothing is cached.
|
|
283
|
+
user: user(),
|
|
284
|
+
receipt: null,
|
|
285
|
+
});
|
|
254
286
|
|
|
255
287
|
actions.useAction(Actions.Mount, async (context) => {
|
|
256
|
-
const data = await
|
|
257
|
-
|
|
288
|
+
const data = await context.actions.resource(user()).exceeds({ minutes: 5 });
|
|
258
289
|
context.actions.produce(({ model }) => void (model.user = data));
|
|
259
290
|
});
|
|
260
291
|
|
|
292
|
+
actions.useAction(Actions.Submit, async (context, body) => {
|
|
293
|
+
const receipt = await context.actions.resource(pay(body));
|
|
294
|
+
context.actions.produce(({ model }) => void (model.receipt = receipt));
|
|
295
|
+
});
|
|
296
|
+
|
|
261
297
|
return actions;
|
|
262
298
|
}
|
|
263
299
|
```
|
|
264
300
|
|
|
265
|
-
`actions.
|
|
301
|
+
`context.actions.resource(invocation)` returns a thenable. Awaiting it fires the fetch unconditionally; chaining `.exceeds({ minutes: 5 })` short-circuits when the per-params cache age does not yet exceed the supplied freshness window. `.exceeds(duration)` accepts a `Temporal.Duration`, a `DurationLike` object, or an ISO 8601 duration string. `Temporal` is read from the host runtime – bring a polyfill (e.g. [`@js-temporal/polyfill`](https://github.com/js-temporal/temporal-polyfill)) if your target environment does not yet expose it natively.
|
|
266
302
|
|
|
267
|
-
`Resource` takes
|
|
303
|
+
`Resource` takes a single fetcher argument. The fetcher receives `{ store, controller, params }` — destructure whichever you need. There are no callbacks – no `onSuccess`, no `onError`, no injected `dispatch`. Side-effects after a run (broadcasting, analytics, model writes) live in the `useAction` handler that awaited the call, next to the rest of the flow:
|
|
268
304
|
|
|
269
305
|
```ts
|
|
270
|
-
export const user = Resource(
|
|
306
|
+
export const user = Resource(({ controller }) =>
|
|
307
|
+
ky.get("/api/user", { signal: controller.signal }).json<User>(),
|
|
308
|
+
);
|
|
271
309
|
|
|
272
310
|
actions.useAction(Actions.Mount, async (context) => {
|
|
273
|
-
const data = await
|
|
311
|
+
const data = await context.actions.resource(user());
|
|
274
312
|
await context.actions.dispatch(Actions.Broadcast.UserUpdated, data);
|
|
275
313
|
context.actions.produce(({ model }) => void (model.user = data));
|
|
276
314
|
});
|
|
277
315
|
```
|
|
278
316
|
|
|
279
|
-
`params` is the second generic on `Resource` and defaults to `{}`. Declare it when the fetcher needs call-time inputs – cursors, ids, query strings. `params` is a single object (not positional args), which keeps call sites self-documenting
|
|
317
|
+
`params` is the second generic on `Resource` and defaults to `{}`. Declare it when the fetcher needs call-time inputs – cursors, ids, query strings, request bodies. `params` is a single object (not positional args), which keeps call sites self-documenting:
|
|
280
318
|
|
|
281
319
|
```ts
|
|
282
320
|
type Params = { cursor: string | null };
|
|
283
321
|
|
|
284
|
-
export const feed = Resource<Page<Item>, Params>(
|
|
322
|
+
export const feed = Resource<Page<Item>, Params>(({ controller, params }) =>
|
|
285
323
|
http
|
|
286
|
-
.get("feed", {
|
|
324
|
+
.get("feed", {
|
|
325
|
+
searchParams: { cursor: params.cursor ?? "" },
|
|
326
|
+
signal: controller.signal,
|
|
327
|
+
})
|
|
287
328
|
.json<Page<Item>>(),
|
|
288
329
|
);
|
|
289
330
|
|
|
290
|
-
const
|
|
291
|
-
|
|
331
|
+
const page = await context.actions.resource(
|
|
332
|
+
feed({ cursor: context.model.cursor }),
|
|
333
|
+
);
|
|
292
334
|
```
|
|
293
335
|
|
|
294
336
|
A complete IntersectionObserver-driven infinite-scroll demo lives at [`src/example/transactions/`](./src/example/transactions/) – mock paginated API, scroll-triggered `LoadMore`, `pending()` guard, broadcast on success.
|
|
@@ -298,7 +340,7 @@ For typed failure routing, wrap the call in `try/catch` and use `instanceof` &nd
|
|
|
298
340
|
```ts
|
|
299
341
|
actions.useAction(Actions.Mount, async (context) => {
|
|
300
342
|
try {
|
|
301
|
-
const data = await
|
|
343
|
+
const data = await context.actions.resource(user());
|
|
302
344
|
context.actions.produce(({ model }) => void (model.user = data));
|
|
303
345
|
} catch (error) {
|
|
304
346
|
if (error instanceof RateLimitedError) {
|
|
@@ -314,6 +356,46 @@ actions.useAction(Actions.Mount, async (context) => {
|
|
|
314
356
|
|
|
315
357
|
See the [Resource recipe](./recipes/use-resource.md) for the three-tier error handling model, parameterised resources, and limitations.
|
|
316
358
|
|
|
359
|
+
### Persisting resources across reloads
|
|
360
|
+
|
|
361
|
+
By default a `Resource`'s cache is in-memory only – it resets on every page load. To keep the most recent successful payload around between sessions, wire a `Cache` instance to the `Resource` definition. The Cache writes through to its adapter on every successful run and seeds the per-params slot from storage on first read, so call sites stay free of explicit `store.set` / `store.get` ceremony.
|
|
362
|
+
|
|
363
|
+
```ts
|
|
364
|
+
// resources.ts
|
|
365
|
+
import { Cache, Resource } from "march-hare";
|
|
366
|
+
|
|
367
|
+
const cache = Cache({
|
|
368
|
+
get: (key) => localStorage.getItem(key),
|
|
369
|
+
set: (key, value) => localStorage.setItem(key, value),
|
|
370
|
+
remove: (key) => localStorage.removeItem(key),
|
|
371
|
+
clear: () => localStorage.clear(),
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
export const cat = Resource(
|
|
375
|
+
async ({ controller }) => fetchCat(controller.signal),
|
|
376
|
+
cache,
|
|
377
|
+
);
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
```ts
|
|
381
|
+
// actions.ts
|
|
382
|
+
const actions = useActions<Model, typeof Actions>({
|
|
383
|
+
// First render reads the Cache automatically.
|
|
384
|
+
cat: cat(),
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
actions.useAction(Actions.Mount, async (context) => {
|
|
388
|
+
// Short-circuits when the persisted payload is < 5 minutes old.
|
|
389
|
+
// The Cache writes through automatically on success.
|
|
390
|
+
const fresh = await context.actions.resource(cat()).exceeds({ minutes: 5 });
|
|
391
|
+
context.actions.produce(({ model }) => void (model.cat = fresh));
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
`Cache()` with no adapter is an in-memory scope – useful in tests or when you want a holdable cache without persistence. Per-params keying via `JSON.stringify(params)` is automatic, so `user({ id: 5 })` and `user({ id: 6 })` are distinct slots.
|
|
396
|
+
|
|
397
|
+
See the [storage recipe](./recipes/storage.md) for backend adapters (React Native MMKV, browser extension `chrome.storage`), sign-out purge, and the `unset` sentinel that keeps "nothing stored" distinct from "a legitimately stored null".
|
|
398
|
+
|
|
317
399
|
For targeted event delivery, use channeled actions. Define a channel type as the second generic argument and call the action with a channel object – handlers fire when the dispatch channel matches:
|
|
318
400
|
|
|
319
401
|
```tsx
|
|
@@ -384,34 +466,41 @@ Unlike broadcast which reaches all mounted components, multicast is confined to
|
|
|
384
466
|
|
|
385
467
|
See the [multicast recipe](./recipes/multicast-actions.md) for more details.
|
|
386
468
|
|
|
387
|
-
For coordinating between async handlers without re-rendering the JSX tree, use the per-`<Boundary>`
|
|
469
|
+
For coordinating between async handlers and threading ambient values (session tokens, locale, feature flags, current operational mode) without re-rendering the JSX tree, use the per-`<Boundary>` `Store`. Declare your app's Store shape once via module augmentation, supply the initial value to `<Boundary store={...}>`, read via dot notation (`store.session`, `context.store.locale`), and write via `context.actions.produce(({ store }) => { ... })` — the same Immer-style recipe used for the model. Every `Resource` fetcher also receives a snapshot of the Store on its args object. Store is **not** reactive — drive view state through the model.
|
|
388
470
|
|
|
389
471
|
```ts
|
|
390
|
-
import
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
472
|
+
import { useActions } from "march-hare";
|
|
473
|
+
|
|
474
|
+
// Declare your Store's shape once. Every read/write is typed against this.
|
|
475
|
+
declare module "march-hare" {
|
|
476
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
|
477
|
+
interface Store {
|
|
478
|
+
session: Session | null;
|
|
479
|
+
operating: "idle" | "signing-out";
|
|
480
|
+
}
|
|
395
481
|
}
|
|
396
482
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
{ mode: typeof mode }
|
|
405
|
-
>(model, () => ({ mode }));
|
|
483
|
+
// Wire the initial Store into Boundary at app root.
|
|
484
|
+
<Boundary store={{ session: null, operating: "idle" }}>
|
|
485
|
+
<App />
|
|
486
|
+
</Boundary>;
|
|
487
|
+
|
|
488
|
+
export function useAuthActions() {
|
|
489
|
+
const actions = useActions<void, typeof Actions>();
|
|
406
490
|
|
|
407
491
|
actions.useAction(Actions.SignOut, async (context) => {
|
|
408
|
-
context.
|
|
492
|
+
context.actions.produce(({ store }) => {
|
|
493
|
+
store.operating = "signing-out";
|
|
494
|
+
});
|
|
409
495
|
await api.signOut();
|
|
410
|
-
context.
|
|
496
|
+
context.actions.produce(({ store }) => {
|
|
497
|
+
store.session = null;
|
|
498
|
+
store.operating = "idle";
|
|
499
|
+
});
|
|
411
500
|
});
|
|
412
501
|
|
|
413
502
|
actions.useAction(Actions.Refresh, async (context) => {
|
|
414
|
-
if (context.
|
|
503
|
+
if (context.store.operating === "signing-out") return;
|
|
415
504
|
// ...
|
|
416
505
|
});
|
|
417
506
|
|
package/dist/march-hare.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{G as e,A as t}from"@mobily/ts-belt";import{immerable as n,enablePatches as r,Immer as o}from"immer";import{jsx as s}from"react/jsx-runtime";import*as c from"react";const i=(e="")=>`march-hare.action/${e}`,a=(e="")=>`march-hare.action/broadcast/${e}`,u=(e="")=>`march-hare.action/multicast/${e}`,l=(e="")=>`march-hare.action.lifecycle/${e}`;class f{static Payload=/* @__PURE__ */Symbol("march-hare.brand/Payload");static Broadcast=/* @__PURE__ */Symbol("march-hare.brand/Broadcast");static Multicast=/* @__PURE__ */Symbol("march-hare.brand/Multicast");static Action=/* @__PURE__ */Symbol("march-hare.brand/Action");static Channel=/* @__PURE__ */Symbol("march-hare.brand/Channel")}function d(e){const t=/* @__PURE__ */Symbol(`march-hare.action.lifecycle/${e}`),n=function(e){return{[f.Action]:t,[f.Payload]:void 0,[f.Channel]:e,channel:e}};return Object.defineProperty(n,f.Action,{value:t,enumerable:!1}),Object.defineProperty(n,f.Payload,{value:void 0,enumerable:!1}),n}const p=Symbol(a("Fault"));class h{static Mount(){return d("Mount")}static Unmount(){return d("Unmount")}static Error(){return d("Error")}static Update(){return d("Update")}static Fault=(()=>{const e={};return Object.defineProperty(e,f.Action,{value:p,enumerable:!1}),Object.defineProperty(e,f.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(e,f.Broadcast,{value:!0,enumerable:!1}),e})()}var m=/* @__PURE__ */(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(m||{}),y=/* @__PURE__ */(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(y||{});const b=e=>"symbol"==typeof e;function v(t){return e.isString(t)||b(t)?t:(e.isObject(t)||e.isFunction(t))&&f.Action in t?t[f.Action]:t}function g(t){if(e.isString(t))return t.startsWith(a());if(b(t))return t.description?.startsWith(a())??!1;if(e.isObject(t)||e.isFunction(t)){if(f.Broadcast in t&&t[f.Broadcast])return!0;if(f.Action in t){const e=t[f.Action];return e.description?.startsWith(a())??!1}}return!1}function w(t){const n=v(t),r=e.isString(n)?n:n.description??"";return r.startsWith(i())&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function O(t){return e.isObject(t)&&f.Channel in t&&"channel"in t}function j(e){const t=v(e),n=b(t)?t.description??"":t;return n.startsWith(l())&&n.slice(l().length)||null}function S(t){if(e.isString(t))return t.startsWith(u());if(b(t))return t.description?.startsWith(u())??!1;if(e.isObject(t)||e.isFunction(t)){if(f.Multicast in t&&t[f.Multicast])return!0;if(f.Action in t){const e=t[f.Action];return e.description?.startsWith(u())??!1}}return!1}const E=(e,t=m.Unicast)=>{const n=t===m.Broadcast?Symbol(a(e)):t===m.Multicast?Symbol(u(e)):Symbol(i(e)),r=function(e){return{[f.Action]:n,[f.Payload]:void 0,[f.Channel]:e,channel:e}};return Object.defineProperty(r,f.Action,{value:n,enumerable:!1}),Object.defineProperty(r,f.Payload,{value:void 0,enumerable:!1}),t===m.Broadcast&&Object.defineProperty(r,f.Broadcast,{value:!0,enumerable:!1}),t===m.Multicast&&Object.defineProperty(r,f.Multicast,{value:!0,enumerable:!1}),r};var P=/* @__PURE__ */(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Errored=2]="Errored",e))(P||{});class M extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}class C extends Error{name="TimeoutError";constructor(e="Timeout"){super(e)}}let x=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var k=/* @__PURE__ */(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(k||{}),A=/* @__PURE__ */(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(A||{}),_=/* @__PURE__ */(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(_||{});class R{[n]=!0;static keys=new Set(Object.values(_));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new R(this.value,this.operation);return n.property=e,n.process=t,n}}class N{static immer=(()=>{r();const e=new o;return e.setAutoFreeze(!1),e})();static tag="κ";static id=x}function U(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function L(t){if(e.isNullable(t)||F(t))return t;if(e.isArray(t))return t.map(e=>L(e));if(e.isObject(t)&&B(t)){const e=Object.entries(t).map(([e,t])=>[e,L(t)]);return{...Object.fromEntries(e),[N.tag]:t[N.tag]??N.id()}}return t}function T(e){if(Array.isArray(e))return e.filter(e=>N.tag in e).map(e=>e[N.tag]??"").join(",");const t=e[N.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function B(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function F(t){return e.isNullable(t)||e.isString(t)||e.isNumber(t)||e.isBoolean(t)||"symbol"==typeof t||"bigint"==typeof t}function W(t,n,r,o,s,c){return function i(a,u=n.path){if(a instanceof R){const n=U(r,u.join("."));if(Object.entries(a).filter(([e,t])=>!R.keys.has(e)&&t instanceof R).forEach(([e,t])=>i(t,u.concat(e))),F(a.value)){if(t===A.Hydrate)return a.value;const i=u.slice(0,-1),l=i.length>0?U(r,i.join(".")):r;return e.isNullable(l)||$(l,a,u.at(-1),o,s,c),n??a.value}if(t===A.Hydrate){const e=L(i(a.value,u));return $(e,a,null,o,s,c),e}const l=n??L(a.value);return $(l,a,null,o,s,c),e.isNullable(n)?l:(i(a.value,u),n)}if(e.isArray(a))return a.map((e,t)=>i(e,u.concat(t)));if(e.isObject(a)&&!B(a))return a;if(e.isObject(a)){const e=Object.entries(a).map(([e,t])=>[e,i(t,u.concat(e))]),n=Object.fromEntries(e);if(t===A.Hydrate){const e=L(n);return Object.entries(a).forEach(([t,n])=>{n instanceof R&&F(n.value)&&$(e,n,t,o,s,c)}),e}return n}return a}(n.value)}function $(e,t,n,r,o,s){const c=s(e),i=o.get(c)??[];o.set(c,[t.assign(n,r),...i])}class z{#e={};#t;#n=/* @__PURE__ */new Map;#r=/* @__PURE__ */new Set;#o=!1;constructor(e=T){this.#t=e}static pk(){return x()}static"κ"=z.pk;annotate(e,t){return new R(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(n,r,o,s,c){function i(s){const c=s.at(-1),i=U(n(),s),a=s.slice(0,-1),u=t.isNotEmpty(a)?U(n(),a):n();return[...e.isObject(i)||e.isArray(i)?r.get(o(i))?.filter(t=>e.isNullable(t.property))??[]:[],...e.isObject(u)?r.get(o(u))?.filter(e=>e.property===c)??[]:[]]}return function e(r){return new Proxy(()=>{},{get:(o,a)=>"pending"===a?()=>!t.isEmpty(i(r)):"remaining"===a?()=>t.length(i(r)):"box"===a?()=>({value:U(n(),r),inspect:e(r)}):"is"===a?e=>i(r).some(t=>0!==(t.operation&e)):"draft"===a?()=>t.head(i(r))?.value??U(n(),r):"settled"===a?()=>new Promise(e=>{if(t.isEmpty(i(r)))return e(U(n(),r));const o=()=>{t.isEmpty(i(r))&&(c(o),e(U(n(),r)))};s(o)}):e([...r,String(a)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#s(A.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#s(A.Produce,e)}#s(e,t){const n=/* @__PURE__ */Symbol("process"),[,r]=N.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>N.immer.applyPatches(t,[{...r,value:W(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=L(this.#e),this.#c(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#c()}#c(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const H=new z;function I(e,t=k.Update){return H.annotate(t,e)}function D(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var G,J={exports:{}};const V=/* @__PURE__ */D((G||(G=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function s(e,t,r,s,c){if("function"!=typeof r)throw new TypeError("The listener must be a function");var i=new o(r,s||e,c),a=n?n+t:t;return e._events[a]?e._events[a].fn?e._events[a]=[e._events[a],i]:e._events[a].push(i):(e._events[a]=i,e._eventsCount++),e}function c(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function i(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=/* @__PURE__ */Object.create(null),(new r).__proto__||(n=!1)),i.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},i.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,s=new Array(o);r<o;r++)s[r]=t[r].fn;return s},i.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},i.prototype.emit=function(e,t,r,o,s,c){var i=n?n+e:e;if(!this._events[i])return!1;var a,u,l=this._events[i],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,s),!0;case 6:return l.fn.call(l.context,t,r,o,s,c),!0}for(u=1,a=new Array(f-1);u<f;u++)a[u-1]=arguments[u];l.fn.apply(l.context,a)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!a)for(d=1,a=new Array(f-1);d<f;d++)a[d-1]=arguments[d];l[u].fn.apply(l[u].context,a)}}return!0},i.prototype.on=function(e,t,n){return s(this,e,t,n,!1)},i.prototype.once=function(e,t,n){return s(this,e,t,n,!0)},i.prototype.removeListener=function(e,t,r,o){var s=n?n+e:e;if(!this._events[s])return this;if(!t)return c(this,s),this;var i=this._events[s];if(i.fn)i.fn!==t||o&&!i.once||r&&i.context!==r||c(this,s);else{for(var a=0,u=[],l=i.length;a<l;a++)(i[a].fn!==t||o&&!i[a].once||r&&i[a].context!==r)&&u.push(i[a]);u.length?this._events[s]=1===u.length?u[0]:u:c(this,s)}return this},i.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&c(this,t):(this._events=new r,this._eventsCount=0),this},i.prototype.off=i.prototype.removeListener,i.prototype.addListener=i.prototype.on,i.prefixed=n,i.EventEmitter=i,e.exports=i}(J)),J.exports));class q extends V{cache=/* @__PURE__ */new Map;emit(e,...t){return this.cache.set(e,t[0]),super.emit(e,...t)}setCache(e,t){this.cache.set(e,t)}getCached(e){return this.cache.get(e)}fire(e,...t){return super.emit(e,...t)}}const K=c.createContext(new q);function Q(){return c.useContext(K)}function X({children:e}){const t=c.useMemo(()=>new q,[]);/* @__PURE__ */
|
|
2
|
-
return
|
|
3
|
-
return
|
|
4
|
-
return
|
|
5
|
-
return
|
|
6
|
-
return
|
|
1
|
+
import{G as e,A as t}from"@mobily/ts-belt";import{immerable as n,enablePatches as r,Immer as o,produce as s}from"immer";import{jsx as c}from"react/jsx-runtime";import*as a from"react";const i=(e="")=>`march-hare.action/${e}`,u=(e="")=>`march-hare.action/broadcast/${e}`,l=(e="")=>`march-hare.action/multicast/${e}`,f=(e="")=>`march-hare.action.lifecycle/${e}`;class d{static Payload=/* @__PURE__ */Symbol("march-hare.brand/Payload");static Broadcast=/* @__PURE__ */Symbol("march-hare.brand/Broadcast");static Multicast=/* @__PURE__ */Symbol("march-hare.brand/Multicast");static Action=/* @__PURE__ */Symbol("march-hare.brand/Action");static Channel=/* @__PURE__ */Symbol("march-hare.brand/Channel");static Name=/* @__PURE__ */Symbol("march-hare.brand/Name")}function p(e){const t=/* @__PURE__ */Symbol(`march-hare.action.lifecycle/${e}`),n=function(n){return{[d.Action]:t,[d.Payload]:void 0,[d.Channel]:n,[d.Name]:e,channel:n}};return Object.defineProperty(n,d.Action,{value:t,enumerable:!1}),Object.defineProperty(n,d.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(n,d.Name,{value:e,enumerable:!1}),n}const h=Symbol(u("Fault"));class m{static Mount(){return p("Mount")}static Unmount(){return p("Unmount")}static Error(){return p("Error")}static Update(){return p("Update")}static Fault=(()=>{const e={};return Object.defineProperty(e,d.Action,{value:h,enumerable:!1}),Object.defineProperty(e,d.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(e,d.Broadcast,{value:!0,enumerable:!1}),Object.defineProperty(e,d.Name,{value:"Fault",enumerable:!1}),e})()}var y=/* @__PURE__ */(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(y||{}),b=/* @__PURE__ */(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(b||{});const v=e=>"symbol"==typeof e;function g(t){return e.isString(t)||v(t)?t:(e.isObject(t)||e.isFunction(t))&&d.Action in t?t[d.Action]:t}function w(t){if(e.isString(t))return t.startsWith(u());if(v(t))return t.description?.startsWith(u())??!1;if(e.isObject(t)||e.isFunction(t)){if(d.Broadcast in t&&t[d.Broadcast])return!0;if(d.Action in t){const e=t[d.Action];return e.description?.startsWith(u())??!1}}return!1}function O(t){const n=g(t),r=e.isString(n)?n:n.description??"";return r.startsWith(i())&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function S(t){return e.isObject(t)&&d.Channel in t&&"channel"in t}function P(e){const t=g(e),n=v(t)?t.description??"":t;return n.startsWith(f())&&n.slice(f().length)||null}function j(t){if(e.isString(t))return t.startsWith(l());if(v(t))return t.description?.startsWith(l())??!1;if(e.isObject(t)||e.isFunction(t)){if(d.Multicast in t&&t[d.Multicast])return!0;if(d.Action in t){const e=t[d.Action];return e.description?.startsWith(l())??!1}}return!1}const E=(e,t=y.Unicast)=>{const n=t===y.Broadcast?Symbol(u(e)):t===y.Multicast?Symbol(l(e)):Symbol(i(e)),r=function(t){return{[d.Action]:n,[d.Payload]:void 0,[d.Channel]:t,[d.Name]:e,channel:t}};return Object.defineProperty(r,d.Action,{value:n,enumerable:!1}),Object.defineProperty(r,d.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(r,d.Name,{value:e,enumerable:!1}),t===y.Broadcast&&Object.defineProperty(r,d.Broadcast,{value:!0,enumerable:!1}),t===y.Multicast&&Object.defineProperty(r,d.Multicast,{value:!0,enumerable:!1}),r};var x=/* @__PURE__ */(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Errored=2]="Errored",e))(x||{});class M extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}class C extends Error{name="TimeoutError";constructor(e="Timeout"){super(e)}}let k=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var N=/* @__PURE__ */(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(N||{}),A=/* @__PURE__ */(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(A||{}),_=/* @__PURE__ */(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(_||{});class R{[n]=!0;static keys=new Set(Object.values(_));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new R(this.value,this.operation);return n.property=e,n.process=t,n}}class U{static immer=(()=>{r();const e=new o;return e.setAutoFreeze(!1),e})();static tag="κ";static id=k}function L(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function T(t){if(e.isNullable(t)||W(t))return t;if(e.isArray(t))return t.map(e=>T(e));if(e.isObject(t)&&F(t)){const e=Object.entries(t).map(([e,t])=>[e,T(t)]);return{...Object.fromEntries(e),[U.tag]:t[U.tag]??U.id()}}return t}function B(e){if(Array.isArray(e))return e.filter(e=>U.tag in e).map(e=>e[U.tag]??"").join(",");const t=e[U.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function F(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function W(t){return e.isNullable(t)||e.isString(t)||e.isNumber(t)||e.isBoolean(t)||"symbol"==typeof t||"bigint"==typeof t}function $(t,n,r,o,s,c){return function a(i,u=n.path){if(i instanceof R){const n=L(r,u.join("."));if(Object.entries(i).filter(([e,t])=>!R.keys.has(e)&&t instanceof R).forEach(([e,t])=>a(t,u.concat(e))),W(i.value)){if(t===A.Hydrate)return i.value;const a=u.slice(0,-1),l=a.length>0?L(r,a.join(".")):r;return e.isNullable(l)||D(l,i,u.at(-1),o,s,c),n??i.value}if(t===A.Hydrate){const e=T(a(i.value,u));return D(e,i,null,o,s,c),e}const l=n??T(i.value);return D(l,i,null,o,s,c),e.isNullable(n)?l:(a(i.value,u),n)}if(e.isArray(i))return i.map((e,t)=>a(e,u.concat(t)));if(e.isObject(i)&&!F(i))return i;if(e.isObject(i)){const e=Object.entries(i).map(([e,t])=>[e,a(t,u.concat(e))]),n=Object.fromEntries(e);if(t===A.Hydrate){const e=T(n);return Object.entries(i).forEach(([t,n])=>{n instanceof R&&W(n.value)&&D(e,n,t,o,s,c)}),e}return n}return i}(n.value)}function D(e,t,n,r,o,s){const c=s(e),a=o.get(c)??[];o.set(c,[t.assign(n,r),...a])}class H{#e={};#t;#n=/* @__PURE__ */new Map;#r=/* @__PURE__ */new Set;#o=!1;constructor(e=B){this.#t=e}static pk(){return k()}static"κ"=H.pk;annotate(e,t){return new R(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(n,r,o,s,c){function a(s){const c=s.at(-1),a=L(n(),s),i=s.slice(0,-1),u=t.isNotEmpty(i)?L(n(),i):n();return[...e.isObject(a)||e.isArray(a)?r.get(o(a))?.filter(t=>e.isNullable(t.property))??[]:[],...e.isObject(u)?r.get(o(u))?.filter(e=>e.property===c)??[]:[]]}return function e(r){return new Proxy(()=>{},{get:(o,i)=>"pending"===i?()=>!t.isEmpty(a(r)):"remaining"===i?()=>t.length(a(r)):"box"===i?()=>({value:L(n(),r),inspect:e(r)}):"is"===i?e=>a(r).some(t=>0!==(t.operation&e)):"draft"===i?()=>t.head(a(r))?.value??L(n(),r):"settled"===i?()=>new Promise(e=>{if(t.isEmpty(a(r)))return e(L(n(),r));const o=()=>{t.isEmpty(a(r))&&(c(o),e(L(n(),r)))};s(o)}):e([...r,String(i)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#s(A.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#s(A.Produce,e)}#s(e,t){const n=/* @__PURE__ */Symbol("process"),[,r]=U.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>U.immer.applyPatches(t,[{...r,value:$(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=T(this.#e),this.#c(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#c()}#c(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const I=new H;function z(e,t=N.Update){return I.annotate(t,e)}function J(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var q,G={exports:{}};const K=/* @__PURE__ */J((q||(q=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function s(e,t,r,s,c){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new o(r,s||e,c),i=n?n+t:t;return e._events[i]?e._events[i].fn?e._events[i]=[e._events[i],a]:e._events[i].push(a):(e._events[i]=a,e._eventsCount++),e}function c(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=/* @__PURE__ */Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},a.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,s=new Array(o);r<o;r++)s[r]=t[r].fn;return s},a.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},a.prototype.emit=function(e,t,r,o,s,c){var a=n?n+e:e;if(!this._events[a])return!1;var i,u,l=this._events[a],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,s),!0;case 6:return l.fn.call(l.context,t,r,o,s,c),!0}for(u=1,i=new Array(f-1);u<f;u++)i[u-1]=arguments[u];l.fn.apply(l.context,i)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!i)for(d=1,i=new Array(f-1);d<f;d++)i[d-1]=arguments[d];l[u].fn.apply(l[u].context,i)}}return!0},a.prototype.on=function(e,t,n){return s(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return s(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,o){var s=n?n+e:e;if(!this._events[s])return this;if(!t)return c(this,s),this;var a=this._events[s];if(a.fn)a.fn!==t||o&&!a.once||r&&a.context!==r||c(this,s);else{for(var i=0,u=[],l=a.length;i<l;i++)(a[i].fn!==t||o&&!a[i].once||r&&a[i].context!==r)&&u.push(a[i]);u.length?this._events[s]=1===u.length?u[0]:u:c(this,s)}return this},a.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&c(this,t):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(G)),G.exports));class V extends K{cache=/* @__PURE__ */new Map;emit(e,...t){return this.cache.set(e,t[0]),super.emit(e,...t)}setCache(e,t){this.cache.set(e,t)}getCached(e){return this.cache.get(e)}fire(e,...t){return super.emit(e,...t)}}const Q=a.createContext(new V);function X(){return a.useContext(Q)}function Y({children:e}){const t=a.useMemo(()=>new V,[]);/* @__PURE__ */
|
|
2
|
+
return c(Q.Provider,{value:t,children:e})}const Z=a.createContext(/* @__PURE__ */new Set);function ee({children:e}){const t=a.useMemo(()=>/* @__PURE__ */new Set,[]);/* @__PURE__ */
|
|
3
|
+
return c(Z.Provider,{value:t,children:e})}const te=a.createContext({current:{}});function ne(){const e=a.useContext(te);return a.useMemo(()=>new Proxy({},{get:(t,n)=>Reflect.get(e.current,n),has:(t,n)=>n in e.current,ownKeys:()=>Reflect.ownKeys(e.current),getOwnPropertyDescriptor(t,n){const r=Object.getOwnPropertyDescriptor(e.current,n);if(void 0!==r)return{...r,configurable:!0}},set(){throw new TypeError("Store is read-only outside `context.actions.produce`. Mutate via produce(({ store }) => { store.x = ... }) instead.")}}),[e])}function re({initial:e,children:t}){const n=a.useRef(e);/* @__PURE__ */
|
|
4
|
+
return c(te.Provider,{value:n,children:t})}function oe({store:e,children:t}){/* @__PURE__ */
|
|
5
|
+
return c(Y,{children:/* @__PURE__ */c(re,{initial:e??{},children:/* @__PURE__ */c(ee,{children:t})})})}const se=a.createContext(null);function ce(){return a.useContext(se)}function ae(e,t){return e?.get(t)??null}function ie(e,t){const n=`Scoped${t.displayName||t.name||"Component"}`,r=g(e);return{[n](e){const n=ce(),o=a.useMemo(()=>({action:r,emitter:new V}),[]),s=a.useMemo(()=>{const e=new Map(n??[]);return e.set(r,o),e},[n,o]);/* @__PURE__ */
|
|
6
|
+
return c(se.Provider,{value:s,children:/* @__PURE__ */c(t,{...e})})}}[n]}const ue=Symbol(((e="")=>`march-hare/replay${e}`)());function le(e,t,...n){e instanceof V&&e.setCache(t,n[0]);const r=e.listeners(t);return 0===r.length?Promise.resolve():Promise.all(r.map(e=>Promise.resolve(e(...n)))).then(()=>{})}const fe={Update:e=>(t,n)=>{t.actions.produce(t=>{t.model[e]=n})},Invert:e=>t=>{t.actions.produce(t=>{t.model[e]=!t.model[e]})}};function de(e,t){for(const n of e.keys())if(P(n)===t)return n;return null}const pe=/* @__PURE__ */Symbol("march-hare.unset");function he(){const[,e]=a.useReducer(e=>e+1,0);return e}function me(){return{data:pe,at:null,else:e=>e}}function ye(e,t){return{data:e,at:t,else:t=>e}}function be(e){if(e instanceof Error){if("TimeoutError"===e.name)return x.Timedout;if("AbortError"===e.name)return x.Supplanted}return x.Errored}function ve(e){const t=/* @__PURE__ */new Map,n=e??{get:e=>t.get(e)??null,set:(e,n)=>{t.set(e,n)},remove:e=>{t.delete(e)},clear:()=>{t.clear()}};return{get(e){try{const t=n.get(e);if(null===t)return me();const r=JSON.parse(t);return ye(r.data,Temporal.Instant.from(r.at))}catch{return me()}},set(e,t){if(t.data===pe||null===t.at)return!1;try{return n.set(e,JSON.stringify({data:t.data,at:t.at.toString()})),!0}catch{return!1}},remove(e){n.remove(e)},clear(){n.clear()}}}function ge(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new M);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new M)},{once:!0})})}async function we(e,t,n){if(t?.aborted)throw new M;for(;;){if(await n())return;await ge(e,t)}}function Oe(e){return e?Boolean(e&&"symbol"!=typeof e):/* @__PURE__ */Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const Se=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,pk:Oe,poll:we,sleep:ge,unset:pe,"ζ":ge,"κ":Oe,"π":we},Symbol.toStringTag,{value:"Module"})),Pe=/* @__PURE__ */new WeakMap;function je(e){return JSON.stringify(e)}let Ee=null;function xe(){if(null===Ee)throw new Error("context.actions.resource(...) and context.actions.resource.set(...) must be called with a fresh resource invocation, e.g. context.actions.resource(cat({ id: 5 })).");const e=Ee;return Ee=null,e}function Me(e,t){const n=t??function(e){let t=Pe.get(e);return void 0===t&&(t=ve(),Pe.set(e,t)),t}(e),r=e=>{const t=n.get(je(e));return t.data===pe||null===t.at?{data:pe,at:null}:{data:t.data,at:t.at}},o=(t,r,o)=>e({store:t,controller:r,params:o}).then(e=>(n.set(je(o),ye(e,Temporal.Now.instant())),e)),s=(e,t,r)=>{n.set(je(e),ye(t,r))};return function(e){const t=e??{};Ee={run:o,read:r,seed:s,params:t},queueMicrotask(()=>{null!==Ee&&Ee.params===t&&(Ee=null)});const{data:n}=r(t);return n===pe?null:n}}const Ce=a.createContext(/* @__PURE__ */new Map);function ke({action:t,renderer:n}){const r=X(),o=a.useContext(Ce),s=he(),c=a.useMemo(()=>{const e=o.get(t);if(e)return e;const n={state:new H,listeners:/* @__PURE__ */new Set};return o.set(t,n),n},[t,o]);a.useLayoutEffect(()=>{function e(e){c.state.hydrate({value:e}),c.listeners.forEach(e=>e())}return c.listeners.add(s),r.on(t,e),()=>{c.listeners.delete(s),r.off(t,e)}},[t,r,c]);const i=c.state.model?.value;return e.isNullable(i)?null:n(i,c.state.inspect.value)}function Ne(...n){const r=e.isUndefined(n[0])||e.isFunction(n[0])?{}:n[0],o=e.isFunction(n[0])?n[0]:n[1]??(()=>({})),c=X(),i=ce(),u=a.useContext(Z),l=ne(),f=a.useContext(te),d=he(),p=a.useRef(!1),m=a.useRef(null),y=a.useRef(new H);p.current||(p.current=!0,m.current=y.current.hydrate(r));const[v,P]=a.useState(()=>y.current.model),E=function(e){const t=a.useRef(e);return a.useLayoutEffect(()=>{t.current=e},[e]),a.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(o()),x=a.useMemo(()=>new K,[]),M=a.useRef({handlers:/* @__PURE__ */new Map});M.current.handlers=/* @__PURE__ */new Map;const C=function(){const e=a.useRef(/* @__PURE__ */new Set),t=a.useRef(/* @__PURE__ */new Set);return a.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),k=a.useRef(b.Mounting),A=a.useRef(/* @__PURE__ */new Set),_=a.useRef(0),R=a.useCallback((e,t,n)=>{const r=new AbortController,o={controller:r,action:e,payload:t};return u.add(o),A.current.add(o),{model:y.current.model,get phase(){return k.current},task:o,data:E,tasks:u,store:l,actions:{produce(e){if(r.signal.aborted)return;const t=y.current.produce(t=>{f.current=s(f.current,n=>{e({model:t,inspect:y.current.inspect,store:n})})});P(y.current.model),n.processes.add(t),m.current&&(n.processes.add(m.current),m.current=null)},dispatch(e,t){if(r.signal.aborted)return Promise.resolve();const n=g(e),o=S(e)?e.channel:void 0;if(j(e)){const e=ae(i,n);return e?le(e.emitter,n,t,o):Promise.resolve()}return le(w(e)?c:x,n,t,o)},annotate:(e,t=N.Update)=>y.current.annotate(t,e),resource:Object.assign(function(e){const t=xe(),n=()=>t.run(f.current,r,t.params);return{then:(e,t)=>n().then(e,t),exceeds:e=>{const{data:r,at:o}=t.read(t.params);if(r!==pe&&null!==o){const t=Temporal.Now.instant().since(o),n=Temporal.Duration.from(e);if(Temporal.Duration.compare(t,n)<=0)return Promise.resolve(r)}return n()}}},{set:(e,t)=>{const n=xe();n.seed(n.params,t,Temporal.Now.instant())}}),async resolution(e){if(r.signal.aborted)return null;const t=g(e),n=j(e)?ae(i,t)?.emitter??null:c;if(!n)return null;if(void 0===n.getCached(t))return null;const o=O(e),s="unknown"!==o?o[0].toLowerCase()+o.slice(1):null;if(s){const e=y.current.inspect[s];e?.pending?.()&&await new Promise((t,n)=>{if(r.signal.aborted)return void n(r.signal.reason);const o=()=>n(r.signal.reason);r.signal.addEventListener("abort",o,{once:!0}),e.settled().then(()=>{r.signal.removeEventListener("abort",o),t()})})}return n.getCached(t)??null},peek(e){if(r.signal.aborted)return null;const t=g(e),n=j(e)?ae(i,t)?.emitter??null:c;return n?n.getCached(t)??null:null}}}},[v]);a.useLayoutEffect(()=>{function t(t,n,r){return function(o,s){const a=r();if(s===ue&&e.isNotNullable(a))return;if(e.isNotNullable(s)&&s!==ue&&e.isNotNullable(a)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(s,a))return;const i={processes:/* @__PURE__ */new Set},l=Promise.withResolvers(),f=R(t,o,i);function p(e){const n=de(M.current.handlers,"Error"),r=null!==n,o={reason:be(e),error:(s=e,s instanceof Error?s:new Error(String(s))),action:O(t),handled:r,tasks:u};var s;c.fire(h,o),r&&n&&x.emit(n,o)}function m(){for(const e of u)if(e===f.task){u.delete(e),A.current.delete(e);break}i.processes.forEach(e=>y.current.prune(e)),i.processes.size>0&&d(),l.resolve()}let b;try{b=n(f,o)}catch(v){return p(v),void m()}if(!function(e){if(!e||"object"!=typeof e)return!1;const t=Object.prototype.toString.call(e);return"[object Generator]"===t||"[object AsyncGenerator]"===t}(b))return Promise.resolve(b).catch(p).finally(m),l.promise;(async()=>{for await(const e of b);})().catch(p).finally(m)}}_.current++;const n=/* @__PURE__ */new Set;return M.current.handlers.forEach((e,r)=>{for(const{getChannel:o,handler:s}of e){const e=t(r,s,o);if(j(r)){if(i)for(const t of i.values()){const o=t.emitter;o.on(r,e),n.add(()=>o.off(r,e))}x.on(r,e),C.multicast.add(r),n.add(()=>x.off(r,e))}else w(r)?(c.on(r,e),x.on(r,e),C.broadcast.add(r),n.add(()=>{c.off(r,e),x.off(r,e)})):(x.on(r,e),n.add(()=>x.off(r,e)))}}),()=>{const e=++_.current,t=new Set(n);queueMicrotask(()=>{if(_.current!==e){for(const e of t)e();return}for(const e of A.current)e.controller.abort(),u.delete(e);A.current.clear(),k.current=b.Unmounting;const n=de(M.current.handlers,"Unmount");n&&x.emit(n),k.current=b.Unmounted;for(const e of t)e()})}},[x]),function({unicast:n,broadcast:r,dispatchers:o,scope:s,phase:c,data:i,handlers:u}){const l=a.useRef(null);a.useLayoutEffect(()=>{if(c.current===b.Mounted)return;c.current=b.Mounting;const t=de(u,"Mount");t&&n.emit(t),o.broadcast.forEach(t=>{const o=r.getCached(t);e.isNullable(o)||n.emit(t,o,ue)}),s&&o.multicast.forEach(t=>{for(const r of s.values()){const o=r.emitter.getCached(t);e.isNullable(o)||n.emit(t,o,ue)}}),c.current=b.Mounted},[]),a.useLayoutEffect(()=>{if(e.isNotNullable(l.current)){const e=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(l.current,i);if(t.isNotEmpty(Object.keys(e))){const t=de(u,"Update");t&&n.emit(t,e)}}l.current=i},[i,n])}({unicast:x,broadcast:c,dispatchers:C,scope:i,phase:k,data:o(),handlers:M.current.handlers});const U=a.useMemo(()=>[v,{dispatch(e,t){const n=g(e),r=S(e)?e.channel:void 0;if(j(e)){const e=ae(i,n);return e?le(e.emitter,n,t,r):Promise.resolve()}return le(w(e)?c:x,n,t,r)},get inspect(){return y.current.inspect},stream:(e,t)=>a.createElement(ke,{action:g(e),renderer:t})}],[v,x]);return U.useAction=(e,t)=>{!function(e,t,n){const r=a.useRef(n);a.useLayoutEffect(()=>{r.current=n});const o=a.useRef(t);a.useLayoutEffect(()=>{o.current=t});const s=a.useCallback((e,t)=>r.current(e,t),[]),c=a.useCallback(()=>S(o.current)?o.current.channel:void 0,[]),i=g(t),u=e.current.handlers.get(i)??/* @__PURE__ */new Set;0===u.size&&e.current.handlers.set(i,u),u.add({getChannel:c,handler:s})}(M,e,t)},U}export{M as AbortError,E as Action,oe as Boundary,ve as Cache,y as Distribution,m as Lifecycle,N as Op,N as Operation,x as Reason,Me as Resource,H as State,C as TimeoutError,fe as With,z as annotate,Ne as useActions,ne as useStore,Se as utils,ie as withScope};
|
package/dist/march-hare.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var global,factory;global=this,factory=function(e,t,n,r,o){"use strict";function s(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const c=s(o),i=(e="")=>`march-hare.action/${e}`,a=(e="")=>`march-hare.action/broadcast/${e}`,u=(e="")=>`march-hare.action/multicast/${e}`,l=(e="")=>`march-hare.action.lifecycle/${e}`;class f{static Payload=Symbol("march-hare.brand/Payload");static Broadcast=Symbol("march-hare.brand/Broadcast");static Multicast=Symbol("march-hare.brand/Multicast");static Action=Symbol("march-hare.brand/Action");static Channel=Symbol("march-hare.brand/Channel")}function d(e){const t=Symbol(`march-hare.action.lifecycle/${e}`),n=function(e){return{[f.Action]:t,[f.Payload]:void 0,[f.Channel]:e,channel:e}};return Object.defineProperty(n,f.Action,{value:t,enumerable:!1}),Object.defineProperty(n,f.Payload,{value:void 0,enumerable:!1}),n}const p=Symbol(a("Fault"));class h{static Mount(){return d("Mount")}static Unmount(){return d("Unmount")}static Error(){return d("Error")}static Update(){return d("Update")}static Fault=(()=>{const e={};return Object.defineProperty(e,f.Action,{value:p,enumerable:!1}),Object.defineProperty(e,f.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(e,f.Broadcast,{value:!0,enumerable:!1}),e})()}var m=(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(m||{}),b=(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(b||{});const y=e=>"symbol"==typeof e;function v(e){return t.G.isString(e)||y(e)?e:(t.G.isObject(e)||t.G.isFunction(e))&&f.Action in e?e[f.Action]:e}function g(e){if(t.G.isString(e))return e.startsWith(a());if(y(e))return e.description?.startsWith(a())??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(f.Broadcast in e&&e[f.Broadcast])return!0;if(f.Action in e){const t=e[f.Action];return t.description?.startsWith(a())??!1}}return!1}function w(e){const n=v(e),r=t.G.isString(n)?n:n.description??"";return r.startsWith(i())&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function j(e){return t.G.isObject(e)&&f.Channel in e&&"channel"in e}function O(e){const t=v(e),n=y(t)?t.description??"":t;return n.startsWith(l())&&n.slice(l().length)||null}function S(e){if(t.G.isString(e))return e.startsWith(u());if(y(e))return e.description?.startsWith(u())??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(f.Multicast in e&&e[f.Multicast])return!0;if(f.Action in e){const t=e[f.Action];return t.description?.startsWith(u())??!1}}return!1}var P=(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Errored=2]="Errored",e))(P||{});class x extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}class E extends Error{name="TimeoutError";constructor(e="Timeout"){super(e)}}let M=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var A=(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(A||{}),C=(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(C||{}),G=(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(G||{});class k{[n.immerable]=!0;static keys=new Set(Object.values(G));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new k(this.value,this.operation);return n.property=e,n.process=t,n}}class _{static immer=(()=>{n.enablePatches();const e=new n.Immer;return e.setAutoFreeze(!1),e})();static tag="κ";static id=M}function R(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function N(e){if(t.G.isNullable(e)||L(e))return e;if(t.G.isArray(e))return e.map(e=>N(e));if(t.G.isObject(e)&&T(e)){const t=Object.entries(e).map(([e,t])=>[e,N(t)]);return{...Object.fromEntries(t),[_.tag]:e[_.tag]??_.id()}}return e}function U(e){if(Array.isArray(e))return e.filter(e=>_.tag in e).map(e=>e[_.tag]??"").join(",");const t=e[_.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function T(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function L(e){return t.G.isNullable(e)||t.G.isString(e)||t.G.isNumber(e)||t.G.isBoolean(e)||"symbol"==typeof e||"bigint"==typeof e}function B(e,n,r,o,s,c){return function i(a,u=n.path){if(a instanceof k){const n=R(r,u.join("."));if(Object.entries(a).filter(([e,t])=>!k.keys.has(e)&&t instanceof k).forEach(([e,t])=>i(t,u.concat(e))),L(a.value)){if(e===C.Hydrate)return a.value;const i=u.slice(0,-1),l=i.length>0?R(r,i.join(".")):r;return t.G.isNullable(l)||F(l,a,u.at(-1),o,s,c),n??a.value}if(e===C.Hydrate){const e=N(i(a.value,u));return F(e,a,null,o,s,c),e}const l=n??N(a.value);return F(l,a,null,o,s,c),t.G.isNullable(n)?l:(i(a.value,u),n)}if(t.G.isArray(a))return a.map((e,t)=>i(e,u.concat(t)));if(t.G.isObject(a)&&!T(a))return a;if(t.G.isObject(a)){const t=Object.entries(a).map(([e,t])=>[e,i(t,u.concat(e))]),n=Object.fromEntries(t);if(e===C.Hydrate){const e=N(n);return Object.entries(a).forEach(([t,n])=>{n instanceof k&&L(n.value)&&F(e,n,t,o,s,c)}),e}return n}return a}(n.value)}function F(e,t,n,r,o,s){const c=s(e),i=o.get(c)??[];o.set(c,[t.assign(n,r),...i])}class W{#e={};#t;#n=new Map;#r=new Set;#o=!1;constructor(e=U){this.#t=e}static pk(){return M()}static"κ"=W.pk;annotate(e,t){return new k(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(e,n,r,o,s){function c(o){const s=o.at(-1),c=R(e(),o),i=o.slice(0,-1),a=t.A.isNotEmpty(i)?R(e(),i):e();return[...t.G.isObject(c)||t.G.isArray(c)?n.get(r(c))?.filter(e=>t.G.isNullable(e.property))??[]:[],...t.G.isObject(a)?n.get(r(a))?.filter(e=>e.property===s)??[]:[]]}return function n(r){return new Proxy(()=>{},{get:(i,a)=>"pending"===a?()=>!t.A.isEmpty(c(r)):"remaining"===a?()=>t.A.length(c(r)):"box"===a?()=>({value:R(e(),r),inspect:n(r)}):"is"===a?e=>c(r).some(t=>0!==(t.operation&e)):"draft"===a?()=>t.A.head(c(r))?.value??R(e(),r):"settled"===a?()=>new Promise(n=>{if(t.A.isEmpty(c(r)))return n(R(e(),r));const i=()=>{t.A.isEmpty(c(r))&&(s(i),n(R(e(),r)))};o(i)}):n([...r,String(a)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#s(C.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#s(C.Produce,e)}#s(e,t){const n=Symbol("process"),[,r]=_.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>_.immer.applyPatches(t,[{...r,value:B(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=N(this.#e),this.#c(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.A.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#c()}#c(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const $=new W;function z(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var H,I={exports:{}},D=(H||(H=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function s(e,t,r,s,c){if("function"!=typeof r)throw new TypeError("The listener must be a function");var i=new o(r,s||e,c),a=n?n+t:t;return e._events[a]?e._events[a].fn?e._events[a]=[e._events[a],i]:e._events[a].push(i):(e._events[a]=i,e._eventsCount++),e}function c(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function i(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),i.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},i.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,s=new Array(o);r<o;r++)s[r]=t[r].fn;return s},i.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},i.prototype.emit=function(e,t,r,o,s,c){var i=n?n+e:e;if(!this._events[i])return!1;var a,u,l=this._events[i],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,s),!0;case 6:return l.fn.call(l.context,t,r,o,s,c),!0}for(u=1,a=new Array(f-1);u<f;u++)a[u-1]=arguments[u];l.fn.apply(l.context,a)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!a)for(d=1,a=new Array(f-1);d<f;d++)a[d-1]=arguments[d];l[u].fn.apply(l[u].context,a)}}return!0},i.prototype.on=function(e,t,n){return s(this,e,t,n,!1)},i.prototype.once=function(e,t,n){return s(this,e,t,n,!0)},i.prototype.removeListener=function(e,t,r,o){var s=n?n+e:e;if(!this._events[s])return this;if(!t)return c(this,s),this;var i=this._events[s];if(i.fn)i.fn!==t||o&&!i.once||r&&i.context!==r||c(this,s);else{for(var a=0,u=[],l=i.length;a<l;a++)(i[a].fn!==t||o&&!i[a].once||r&&i[a].context!==r)&&u.push(i[a]);u.length?this._events[s]=1===u.length?u[0]:u:c(this,s)}return this},i.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&c(this,t):(this._events=new r,this._eventsCount=0),this},i.prototype.off=i.prototype.removeListener,i.prototype.addListener=i.prototype.on,i.prefixed=n,i.EventEmitter=i,e.exports=i}(I)),I.exports);const q=z(D);class J extends q{cache=new Map;emit(e,...t){return this.cache.set(e,t[0]),super.emit(e,...t)}setCache(e,t){this.cache.set(e,t)}getCached(e){return this.cache.get(e)}fire(e,...t){return super.emit(e,...t)}}const V=c.createContext(new J);function K(){return c.useContext(V)}function Q({children:e}){const t=c.useMemo(()=>new J,[]);return r.jsx(V.Provider,{value:t,children:e})}const X=c.createContext(new Set);function Y({children:e}){const t=c.useMemo(()=>new Set,[]);return r.jsx(X.Provider,{value:t,children:e})}const Z=c.createContext({current:null});function ee({children:e}){const t=c.useRef(null);return r.jsx(Z.Provider,{value:t,children:e})}const te=c.createContext(null);function ne(){return c.useContext(te)}function re(e,t){return e?.get(t)??null}const oe=Symbol(((e="")=>`march-hare/replay${e}`)());function se(e,t,...n){e instanceof J&&e.setCache(t,n[0]);const r=e.listeners(t);return 0===r.length?Promise.resolve():Promise.all(r.map(e=>Promise.resolve(e(...n)))).then(()=>{})}function ce(e,t){for(const n of e.keys())if(O(n)===t)return n;return null}function ie(){const[,e]=c.useReducer(e=>e+1,0);return e}function ae(e){if(e instanceof Error){if("TimeoutError"===e.name)return P.Timedout;if("AbortError"===e.name)return P.Supplanted}return P.Errored}const ue=c.createContext(new Map);function le({action:e,renderer:n}){const r=K(),o=c.useContext(ue),s=ie(),i=c.useMemo(()=>{const t=o.get(e);if(t)return t;const n={state:new W,listeners:new Set};return o.set(e,n),n},[e,o]);c.useLayoutEffect(()=>{function t(e){i.state.hydrate({value:e}),i.listeners.forEach(e=>e())}return i.listeners.add(s),r.on(e,t),()=>{i.listeners.delete(s),r.off(e,t)}},[e,r,i]);const a=i.state.model?.value;return t.G.isNullable(a)?null:n(a,i.state.inspect.value)}function fe(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new x);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new x)},{once:!0})})}async function de(e,t,n){if(t?.aborted)throw new x;for(;;){if(await n())return;await fe(e,t)}}function pe(e){return e?Boolean(e&&"symbol"!=typeof e):Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const he=Object.freeze(Object.defineProperty({__proto__:null,pk:pe,poll:de,sleep:fe,"ζ":fe,"κ":pe,"π":de},Symbol.toStringTag,{value:"Module"}));e.AbortError=x,e.Action=(e,t=m.Unicast)=>{const n=t===m.Broadcast?Symbol(a(e)):t===m.Multicast?Symbol(u(e)):Symbol(i(e)),r=function(e){return{[f.Action]:n,[f.Payload]:void 0,[f.Channel]:e,channel:e}};return Object.defineProperty(r,f.Action,{value:n,enumerable:!1}),Object.defineProperty(r,f.Payload,{value:void 0,enumerable:!1}),t===m.Broadcast&&Object.defineProperty(r,f.Broadcast,{value:!0,enumerable:!1}),t===m.Multicast&&Object.defineProperty(r,f.Multicast,{value:!0,enumerable:!1}),r},e.Boundary=function({children:e}){return r.jsx(Q,{children:r.jsx(ee,{children:r.jsx(Y,{children:e})})})},e.Distribution=m,e.Lifecycle=h,e.Op=A,e.Operation=A,e.Reason=P,e.Resource=function(e,t){const n=new Map;let r=null,o=null;return Object.freeze({key:e,run:e=>{const s=JSON.stringify(e),c=n.get(s);if(c)return c;const i=t(e).then(e=>(n.get(s)===i&&n.delete(s),r=e,o=Temporal.Now.instant(),e),e=>{throw n.get(s)===i&&n.delete(s),e});return n.set(s,i),i},get data(){return r},get at(){return o}})},e.State=W,e.TimeoutError=E,e.With={Update:e=>(t,n)=>{t.actions.produce(t=>{t.model[e]=n})},Invert:e=>t=>{t.actions.produce(t=>{t.model[e]=!t.model[e]})}},e.annotate=function(e,t=A.Update){return $.annotate(t,e)},e.useActions=function(...e){const n=t.G.isUndefined(e[0])||t.G.isFunction(e[0])?{}:e[0],r=t.G.isFunction(e[0])?e[0]:e[1]??(()=>({})),o=K(),s=ne(),i=c.useContext(X),a=ie(),u=c.useRef(!1),l=c.useRef(null),f=c.useRef(new W);u.current||(u.current=!0,l.current=f.current.hydrate(n));const[d,h]=c.useState(()=>f.current.model),m=function(e){const t=c.useRef(e);return c.useLayoutEffect(()=>{t.current=e},[e]),c.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(r()),y=c.useMemo(()=>new q,[]),O=c.useRef({handlers:new Map});O.current.handlers=new Map;const P=function(){const e=c.useRef(new Set),t=c.useRef(new Set);return c.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),x=c.useRef(b.Mounting),E=c.useRef(new Set),M=c.useRef(0),C=c.useCallback((e,t,n)=>{const r=new AbortController,c={controller:r,action:e,payload:t};return i.add(c),E.current.add(c),{model:f.current.model,get phase(){return x.current},task:c,data:m,tasks:i,actions:{produce(e){if(r.signal.aborted)return;const t=f.current.produce(t=>{e({model:t,inspect:f.current.inspect})});h(f.current.model),n.processes.add(t),l.current&&(n.processes.add(l.current),l.current=null)},dispatch(e,t){if(r.signal.aborted)return Promise.resolve();const n=v(e),c=j(e)?e.channel:void 0;if(S(e)){const e=re(s,n);return e?se(e.emitter,n,t,c):Promise.resolve()}return se(g(e)?o:y,n,t,c)},annotate:(e,t=A.Update)=>f.current.annotate(t,e),async resolution(e){if(r.signal.aborted)return null;const t=v(e),n=S(e)?re(s,t)?.emitter??null:o;if(!n)return null;if(void 0===n.getCached(t))return null;const c=w(e),i="unknown"!==c?c[0].toLowerCase()+c.slice(1):null;if(i){const e=f.current.inspect[i];e?.pending?.()&&await new Promise((t,n)=>{if(r.signal.aborted)return void n(r.signal.reason);const o=()=>n(r.signal.reason);r.signal.addEventListener("abort",o,{once:!0}),e.settled().then(()=>{r.signal.removeEventListener("abort",o),t()})})}return n.getCached(t)??null},peek(e){if(r.signal.aborted)return null;const t=v(e),n=S(e)?re(s,t)?.emitter??null:o;return n?n.getCached(t)??null:null}}}},[d]);c.useLayoutEffect(()=>{function e(e,n,r){return function(s,c){const u=r();if(c===oe&&t.G.isNotNullable(u))return;if(t.G.isNotNullable(c)&&c!==oe&&t.G.isNotNullable(u)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(c,u))return;const l={processes:new Set},d=Promise.withResolvers(),h=C(e,s,l);function m(t){const n=ce(O.current.handlers,"Error"),r=null!==n,s={reason:ae(t),error:(c=t,c instanceof Error?c:new Error(String(c))),action:w(e),handled:r,tasks:i};var c;o.fire(p,s),r&&n&&y.emit(n,s)}function b(){for(const e of i)if(e===h.task){i.delete(e),E.current.delete(e);break}l.processes.forEach(e=>f.current.prune(e)),l.processes.size>0&&a(),d.resolve()}let v;try{v=n(h,s)}catch(g){return m(g),void b()}if(!function(e){if(!e||"object"!=typeof e)return!1;const t=Object.prototype.toString.call(e);return"[object Generator]"===t||"[object AsyncGenerator]"===t}(v))return Promise.resolve(v).catch(m).finally(b),d.promise;(async()=>{for await(const e of v);})().catch(m).finally(b)}}M.current++;const n=new Set;return O.current.handlers.forEach((t,r)=>{for(const{getChannel:c,handler:i}of t){const t=e(r,i,c);if(S(r)){if(s)for(const e of s.values()){const o=e.emitter;o.on(r,t),n.add(()=>o.off(r,t))}y.on(r,t),P.multicast.add(r),n.add(()=>y.off(r,t))}else g(r)?(o.on(r,t),y.on(r,t),P.broadcast.add(r),n.add(()=>{o.off(r,t),y.off(r,t)})):(y.on(r,t),n.add(()=>y.off(r,t)))}}),()=>{const e=++M.current,t=new Set(n);queueMicrotask(()=>{if(M.current!==e){for(const e of t)e();return}for(const e of E.current)e.controller.abort(),i.delete(e);E.current.clear(),x.current=b.Unmounting;const n=ce(O.current.handlers,"Unmount");n&&y.emit(n),x.current=b.Unmounted;for(const e of t)e()})}},[y]),function({unicast:e,broadcast:n,dispatchers:r,scope:o,phase:s,data:i,handlers:a}){const u=c.useRef(null);c.useLayoutEffect(()=>{if(s.current===b.Mounted)return;s.current=b.Mounting;const c=ce(a,"Mount");c&&e.emit(c),r.broadcast.forEach(r=>{const o=n.getCached(r);t.G.isNullable(o)||e.emit(r,o,oe)}),o&&r.multicast.forEach(n=>{for(const r of o.values()){const o=r.emitter.getCached(n);t.G.isNullable(o)||e.emit(n,o,oe)}}),s.current=b.Mounted},[]),c.useLayoutEffect(()=>{if(t.G.isNotNullable(u.current)){const n=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(u.current,i);if(t.A.isNotEmpty(Object.keys(n))){const t=ce(a,"Update");t&&e.emit(t,n)}}u.current=i},[i,e])}({unicast:y,broadcast:o,dispatchers:P,scope:s,phase:x,data:r(),handlers:O.current.handlers});const G=c.useMemo(()=>[d,{dispatch(e,t){const n=v(e),r=j(e)?e.channel:void 0;if(S(e)){const e=re(s,n);return e?se(e.emitter,n,t,r):Promise.resolve()}return se(g(e)?o:y,n,t,r)},get inspect(){return f.current.inspect},stream:(e,t)=>c.createElement(le,{action:v(e),renderer:t})}],[d,y]);return G.useAction=(e,t)=>{!function(e,t,n){const r=c.useRef(n);c.useLayoutEffect(()=>{r.current=n});const o=c.useRef(t);c.useLayoutEffect(()=>{o.current=t});const s=c.useCallback((e,t)=>r.current(e,t),[]),i=c.useCallback(()=>j(o.current)?o.current.channel:void 0,[]),a=v(t),u=e.current.handlers.get(a)??new Set;0===u.size&&e.current.handlers.set(a,u),u.add({getChannel:i,handler:s})}(O,e,t)},G.useResource=e=>{const t=c.useMemo(()=>{const t=t=>e.run(t??{});return Object.assign(t,{if:(n,r)=>{const{data:o,at:s}=e;if(null!==s&&null!==o){const e=Temporal.Now.instant().since(s),t=Temporal.Duration.from(n.over);if(Temporal.Duration.compare(e,t)<=0)return Promise.resolve(o)}return t(r)}})},[e]);return c.useMemo(()=>Object.freeze({run:t,get data(){return e.data},get at(){return e.at}}),[e,t])},G},e.useMode=function(){const e=c.useContext(Z);return c.useMemo(()=>({read:()=>e.current,update(t){e.current=t}}),[e])},e.utils=he,e.withScope=function(e,t){const n=`Scoped${t.displayName||t.name||"Component"}`,o=v(e);return{[n](e){const n=ne(),s=c.useMemo(()=>({action:o,emitter:new J}),[]),i=c.useMemo(()=>{const e=new Map(n??[]);return e.set(o,s),e},[n,s]);return r.jsx(te.Provider,{value:i,children:r.jsx(t,{...e})})}}[n]},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})},"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("@mobily/ts-belt"),require("immer"),require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["exports","@mobily/ts-belt","immer","react/jsx-runtime","react"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).MarchHare={},global.TsBelt,global.Immer,global.jsxRuntime,global.React);
|
|
1
|
+
var global,factory;global=this,factory=function(e,t,n,r,o){"use strict";function s(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const n in e)if("default"!==n){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}return t.default=e,Object.freeze(t)}const c=s(o),a=(e="")=>`march-hare.action/${e}`,i=(e="")=>`march-hare.action/broadcast/${e}`,u=(e="")=>`march-hare.action/multicast/${e}`,l=(e="")=>`march-hare.action.lifecycle/${e}`;class f{static Payload=Symbol("march-hare.brand/Payload");static Broadcast=Symbol("march-hare.brand/Broadcast");static Multicast=Symbol("march-hare.brand/Multicast");static Action=Symbol("march-hare.brand/Action");static Channel=Symbol("march-hare.brand/Channel");static Name=Symbol("march-hare.brand/Name")}function d(e){const t=Symbol(`march-hare.action.lifecycle/${e}`),n=function(n){return{[f.Action]:t,[f.Payload]:void 0,[f.Channel]:n,[f.Name]:e,channel:n}};return Object.defineProperty(n,f.Action,{value:t,enumerable:!1}),Object.defineProperty(n,f.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(n,f.Name,{value:e,enumerable:!1}),n}const p=Symbol(i("Fault"));class h{static Mount(){return d("Mount")}static Unmount(){return d("Unmount")}static Error(){return d("Error")}static Update(){return d("Update")}static Fault=(()=>{const e={};return Object.defineProperty(e,f.Action,{value:p,enumerable:!1}),Object.defineProperty(e,f.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(e,f.Broadcast,{value:!0,enumerable:!1}),Object.defineProperty(e,f.Name,{value:"Fault",enumerable:!1}),e})()}var m=(e=>(e.Unicast="unicast",e.Broadcast="broadcast",e.Multicast="multicast",e))(m||{}),b=(e=>(e.Mounting="mounting",e.Mounted="mounted",e.Unmounting="unmounting",e.Unmounted="unmounted",e))(b||{});const y=e=>"symbol"==typeof e;function v(e){return t.G.isString(e)||y(e)?e:(t.G.isObject(e)||t.G.isFunction(e))&&f.Action in e?e[f.Action]:e}function g(e){if(t.G.isString(e))return e.startsWith(i());if(y(e))return e.description?.startsWith(i())??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(f.Broadcast in e&&e[f.Broadcast])return!0;if(f.Action in e){const t=e[f.Action];return t.description?.startsWith(i())??!1}}return!1}function w(e){const n=v(e),r=t.G.isString(n)?n:n.description??"";return r.startsWith(a())&&r.slice(r.lastIndexOf("/")+1)||"unknown"}function j(e){return t.G.isObject(e)&&f.Channel in e&&"channel"in e}function O(e){const t=v(e),n=y(t)?t.description??"":t;return n.startsWith(l())&&n.slice(l().length)||null}function S(e){if(t.G.isString(e))return e.startsWith(u());if(y(e))return e.description?.startsWith(u())??!1;if(t.G.isObject(e)||t.G.isFunction(e)){if(f.Multicast in e&&e[f.Multicast])return!0;if(f.Action in e){const t=e[f.Action];return t.description?.startsWith(u())??!1}}return!1}var x=(e=>(e[e.Timedout=0]="Timedout",e[e.Supplanted=1]="Supplanted",e[e.Errored=2]="Errored",e))(x||{});class P extends Error{name="AbortError";constructor(e="Aborted"){super(e)}}class E extends Error{name="TimeoutError";constructor(e="Timeout"){super(e)}}let M=(e=21)=>{let t="",n=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[63&n[e]];return t};var A=(e=>(e[e.Add=1]="Add",e[e.Remove=2]="Remove",e[e.Update=4]="Update",e[e.Move=8]="Move",e[e.Replace=16]="Replace",e[e.Sort=32]="Sort",e[e.Create=64]="Create",e[e.Fetch=128]="Fetch",e[e.Clone=256]="Clone",e[e.Archive=512]="Archive",e[e.Restore=1024]="Restore",e[e.Merge=2048]="Merge",e[e.Reorder=4096]="Reorder",e[e.Sync=8192]="Sync",e[e.Publish=16384]="Publish",e[e.Link=32768]="Link",e[e.Unlink=65536]="Unlink",e[e.Lock=131072]="Lock",e[e.Unlock=262144]="Unlock",e[e.Import=524288]="Import",e[e.Export=1048576]="Export",e[e.Transfer=2097152]="Transfer",e))(A||{}),C=(e=>(e[e.Produce=0]="Produce",e[e.Hydrate=1]="Hydrate",e))(C||{}),G=(e=>(e.Property="property",e.Process="process",e.Value="value",e.Operation="operation",e))(G||{});class k{[n.immerable]=!0;static keys=new Set(Object.values(G));property=null;process=null;value;operation;constructor(e,t){this.value=e,this.operation=t}assign(e,t){const n=new k(this.value,this.operation);return n.property=e,n.process=t,n}}class N{static immer=(()=>{n.enablePatches();const e=new n.Immer;return e.setAutoFreeze(!1),e})();static tag="κ";static id=M}function _(e,t){const n="string"==typeof t?""===t?[]:t.split("."):t;let r=e;for(const o of n){if(null==r)return;r=r[o]}return r}function R(e){if(t.G.isNullable(e)||L(e))return e;if(t.G.isArray(e))return e.map(e=>R(e));if(t.G.isObject(e)&&U(e)){const t=Object.entries(e).map(([e,t])=>[e,R(t)]);return{...Object.fromEntries(t),[N.tag]:e[N.tag]??N.id()}}return e}function T(e){if(Array.isArray(e))return e.filter(e=>N.tag in e).map(e=>e[N.tag]??"").join(",");const t=e[N.tag];if(t)return t;try{return JSON.stringify(e)}catch{return`[unserializable:${typeof e}]`}}function U(e){const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function L(e){return t.G.isNullable(e)||t.G.isString(e)||t.G.isNumber(e)||t.G.isBoolean(e)||"symbol"==typeof e||"bigint"==typeof e}function B(e,n,r,o,s,c){return function a(i,u=n.path){if(i instanceof k){const n=_(r,u.join("."));if(Object.entries(i).filter(([e,t])=>!k.keys.has(e)&&t instanceof k).forEach(([e,t])=>a(t,u.concat(e))),L(i.value)){if(e===C.Hydrate)return i.value;const a=u.slice(0,-1),l=a.length>0?_(r,a.join(".")):r;return t.G.isNullable(l)||F(l,i,u.at(-1),o,s,c),n??i.value}if(e===C.Hydrate){const e=R(a(i.value,u));return F(e,i,null,o,s,c),e}const l=n??R(i.value);return F(l,i,null,o,s,c),t.G.isNullable(n)?l:(a(i.value,u),n)}if(t.G.isArray(i))return i.map((e,t)=>a(e,u.concat(t)));if(t.G.isObject(i)&&!U(i))return i;if(t.G.isObject(i)){const t=Object.entries(i).map(([e,t])=>[e,a(t,u.concat(e))]),n=Object.fromEntries(t);if(e===C.Hydrate){const e=R(n);return Object.entries(i).forEach(([t,n])=>{n instanceof k&&L(n.value)&&F(e,n,t,o,s,c)}),e}return n}return i}(n.value)}function F(e,t,n,r,o,s){const c=s(e),a=o.get(c)??[];o.set(c,[t.assign(n,r),...a])}class W{#e={};#t;#n=new Map;#r=new Set;#o=!1;constructor(e=T){this.#t=e}static pk(){return M()}static"κ"=W.pk;annotate(e,t){return new k(t,e)}"δ"=this.annotate;get model(){return this.#e}get inspect(){return function(e,n,r,o,s){function c(o){const s=o.at(-1),c=_(e(),o),a=o.slice(0,-1),i=t.A.isNotEmpty(a)?_(e(),a):e();return[...t.G.isObject(c)||t.G.isArray(c)?n.get(r(c))?.filter(e=>t.G.isNullable(e.property))??[]:[],...t.G.isObject(i)?n.get(r(i))?.filter(e=>e.property===s)??[]:[]]}return function n(r){return new Proxy(()=>{},{get:(a,i)=>"pending"===i?()=>!t.A.isEmpty(c(r)):"remaining"===i?()=>t.A.length(c(r)):"box"===i?()=>({value:_(e(),r),inspect:n(r)}):"is"===i?e=>c(r).some(t=>0!==(t.operation&e)):"draft"===i?()=>t.A.head(c(r))?.value??_(e(),r):"settled"===i?()=>new Promise(n=>{if(t.A.isEmpty(c(r)))return n(_(e(),r));const a=()=>{t.A.isEmpty(c(r))&&(s(a),n(_(e(),r)))};o(a)}):n([...r,String(i)])})}([])}(()=>this.#e,this.#n,this.#t,e=>this.#r.add(e),e=>this.#r.delete(e))}hydrate(e){return this.#o=!0,this.#s(C.Hydrate,()=>e)}produce(e){if(!this.#o)throw new Error("State must be hydrated using hydrate() before calling produce()");return this.#s(C.Produce,e)}#s(e,t){const n=Symbol("process"),[,r]=N.immer.produceWithPatches(this.#e,t);return this.#e=r.reduce((t,r)=>N.immer.applyPatches(t,[{...r,value:B(e,r,t,n,this.#n,this.#t)}]),this.#e),this.#e=R(this.#e),this.#c(),n}prune(e){this.#n.forEach((n,r)=>{const o=n.filter(t=>t.process!==e);t.A.isEmpty(o)?this.#n.delete(r):this.#n.set(r,o)}),this.#c()}#c(){this.#r.forEach(e=>e())}observe(e){const t=()=>e(this.#e);return this.#r.add(t),()=>this.#r.delete(t)}}const $=new W;function D(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var I,H={exports:{}},q=(I||(I=1,function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function s(e,t,r,s,c){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new o(r,s||e,c),i=n?n+t:t;return e._events[i]?e._events[i].fn?e._events[i]=[e._events[i],a]:e._events[i].push(a):(e._events[i]=a,e._eventsCount++),e}function c(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},a.prototype.listeners=function(e){var t=this._events[n?n+e:e];if(!t)return[];if(t.fn)return[t.fn];for(var r=0,o=t.length,s=new Array(o);r<o;r++)s[r]=t[r].fn;return s},a.prototype.listenerCount=function(e){var t=this._events[n?n+e:e];return t?t.fn?1:t.length:0},a.prototype.emit=function(e,t,r,o,s,c){var a=n?n+e:e;if(!this._events[a])return!1;var i,u,l=this._events[a],f=arguments.length;if(l.fn){switch(l.once&&this.removeListener(e,l.fn,void 0,!0),f){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,t),!0;case 3:return l.fn.call(l.context,t,r),!0;case 4:return l.fn.call(l.context,t,r,o),!0;case 5:return l.fn.call(l.context,t,r,o,s),!0;case 6:return l.fn.call(l.context,t,r,o,s,c),!0}for(u=1,i=new Array(f-1);u<f;u++)i[u-1]=arguments[u];l.fn.apply(l.context,i)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(e,l[u].fn,void 0,!0),f){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,t);break;case 3:l[u].fn.call(l[u].context,t,r);break;case 4:l[u].fn.call(l[u].context,t,r,o);break;default:if(!i)for(d=1,i=new Array(f-1);d<f;d++)i[d-1]=arguments[d];l[u].fn.apply(l[u].context,i)}}return!0},a.prototype.on=function(e,t,n){return s(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return s(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,o){var s=n?n+e:e;if(!this._events[s])return this;if(!t)return c(this,s),this;var a=this._events[s];if(a.fn)a.fn!==t||o&&!a.once||r&&a.context!==r||c(this,s);else{for(var i=0,u=[],l=a.length;i<l;i++)(a[i].fn!==t||o&&!a[i].once||r&&a[i].context!==r)&&u.push(a[i]);u.length?this._events[s]=1===u.length?u[0]:u:c(this,s)}return this},a.prototype.removeAllListeners=function(e){var t;return e?this._events[t=n?n+e:e]&&c(this,t):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(H)),H.exports);const z=D(q);class J extends z{cache=new Map;emit(e,...t){return this.cache.set(e,t[0]),super.emit(e,...t)}setCache(e,t){this.cache.set(e,t)}getCached(e){return this.cache.get(e)}fire(e,...t){return super.emit(e,...t)}}const K=c.createContext(new J);function V(){return c.useContext(K)}function Q({children:e}){const t=c.useMemo(()=>new J,[]);return r.jsx(K.Provider,{value:t,children:e})}const X=c.createContext(new Set);function Y({children:e}){const t=c.useMemo(()=>new Set,[]);return r.jsx(X.Provider,{value:t,children:e})}const Z=c.createContext({current:{}});function ee(){const e=c.useContext(Z);return c.useMemo(()=>new Proxy({},{get:(t,n)=>Reflect.get(e.current,n),has:(t,n)=>n in e.current,ownKeys:()=>Reflect.ownKeys(e.current),getOwnPropertyDescriptor(t,n){const r=Object.getOwnPropertyDescriptor(e.current,n);if(void 0!==r)return{...r,configurable:!0}},set(){throw new TypeError("Store is read-only outside `context.actions.produce`. Mutate via produce(({ store }) => { store.x = ... }) instead.")}}),[e])}function te({initial:e,children:t}){const n=c.useRef(e);return r.jsx(Z.Provider,{value:n,children:t})}const ne=c.createContext(null);function re(){return c.useContext(ne)}function oe(e,t){return e?.get(t)??null}const se=Symbol(((e="")=>`march-hare/replay${e}`)());function ce(e,t,...n){e instanceof J&&e.setCache(t,n[0]);const r=e.listeners(t);return 0===r.length?Promise.resolve():Promise.all(r.map(e=>Promise.resolve(e(...n)))).then(()=>{})}function ae(e,t){for(const n of e.keys())if(O(n)===t)return n;return null}const ie=Symbol("march-hare.unset");function ue(){const[,e]=c.useReducer(e=>e+1,0);return e}function le(){return{data:ie,at:null,else:e=>e}}function fe(e,t){return{data:e,at:t,else:t=>e}}function de(e){if(e instanceof Error){if("TimeoutError"===e.name)return x.Timedout;if("AbortError"===e.name)return x.Supplanted}return x.Errored}function pe(e){const t=new Map,n=e??{get:e=>t.get(e)??null,set:(e,n)=>{t.set(e,n)},remove:e=>{t.delete(e)},clear:()=>{t.clear()}};return{get(e){try{const t=n.get(e);if(null===t)return le();const r=JSON.parse(t);return fe(r.data,Temporal.Instant.from(r.at))}catch{return le()}},set(e,t){if(t.data===ie||null===t.at)return!1;try{return n.set(e,JSON.stringify({data:t.data,at:t.at.toString()})),!0}catch{return!1}},remove(e){n.remove(e)},clear(){n.clear()}}}function he(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(new P);const o=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(o),r(new P)},{once:!0})})}async function me(e,t,n){if(t?.aborted)throw new P;for(;;){if(await n())return;await he(e,t)}}function be(e){return e?Boolean(e&&"symbol"!=typeof e):Symbol(`pk.${Date.now()}.${crypto.randomUUID()}`)}const ye=Object.freeze(Object.defineProperty({__proto__:null,pk:be,poll:me,sleep:he,unset:ie,"ζ":he,"κ":be,"π":me},Symbol.toStringTag,{value:"Module"})),ve=new WeakMap;function ge(e){return JSON.stringify(e)}let we=null;function je(){if(null===we)throw new Error("context.actions.resource(...) and context.actions.resource.set(...) must be called with a fresh resource invocation, e.g. context.actions.resource(cat({ id: 5 })).");const e=we;return we=null,e}const Oe=c.createContext(new Map);function Se({action:e,renderer:n}){const r=V(),o=c.useContext(Oe),s=ue(),a=c.useMemo(()=>{const t=o.get(e);if(t)return t;const n={state:new W,listeners:new Set};return o.set(e,n),n},[e,o]);c.useLayoutEffect(()=>{function t(e){a.state.hydrate({value:e}),a.listeners.forEach(e=>e())}return a.listeners.add(s),r.on(e,t),()=>{a.listeners.delete(s),r.off(e,t)}},[e,r,a]);const i=a.state.model?.value;return t.G.isNullable(i)?null:n(i,a.state.inspect.value)}e.AbortError=P,e.Action=(e,t=m.Unicast)=>{const n=t===m.Broadcast?Symbol(i(e)):t===m.Multicast?Symbol(u(e)):Symbol(a(e)),r=function(t){return{[f.Action]:n,[f.Payload]:void 0,[f.Channel]:t,[f.Name]:e,channel:t}};return Object.defineProperty(r,f.Action,{value:n,enumerable:!1}),Object.defineProperty(r,f.Payload,{value:void 0,enumerable:!1}),Object.defineProperty(r,f.Name,{value:e,enumerable:!1}),t===m.Broadcast&&Object.defineProperty(r,f.Broadcast,{value:!0,enumerable:!1}),t===m.Multicast&&Object.defineProperty(r,f.Multicast,{value:!0,enumerable:!1}),r},e.Boundary=function({store:e,children:t}){return r.jsx(Q,{children:r.jsx(te,{initial:e??{},children:r.jsx(Y,{children:t})})})},e.Cache=pe,e.Distribution=m,e.Lifecycle=h,e.Op=A,e.Operation=A,e.Reason=x,e.Resource=function(e,t){const n=t??function(e){let t=ve.get(e);return void 0===t&&(t=pe(),ve.set(e,t)),t}(e),r=e=>{const t=n.get(ge(e));return t.data===ie||null===t.at?{data:ie,at:null}:{data:t.data,at:t.at}},o=(t,r,o)=>e({store:t,controller:r,params:o}).then(e=>(n.set(ge(o),fe(e,Temporal.Now.instant())),e)),s=(e,t,r)=>{n.set(ge(e),fe(t,r))};return function(e){const t=e??{};we={run:o,read:r,seed:s,params:t},queueMicrotask(()=>{null!==we&&we.params===t&&(we=null)});const{data:n}=r(t);return n===ie?null:n}},e.State=W,e.TimeoutError=E,e.With={Update:e=>(t,n)=>{t.actions.produce(t=>{t.model[e]=n})},Invert:e=>t=>{t.actions.produce(t=>{t.model[e]=!t.model[e]})}},e.annotate=function(e,t=A.Update){return $.annotate(t,e)},e.useActions=function(...e){const r=t.G.isUndefined(e[0])||t.G.isFunction(e[0])?{}:e[0],o=t.G.isFunction(e[0])?e[0]:e[1]??(()=>({})),s=V(),a=re(),i=c.useContext(X),u=ee(),l=c.useContext(Z),f=ue(),d=c.useRef(!1),h=c.useRef(null),m=c.useRef(new W);d.current||(d.current=!0,h.current=m.current.hydrate(r));const[y,O]=c.useState(()=>m.current.model),x=function(e){const t=c.useRef(e);return c.useLayoutEffect(()=>{t.current=e},[e]),c.useMemo(()=>{return n=t,Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>n.current[t],enumerable:!0}),e),{});var n},[e])}(o()),P=c.useMemo(()=>new z,[]),E=c.useRef({handlers:new Map});E.current.handlers=new Map;const M=function(){const e=c.useRef(new Set),t=c.useRef(new Set);return c.useMemo(()=>({broadcast:e.current,multicast:t.current}),[])}(),C=c.useRef(b.Mounting),G=c.useRef(new Set),k=c.useRef(0),N=c.useCallback((e,t,r)=>{const o=new AbortController,c={controller:o,action:e,payload:t};return i.add(c),G.current.add(c),{model:m.current.model,get phase(){return C.current},task:c,data:x,tasks:i,store:u,actions:{produce(e){if(o.signal.aborted)return;const t=m.current.produce(t=>{l.current=n.produce(l.current,n=>{e({model:t,inspect:m.current.inspect,store:n})})});O(m.current.model),r.processes.add(t),h.current&&(r.processes.add(h.current),h.current=null)},dispatch(e,t){if(o.signal.aborted)return Promise.resolve();const n=v(e),r=j(e)?e.channel:void 0;if(S(e)){const e=oe(a,n);return e?ce(e.emitter,n,t,r):Promise.resolve()}return ce(g(e)?s:P,n,t,r)},annotate:(e,t=A.Update)=>m.current.annotate(t,e),resource:Object.assign(function(e){const t=je(),n=()=>t.run(l.current,o,t.params);return{then:(e,t)=>n().then(e,t),exceeds:e=>{const{data:r,at:o}=t.read(t.params);if(r!==ie&&null!==o){const t=Temporal.Now.instant().since(o),n=Temporal.Duration.from(e);if(Temporal.Duration.compare(t,n)<=0)return Promise.resolve(r)}return n()}}},{set:(e,t)=>{const n=je();n.seed(n.params,t,Temporal.Now.instant())}}),async resolution(e){if(o.signal.aborted)return null;const t=v(e),n=S(e)?oe(a,t)?.emitter??null:s;if(!n)return null;if(void 0===n.getCached(t))return null;const r=w(e),c="unknown"!==r?r[0].toLowerCase()+r.slice(1):null;if(c){const e=m.current.inspect[c];e?.pending?.()&&await new Promise((t,n)=>{if(o.signal.aborted)return void n(o.signal.reason);const r=()=>n(o.signal.reason);o.signal.addEventListener("abort",r,{once:!0}),e.settled().then(()=>{o.signal.removeEventListener("abort",r),t()})})}return n.getCached(t)??null},peek(e){if(o.signal.aborted)return null;const t=v(e),n=S(e)?oe(a,t)?.emitter??null:s;return n?n.getCached(t)??null:null}}}},[y]);c.useLayoutEffect(()=>{function e(e,n,r){return function(o,c){const a=r();if(c===se&&t.G.isNotNullable(a))return;if(t.G.isNotNullable(c)&&c!==se&&t.G.isNotNullable(a)&&!function(e,t){for(const n of Object.keys(e))if(t[n]!==e[n])return!1;return!0}(c,a))return;const u={processes:new Set},l=Promise.withResolvers(),d=N(e,o,u);function h(t){const n=ae(E.current.handlers,"Error"),r=null!==n,o={reason:de(t),error:(c=t,c instanceof Error?c:new Error(String(c))),action:w(e),handled:r,tasks:i};var c;s.fire(p,o),r&&n&&P.emit(n,o)}function b(){for(const e of i)if(e===d.task){i.delete(e),G.current.delete(e);break}u.processes.forEach(e=>m.current.prune(e)),u.processes.size>0&&f(),l.resolve()}let y;try{y=n(d,o)}catch(v){return h(v),void b()}if(!function(e){if(!e||"object"!=typeof e)return!1;const t=Object.prototype.toString.call(e);return"[object Generator]"===t||"[object AsyncGenerator]"===t}(y))return Promise.resolve(y).catch(h).finally(b),l.promise;(async()=>{for await(const e of y);})().catch(h).finally(b)}}k.current++;const n=new Set;return E.current.handlers.forEach((t,r)=>{for(const{getChannel:o,handler:c}of t){const t=e(r,c,o);if(S(r)){if(a)for(const e of a.values()){const o=e.emitter;o.on(r,t),n.add(()=>o.off(r,t))}P.on(r,t),M.multicast.add(r),n.add(()=>P.off(r,t))}else g(r)?(s.on(r,t),P.on(r,t),M.broadcast.add(r),n.add(()=>{s.off(r,t),P.off(r,t)})):(P.on(r,t),n.add(()=>P.off(r,t)))}}),()=>{const e=++k.current,t=new Set(n);queueMicrotask(()=>{if(k.current!==e){for(const e of t)e();return}for(const e of G.current)e.controller.abort(),i.delete(e);G.current.clear(),C.current=b.Unmounting;const n=ae(E.current.handlers,"Unmount");n&&P.emit(n),C.current=b.Unmounted;for(const e of t)e()})}},[P]),function({unicast:e,broadcast:n,dispatchers:r,scope:o,phase:s,data:a,handlers:i}){const u=c.useRef(null);c.useLayoutEffect(()=>{if(s.current===b.Mounted)return;s.current=b.Mounting;const c=ae(i,"Mount");c&&e.emit(c),r.broadcast.forEach(r=>{const o=n.getCached(r);t.G.isNullable(o)||e.emit(r,o,se)}),o&&r.multicast.forEach(n=>{for(const r of o.values()){const o=r.emitter.getCached(n);t.G.isNullable(o)||e.emit(n,o,se)}}),s.current=b.Mounted},[]),c.useLayoutEffect(()=>{if(t.G.isNotNullable(u.current)){const n=function(e,t){return Object.keys(t).reduce((n,r)=>e[r]!==t[r]?{...n,[r]:t[r]}:n,{})}(u.current,a);if(t.A.isNotEmpty(Object.keys(n))){const t=ae(i,"Update");t&&e.emit(t,n)}}u.current=a},[a,e])}({unicast:P,broadcast:s,dispatchers:M,scope:a,phase:C,data:o(),handlers:E.current.handlers});const _=c.useMemo(()=>[y,{dispatch(e,t){const n=v(e),r=j(e)?e.channel:void 0;if(S(e)){const e=oe(a,n);return e?ce(e.emitter,n,t,r):Promise.resolve()}return ce(g(e)?s:P,n,t,r)},get inspect(){return m.current.inspect},stream:(e,t)=>c.createElement(Se,{action:v(e),renderer:t})}],[y,P]);return _.useAction=(e,t)=>{!function(e,t,n){const r=c.useRef(n);c.useLayoutEffect(()=>{r.current=n});const o=c.useRef(t);c.useLayoutEffect(()=>{o.current=t});const s=c.useCallback((e,t)=>r.current(e,t),[]),a=c.useCallback(()=>j(o.current)?o.current.channel:void 0,[]),i=v(t),u=e.current.handlers.get(i)??new Set;0===u.size&&e.current.handlers.set(i,u),u.add({getChannel:a,handler:s})}(E,e,t)},_},e.useStore=ee,e.utils=ye,e.withScope=function(e,t){const n=`Scoped${t.displayName||t.name||"Component"}`,o=v(e);return{[n](e){const n=re(),s=c.useMemo(()=>({action:o,emitter:new J}),[]),a=c.useMemo(()=>{const e=new Map(n??[]);return e.set(o,s),e},[n,s]);return r.jsx(ne.Provider,{value:a,children:r.jsx(t,{...e})})}}[n]},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})},"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("@mobily/ts-belt"),require("immer"),require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["exports","@mobily/ts-belt","immer","react/jsx-runtime","react"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).MarchHare={},global.TsBelt,global.Immer,global.jsxRuntime,global.React);
|