@vielzeug/ripple 2.1.0 → 2.2.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/README.md +2 -2
- package/dist/_async.cjs +1 -1
- package/dist/_async.cjs.map +1 -1
- package/dist/_async.d.ts +4 -12
- package/dist/_async.d.ts.map +1 -1
- package/dist/_async.js +27 -24
- package/dist/_async.js.map +1 -1
- package/dist/_default.cjs +1 -1
- package/dist/_default.cjs.map +1 -1
- package/dist/_default.d.ts +5 -8
- package/dist/_default.d.ts.map +1 -1
- package/dist/_default.js +16 -18
- package/dist/_default.js.map +1 -1
- package/dist/_watch.cjs +1 -1
- package/dist/_watch.cjs.map +1 -1
- package/dist/_watch.d.ts +1 -1
- package/dist/_watch.d.ts.map +1 -1
- package/dist/_watch.js +1 -1
- package/dist/_watch.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +0 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -4
- package/dist/errors.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/ripple.cjs +1 -1
- package/dist/ripple.cjs.map +1 -1
- package/dist/ripple.iife.js +1 -1
- package/dist/ripple.iife.js.map +1 -1
- package/dist/ripple.js +1 -1
- package/dist/ripple.js.map +1 -1
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.ts +3 -5
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +24 -19
- package/dist/runtime.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +23 -47
- package/dist/_store.cjs +0 -2
- package/dist/_store.cjs.map +0 -1
- package/dist/_store.d.ts +0 -20
- package/dist/_store.d.ts.map +0 -1
- package/dist/_store.js +0 -24
- package/dist/_store.js.map +0 -1
- package/dist/async.cjs +0 -2
- package/dist/async.cjs.map +0 -1
- package/dist/async.d.ts +0 -5
- package/dist/async.d.ts.map +0 -1
- package/dist/async.js +0 -7
- package/dist/async.js.map +0 -1
- package/dist/store.cjs +0 -2
- package/dist/store.cjs.map +0 -1
- package/dist/store.d.ts +0 -3
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -7
- package/dist/store.js.map +0 -1
- package/dist/watch.cjs +0 -2
- package/dist/watch.cjs.map +0 -1
- package/dist/watch.d.ts +0 -3
- package/dist/watch.d.ts.map +0 -1
- package/dist/watch.js +0 -7
- package/dist/watch.js.map +0 -1
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ stop.dispose();
|
|
|
32
32
|
ripple.dispose();
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
`ripple.dispose()` is terminal: create a new graph instead of reusing a disposed one. Use default exports (`signal`, `computed`, `effect`, `batch`) only when application has one graph for full lifetime.
|
|
35
|
+
`ripple.dispose()` is terminal: create a new graph instead of reusing a disposed one. Use default exports (`signal`, `computed`, `effect`, `batch`, `watch`, `resource`) only when application has one graph for full lifetime.
|
|
36
36
|
|
|
37
37
|
## Bound helpers
|
|
38
38
|
|
|
@@ -40,7 +40,7 @@ Every `Ripple` instance provides bound helpers:
|
|
|
40
40
|
|
|
41
41
|
```ts
|
|
42
42
|
const user = ripple.resource(() => userId.value, loadUser);
|
|
43
|
-
const cart = ripple.
|
|
43
|
+
const cart = ripple.signal({ items: 0 });
|
|
44
44
|
const stop = ripple.watch(() => cart.value.items, renderItems);
|
|
45
45
|
```
|
|
46
46
|
|
package/dist/_async.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
const e=require("./runtime.cjs");var t=t=>(n,r,i)=>{let a=t.signal({status:`pending`},{name:i?.name}),o=t.signal(0),s,c=!1,l=()=>{o.value,s?.abort();let e=a.peek(),t=e.status===`success`?e.value:`previous`in e?e.previous:void 0,i;try{i=n()}catch(e){a.value=t===void 0?{error:e,status:`error`}:{error:e,previous:t,status:`error`};return}let l=new AbortController;s=l,a.value=t===void 0?{status:`pending`}:{previous:t,status:`pending`};let u;try{u=Promise.resolve(r(i,{signal:l.signal}))}catch(e){u=Promise.reject(e)}u.then(e=>{!c&&!l.signal.aborted&&(a.value={status:`success`,value:e})},e=>{!c&&!l.signal.aborted&&(a.value=t===void 0?{error:e,status:`error`}:{error:e,previous:t,status:`error`})})},u=t.effect(()=>(l(),()=>s?.abort()),{name:i?.name});u.disposalSignal.addEventListener(`abort`,()=>{c=!0},{once:!0});let d={get disposalSignal(){return u.disposalSignal},dispose:()=>u.dispose(),get disposed(){return c},get name(){return a.name},peek:()=>a.peek(),reload:()=>{c||(o.value=o.peek()+1)},subscribe:e=>a.subscribe(e),[Symbol.dispose](){this.dispose()},get value(){return a.value}};return Object.defineProperty(d,e.REACTIVE,{value:!0}),d};exports.createResource=t;
|
|
2
2
|
//# sourceMappingURL=_async.cjs.map
|
package/dist/_async.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_async.cjs","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import type { EffectHandle, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport
|
|
1
|
+
{"version":3,"file":"_async.cjs","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import { REACTIVE } from './runtime';\nimport type { Disposable, EffectHandle, Readable, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport interface Resource<T> extends Readable<AsyncState<T>>, Disposable {\n reload(): void;\n}\n\nexport type ResourceOptions = {\n name?: string;\n};\n\ntype AsyncRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n signal<T>(initial: T, options?: { name?: string }): Signal<T>;\n};\n\n/** Resource only depends on primitive runtime methods; graph binding stays private. */\nexport const createResource =\n (runtime: AsyncRuntime) =>\n <Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value> => {\n const state = runtime.signal<AsyncState<Value>>({ status: 'pending' }, { name: options?.name });\n const reloadEpoch = runtime.signal(0);\n let active: AbortController | undefined;\n let disposed = false;\n\n const run = (): void => {\n void reloadEpoch.value;\n active?.abort();\n\n const current = state.peek();\n const previous =\n current.status === 'success' ? current.value : 'previous' in current ? current.previous : undefined;\n let input: Source;\n\n try {\n input = source();\n } catch (error) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n\n return;\n }\n\n const next = new AbortController();\n\n active = next;\n state.value = previous === undefined ? { status: 'pending' } : { previous, status: 'pending' };\n\n let request: Promise<Value>;\n\n try {\n request = Promise.resolve(loader(input, { signal: next.signal }));\n } catch (error) {\n request = Promise.reject(error);\n }\n\n void request.then(\n (value) => {\n if (!disposed && !next.signal.aborted) state.value = { status: 'success', value };\n },\n (error: unknown) => {\n if (!disposed && !next.signal.aborted) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n }\n },\n );\n };\n\n const stop = runtime.effect(\n () => {\n run();\n\n return () => active?.abort();\n },\n { name: options?.name },\n );\n\n stop.disposalSignal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n },\n { once: true },\n );\n\n const resource: Resource<Value> = {\n get disposalSignal() {\n return stop.disposalSignal;\n },\n dispose: () => stop.dispose(),\n get disposed() {\n return disposed;\n },\n get name() {\n return state.name;\n },\n peek: () => state.peek(),\n reload: () => {\n if (disposed) return;\n\n reloadEpoch.value = reloadEpoch.peek() + 1;\n },\n subscribe: (listener) => state.subscribe(listener),\n [Symbol.dispose]() {\n this.dispose();\n },\n get value() {\n return state.value;\n },\n };\n\n Object.defineProperty(resource, REACTIVE, { value: true });\n\n return resource;\n };\n"],"mappings":"iCAsBA,IAAa,EACV,IAEC,EACA,EACA,IACoB,CACpB,IAAM,EAAQ,EAAQ,OAA0B,CAAE,OAAQ,SAAU,EAAG,CAAE,KAAM,GAAS,IAAK,CAAC,EACxF,EAAc,EAAQ,OAAO,CAAC,EAChC,EACA,EAAW,GAET,MAAkB,CACtB,EAAiB,MACjB,GAAQ,MAAM,EAEd,IAAM,EAAU,EAAM,KAAK,EACrB,EACJ,EAAQ,SAAW,UAAY,EAAQ,MAAQ,aAAc,EAAU,EAAQ,SAAW,IAAA,GACxF,EAEJ,GAAI,CACF,EAAQ,EAAO,CACjB,OAAS,EAAO,CACd,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,QAAO,OAAQ,OAAQ,EAAI,CAAE,QAAO,WAAU,OAAQ,OAAQ,EAEvG,MACF,CAEA,IAAM,EAAO,IAAI,gBAEjB,EAAS,EACT,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,OAAQ,SAAU,EAAI,CAAE,WAAU,OAAQ,SAAU,EAE7F,IAAI,EAEJ,GAAI,CACF,EAAU,QAAQ,QAAQ,EAAO,EAAO,CAAE,OAAQ,EAAK,MAAO,CAAC,CAAC,CAClE,OAAS,EAAO,CACd,EAAU,QAAQ,OAAO,CAAK,CAChC,CAEA,EAAa,KACV,GAAU,CACL,CAAC,GAAY,CAAC,EAAK,OAAO,UAAS,EAAM,MAAQ,CAAE,OAAQ,UAAW,OAAM,EAClF,EACC,GAAmB,CACd,CAAC,GAAY,CAAC,EAAK,OAAO,UAC5B,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,QAAO,OAAQ,OAAQ,EAAI,CAAE,QAAO,WAAU,OAAQ,OAAQ,EAE3G,CACF,CACF,EAEM,EAAO,EAAQ,YAEjB,EAAI,MAES,GAAQ,MAAM,GAE7B,CAAE,KAAM,GAAS,IAAK,CACxB,EAEA,EAAK,eAAe,iBAClB,YACM,CACJ,EAAW,EACb,EACA,CAAE,KAAM,EAAK,CACf,EAEA,IAAM,EAA4B,CAChC,IAAI,gBAAiB,CACnB,OAAO,EAAK,cACd,EACA,YAAe,EAAK,QAAQ,EAC5B,IAAI,UAAW,CACb,OAAO,CACT,EACA,IAAI,MAAO,CACT,OAAO,EAAM,IACf,EACA,SAAY,EAAM,KAAK,EACvB,WAAc,CACR,IAEJ,EAAY,MAAQ,EAAY,KAAK,EAAI,EAC3C,EACA,UAAY,GAAa,EAAM,UAAU,CAAQ,EACjD,CAAC,OAAO,UAAW,CACjB,KAAK,QAAQ,CACf,EACA,IAAI,OAAQ,CACV,OAAO,EAAM,KACf,CACF,EAIA,OAFA,OAAO,eAAe,EAAU,EAAA,SAAU,CAAE,MAAO,EAAK,CAAC,EAElD,CACT"}
|
package/dist/_async.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EffectHandle, Signal } from './types';
|
|
1
|
+
import type { Disposable, EffectHandle, Readable, Signal } from './types';
|
|
2
2
|
export type AsyncState<T> = {
|
|
3
3
|
readonly previous?: T;
|
|
4
4
|
readonly status: 'pending';
|
|
@@ -10,22 +10,14 @@ export type AsyncState<T> = {
|
|
|
10
10
|
readonly previous?: T;
|
|
11
11
|
readonly status: 'error';
|
|
12
12
|
};
|
|
13
|
-
export
|
|
14
|
-
[Symbol.dispose](): void;
|
|
15
|
-
readonly disposalSignal: AbortSignal;
|
|
16
|
-
dispose(): void;
|
|
17
|
-
readonly disposed: boolean;
|
|
18
|
-
readonly name?: string;
|
|
19
|
-
peek(): AsyncState<T>;
|
|
13
|
+
export interface Resource<T> extends Readable<AsyncState<T>>, Disposable {
|
|
20
14
|
reload(): void;
|
|
21
|
-
|
|
22
|
-
readonly value: AsyncState<T>;
|
|
23
|
-
};
|
|
15
|
+
}
|
|
24
16
|
export type ResourceOptions = {
|
|
25
17
|
name?: string;
|
|
26
18
|
};
|
|
27
19
|
type AsyncRuntime = {
|
|
28
|
-
effect(callback: () =>
|
|
20
|
+
effect(callback: () => undefined | (() => void), options?: {
|
|
29
21
|
name?: string;
|
|
30
22
|
}): EffectHandle;
|
|
31
23
|
signal<T>(initial: T, options?: {
|
package/dist/_async.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_async.d.ts","sourceRoot":"","sources":["../src/_async.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_async.d.ts","sourceRoot":"","sources":["../src/_async.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjF,MAAM,WAAW,QAAQ,CAAC,CAAC,CAAE,SAAQ,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU;IACtE,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;IAC5F,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,cAAc,GACxB,SAAS,YAAY,MACrB,MAAM,EAAE,KAAK,EACZ,QAAQ,MAAM,MAAM,EACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EACrF,UAAU,eAAe,KACxB,QAAQ,CAAC,KAAK,CA8FhB,CAAC"}
|
package/dist/_async.js
CHANGED
|
@@ -1,75 +1,78 @@
|
|
|
1
|
+
import { REACTIVE as e } from "./runtime.js";
|
|
1
2
|
//#region src/_async.ts
|
|
2
|
-
var
|
|
3
|
-
let
|
|
4
|
-
|
|
5
|
-
let e =
|
|
3
|
+
var t = (t) => (n, r, i) => {
|
|
4
|
+
let a = t.signal({ status: "pending" }, { name: i?.name }), o = t.signal(0), s, c = !1, l = () => {
|
|
5
|
+
o.value, s?.abort();
|
|
6
|
+
let e = a.peek(), t = e.status === "success" ? e.value : "previous" in e ? e.previous : void 0, i;
|
|
6
7
|
try {
|
|
7
|
-
|
|
8
|
+
i = n();
|
|
8
9
|
} catch (e) {
|
|
9
|
-
|
|
10
|
+
a.value = t === void 0 ? {
|
|
10
11
|
error: e,
|
|
11
12
|
status: "error"
|
|
12
13
|
} : {
|
|
13
14
|
error: e,
|
|
14
|
-
previous:
|
|
15
|
+
previous: t,
|
|
15
16
|
status: "error"
|
|
16
17
|
};
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
20
|
let l = new AbortController();
|
|
20
|
-
s = l,
|
|
21
|
-
previous:
|
|
21
|
+
s = l, a.value = t === void 0 ? { status: "pending" } : {
|
|
22
|
+
previous: t,
|
|
22
23
|
status: "pending"
|
|
23
24
|
};
|
|
24
25
|
let u;
|
|
25
26
|
try {
|
|
26
|
-
u = Promise.resolve(
|
|
27
|
+
u = Promise.resolve(r(i, { signal: l.signal }));
|
|
27
28
|
} catch (e) {
|
|
28
29
|
u = Promise.reject(e);
|
|
29
30
|
}
|
|
30
31
|
u.then((e) => {
|
|
31
|
-
!c && !l.signal.aborted && (
|
|
32
|
+
!c && !l.signal.aborted && (a.value = {
|
|
32
33
|
status: "success",
|
|
33
34
|
value: e
|
|
34
35
|
});
|
|
35
36
|
}, (e) => {
|
|
36
|
-
!c && !l.signal.aborted && (
|
|
37
|
+
!c && !l.signal.aborted && (a.value = t === void 0 ? {
|
|
37
38
|
error: e,
|
|
38
39
|
status: "error"
|
|
39
40
|
} : {
|
|
40
41
|
error: e,
|
|
41
|
-
previous:
|
|
42
|
+
previous: t,
|
|
42
43
|
status: "error"
|
|
43
44
|
});
|
|
44
45
|
});
|
|
45
|
-
}, u =
|
|
46
|
-
|
|
47
|
-
c = !0
|
|
48
|
-
}, { once: !0 })
|
|
46
|
+
}, u = t.effect(() => (l(), () => s?.abort()), { name: i?.name });
|
|
47
|
+
u.disposalSignal.addEventListener("abort", () => {
|
|
48
|
+
c = !0;
|
|
49
|
+
}, { once: !0 });
|
|
50
|
+
let d = {
|
|
49
51
|
get disposalSignal() {
|
|
50
|
-
return
|
|
52
|
+
return u.disposalSignal;
|
|
51
53
|
},
|
|
52
54
|
dispose: () => u.dispose(),
|
|
53
55
|
get disposed() {
|
|
54
56
|
return c;
|
|
55
57
|
},
|
|
56
58
|
get name() {
|
|
57
|
-
return
|
|
59
|
+
return a.name;
|
|
58
60
|
},
|
|
59
|
-
peek: () =>
|
|
61
|
+
peek: () => a.peek(),
|
|
60
62
|
reload: () => {
|
|
61
|
-
c || (
|
|
63
|
+
c || (o.value = o.peek() + 1);
|
|
62
64
|
},
|
|
63
|
-
subscribe: (e) =>
|
|
65
|
+
subscribe: (e) => a.subscribe(e),
|
|
64
66
|
[Symbol.dispose]() {
|
|
65
67
|
this.dispose();
|
|
66
68
|
},
|
|
67
69
|
get value() {
|
|
68
|
-
return
|
|
70
|
+
return a.value;
|
|
69
71
|
}
|
|
70
72
|
};
|
|
73
|
+
return Object.defineProperty(d, e, { value: !0 }), d;
|
|
71
74
|
};
|
|
72
75
|
//#endregion
|
|
73
|
-
export {
|
|
76
|
+
export { t as createResource };
|
|
74
77
|
|
|
75
78
|
//# sourceMappingURL=_async.js.map
|
package/dist/_async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_async.js","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import type { EffectHandle, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport
|
|
1
|
+
{"version":3,"file":"_async.js","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import { REACTIVE } from './runtime';\nimport type { Disposable, EffectHandle, Readable, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport interface Resource<T> extends Readable<AsyncState<T>>, Disposable {\n reload(): void;\n}\n\nexport type ResourceOptions = {\n name?: string;\n};\n\ntype AsyncRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n signal<T>(initial: T, options?: { name?: string }): Signal<T>;\n};\n\n/** Resource only depends on primitive runtime methods; graph binding stays private. */\nexport const createResource =\n (runtime: AsyncRuntime) =>\n <Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value> => {\n const state = runtime.signal<AsyncState<Value>>({ status: 'pending' }, { name: options?.name });\n const reloadEpoch = runtime.signal(0);\n let active: AbortController | undefined;\n let disposed = false;\n\n const run = (): void => {\n void reloadEpoch.value;\n active?.abort();\n\n const current = state.peek();\n const previous =\n current.status === 'success' ? current.value : 'previous' in current ? current.previous : undefined;\n let input: Source;\n\n try {\n input = source();\n } catch (error) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n\n return;\n }\n\n const next = new AbortController();\n\n active = next;\n state.value = previous === undefined ? { status: 'pending' } : { previous, status: 'pending' };\n\n let request: Promise<Value>;\n\n try {\n request = Promise.resolve(loader(input, { signal: next.signal }));\n } catch (error) {\n request = Promise.reject(error);\n }\n\n void request.then(\n (value) => {\n if (!disposed && !next.signal.aborted) state.value = { status: 'success', value };\n },\n (error: unknown) => {\n if (!disposed && !next.signal.aborted) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n }\n },\n );\n };\n\n const stop = runtime.effect(\n () => {\n run();\n\n return () => active?.abort();\n },\n { name: options?.name },\n );\n\n stop.disposalSignal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n },\n { once: true },\n );\n\n const resource: Resource<Value> = {\n get disposalSignal() {\n return stop.disposalSignal;\n },\n dispose: () => stop.dispose(),\n get disposed() {\n return disposed;\n },\n get name() {\n return state.name;\n },\n peek: () => state.peek(),\n reload: () => {\n if (disposed) return;\n\n reloadEpoch.value = reloadEpoch.peek() + 1;\n },\n subscribe: (listener) => state.subscribe(listener),\n [Symbol.dispose]() {\n this.dispose();\n },\n get value() {\n return state.value;\n },\n };\n\n Object.defineProperty(resource, REACTIVE, { value: true });\n\n return resource;\n };\n"],"mappings":";;AAsBA,IAAa,KACV,OAEC,GACA,GACA,MACoB;CACpB,IAAM,IAAQ,EAAQ,OAA0B,EAAE,QAAQ,UAAU,GAAG,EAAE,MAAM,GAAS,KAAK,CAAC,GACxF,IAAc,EAAQ,OAAO,CAAC,GAChC,GACA,IAAW,IAET,UAAkB;EAEtB,AADA,EAAiB,OACjB,GAAQ,MAAM;EAEd,IAAM,IAAU,EAAM,KAAK,GACrB,IACJ,EAAQ,WAAW,YAAY,EAAQ,QAAQ,cAAc,IAAU,EAAQ,WAAW,KAAA,GACxF;EAEJ,IAAI;GACF,IAAQ,EAAO;EACjB,SAAS,GAAO;GACd,EAAM,QAAQ,MAAa,KAAA,IAAY;IAAE;IAAO,QAAQ;GAAQ,IAAI;IAAE;IAAO;IAAU,QAAQ;GAAQ;GAEvG;EACF;EAEA,IAAM,IAAO,IAAI,gBAAgB;EAGjC,AADA,IAAS,GACT,EAAM,QAAQ,MAAa,KAAA,IAAY,EAAE,QAAQ,UAAU,IAAI;GAAE;GAAU,QAAQ;EAAU;EAE7F,IAAI;EAEJ,IAAI;GACF,IAAU,QAAQ,QAAQ,EAAO,GAAO,EAAE,QAAQ,EAAK,OAAO,CAAC,CAAC;EAClE,SAAS,GAAO;GACd,IAAU,QAAQ,OAAO,CAAK;EAChC;EAEA,EAAa,MACV,MAAU;GACT,AAAI,CAAC,KAAY,CAAC,EAAK,OAAO,YAAS,EAAM,QAAQ;IAAE,QAAQ;IAAW;GAAM;EAClF,IACC,MAAmB;GAClB,AAAI,CAAC,KAAY,CAAC,EAAK,OAAO,YAC5B,EAAM,QAAQ,MAAa,KAAA,IAAY;IAAE;IAAO,QAAQ;GAAQ,IAAI;IAAE;IAAO;IAAU,QAAQ;GAAQ;EAE3G,CACF;CACF,GAEM,IAAO,EAAQ,cAEjB,EAAI,SAES,GAAQ,MAAM,IAE7B,EAAE,MAAM,GAAS,KAAK,CACxB;CAEA,EAAK,eAAe,iBAClB,eACM;EACJ,IAAW;CACb,GACA,EAAE,MAAM,GAAK,CACf;CAEA,IAAM,IAA4B;EAChC,IAAI,iBAAiB;GACnB,OAAO,EAAK;EACd;EACA,eAAe,EAAK,QAAQ;EAC5B,IAAI,WAAW;GACb,OAAO;EACT;EACA,IAAI,OAAO;GACT,OAAO,EAAM;EACf;EACA,YAAY,EAAM,KAAK;EACvB,cAAc;GACR,MAEJ,EAAY,QAAQ,EAAY,KAAK,IAAI;EAC3C;EACA,YAAY,MAAa,EAAM,UAAU,CAAQ;EACjD,CAAC,OAAO,WAAW;GACjB,KAAK,QAAQ;EACf;EACA,IAAI,QAAQ;GACV,OAAO,EAAM;EACf;CACF;CAIA,OAFA,OAAO,eAAe,GAAU,GAAU,EAAE,OAAO,GAAK,CAAC,GAElD;AACT"}
|
package/dist/_default.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./
|
|
1
|
+
const e=require("./runtime.cjs"),t=require("./_async.cjs"),n=require("./_watch.cjs");var r=r=>{let i=new e.ReactiveRuntime(r),a=t.createResource(i);return{batch:i.batch,computed:i.computed,createScope:i.createScope,dispose:()=>i.dispose(),get disposed(){return i.disposed},effect:i.effect,resource:a,signal:i.signal,untrack:i.untrack,watch:n.createWatch(i)}},i=r();exports.createRipple=r,exports.defaultRipple=i;
|
|
2
2
|
//# sourceMappingURL=_default.cjs.map
|
package/dist/_default.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_default.cjs","names":[],"sources":["../src/_default.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"_default.cjs","names":[],"sources":["../src/_default.ts"],"sourcesContent":["import { createResource, type Resource, type ResourceOptions } from './_async';\nimport { createWatch, type WatchOptions } from './_watch';\nimport { ReactiveRuntime } from './runtime';\nimport type {\n Cleanup,\n ComputedOptions,\n EffectHandle,\n EffectOptions,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n} from './types';\n\nexport interface Ripple {\n batch<T>(fn: () => T): T;\n computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;\n createScope(name?: string): Scope;\n dispose(): void;\n readonly disposed: boolean;\n effect(callback: () => Cleanup | undefined, options?: EffectOptions): EffectHandle;\n resource<Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value>;\n signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;\n untrack<T>(fn: () => T): T;\n watch<T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle;\n}\n\n/** Creates one complete reactive graph. All factories on the object share its runtime. */\nexport const createRipple = (options?: RippleOptions): Ripple => {\n const runtime = new ReactiveRuntime(options);\n const resource = createResource(runtime);\n\n return {\n batch: runtime.batch,\n computed: runtime.computed,\n createScope: runtime.createScope,\n dispose: () => runtime.dispose(),\n get disposed() {\n return runtime.disposed;\n },\n effect: runtime.effect,\n resource,\n signal: runtime.signal,\n untrack: runtime.untrack,\n watch: createWatch(runtime),\n };\n};\n\n/**\n * The shared default reactive graph. Private — `signal`, `computed`, `effect`, `batch`,\n * `createScope`, `untrack`, `watch`, and `resource` are re-exported from the package root\n * as bound methods on this single graph instance.\n */\nexport const defaultRipple = createRipple();\n"],"mappings":"qFAqCA,IAAa,EAAgB,GAAoC,CAC/D,IAAM,EAAU,IAAI,EAAA,gBAAgB,CAAO,EACrC,EAAW,EAAA,eAAe,CAAO,EAEvC,MAAO,CACL,MAAO,EAAQ,MACf,SAAU,EAAQ,SAClB,YAAa,EAAQ,YACrB,YAAe,EAAQ,QAAQ,EAC/B,IAAI,UAAW,CACb,OAAO,EAAQ,QACjB,EACA,OAAQ,EAAQ,OAChB,WACA,OAAQ,EAAQ,OAChB,QAAS,EAAQ,QACjB,MAAO,EAAA,YAAY,CAAO,CAC5B,CACF,EAOa,EAAgB,EAAa"}
|
package/dist/_default.d.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import type { Cleanup, ComputedOptions, EffectHandle, EffectOptions, Readable, RippleOptions, Scope, Signal, SignalOptions } from './types';
|
|
2
1
|
import { type Resource, type ResourceOptions } from './_async';
|
|
3
|
-
import { type Store, type StoreOptions } from './_store';
|
|
4
2
|
import { type WatchOptions } from './_watch';
|
|
3
|
+
import type { Cleanup, ComputedOptions, EffectHandle, EffectOptions, Readable, RippleOptions, Scope, Signal, SignalOptions } from './types';
|
|
5
4
|
export interface Ripple {
|
|
6
5
|
batch<T>(fn: () => T): T;
|
|
7
6
|
computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;
|
|
8
7
|
createScope(name?: string): Scope;
|
|
9
|
-
createStore<T>(initial: T, options?: StoreOptions): Store<T>;
|
|
10
8
|
dispose(): void;
|
|
11
9
|
readonly disposed: boolean;
|
|
12
|
-
effect(callback: () => Cleanup |
|
|
10
|
+
effect(callback: () => Cleanup | undefined, options?: EffectOptions): EffectHandle;
|
|
13
11
|
resource<Source, Value>(source: () => Source, loader: (source: Source, context: {
|
|
14
12
|
readonly signal: AbortSignal;
|
|
15
13
|
}) => Promise<Value>, options?: ResourceOptions): Resource<Value>;
|
|
@@ -20,10 +18,9 @@ export interface Ripple {
|
|
|
20
18
|
/** Creates one complete reactive graph. All factories on the object share its runtime. */
|
|
21
19
|
export declare const createRipple: (options?: RippleOptions) => Ripple;
|
|
22
20
|
/**
|
|
23
|
-
* The shared default reactive graph. Private — `
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* that resolve to the same binding.
|
|
21
|
+
* The shared default reactive graph. Private — `signal`, `computed`, `effect`, `batch`,
|
|
22
|
+
* `createScope`, `untrack`, `watch`, and `resource` are re-exported from the package root
|
|
23
|
+
* as bound methods on this single graph instance.
|
|
27
24
|
*/
|
|
28
25
|
export declare const defaultRipple: Ripple;
|
|
29
26
|
//# sourceMappingURL=_default.d.ts.map
|
package/dist/_default.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_default.d.ts","sourceRoot":"","sources":["../src/_default.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"_default.d.ts","sourceRoot":"","sources":["../src/_default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,QAAQ,EAAE,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IACnF,QAAQ,CAAC,MAAM,EAAE,KAAK,EACpB,MAAM,EAAE,MAAM,MAAM,EACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EACrF,OAAO,CAAC,EAAE,eAAe,GACxB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,CAAC,CAAC,EACL,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC;CACjB;AAED,0FAA0F;AAC1F,eAAO,MAAM,YAAY,GAAI,UAAU,aAAa,KAAG,MAkBtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAiB,CAAC"}
|
package/dist/_default.js
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { ReactiveRuntime as e } from "./runtime.js";
|
|
2
|
+
import { createResource as t } from "./_async.js";
|
|
3
3
|
import { createWatch as n } from "./_watch.js";
|
|
4
|
-
import { ReactiveRuntime as r } from "./runtime.js";
|
|
5
4
|
//#region src/_default.ts
|
|
6
|
-
var
|
|
7
|
-
let
|
|
5
|
+
var r = (r) => {
|
|
6
|
+
let i = new e(r), a = t(i);
|
|
8
7
|
return {
|
|
9
|
-
batch:
|
|
10
|
-
computed:
|
|
11
|
-
createScope:
|
|
12
|
-
|
|
13
|
-
dispose: () => a.dispose(),
|
|
8
|
+
batch: i.batch,
|
|
9
|
+
computed: i.computed,
|
|
10
|
+
createScope: i.createScope,
|
|
11
|
+
dispose: () => i.dispose(),
|
|
14
12
|
get disposed() {
|
|
15
|
-
return
|
|
13
|
+
return i.disposed;
|
|
16
14
|
},
|
|
17
|
-
effect:
|
|
18
|
-
resource:
|
|
19
|
-
signal:
|
|
20
|
-
untrack:
|
|
21
|
-
watch: n(
|
|
15
|
+
effect: i.effect,
|
|
16
|
+
resource: a,
|
|
17
|
+
signal: i.signal,
|
|
18
|
+
untrack: i.untrack,
|
|
19
|
+
watch: n(i)
|
|
22
20
|
};
|
|
23
|
-
},
|
|
21
|
+
}, i = r();
|
|
24
22
|
//#endregion
|
|
25
|
-
export {
|
|
23
|
+
export { r as createRipple, i as defaultRipple };
|
|
26
24
|
|
|
27
25
|
//# sourceMappingURL=_default.js.map
|
package/dist/_default.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_default.js","names":[],"sources":["../src/_default.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"_default.js","names":[],"sources":["../src/_default.ts"],"sourcesContent":["import { createResource, type Resource, type ResourceOptions } from './_async';\nimport { createWatch, type WatchOptions } from './_watch';\nimport { ReactiveRuntime } from './runtime';\nimport type {\n Cleanup,\n ComputedOptions,\n EffectHandle,\n EffectOptions,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n} from './types';\n\nexport interface Ripple {\n batch<T>(fn: () => T): T;\n computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;\n createScope(name?: string): Scope;\n dispose(): void;\n readonly disposed: boolean;\n effect(callback: () => Cleanup | undefined, options?: EffectOptions): EffectHandle;\n resource<Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value>;\n signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;\n untrack<T>(fn: () => T): T;\n watch<T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle;\n}\n\n/** Creates one complete reactive graph. All factories on the object share its runtime. */\nexport const createRipple = (options?: RippleOptions): Ripple => {\n const runtime = new ReactiveRuntime(options);\n const resource = createResource(runtime);\n\n return {\n batch: runtime.batch,\n computed: runtime.computed,\n createScope: runtime.createScope,\n dispose: () => runtime.dispose(),\n get disposed() {\n return runtime.disposed;\n },\n effect: runtime.effect,\n resource,\n signal: runtime.signal,\n untrack: runtime.untrack,\n watch: createWatch(runtime),\n };\n};\n\n/**\n * The shared default reactive graph. Private — `signal`, `computed`, `effect`, `batch`,\n * `createScope`, `untrack`, `watch`, and `resource` are re-exported from the package root\n * as bound methods on this single graph instance.\n */\nexport const defaultRipple = createRipple();\n"],"mappings":";;;;AAqCA,IAAa,KAAgB,MAAoC;CAC/D,IAAM,IAAU,IAAI,EAAgB,CAAO,GACrC,IAAW,EAAe,CAAO;CAEvC,OAAO;EACL,OAAO,EAAQ;EACf,UAAU,EAAQ;EAClB,aAAa,EAAQ;EACrB,eAAe,EAAQ,QAAQ;EAC/B,IAAI,WAAW;GACb,OAAO,EAAQ;EACjB;EACA,QAAQ,EAAQ;EAChB;EACA,QAAQ,EAAQ;EAChB,SAAS,EAAQ;EACjB,OAAO,EAAY,CAAO;CAC5B;AACF,GAOa,IAAgB,EAAa"}
|
package/dist/_watch.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=e=>(t,n,r)=>{let i=typeof t==`function`?t:()=>t.value,a=r?.equals??Object.is,o=!0,s,c=!1,l=e.effect(()=>{let e=i();if(o){o=!1,s=e,r?.immediate&&n(e,void 0),
|
|
1
|
+
var e=e=>(t,n,r)=>{let i=typeof t==`function`?t:()=>t.value,a=r?.equals??Object.is,o=!0,s,c=!1,l=e.effect(()=>{let e=i();if(o){o=!1,s=e,r?.immediate&&(n(e,void 0),r?.once&&(c=!0));return}if(a(s,e))return;let t=s;s=e,n(e,t),r?.once&&l.dispose()},{name:r?.name});return c&&l.dispose(),l};exports.createWatch=e;
|
|
2
2
|
//# sourceMappingURL=_watch.cjs.map
|
package/dist/_watch.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_watch.cjs","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () =>
|
|
1
|
+
{"version":3,"file":"_watch.cjs","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n};\n\nexport const createWatch =\n (runtime: WatchRuntime) =>\n <T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle => {\n const read = typeof source === 'function' ? source : () => source.value;\n const equals = options?.equals ?? Object.is;\n let initial = true;\n let previous: T | undefined;\n // `handle` is in the temporal dead zone during the effect's initial synchronous run —\n // `runtime.effect()` calls `node.run()` before returning. Defer disposal until after\n // the constructor returns so `handle.dispose()` is reachable from inside the callback.\n let disposeAfterInit = false;\n\n const handle = runtime.effect(\n () => {\n const value = read();\n\n if (initial) {\n initial = false;\n previous = value;\n\n if (options?.immediate) {\n callback(value, undefined);\n if (options?.once) disposeAfterInit = true;\n }\n\n return;\n }\n\n if (equals(previous as T, value)) return;\n\n const oldValue = previous;\n\n previous = value;\n callback(value, oldValue);\n\n if (options?.once) handle.dispose();\n },\n { name: options?.name },\n );\n\n if (disposeAfterInit) handle.dispose();\n\n return handle;\n };\n"],"mappings":"AAaA,IAAa,EACV,IAEC,EACA,EACA,IACiB,CACjB,IAAM,EAAO,OAAO,GAAW,WAAa,MAAe,EAAO,MAC5D,EAAS,GAAS,QAAU,OAAO,GACrC,EAAU,GACV,EAIA,EAAmB,GAEjB,EAAS,EAAQ,WACf,CACJ,IAAM,EAAQ,EAAK,EAEnB,GAAI,EAAS,CACX,EAAU,GACV,EAAW,EAEP,GAAS,YACX,EAAS,EAAO,IAAA,EAAS,EACrB,GAAS,OAAM,EAAmB,KAGxC,MACF,CAEA,GAAI,EAAO,EAAe,CAAK,EAAG,OAElC,IAAM,EAAW,EAEjB,EAAW,EACX,EAAS,EAAO,CAAQ,EAEpB,GAAS,MAAM,EAAO,QAAQ,CACpC,EACA,CAAE,KAAM,GAAS,IAAK,CACxB,EAIA,OAFI,GAAkB,EAAO,QAAQ,EAE9B,CACT"}
|
package/dist/_watch.d.ts
CHANGED
package/dist/_watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_watch.d.ts","sourceRoot":"","sources":["../src/_watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"_watch.d.ts","sourceRoot":"","sources":["../src/_watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;CAC7F,CAAC;AAEF,eAAO,MAAM,WAAW,GACrB,SAAS,YAAY,MACrB,CAAC,EACA,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/B,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,UAAU,YAAY,CAAC,CAAC,CAAC,KACxB,YAyCF,CAAC"}
|
package/dist/_watch.js
CHANGED
|
@@ -3,7 +3,7 @@ var e = (e) => (t, n, r) => {
|
|
|
3
3
|
let i = typeof t == "function" ? t : () => t.value, a = r?.equals ?? Object.is, o = !0, s, c = !1, l = e.effect(() => {
|
|
4
4
|
let e = i();
|
|
5
5
|
if (o) {
|
|
6
|
-
o = !1, s = e, r?.immediate && n(e, void 0),
|
|
6
|
+
o = !1, s = e, r?.immediate && (n(e, void 0), r?.once && (c = !0));
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
9
|
if (a(s, e)) return;
|
package/dist/_watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_watch.js","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () =>
|
|
1
|
+
{"version":3,"file":"_watch.js","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n};\n\nexport const createWatch =\n (runtime: WatchRuntime) =>\n <T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle => {\n const read = typeof source === 'function' ? source : () => source.value;\n const equals = options?.equals ?? Object.is;\n let initial = true;\n let previous: T | undefined;\n // `handle` is in the temporal dead zone during the effect's initial synchronous run —\n // `runtime.effect()` calls `node.run()` before returning. Defer disposal until after\n // the constructor returns so `handle.dispose()` is reachable from inside the callback.\n let disposeAfterInit = false;\n\n const handle = runtime.effect(\n () => {\n const value = read();\n\n if (initial) {\n initial = false;\n previous = value;\n\n if (options?.immediate) {\n callback(value, undefined);\n if (options?.once) disposeAfterInit = true;\n }\n\n return;\n }\n\n if (equals(previous as T, value)) return;\n\n const oldValue = previous;\n\n previous = value;\n callback(value, oldValue);\n\n if (options?.once) handle.dispose();\n },\n { name: options?.name },\n );\n\n if (disposeAfterInit) handle.dispose();\n\n return handle;\n };\n"],"mappings":";AAaA,IAAa,KACV,OAEC,GACA,GACA,MACiB;CACjB,IAAM,IAAO,OAAO,KAAW,aAAa,UAAe,EAAO,OAC5D,IAAS,GAAS,UAAU,OAAO,IACrC,IAAU,IACV,GAIA,IAAmB,IAEjB,IAAS,EAAQ,aACf;EACJ,IAAM,IAAQ,EAAK;EAEnB,IAAI,GAAS;GAIX,AAHA,IAAU,IACV,IAAW,GAEP,GAAS,cACX,EAAS,GAAO,KAAA,CAAS,GACrB,GAAS,SAAM,IAAmB;GAGxC;EACF;EAEA,IAAI,EAAO,GAAe,CAAK,GAAG;EAElC,IAAM,IAAW;EAKjB,AAHA,IAAW,GACX,EAAS,GAAO,CAAQ,GAEpB,GAAS,QAAM,EAAO,QAAQ;CACpC,GACA,EAAE,MAAM,GAAS,KAAK,CACxB;CAIA,OAFI,KAAkB,EAAO,QAAQ,GAE9B;AACT"}
|
package/dist/errors.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=class
|
|
1
|
+
var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{},n=class extends e{},r=class extends e{},i=class extends e{};exports.RippleComputedCycleError=t,exports.RippleDisposedRuntimeError=n,exports.RippleDisposedScopeError=r,exports.RippleError=e,exports.RippleInfiniteLoopError=i;
|
|
2
2
|
//# sourceMappingURL=errors.cjs.map
|
package/dist/errors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n
|
|
1
|
+
{"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RippleComputedCycleError extends RippleError {}\nexport class RippleDisposedRuntimeError extends RippleError {}\nexport class RippleDisposedScopeError extends RippleError {}\nexport class RippleInfiniteLoopError extends RippleError {}\n"],"mappings":"AAAA,IAAa,EAAb,cAAiC,KAAM,CACrC,YAAY,EAAiB,EAAwB,CACnD,MAAM,EAAS,CAAO,EACtB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,EAAb,cAA8C,CAAY,CAAC,EAC9C,EAAb,cAAgD,CAAY,CAAC,EAChD,EAAb,cAA8C,CAAY,CAAC,EAC9C,EAAb,cAA6C,CAAY,CAAC"}
|
package/dist/errors.d.ts
CHANGED
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKpD;AAED,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,0BAA2B,SAAQ,WAAW;CAAG;AAC9D,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,uBAAwB,SAAQ,WAAW;CAAG"}
|
package/dist/errors.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
//#region src/errors.ts
|
|
2
|
-
var e = class
|
|
2
|
+
var e = class extends Error {
|
|
3
3
|
constructor(e, t) {
|
|
4
4
|
super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
|
|
5
5
|
}
|
|
6
|
-
static is(t) {
|
|
7
|
-
return t instanceof e;
|
|
8
|
-
}
|
|
9
6
|
}, t = class extends e {}, n = class extends e {}, r = class extends e {}, i = class extends e {};
|
|
10
7
|
//#endregion
|
|
11
8
|
export { t as RippleComputedCycleError, n as RippleDisposedRuntimeError, r as RippleDisposedScopeError, e as RippleError, i as RippleInfiniteLoopError };
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RippleComputedCycleError extends RippleError {}\nexport class RippleDisposedRuntimeError extends RippleError {}\nexport class RippleDisposedScopeError extends RippleError {}\nexport class RippleInfiniteLoopError extends RippleError {}\n"],"mappings":";AAAA,IAAa,IAAb,cAAiC,MAAM;CACrC,YAAY,GAAiB,GAAwB;EAGnD,AAFA,MAAM,GAAS,CAAO,GACtB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAEa,IAAb,cAA8C,EAAY,CAAC,GAC9C,IAAb,cAAgD,EAAY,CAAC,GAChD,IAAb,cAA8C,EAAY,CAAC,GAC9C,IAAb,cAA6C,EAAY,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./runtime.cjs"),n=require("./_default.cjs");var r=n.defaultRipple.signal,i=n.defaultRipple.computed,a=n.defaultRipple.effect,o=n.defaultRipple.batch,s=n.defaultRipple.createScope,c=n.defaultRipple.untrack;exports.RippleComputedCycleError=e.RippleComputedCycleError,exports.RippleDisposedRuntimeError=e.RippleDisposedRuntimeError,exports.RippleDisposedScopeError=e.RippleDisposedScopeError,exports.RippleError=e.RippleError,exports.RippleInfiniteLoopError=e.RippleInfiniteLoopError,exports.batch=o,exports.computed=i,exports.createRipple=n.createRipple,exports.createScope=s,exports.effect=a,exports.isReactive=t.isReactive,exports.signal=r,exports.untrack=c;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./runtime.cjs"),n=require("./_default.cjs");var r=n.defaultRipple.signal,i=n.defaultRipple.computed,a=n.defaultRipple.effect,o=n.defaultRipple.batch,s=n.defaultRipple.createScope,c=n.defaultRipple.untrack,l=n.defaultRipple.watch,u=n.defaultRipple.resource;exports.RippleComputedCycleError=e.RippleComputedCycleError,exports.RippleDisposedRuntimeError=e.RippleDisposedRuntimeError,exports.RippleDisposedScopeError=e.RippleDisposedScopeError,exports.RippleError=e.RippleError,exports.RippleInfiniteLoopError=e.RippleInfiniteLoopError,exports.batch=o,exports.computed=i,exports.createRipple=n.createRipple,exports.createScope=s,exports.effect=a,exports.isReactive=t.isReactive,exports.resource=u,exports.signal=r,exports.untrack=c,exports.watch=l;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type { AsyncState, Resource, ResourceOptions } from './_async';\nexport { createRipple, type Ripple } from './_default';\nexport type { WatchOptions } from './_watch';\nexport {\n RippleComputedCycleError,\n RippleDisposedRuntimeError,\n RippleDisposedScopeError,\n RippleError,\n RippleInfiniteLoopError,\n} from './errors';\nexport { isReactive } from './runtime';\nexport type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\nimport { defaultRipple } from './_default';\n\nexport const signal = defaultRipple.signal;\nexport const computed = defaultRipple.computed;\nexport const effect = defaultRipple.effect;\nexport const batch = defaultRipple.batch;\nexport const createScope = defaultRipple.createScope;\nexport const untrack = defaultRipple.untrack;\nexport const watch = defaultRipple.watch;\nexport const resource = defaultRipple.resource;\n"],"mappings":"0JA+BA,IAAa,EAAS,EAAA,cAAc,OACvB,EAAW,EAAA,cAAc,SACzB,EAAS,EAAA,cAAc,OACvB,EAAQ,EAAA,cAAc,MACtB,EAAc,EAAA,cAAc,YAC5B,EAAU,EAAA,cAAc,QACxB,EAAQ,EAAA,cAAc,MACtB,EAAW,EAAA,cAAc"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
export type {
|
|
1
|
+
export type { AsyncState, Resource, ResourceOptions } from './_async';
|
|
2
|
+
export { createRipple, type Ripple } from './_default';
|
|
3
|
+
export type { WatchOptions } from './_watch';
|
|
2
4
|
export { RippleComputedCycleError, RippleDisposedRuntimeError, RippleDisposedScopeError, RippleError, RippleInfiniteLoopError, } from './errors';
|
|
3
5
|
export { isReactive } from './runtime';
|
|
4
|
-
export {
|
|
6
|
+
export type { Cleanup, ComputedOptions, Disposable, EffectHandle, EffectOptions, Equality, ReactiveErrorContext, ReactiveEvent, ReactiveObserver, Readable, RippleOptions, Scope, Signal, SignalOptions, Unsubscribe, } from './types';
|
|
5
7
|
export declare const signal: <T>(initial: T, options?: import("./types").SignalOptions<T>) => import("./types").Signal<T>;
|
|
6
8
|
export declare const computed: <T>(derive: () => T, options?: import("./types").ComputedOptions<T>) => import("./types").Readable<T>;
|
|
7
|
-
export declare const effect: (callback: () => import("./types").Cleanup |
|
|
9
|
+
export declare const effect: (callback: () => import("./types").Cleanup | undefined, options?: import("./types").EffectOptions) => import("./types").EffectHandle;
|
|
8
10
|
export declare const batch: <T>(fn: () => T) => T;
|
|
9
11
|
export declare const createScope: (name?: string) => import("./types").Scope;
|
|
10
12
|
export declare const untrack: <T>(fn: () => T) => T;
|
|
13
|
+
export declare const watch: <T>(source: import("./types").Readable<T> | (() => T), callback: (value: T, previous: T | undefined) => void, options?: import("./_watch").WatchOptions<T>) => import("./types").EffectHandle;
|
|
14
|
+
export declare const resource: <Source, Value>(source: () => Source, loader: (source: Source, context: {
|
|
15
|
+
readonly signal: AbortSignal;
|
|
16
|
+
}) => Promise<Value>, options?: import("./_async").ResourceOptions) => import("./_async").Resource<Value>;
|
|
11
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,WAAW,EACX,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EACV,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,MAAM,8FAAuB,CAAC;AAC3C,eAAO,MAAM,QAAQ,uGAAyB,CAAC;AAC/C,eAAO,MAAM,MAAM,sIAAuB,CAAC;AAC3C,eAAO,MAAM,KAAK,uBAAsB,CAAC;AACzC,eAAO,MAAM,WAAW,4CAA4B,CAAC;AACrD,eAAO,MAAM,OAAO,uBAAwB,CAAC;AAC7C,eAAO,MAAM,KAAK,+LAAsB,CAAC;AACzC,eAAO,MAAM,QAAQ;;yGAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,8 @@ import { RippleComputedCycleError as e, RippleDisposedRuntimeError as t, RippleD
|
|
|
2
2
|
import { isReactive as a } from "./runtime.js";
|
|
3
3
|
import { createRipple as o, defaultRipple as s } from "./_default.js";
|
|
4
4
|
//#region src/index.ts
|
|
5
|
-
var c = s.signal, l = s.computed, u = s.effect, d = s.batch, f = s.createScope, p = s.untrack;
|
|
5
|
+
var c = s.signal, l = s.computed, u = s.effect, d = s.batch, f = s.createScope, p = s.untrack, m = s.watch, h = s.resource;
|
|
6
6
|
//#endregion
|
|
7
|
-
export { e as RippleComputedCycleError, t as RippleDisposedRuntimeError, n as RippleDisposedScopeError, r as RippleError, i as RippleInfiniteLoopError, d as batch, l as computed, o as createRipple, f as createScope, u as effect, a as isReactive, c as signal, p as untrack };
|
|
7
|
+
export { e as RippleComputedCycleError, t as RippleDisposedRuntimeError, n as RippleDisposedScopeError, r as RippleError, i as RippleInfiniteLoopError, d as batch, l as computed, o as createRipple, f as createScope, u as effect, a as isReactive, h as resource, c as signal, p as untrack, m as watch };
|
|
8
8
|
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type { AsyncState, Resource, ResourceOptions } from './_async';\nexport { createRipple, type Ripple } from './_default';\nexport type { WatchOptions } from './_watch';\nexport {\n RippleComputedCycleError,\n RippleDisposedRuntimeError,\n RippleDisposedScopeError,\n RippleError,\n RippleInfiniteLoopError,\n} from './errors';\nexport { isReactive } from './runtime';\nexport type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\nimport { defaultRipple } from './_default';\n\nexport const signal = defaultRipple.signal;\nexport const computed = defaultRipple.computed;\nexport const effect = defaultRipple.effect;\nexport const batch = defaultRipple.batch;\nexport const createScope = defaultRipple.createScope;\nexport const untrack = defaultRipple.untrack;\nexport const watch = defaultRipple.watch;\nexport const resource = defaultRipple.resource;\n"],"mappings":";;;;AA+BA,IAAa,IAAS,EAAc,QACvB,IAAW,EAAc,UACzB,IAAS,EAAc,QACvB,IAAQ,EAAc,OACtB,IAAc,EAAc,aAC5B,IAAU,EAAc,SACxB,IAAQ,EAAc,OACtB,IAAW,EAAc"}
|