storion 0.18.0 → 0.20.1
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/CHANGELOG.md +72 -0
- package/dist/async/abortable-guard.d.ts +25 -0
- package/dist/async/abortable-guard.d.ts.map +1 -0
- package/dist/async/abortable.d.ts +2 -6
- package/dist/async/abortable.d.ts.map +1 -1
- package/dist/async/index.js +271 -6
- package/dist/async/safe.d.ts.map +1 -1
- package/dist/{async-D0oaIaAZ.js → async-BwwGEvA0.js} +1 -1
- package/dist/core/mixins.d.ts +59 -1
- package/dist/core/mixins.d.ts.map +1 -1
- package/dist/{effect-YVnKUiyL.js → effect-BK2j3cpd.js} +36 -298
- package/dist/{index-ZfO5JJi7.js → index-CMDQDIUy.js} +65 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/network/index.js +2 -2
- package/dist/react/index.js +200 -210
- package/dist/react/strictMode.d.ts +0 -1
- package/dist/react/strictMode.d.ts.map +1 -1
- package/dist/react/useStore.d.ts.map +1 -1
- package/dist/storion.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,78 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.20.1] - 2025-12-31
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Fixed circular dependency warnings in async module (Metro/Expo). Extracted `isAbortable` and `abortableSymbol` to separate `abortable-guard.ts` file, and changed `toPromise` import to source from `utils.ts` directly instead of `async.ts`.
|
|
15
|
+
|
|
16
|
+
- Fixed Hot Module Replacement (HMR) causing "store disposed" errors with `scoped()` stores. Both `normalStrategy` and `strictStrategy` now use deferred disposal (50ms and 100ms respectively) to allow HMR bundle loading to complete before disposal fires. Previously, `normalStrategy` disposed immediately on cleanup, which raced with Metro's async module reloading.
|
|
17
|
+
|
|
18
|
+
## [0.20.0] - 2025-12-30
|
|
19
|
+
|
|
20
|
+
## [0.19.0] - 2025-12-30
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- `mixins()` now accepts a `StoreSpec` and returns a proxy for accessing state properties and actions as mixins:
|
|
25
|
+
```ts
|
|
26
|
+
const userStore = store({
|
|
27
|
+
state: { name: "", age: 0 },
|
|
28
|
+
setup: ({ state }) => ({
|
|
29
|
+
setName: (name: string) => { state.name = name; },
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const proxy = mixins(userStore);
|
|
34
|
+
|
|
35
|
+
// Use in useStore
|
|
36
|
+
const { name, setName } = useStore(mixins({
|
|
37
|
+
name: proxy.name, // mixin for state.name
|
|
38
|
+
setName: proxy.setName, // mixin for actions.setName
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
// Equivalent to:
|
|
42
|
+
// const nameMixin = (ctx) => ctx.get(userStore)[0].name;
|
|
43
|
+
// const setNameMixin = (ctx) => ctx.get(userStore)[1].setName;
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
- `MixinProxy` now has a `select()` method for selecting multiple properties/actions:
|
|
47
|
+
```ts
|
|
48
|
+
const proxy = mixins(userStore);
|
|
49
|
+
|
|
50
|
+
// Array syntax - use property names as keys
|
|
51
|
+
const userMixin = proxy.select(["name", "age", "setName"]);
|
|
52
|
+
// Returns: (ctx) => ({ name: string, age: number, setName: function })
|
|
53
|
+
|
|
54
|
+
// Object syntax - map to custom keys
|
|
55
|
+
const userMixin = proxy.select({ userName: "name", userAge: "age", updateName: "setName" });
|
|
56
|
+
// Returns: (ctx) => ({ userName: string, userAge: number, updateName: function })
|
|
57
|
+
|
|
58
|
+
// Use in useStore
|
|
59
|
+
const { name, age, setName } = useStore(userMixin);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Mixins are cached when accessed, so `select()` reuses cached mixins for better performance.
|
|
63
|
+
|
|
64
|
+
- `mixins()` now accepts a `Factory` (service factory) and returns a proxy for accessing service properties as mixins:
|
|
65
|
+
```ts
|
|
66
|
+
const dbService = (resolver: Resolver) => ({
|
|
67
|
+
users: { getAll: () => [] },
|
|
68
|
+
posts: { getAll: () => [] },
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const proxy = mixins(dbService);
|
|
72
|
+
|
|
73
|
+
// Use in useStore
|
|
74
|
+
const { users } = useStore(mixins({
|
|
75
|
+
users: proxy.users, // mixin for service.users
|
|
76
|
+
}));
|
|
77
|
+
|
|
78
|
+
// Equivalent to:
|
|
79
|
+
// const usersMixin = (ctx) => ctx.get(dbService).users;
|
|
80
|
+
```
|
|
81
|
+
|
|
10
82
|
### Changed
|
|
11
83
|
|
|
12
84
|
- Updated React peer dependency requirement from `^18.0.0 || ^19.0.0` and development dependencies to React 19. The library now fully supports React 19's improved Suspense behavior and concurrent rendering.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abortable type guard and symbol.
|
|
3
|
+
*
|
|
4
|
+
* Extracted to a separate file to avoid circular dependencies
|
|
5
|
+
* between safe.ts and abortable.ts.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Symbol used to identify Abortable functions.
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare const abortableSymbol: unique symbol;
|
|
12
|
+
/**
|
|
13
|
+
* Check if a value is an Abortable function.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* if (isAbortable(fn)) {
|
|
18
|
+
* fn.withSignal(signal, ...args);
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function isAbortable(fn: unknown): fn is {
|
|
23
|
+
withSignal: Function;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=abortable-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abortable-guard.d.ts","sourceRoot":"","sources":["../../src/async/abortable-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,eAAO,MAAM,eAAe,eAAkC,CAAC;AAM/D;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI;IAAE,UAAU,EAAE,QAAQ,CAAA;CAAE,CAMvE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SafeFnWithUtils } from './safe';
|
|
2
|
+
import { abortableSymbol, isAbortable } from './abortable-guard';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
export { isAbortable };
|
|
4
5
|
export type AbortableStatus = "running" | "success" | "error" | "paused" | "waiting" | "aborted";
|
|
5
6
|
/**
|
|
6
7
|
* Send function type.
|
|
@@ -236,10 +237,6 @@ export interface Abortable<TArgs extends any[], TResult, TYield extends void | o
|
|
|
236
237
|
/** Type brand for discrimination */
|
|
237
238
|
readonly [abortableSymbol]: true;
|
|
238
239
|
}
|
|
239
|
-
/**
|
|
240
|
-
* Check if a value is an Abortable.
|
|
241
|
-
*/
|
|
242
|
-
export declare function isAbortable<TArgs extends any[], TResult, TYield extends void | object = void>(fn: unknown): fn is Abortable<TArgs, TResult, TYield>;
|
|
243
240
|
/**
|
|
244
241
|
* Error thrown when abortable is aborted.
|
|
245
242
|
*/
|
|
@@ -291,5 +288,4 @@ export declare class AbortableAbortedError extends Error {
|
|
|
291
288
|
* ```
|
|
292
289
|
*/
|
|
293
290
|
export declare function abortable<const TArgs extends any[], TResult, TYield extends void | object = void>(fn: AbortableFn<TArgs, TResult, TYield>): Abortable<TArgs, TResult, TYield>;
|
|
294
|
-
export {};
|
|
295
291
|
//# sourceMappingURL=abortable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/async/abortable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"abortable.d.ts","sourceRoot":"","sources":["../../src/async/abortable.ts"],"names":[],"mappings":"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"}
|
package/dist/async/index.js
CHANGED
|
@@ -1,6 +1,271 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
import { a, b, c } from "../async-BwwGEvA0.js";
|
|
5
|
+
import { a as abortableSymbol, c as createSafe, i as isAbortable, r as retryStrategy, d as dev } from "../effect-BK2j3cpd.js";
|
|
6
|
+
import { b as b2, A, g, t } from "../effect-BK2j3cpd.js";
|
|
7
|
+
class AbortableAbortedError extends Error {
|
|
8
|
+
constructor(message = "Abortable was aborted") {
|
|
9
|
+
super(message);
|
|
10
|
+
__publicField(this, "name", "AbortableAbortedError");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function createAbortableContext(controller, pauseState, takeState, setStatus) {
|
|
14
|
+
const signal = controller.signal;
|
|
15
|
+
const checkPauseAndAbort = async () => {
|
|
16
|
+
if (signal.aborted) {
|
|
17
|
+
throw new AbortableAbortedError();
|
|
18
|
+
}
|
|
19
|
+
if (pauseState.isPaused) {
|
|
20
|
+
setStatus("paused");
|
|
21
|
+
await new Promise((resolve) => {
|
|
22
|
+
pauseState.resumeResolve = resolve;
|
|
23
|
+
});
|
|
24
|
+
pauseState.resumeResolve = null;
|
|
25
|
+
setStatus("running");
|
|
26
|
+
}
|
|
27
|
+
if (signal.aborted) {
|
|
28
|
+
throw new AbortableAbortedError();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const afterCheck = async (value) => {
|
|
32
|
+
await checkPauseAndAbort();
|
|
33
|
+
return value;
|
|
34
|
+
};
|
|
35
|
+
const join = (resultOrResults) => {
|
|
36
|
+
if (signal.aborted) {
|
|
37
|
+
return Promise.reject(new AbortableAbortedError());
|
|
38
|
+
}
|
|
39
|
+
const isArray = Array.isArray(resultOrResults);
|
|
40
|
+
const results = isArray ? resultOrResults : [resultOrResults];
|
|
41
|
+
const abortAll = () => {
|
|
42
|
+
for (const result of results) {
|
|
43
|
+
result.abort();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
signal.addEventListener("abort", abortAll, { once: true });
|
|
47
|
+
const promise = Promise.all(results).then(async (values) => {
|
|
48
|
+
signal.removeEventListener("abort", abortAll);
|
|
49
|
+
await checkPauseAndAbort();
|
|
50
|
+
return isArray ? values : values[0];
|
|
51
|
+
}).catch(async (error) => {
|
|
52
|
+
signal.removeEventListener("abort", abortAll);
|
|
53
|
+
abortAll();
|
|
54
|
+
if (signal.aborted) {
|
|
55
|
+
throw new AbortableAbortedError();
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
});
|
|
59
|
+
return promise;
|
|
60
|
+
};
|
|
61
|
+
const baseSafe = createSafe(
|
|
62
|
+
() => signal,
|
|
63
|
+
() => signal.aborted
|
|
64
|
+
);
|
|
65
|
+
const safeFn = async (fnOrPromise, ...args) => {
|
|
66
|
+
if (isAbortable(fnOrPromise)) {
|
|
67
|
+
const abortableResult = fnOrPromise.withSignal(signal, ...args);
|
|
68
|
+
return join(abortableResult);
|
|
69
|
+
}
|
|
70
|
+
const result = await baseSafe(fnOrPromise, ...args);
|
|
71
|
+
await checkPauseAndAbort();
|
|
72
|
+
return result;
|
|
73
|
+
};
|
|
74
|
+
const safe = Object.assign(safeFn, {
|
|
75
|
+
all: baseSafe.all,
|
|
76
|
+
race: baseSafe.race,
|
|
77
|
+
settled: baseSafe.settled,
|
|
78
|
+
any: baseSafe.any,
|
|
79
|
+
callback: baseSafe.callback,
|
|
80
|
+
delay: baseSafe.delay
|
|
81
|
+
});
|
|
82
|
+
const take = (key) => {
|
|
83
|
+
const takeKey = String(key ?? "__checkpoint__");
|
|
84
|
+
if (signal.aborted) {
|
|
85
|
+
return Promise.reject(new AbortableAbortedError());
|
|
86
|
+
}
|
|
87
|
+
const existing = takeState.pendingTakes.get(takeKey);
|
|
88
|
+
if (existing) {
|
|
89
|
+
return existing.promise.then(afterCheck);
|
|
90
|
+
}
|
|
91
|
+
let resolve;
|
|
92
|
+
let reject;
|
|
93
|
+
const promise = new Promise((res, rej) => {
|
|
94
|
+
resolve = res;
|
|
95
|
+
reject = rej;
|
|
96
|
+
});
|
|
97
|
+
takeState.pendingTakes.set(takeKey, {
|
|
98
|
+
resolve,
|
|
99
|
+
reject,
|
|
100
|
+
promise
|
|
101
|
+
});
|
|
102
|
+
setStatus("waiting");
|
|
103
|
+
return promise.then(afterCheck);
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
signal,
|
|
107
|
+
safe,
|
|
108
|
+
take,
|
|
109
|
+
join,
|
|
110
|
+
aborted: () => signal.aborted,
|
|
111
|
+
abort: () => {
|
|
112
|
+
if (signal.aborted) return false;
|
|
113
|
+
controller.abort();
|
|
114
|
+
return true;
|
|
115
|
+
},
|
|
116
|
+
checkpoint: checkPauseAndAbort
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function createSend(takeState, setStatus) {
|
|
120
|
+
return (key, value) => {
|
|
121
|
+
const takeKey = String(key ?? "__checkpoint__");
|
|
122
|
+
const pending = takeState.pendingTakes.get(takeKey);
|
|
123
|
+
if (pending) {
|
|
124
|
+
pending.resolve(value);
|
|
125
|
+
takeState.pendingTakes.delete(takeKey);
|
|
126
|
+
setStatus("running");
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function executeAbortable(fn, args, parentSignal) {
|
|
131
|
+
const controller = new AbortController();
|
|
132
|
+
if (parentSignal) {
|
|
133
|
+
if (parentSignal.aborted) {
|
|
134
|
+
controller.abort();
|
|
135
|
+
} else {
|
|
136
|
+
const onParentAbort = () => controller.abort();
|
|
137
|
+
parentSignal.addEventListener("abort", onParentAbort, { once: true });
|
|
138
|
+
controller.signal.addEventListener(
|
|
139
|
+
"abort",
|
|
140
|
+
() => parentSignal.removeEventListener("abort", onParentAbort),
|
|
141
|
+
{ once: true }
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
let status = "running";
|
|
146
|
+
let resultValue;
|
|
147
|
+
let errorValue;
|
|
148
|
+
const pauseState = {
|
|
149
|
+
isPaused: false,
|
|
150
|
+
resumeResolve: null
|
|
151
|
+
};
|
|
152
|
+
const takeState = {
|
|
153
|
+
pendingTakes: /* @__PURE__ */ new Map()
|
|
154
|
+
};
|
|
155
|
+
const setStatus = (newStatus) => {
|
|
156
|
+
if (!["success", "error", "aborted"].includes(status)) {
|
|
157
|
+
status = newStatus;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
const ctx = createAbortableContext(
|
|
161
|
+
controller,
|
|
162
|
+
pauseState,
|
|
163
|
+
takeState,
|
|
164
|
+
setStatus
|
|
165
|
+
);
|
|
166
|
+
const wrappedFn = async () => {
|
|
167
|
+
try {
|
|
168
|
+
if (controller.signal.aborted) {
|
|
169
|
+
throw new AbortableAbortedError();
|
|
170
|
+
}
|
|
171
|
+
const result = await fn(ctx, ...args);
|
|
172
|
+
return result;
|
|
173
|
+
} catch (e) {
|
|
174
|
+
if (controller.signal.aborted) {
|
|
175
|
+
throw new AbortableAbortedError();
|
|
176
|
+
}
|
|
177
|
+
throw e;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const promise = wrappedFn().then((result) => {
|
|
181
|
+
status = "success";
|
|
182
|
+
resultValue = result;
|
|
183
|
+
return result;
|
|
184
|
+
}).catch((error) => {
|
|
185
|
+
if (error instanceof AbortableAbortedError || controller.signal.aborted) {
|
|
186
|
+
status = "aborted";
|
|
187
|
+
errorValue = error instanceof Error ? error : new AbortableAbortedError();
|
|
188
|
+
} else {
|
|
189
|
+
status = "error";
|
|
190
|
+
errorValue = error instanceof Error ? error : new Error(String(error));
|
|
191
|
+
}
|
|
192
|
+
throw errorValue;
|
|
193
|
+
});
|
|
194
|
+
const send = createSend(takeState, setStatus);
|
|
195
|
+
return Object.assign(promise, {
|
|
196
|
+
send,
|
|
197
|
+
// Status checks
|
|
198
|
+
failed: () => status === "error",
|
|
199
|
+
completed: () => ["success", "error", "aborted"].includes(status),
|
|
200
|
+
running: () => status === "running",
|
|
201
|
+
succeeded: () => status === "success",
|
|
202
|
+
paused: () => status === "paused",
|
|
203
|
+
waiting: () => status === "waiting",
|
|
204
|
+
aborted: () => status === "aborted",
|
|
205
|
+
status: () => status,
|
|
206
|
+
// Result access
|
|
207
|
+
result: () => resultValue,
|
|
208
|
+
error: () => errorValue,
|
|
209
|
+
// Control methods
|
|
210
|
+
pause: () => {
|
|
211
|
+
if (pauseState.isPaused || ["success", "error", "aborted"].includes(status)) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
pauseState.isPaused = true;
|
|
215
|
+
status = "paused";
|
|
216
|
+
return true;
|
|
217
|
+
},
|
|
218
|
+
resume: () => {
|
|
219
|
+
if (!pauseState.isPaused) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
pauseState.isPaused = false;
|
|
223
|
+
status = "running";
|
|
224
|
+
if (pauseState.resumeResolve) {
|
|
225
|
+
pauseState.resumeResolve();
|
|
226
|
+
}
|
|
227
|
+
return true;
|
|
228
|
+
},
|
|
229
|
+
abort: () => {
|
|
230
|
+
if (controller.signal.aborted || ["success", "error"].includes(status)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
status = "aborted";
|
|
234
|
+
controller.abort();
|
|
235
|
+
const abortError = new AbortableAbortedError();
|
|
236
|
+
for (const [, pending] of takeState.pendingTakes) {
|
|
237
|
+
pending.reject(abortError);
|
|
238
|
+
}
|
|
239
|
+
takeState.pendingTakes.clear();
|
|
240
|
+
if (pauseState.resumeResolve) {
|
|
241
|
+
pauseState.resumeResolve();
|
|
242
|
+
}
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
function abortable(fn) {
|
|
248
|
+
const wrapper = (...args) => {
|
|
249
|
+
return executeAbortable(fn, args);
|
|
250
|
+
};
|
|
251
|
+
wrapper.withSignal = (signal, ...args) => {
|
|
252
|
+
return executeAbortable(fn, args, signal);
|
|
253
|
+
};
|
|
254
|
+
wrapper.use = (wrapperFn) => {
|
|
255
|
+
const wrappedHandler = wrapperFn(fn);
|
|
256
|
+
return abortable(wrappedHandler);
|
|
257
|
+
};
|
|
258
|
+
wrapper.as = () => {
|
|
259
|
+
return wrapper;
|
|
260
|
+
};
|
|
261
|
+
Object.defineProperty(wrapper, abortableSymbol, {
|
|
262
|
+
value: true,
|
|
263
|
+
writable: false,
|
|
264
|
+
enumerable: false,
|
|
265
|
+
configurable: false
|
|
266
|
+
});
|
|
267
|
+
return wrapper;
|
|
268
|
+
}
|
|
4
269
|
function retry(retriesOrStrategyOrOptions) {
|
|
5
270
|
const options = typeof retriesOrStrategyOrOptions === "number" ? { retries: retriesOrStrategyOrOptions } : typeof retriesOrStrategyOrOptions === "string" ? { delay: retriesOrStrategyOrOptions } : retriesOrStrategyOrOptions ?? {};
|
|
6
271
|
const retries = options.retries ?? 3;
|
|
@@ -284,18 +549,18 @@ function observe(onStart) {
|
|
|
284
549
|
export {
|
|
285
550
|
b2 as AsyncAggregateError,
|
|
286
551
|
A as AsyncNotReadyError,
|
|
287
|
-
|
|
552
|
+
abortable,
|
|
288
553
|
a as async,
|
|
289
554
|
b as asyncState,
|
|
290
555
|
c as asyncStateFrom,
|
|
291
556
|
cache,
|
|
292
557
|
catchError,
|
|
293
558
|
circuitBreaker,
|
|
294
|
-
|
|
559
|
+
createSafe,
|
|
295
560
|
debounce,
|
|
296
561
|
fallback,
|
|
297
562
|
g as getPendingPromise,
|
|
298
|
-
|
|
563
|
+
isAbortable,
|
|
299
564
|
logging,
|
|
300
565
|
map,
|
|
301
566
|
observe,
|
package/dist/async/safe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../src/async/safe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../src/async/safe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAO3E;AA6CD;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,MAAM,CAAC,GACpD,OAAO,CAAC,CAAC,CAAC,GACV,OAAO,CAAC,CAAC,CAAC,CAAC;AAMf,KAAK,kBAAkB,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI;IAC7D,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,KAAK,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI;KAClE,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB;;;;;OAKG;IACH,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAC5D,kBAAkB,CAAC,CAAC,CAAC,CACtB,CAAC;IAEF;;;;;;;;OAQG;IACH,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAC5D,mBAAmB,CAAC,CAAC,CAAC,CACvB,CAAC;CACH;AAMD,KAAK,mBAAmB,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,eAAe,CAC7E,CAAC,CAAC,MAAM,CAAC,CACV,CAAC;AAEF,KAAK,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI;KACnE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC3C,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,WAAW,QAAQ;IACvB;;;;;OAKG;IACH,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAC5D,mBAAmB,CAAC,CAAC,CAAC,CACvB,CAAC;IAEF;;;;;;;;;OASG;IACH,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAC5D,oBAAoB,CAAC,CAAC,CAAC,CACxB,CAAC;CACH;AAMD,KAAK,sBAAsB,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI;IACjE,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,KAAK,uBAAuB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI;KACtE,CAAC,IAAI,MAAM,CAAC,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAC5D,sBAAsB,CAAC,CAAC,CAAC,CAC1B,CAAC;IAEF;;;;;;;;;OASG;IACH,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAC5D,uBAAuB,CAAC,CAAC,CAAC,CAC3B,CAAC;CACH;AAMD,MAAM,WAAW,OAAO;IACtB;;;;;OAKG;IACH,CAAC,CAAC,SAAS,SAAS,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAC5D,mBAAmB,CAAC,CAAC,CAAC,CACvB,CAAC;IAEF;;;;;;;;OAQG;IACH,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAC5D,oBAAoB,CAAC,CAAC,CAAC,CACxB,CAAC;CACH;AAMD,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,CACzD,GAAG,IAAI,EAAE,KAAK,KACX,IAAI,CAAC;CACX;AAMD,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;OAUG;IACH,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClD;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;;;;OAQG;IACH,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzC;;;;;OAKG;IACH,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAC3B,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAC/B,GAAG,IAAI,EAAE,KAAK,GACb,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAE/D;;;;;;OAMG;IACH,CAAC,KAAK,SAAS,GAAG,EAAE,EAAE,OAAO,EAC3B,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAC7B,GAAG,IAAI,EAAE,KAAK,GACb,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,MAAM;IAC7C,sCAAsC;IACtC,GAAG,EAAE,OAAO,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,wDAAwD;IACxD,OAAO,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,GAAG,EAAE,OAAO,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,YAAY,CAAC;IACvB,mDAAmD;IACnD,KAAK,EAAE,SAAS,CAAC;CAClB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,WAAW,GAAG,SAAS,EACxC,WAAW,EAAE,MAAM,OAAO,GACzB,eAAe,CA4NjB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { G as stateToJSON, c as createSafe, e as isSpec, k as storeTuple, B as SetupPhaseError, u as untrack, J as pendingPromises, K as createCancellablePromise, M as createAbortError, N as promiseTry, i as isAbortable, s as store, g as getPendingPromise, A as AsyncNotReadyError, O as getData, b as AsyncAggregateError, Q as isAsyncState, R as toPromiseWithState, T as isAsyncOrPromise, q as effect, f as AsyncFunctionError, U as state, V as invoke, W as delay } from "./effect-
|
|
1
|
+
import { G as stateToJSON, c as createSafe, e as isSpec, k as storeTuple, B as SetupPhaseError, u as untrack, J as pendingPromises, K as createCancellablePromise, M as createAbortError, N as promiseTry, i as isAbortable, s as store, g as getPendingPromise, A as AsyncNotReadyError, O as getData, b as AsyncAggregateError, Q as isAsyncState, R as toPromiseWithState, T as isAsyncOrPromise, q as effect, f as AsyncFunctionError, U as state, V as invoke, W as delay } from "./effect-BK2j3cpd.js";
|
|
2
2
|
import { i as isPromiseLike } from "./isPromiseLike-bFkfHAbm.js";
|
|
3
3
|
function asyncState(mode, status, dataOrError, errorOrExtra, extra) {
|
|
4
4
|
let state2;
|
package/dist/core/mixins.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Prettify } from '../types';
|
|
1
|
+
import { Prettify, StoreSpec, StateOf, ActionsOf, SelectorContext, Factory } from '../types';
|
|
2
2
|
|
|
3
3
|
export type Mixin<TResult = any, TContext = any> = (context: TContext) => TResult;
|
|
4
4
|
/**
|
|
@@ -89,6 +89,45 @@ type InferMixinArray<T extends readonly unknown[]> = T extends readonly [
|
|
|
89
89
|
infer First,
|
|
90
90
|
...infer Rest
|
|
91
91
|
] ? InferMixinArrayItem<First> & InferMixinArray<Rest> : unknown;
|
|
92
|
+
/**
|
|
93
|
+
* Proxy type for accessing store state properties and actions as mixins.
|
|
94
|
+
* State properties return mixins that access state values.
|
|
95
|
+
* Actions return mixins that access action functions.
|
|
96
|
+
*/
|
|
97
|
+
export type MixinProxy<TSpec extends StoreSpec<any, any>> = {
|
|
98
|
+
readonly [K in keyof StateOf<TSpec>]: Mixin<StateOf<TSpec>[K], SelectorContext>;
|
|
99
|
+
} & {
|
|
100
|
+
readonly [K in keyof ActionsOf<TSpec>]: Mixin<ActionsOf<TSpec>[K], SelectorContext>;
|
|
101
|
+
} & {
|
|
102
|
+
/**
|
|
103
|
+
* Select multiple properties/actions as a composed mixin.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* // Array syntax - use property names as keys
|
|
108
|
+
* const proxy = mixins(userStore);
|
|
109
|
+
* const userMixin = proxy.select(["name", "age", "setName"]);
|
|
110
|
+
* // Returns: (ctx) => ({ name: string, age: number, setName: function })
|
|
111
|
+
*
|
|
112
|
+
* // Object syntax - map to custom keys
|
|
113
|
+
* const userMixin = proxy.select({ userName: "name", userAge: "age", updateName: "setName" });
|
|
114
|
+
* // Returns: (ctx) => ({ userName: string, userAge: number, updateName: function })
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
select<TKeys extends readonly (keyof StateOf<TSpec> | keyof ActionsOf<TSpec>)[]>(keys: TKeys): Mixin<{
|
|
118
|
+
readonly [K in TKeys[number]]: K extends keyof StateOf<TSpec> ? StateOf<TSpec>[K] : K extends keyof ActionsOf<TSpec> ? ActionsOf<TSpec>[K] : never;
|
|
119
|
+
}, SelectorContext>;
|
|
120
|
+
select<TMap extends Record<string, keyof StateOf<TSpec> | keyof ActionsOf<TSpec>>>(map: TMap): Mixin<{
|
|
121
|
+
readonly [K in keyof TMap]: TMap[K] extends keyof StateOf<TSpec> ? StateOf<TSpec>[TMap[K]] : TMap[K] extends keyof ActionsOf<TSpec> ? ActionsOf<TSpec>[TMap[K]] : never;
|
|
122
|
+
}, SelectorContext>;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Proxy type for accessing service factory properties as mixins.
|
|
126
|
+
* Each property of the service instance becomes a mixin.
|
|
127
|
+
*/
|
|
128
|
+
export type ServiceMixinProxy<T> = {
|
|
129
|
+
readonly [K in keyof T]: Mixin<T[K], SelectorContext>;
|
|
130
|
+
};
|
|
92
131
|
/**
|
|
93
132
|
* Compose multiple mixins into a single mixin function.
|
|
94
133
|
* Accepts any mixin type (Selector or Store context).
|
|
@@ -103,8 +142,27 @@ type InferMixinArray<T extends readonly unknown[]> = T extends readonly [
|
|
|
103
142
|
* // Array syntax - merge mixins
|
|
104
143
|
* const merged = mixins([selectUserMixin, { countMixin }]);
|
|
105
144
|
* // Returns: (ctx) => { name: string, age: number, count: number }
|
|
145
|
+
*
|
|
146
|
+
* // Store spec syntax - proxy for state/actions
|
|
147
|
+
* const proxy = mixins(userStore);
|
|
148
|
+
* const { name, doSomething } = useStore(mixins({
|
|
149
|
+
* name: proxy.name,
|
|
150
|
+
* doSomething: proxy.doSomething,
|
|
151
|
+
* }));
|
|
152
|
+
*
|
|
153
|
+
* // Factory syntax - proxy for service properties
|
|
154
|
+
* const dbService = (resolver: Resolver) => ({
|
|
155
|
+
* users: { getAll: () => [] },
|
|
156
|
+
* posts: { getAll: () => [] },
|
|
157
|
+
* });
|
|
158
|
+
* const serviceProxy = mixins(dbService);
|
|
159
|
+
* const { users } = useStore(mixins({
|
|
160
|
+
* users: serviceProxy.users,
|
|
161
|
+
* }));
|
|
106
162
|
* ```
|
|
107
163
|
*/
|
|
164
|
+
export declare function mixins<TSpec extends StoreSpec<any, any>>(spec: TSpec): MixinProxy<TSpec>;
|
|
165
|
+
export declare function mixins<T extends object>(factory: Factory<T, []>): ServiceMixinProxy<T>;
|
|
108
166
|
export declare function mixins<const T extends readonly (Mixin<object> | Record<string, Mixin>)[]>(mixinArray: T): (context: ExtractArrayMixinContext<T>) => Prettify<InferMixinArray<T>>;
|
|
109
167
|
export declare function mixins<const T extends Record<string, Mixin>>(mixinMap: T): (context: ExtractMixinContext<T>) => Prettify<StripMixinSuffixFromRecord<T>>;
|
|
110
168
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mixins.d.ts","sourceRoot":"","sources":["../../src/core/mixins.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mixins.d.ts","sourceRoot":"","sources":["../../src/core/mixins.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,UAAU,CAAC;AAGlB,MAAM,MAAM,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,QAAQ,GAAG,GAAG,IAAI,CACjD,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC;AAEb;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAExD;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,GAC1E;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,GAC3D,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,GACzE,CAAC,GACD,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,GACrB,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtB,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,SAAS;IAC3E,MAAM,KAAK;IACX,GAAG,MAAM,IAAI,SAAS,UAAU,CAAC,CAAC,CAAC;CACpC,GACG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,GACnD,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CACjE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ,CAC7D,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CACvB,CAAC;AAEF;;GAEG;AACH,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GACvE,CAAC,GACD,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAC7B,CAAC,GACD,KAAK,CAAC;AAEV;;GAEG;AACH,KAAK,wBAAwB,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IACxD,CAAC,SAAS,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GAC3C,mBAAmB,CAAC,KAAK,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,GAC3D,KAAK,CAAC;AAEZ;;;;GAIG;AACH,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,MAAM,OAAO,GACtE,MAAM,GACN,CAAC,CAAC;AAEN;;GAEG;AACH,KAAK,0BAA0B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;IACjE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GACtC,gBAAgB,CAAC,CAAC,CAAC,GACnB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAChD,CAAC;AAEF;;;GAGG;AACH,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,GACjE,QAAQ,CAAC,CAAC,CAAC,GACX,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAC/B,0BAA0B,CAAC,CAAC,CAAC,GAC7B,KAAK,CAAC;AAEV;;GAEG;AACH,KAAK,eAAe,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,SAAS;IACtE,MAAM,KAAK;IACX,GAAG,MAAM,IAAI;CACd,GACG,mBAAmB,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,GAClD,OAAO,CAAC;AAEZ;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,KAAK,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI;IAC1D,QAAQ,EAAE,CAAC,IAAI,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CACzC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACjB,eAAe,CAChB;CACF,GAAG;IACF,QAAQ,EAAE,CAAC,IAAI,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAC3C,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACnB,eAAe,CAChB;CACF,GAAG;IACF;;;;;;;;;;;;;;OAcG;IACH,MAAM,CACJ,KAAK,SAAS,SAAS,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAExE,IAAI,EAAE,KAAK,GACV,KAAK,CACN;QACE,QAAQ,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,GACzD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACjB,CAAC,SAAS,MAAM,SAAS,CAAC,KAAK,CAAC,GAChC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GACnB,KAAK;KACV,EACD,eAAe,CAChB,CAAC;IACF,MAAM,CACJ,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,EAE1E,GAAG,EAAE,IAAI,GACR,KAAK,CACN;QACE,QAAQ,EAAE,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,MAAM,OAAO,CAAC,KAAK,CAAC,GAC5D,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACvB,IAAI,CAAC,CAAC,CAAC,SAAS,MAAM,SAAS,CAAC,KAAK,CAAC,GACtC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACzB,KAAK;KACV,EACD,eAAe,CAChB,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;CACtD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,wBAAgB,MAAM,CAAC,KAAK,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EACtD,IAAI,EAAE,KAAK,GACV,UAAU,CAAC,KAAK,CAAC,CAAC;AACrB,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EACrC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,GACtB,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAExB,wBAAgB,MAAM,CACpB,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,EAElE,UAAU,EAAE,CAAC,GACZ,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1E,wBAAgB,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC1D,QAAQ,EAAE,CAAC,GACV,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC"}
|