foldkit 0.148.2 → 0.149.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 +15 -24
- package/dist/message/index.d.ts +2 -1
- package/dist/message/index.d.ts.map +1 -1
- package/dist/message/index.js +1 -1
- package/dist/message/public.d.ts +2 -1
- package/dist/message/public.d.ts.map +1 -1
- package/dist/message/public.js +1 -1
- package/dist/runtime/runtime.d.ts +1 -2
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/schema/index.d.ts +53 -8
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +179 -21
- package/dist/subscription/subscription.d.ts +1 -1
- package/dist/subscription/subscription.js +1 -1
- package/dist/test/apps/attributes.d.ts +7 -4
- package/dist/test/apps/attributes.d.ts.map +1 -1
- package/dist/test/apps/attributes.js +6 -6
- package/dist/test/apps/bubbling.d.ts +8 -2
- package/dist/test/apps/bubbling.d.ts.map +1 -1
- package/dist/test/apps/bubbling.js +10 -9
- package/dist/test/apps/colorPicker.d.ts +7 -6
- package/dist/test/apps/colorPicker.d.ts.map +1 -1
- package/dist/test/apps/colorPicker.js +8 -7
- package/dist/test/apps/contextMenu.d.ts +14 -4
- package/dist/test/apps/contextMenu.d.ts.map +1 -1
- package/dist/test/apps/contextMenu.js +8 -9
- package/dist/test/apps/counter.d.ts +52 -24
- package/dist/test/apps/counter.d.ts.map +1 -1
- package/dist/test/apps/counter.js +23 -34
- package/dist/test/apps/crashOnRender.d.ts +44 -28
- package/dist/test/apps/crashOnRender.d.ts.map +1 -1
- package/dist/test/apps/crashOnRender.js +17 -20
- package/dist/test/apps/drafts.d.ts +19 -8
- package/dist/test/apps/drafts.d.ts.map +1 -1
- package/dist/test/apps/drafts.js +10 -11
- package/dist/test/apps/feedSocket.d.ts +13 -13
- package/dist/test/apps/feedSocket.d.ts.map +1 -1
- package/dist/test/apps/feedSocket.js +17 -28
- package/dist/test/apps/fileUpload.d.ts +7 -6
- package/dist/test/apps/fileUpload.d.ts.map +1 -1
- package/dist/test/apps/fileUpload.js +9 -8
- package/dist/test/apps/formChild.d.ts +40 -24
- package/dist/test/apps/formChild.d.ts.map +1 -1
- package/dist/test/apps/formChild.js +31 -32
- package/dist/test/apps/interactions.d.ts +16 -11
- package/dist/test/apps/interactions.d.ts.map +1 -1
- package/dist/test/apps/interactions.js +21 -24
- package/dist/test/apps/keypress.d.ts +11 -11
- package/dist/test/apps/keypress.d.ts.map +1 -1
- package/dist/test/apps/keypress.js +12 -12
- package/dist/test/apps/login.d.ts +43 -23
- package/dist/test/apps/login.d.ts.map +1 -1
- package/dist/test/apps/login.js +17 -25
- package/dist/test/apps/logoutButton.d.ts +12 -6
- package/dist/test/apps/logoutButton.d.ts.map +1 -1
- package/dist/test/apps/logoutButton.js +15 -11
- package/dist/test/apps/mountPanel.d.ts +19 -20
- package/dist/test/apps/mountPanel.d.ts.map +1 -1
- package/dist/test/apps/mountPanel.js +22 -24
- package/dist/test/apps/multiRole.d.ts +6 -3
- package/dist/test/apps/multiRole.d.ts.map +1 -1
- package/dist/test/apps/multiRole.js +8 -7
- package/dist/test/apps/pointer.d.ts +13 -6
- package/dist/test/apps/pointer.d.ts.map +1 -1
- package/dist/test/apps/pointer.js +11 -10
- package/dist/test/apps/resumeUpload.d.ts +11 -14
- package/dist/test/apps/resumeUpload.d.ts.map +1 -1
- package/dist/test/apps/resumeUpload.js +17 -27
- package/dist/test/apps/scorePanel.d.ts +6 -3
- package/dist/test/apps/scorePanel.d.ts.map +1 -1
- package/dist/test/apps/scorePanel.js +8 -7
- package/dist/test/apps/selectiveKeys.d.ts +5 -1
- package/dist/test/apps/selectiveKeys.d.ts.map +1 -1
- package/dist/test/apps/selectiveKeys.js +13 -12
- package/dist/test/apps/uploads.d.ts +52 -30
- package/dist/test/apps/uploads.d.ts.map +1 -1
- package/dist/test/apps/uploads.js +20 -30
- package/dist/update/update.d.ts +4 -7
- package/dist/update/update.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,31 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Schema as S } from 'effect';
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
// MODEL
|
|
4
4
|
export const Model = S.Struct({
|
|
5
5
|
clicks: S.Number,
|
|
6
6
|
doubleClicks: S.Number,
|
|
7
7
|
});
|
|
8
8
|
// MESSAGE
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const Message = defineMessageUnion({
|
|
10
|
+
ClickedContainer: {},
|
|
11
|
+
DoubleClickedContainer: {},
|
|
12
|
+
});
|
|
12
13
|
// INIT
|
|
13
14
|
export const initialModel = {
|
|
14
15
|
clicks: 0,
|
|
15
16
|
doubleClicks: 0,
|
|
16
17
|
};
|
|
17
18
|
// UPDATE
|
|
18
|
-
export const update = (model, message) =>
|
|
19
|
+
export const update = (model, message) => Message.match(message, {
|
|
19
20
|
ClickedContainer: () => [{ ...model, clicks: model.clicks + 1 }, []],
|
|
20
21
|
DoubleClickedContainer: () => [
|
|
21
22
|
{ ...model, doubleClicks: model.doubleClicks + 1 },
|
|
22
23
|
[],
|
|
23
24
|
],
|
|
24
|
-
})
|
|
25
|
+
});
|
|
25
26
|
// VIEW
|
|
26
27
|
export const view = (model, h) => {
|
|
27
28
|
return h.div([], [
|
|
28
|
-
h.div([h.Role('option'), h.OnClick(ClickedContainer())], [h.span([], [`clicks=${model.clicks}`])]),
|
|
29
|
-
h.div([h.Role('listitem'), h.OnDoubleClick(DoubleClickedContainer())], [h.span([], [`dbl=${model.doubleClicks}`])]),
|
|
29
|
+
h.div([h.Role('option'), h.OnClick(Message.ClickedContainer())], [h.span([], [`clicks=${model.clicks}`])]),
|
|
30
|
+
h.div([h.Role('listitem'), h.OnDoubleClick(Message.DoubleClickedContainer())], [h.span([], [`dbl=${model.doubleClicks}`])]),
|
|
30
31
|
]);
|
|
31
32
|
};
|
|
@@ -12,17 +12,18 @@ export declare const Model: S.Struct<{
|
|
|
12
12
|
readonly color: S.String;
|
|
13
13
|
}>;
|
|
14
14
|
export type Model = typeof Model.Type;
|
|
15
|
-
export declare const
|
|
16
|
-
|
|
15
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
16
|
+
readonly ChangedColor: {
|
|
17
|
+
readonly value: S.String;
|
|
18
|
+
};
|
|
17
19
|
}>;
|
|
18
|
-
export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ChangedColor", {
|
|
19
|
-
value: S.String;
|
|
20
|
-
}>]>;
|
|
21
20
|
export type Message = typeof Message.Type;
|
|
22
21
|
export declare const initialModel: {
|
|
23
22
|
readonly color: string;
|
|
24
23
|
};
|
|
25
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
24
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
25
|
+
readonly color: string;
|
|
26
|
+
}, readonly never[]];
|
|
26
27
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
27
28
|
export declare const viewWithoutHandler: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
28
29
|
//# sourceMappingURL=colorPicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colorPicker.d.ts","sourceRoot":"","sources":["../../../src/test/apps/colorPicker.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"colorPicker.d.ts","sourceRoot":"","sources":["../../../src/test/apps/colorPicker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,aAAa,MAAM,8BAA8B,CAAA;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAM5D,eAAO,MAAM,cAAc;;;;;;EAQzB,CAAA;AAIF,eAAO,MAAM,KAAK;;EAAgC,CAAA;AAClD,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;EAElB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY;;CAAmC,CAAA;AAI5D,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;oBAGjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAkB5D,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,GAAG,WAAW,CAAC,OAAO,CAAC,KACtB,IAUF,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Schema as S } from 'effect';
|
|
2
2
|
import * as CustomElement from '../../customElement/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
4
4
|
import { evo } from '../../struct/index.js';
|
|
5
5
|
// CUSTOM ELEMENT
|
|
6
6
|
export const hexColorPicker = CustomElement.define({
|
|
@@ -15,21 +15,22 @@ export const hexColorPicker = CustomElement.define({
|
|
|
15
15
|
// MODEL
|
|
16
16
|
export const Model = S.Struct({ color: S.String });
|
|
17
17
|
// MESSAGE
|
|
18
|
-
export const
|
|
19
|
-
|
|
18
|
+
export const Message = defineMessageUnion({
|
|
19
|
+
ChangedColor: { value: S.String },
|
|
20
|
+
});
|
|
20
21
|
// INIT
|
|
21
22
|
export const initialModel = Model.make({ color: '#000000' });
|
|
22
23
|
// UPDATE
|
|
23
|
-
export const update = (model, message) =>
|
|
24
|
+
export const update = (model, message) => Message.match(message, {
|
|
24
25
|
ChangedColor: ({ value }) => [evo(model, { color: () => value }), []],
|
|
25
|
-
})
|
|
26
|
+
});
|
|
26
27
|
// VIEW
|
|
27
28
|
export const view = (model, h) => {
|
|
28
29
|
const picker = hexColorPicker.withMessage(h);
|
|
29
30
|
return h.div([], [
|
|
30
31
|
picker([
|
|
31
32
|
picker.Color(model.color),
|
|
32
|
-
picker.OnColorChanged(detail => ChangedColor({ value: detail.value })),
|
|
33
|
+
picker.OnColorChanged(detail => Message.ChangedColor({ value: detail.value })),
|
|
33
34
|
], []),
|
|
34
35
|
h.span([h.Role('status')], [model.color]),
|
|
35
36
|
]);
|
|
@@ -7,9 +7,11 @@ export declare const Model: S.Struct<{
|
|
|
7
7
|
readonly openCount: S.Number;
|
|
8
8
|
}>;
|
|
9
9
|
export type Model = typeof Model.Type;
|
|
10
|
-
declare const Message:
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
11
|
+
readonly OpenedContextMenu: {
|
|
12
|
+
readonly source: S.Literals<readonly ["Direct", "Inner", "Outer"]>;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
13
15
|
type Message = typeof Message.Type;
|
|
14
16
|
export declare const initialModel: {
|
|
15
17
|
readonly contextMenu: {
|
|
@@ -20,7 +22,15 @@ export declare const initialModel: {
|
|
|
20
22
|
};
|
|
21
23
|
readonly openCount: number;
|
|
22
24
|
};
|
|
23
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
25
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
26
|
+
readonly contextMenu: {
|
|
27
|
+
readonly _tag: "Closed";
|
|
28
|
+
} | {
|
|
29
|
+
readonly _tag: "Open";
|
|
30
|
+
readonly source: "Direct" | "Inner" | "Outer";
|
|
31
|
+
};
|
|
32
|
+
readonly openCount: number;
|
|
33
|
+
}, readonly never[]];
|
|
24
34
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
25
35
|
export {};
|
|
26
36
|
//# sourceMappingURL=contextMenu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextMenu.d.ts","sourceRoot":"","sources":["../../../src/test/apps/contextMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAiB5D,eAAO,MAAM,KAAK;;;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"contextMenu.d.ts","sourceRoot":"","sources":["../../../src/test/apps/contextMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAiB5D,eAAO,MAAM,KAAK;;;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,QAAA,MAAM,OAAO;;;;EAEX,CAAA;AACF,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIlC,eAAO,MAAM,YAAY;;;;;;;;CAGvB,CAAA;AAIF,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;;;;;oBASjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA8C5D,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Match as M, Number, Schema as S } from 'effect';
|
|
2
|
-
import {
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
import { ts } from '../../schema/index.js';
|
|
4
4
|
import { evo } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
@@ -14,17 +14,16 @@ export const Model = S.Struct({
|
|
|
14
14
|
openCount: S.Number,
|
|
15
15
|
});
|
|
16
16
|
// MESSAGE
|
|
17
|
-
const
|
|
18
|
-
source: ContextMenuSource,
|
|
17
|
+
const Message = defineMessageUnion({
|
|
18
|
+
OpenedContextMenu: { source: ContextMenuSource },
|
|
19
19
|
});
|
|
20
|
-
const Message = S.Union([OpenedContextMenu]);
|
|
21
20
|
// INIT
|
|
22
21
|
export const initialModel = Model.make({
|
|
23
22
|
contextMenu: Closed(),
|
|
24
23
|
openCount: 0,
|
|
25
24
|
});
|
|
26
25
|
// UPDATE
|
|
27
|
-
export const update = (model, message) =>
|
|
26
|
+
export const update = (model, message) => Message.match(message, {
|
|
28
27
|
OpenedContextMenu: ({ source }) => [
|
|
29
28
|
evo(model, {
|
|
30
29
|
contextMenu: () => Open({ source }),
|
|
@@ -32,7 +31,7 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
|
|
|
32
31
|
}),
|
|
33
32
|
[],
|
|
34
33
|
],
|
|
35
|
-
})
|
|
34
|
+
});
|
|
36
35
|
// VIEW
|
|
37
36
|
export const view = (model, h) => {
|
|
38
37
|
const contextMenu = M.value(model.contextMenu).pipe(M.tagsExhaustive({
|
|
@@ -42,17 +41,17 @@ export const view = (model, h) => {
|
|
|
42
41
|
return h.div([], [
|
|
43
42
|
h.section([
|
|
44
43
|
h.AriaLabel('outer context area'),
|
|
45
|
-
h.OnContextMenu(OpenedContextMenu({ source: 'Outer' })),
|
|
44
|
+
h.OnContextMenu(Message.OpenedContextMenu({ source: 'Outer' })),
|
|
46
45
|
], [
|
|
47
46
|
h.span([h.AriaLabel('outer target')], ['Outer target']),
|
|
48
47
|
h.div([
|
|
49
48
|
h.AriaLabel('inner context area'),
|
|
50
|
-
h.OnContextMenu(OpenedContextMenu({ source: 'Inner' })),
|
|
49
|
+
h.OnContextMenu(Message.OpenedContextMenu({ source: 'Inner' })),
|
|
51
50
|
], [
|
|
52
51
|
h.span([h.AriaLabel('nearest target')], ['Nearest target']),
|
|
53
52
|
h.button([
|
|
54
53
|
h.AriaLabel('direct target'),
|
|
55
|
-
h.OnContextMenu(OpenedContextMenu({ source: 'Direct' })),
|
|
54
|
+
h.OnContextMenu(Message.OpenedContextMenu({ source: 'Direct' })),
|
|
56
55
|
], ['Direct target']),
|
|
57
56
|
]),
|
|
58
57
|
]),
|
|
@@ -6,30 +6,25 @@ export declare const Model: S.Struct<{
|
|
|
6
6
|
readonly log: S.$Array<S.Number>;
|
|
7
7
|
}>;
|
|
8
8
|
export type Model = typeof Model.Type;
|
|
9
|
-
export declare const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
10
|
+
readonly ClickedIncrement: {};
|
|
11
|
+
readonly ClickedDecrement: {};
|
|
12
|
+
readonly ClickedFetch: {};
|
|
13
|
+
readonly ClickedFetchById: {
|
|
14
|
+
readonly id: S.Number;
|
|
15
|
+
};
|
|
16
|
+
readonly Ticked: {};
|
|
17
|
+
readonly PolledCount: {};
|
|
18
|
+
readonly StartedThreeFetches: {};
|
|
19
|
+
readonly StartedTwoFetchesById: {};
|
|
20
|
+
readonly StartedMixedFetches: {};
|
|
21
|
+
readonly SucceededFetchCount: {
|
|
22
|
+
readonly count: S.Number;
|
|
23
|
+
};
|
|
24
|
+
readonly FailedFetchCount: {
|
|
25
|
+
readonly error: S.String;
|
|
26
|
+
};
|
|
25
27
|
}>;
|
|
26
|
-
export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ClickedIncrement", {}>, import("../../schema/index.js").CallableTaggedStruct<"ClickedDecrement", {}>, import("../../schema/index.js").CallableTaggedStruct<"ClickedFetch", {}>, import("../../schema/index.js").CallableTaggedStruct<"ClickedFetchById", {
|
|
27
|
-
id: S.Number;
|
|
28
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"Ticked", {}>, import("../../schema/index.js").CallableTaggedStruct<"PolledCount", {}>, import("../../schema/index.js").CallableTaggedStruct<"StartedThreeFetches", {}>, import("../../schema/index.js").CallableTaggedStruct<"StartedTwoFetchesById", {}>, import("../../schema/index.js").CallableTaggedStruct<"StartedMixedFetches", {}>, import("../../schema/index.js").CallableTaggedStruct<"SucceededFetchCount", {
|
|
29
|
-
count: S.Number;
|
|
30
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"FailedFetchCount", {
|
|
31
|
-
error: S.String;
|
|
32
|
-
}>]>;
|
|
33
28
|
export type Message = typeof Message.Type;
|
|
34
29
|
export declare const FetchCount: Command.CommandDefinitionNoArgs<"FetchCount", Effect.Effect<{
|
|
35
30
|
readonly _tag: "SucceededFetchCount";
|
|
@@ -42,6 +37,39 @@ export declare const FetchCountById: Command.CommandDefinitionWithArgs<"FetchCou
|
|
|
42
37
|
readonly count: number;
|
|
43
38
|
}, never, never>>;
|
|
44
39
|
export declare const initialModel: Model;
|
|
45
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
40
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
41
|
+
readonly count: number;
|
|
42
|
+
readonly log: readonly number[];
|
|
43
|
+
}, readonly Readonly<{
|
|
44
|
+
name: string;
|
|
45
|
+
args?: Record<string, unknown>;
|
|
46
|
+
key?: string;
|
|
47
|
+
effect: Effect.Effect<{
|
|
48
|
+
readonly _tag: "ClickedIncrement";
|
|
49
|
+
} | {
|
|
50
|
+
readonly _tag: "ClickedDecrement";
|
|
51
|
+
} | {
|
|
52
|
+
readonly _tag: "ClickedFetch";
|
|
53
|
+
} | {
|
|
54
|
+
readonly _tag: "ClickedFetchById";
|
|
55
|
+
readonly id: number;
|
|
56
|
+
} | {
|
|
57
|
+
readonly _tag: "Ticked";
|
|
58
|
+
} | {
|
|
59
|
+
readonly _tag: "PolledCount";
|
|
60
|
+
} | {
|
|
61
|
+
readonly _tag: "StartedThreeFetches";
|
|
62
|
+
} | {
|
|
63
|
+
readonly _tag: "StartedTwoFetchesById";
|
|
64
|
+
} | {
|
|
65
|
+
readonly _tag: "StartedMixedFetches";
|
|
66
|
+
} | {
|
|
67
|
+
readonly _tag: "SucceededFetchCount";
|
|
68
|
+
readonly count: number;
|
|
69
|
+
} | {
|
|
70
|
+
readonly _tag: "FailedFetchCount";
|
|
71
|
+
readonly error: string;
|
|
72
|
+
}, never, never>;
|
|
73
|
+
}>[]];
|
|
46
74
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
47
75
|
//# sourceMappingURL=counter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../../src/test/apps/counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../../src/test/apps/counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAU,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE3D,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAM5D,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;EAYlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,UAAU;;;iBAGrB,CAAA;AAEF,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAA;AAIF,eAAO,MAAM,YAAY,EAAE,KAA6B,CAAA;AAIxD,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiClD,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAe5D,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Array, Effect,
|
|
1
|
+
import { Array, Effect, Number, Schema as S } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
4
4
|
import { evo } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const Model = S.Struct({
|
|
@@ -8,44 +8,33 @@ export const Model = S.Struct({
|
|
|
8
8
|
log: S.Array(S.Number),
|
|
9
9
|
});
|
|
10
10
|
// MESSAGE
|
|
11
|
-
export const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
ClickedDecrement,
|
|
25
|
-
ClickedFetch,
|
|
26
|
-
ClickedFetchById,
|
|
27
|
-
Ticked,
|
|
28
|
-
PolledCount,
|
|
29
|
-
StartedThreeFetches,
|
|
30
|
-
StartedTwoFetchesById,
|
|
31
|
-
StartedMixedFetches,
|
|
32
|
-
SucceededFetchCount,
|
|
33
|
-
FailedFetchCount,
|
|
34
|
-
]);
|
|
11
|
+
export const Message = defineMessageUnion({
|
|
12
|
+
ClickedIncrement: {},
|
|
13
|
+
ClickedDecrement: {},
|
|
14
|
+
ClickedFetch: {},
|
|
15
|
+
ClickedFetchById: { id: S.Number },
|
|
16
|
+
Ticked: {},
|
|
17
|
+
PolledCount: {},
|
|
18
|
+
StartedThreeFetches: {},
|
|
19
|
+
StartedTwoFetchesById: {},
|
|
20
|
+
StartedMixedFetches: {},
|
|
21
|
+
SucceededFetchCount: { count: S.Number },
|
|
22
|
+
FailedFetchCount: { error: S.String },
|
|
23
|
+
});
|
|
35
24
|
// COMMAND
|
|
36
25
|
export const FetchCount = Command.define('FetchCount', {
|
|
37
|
-
messages: [SucceededFetchCount, FailedFetchCount],
|
|
38
|
-
execute: Effect.sync(() => SucceededFetchCount({ count: 0 })),
|
|
26
|
+
messages: [Message.SucceededFetchCount, Message.FailedFetchCount],
|
|
27
|
+
execute: Effect.sync(() => Message.SucceededFetchCount({ count: 0 })),
|
|
39
28
|
});
|
|
40
29
|
export const FetchCountById = Command.define('FetchCountById', {
|
|
41
30
|
args: { id: S.Number },
|
|
42
|
-
messages: [SucceededFetchCount, FailedFetchCount],
|
|
43
|
-
execute: ({ id }) => Effect.sync(() => SucceededFetchCount({ count: id })),
|
|
31
|
+
messages: [Message.SucceededFetchCount, Message.FailedFetchCount],
|
|
32
|
+
execute: ({ id }) => Effect.sync(() => Message.SucceededFetchCount({ count: id })),
|
|
44
33
|
});
|
|
45
34
|
// INIT
|
|
46
35
|
export const initialModel = { count: 0, log: [] };
|
|
47
36
|
// UPDATE
|
|
48
|
-
export const update = (model, message) =>
|
|
37
|
+
export const update = (model, message) => Message.match(message, {
|
|
49
38
|
ClickedIncrement: () => [evo(model, { count: Number.increment }), []],
|
|
50
39
|
ClickedDecrement: () => [evo(model, { count: Number.decrement }), []],
|
|
51
40
|
ClickedFetch: () => [model, [FetchCount()]],
|
|
@@ -74,12 +63,12 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
|
|
|
74
63
|
[],
|
|
75
64
|
],
|
|
76
65
|
FailedFetchCount: () => [model, []],
|
|
77
|
-
})
|
|
66
|
+
});
|
|
78
67
|
// VIEW
|
|
79
68
|
export const view = (model, h) => {
|
|
80
69
|
return h.div([], [
|
|
81
70
|
h.span([h.Role('status')], [`count: ${model.count}`]),
|
|
82
|
-
h.button([h.OnClick(StartedThreeFetches()), h.Role('button')], ['Start three fetches']),
|
|
83
|
-
h.button([h.OnClick(StartedTwoFetchesById()), h.Role('button')], ['Start two fetches by id']),
|
|
71
|
+
h.button([h.OnClick(Message.StartedThreeFetches()), h.Role('button')], ['Start three fetches']),
|
|
72
|
+
h.button([h.OnClick(Message.StartedTwoFetchesById()), h.Role('button')], ['Start two fetches by id']),
|
|
84
73
|
]);
|
|
85
74
|
};
|
|
@@ -18,35 +18,24 @@ export declare const Model: S.Struct<{
|
|
|
18
18
|
}>>;
|
|
19
19
|
}>;
|
|
20
20
|
export type Model = typeof Model.Type;
|
|
21
|
-
export declare const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
readonly
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
readonly
|
|
21
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
22
|
+
readonly ClickedReload: {};
|
|
23
|
+
readonly CompletedReloadSources: {
|
|
24
|
+
readonly sources: S.$Array<S.Struct<{
|
|
25
|
+
readonly kind: S.Literal<"Book">;
|
|
26
|
+
readonly id: S.String;
|
|
27
|
+
}>>;
|
|
28
|
+
};
|
|
29
|
+
readonly SelectedSource: {
|
|
30
|
+
readonly source: S.Struct<{
|
|
31
|
+
readonly kind: S.Literal<"Book">;
|
|
32
|
+
readonly id: S.String;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
readonly SubmittedNewSourceId: {
|
|
31
36
|
readonly id: S.String;
|
|
32
|
-
}
|
|
33
|
-
}>;
|
|
34
|
-
export declare const SubmittedNewSourceId: import("../../schema/index.js").CallableTaggedStruct<"SubmittedNewSourceId", {
|
|
35
|
-
id: S.String;
|
|
37
|
+
};
|
|
36
38
|
}>;
|
|
37
|
-
export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ClickedReload", {}>, import("../../schema/index.js").CallableTaggedStruct<"CompletedReloadSources", {
|
|
38
|
-
sources: S.$Array<S.Struct<{
|
|
39
|
-
readonly kind: S.Literal<"Book">;
|
|
40
|
-
readonly id: S.String;
|
|
41
|
-
}>>;
|
|
42
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"SelectedSource", {
|
|
43
|
-
source: S.Struct<{
|
|
44
|
-
readonly kind: S.Literal<"Book">;
|
|
45
|
-
readonly id: S.String;
|
|
46
|
-
}>;
|
|
47
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"SubmittedNewSourceId", {
|
|
48
|
-
id: S.String;
|
|
49
|
-
}>]>;
|
|
50
39
|
export type Message = typeof Message.Type;
|
|
51
40
|
export declare const reloadedSources: ReadonlyArray<RawSource>;
|
|
52
41
|
export declare const ReloadSources: Command.CommandDefinitionNoArgs<"ReloadSources", Effect.Effect<{
|
|
@@ -59,6 +48,33 @@ export declare const ReloadSources: Command.CommandDefinitionNoArgs<"ReloadSourc
|
|
|
59
48
|
export declare const validSources: ReadonlyArray<RawSource>;
|
|
60
49
|
export declare const malformedSources: ReadonlyArray<RawSource>;
|
|
61
50
|
export declare const initialModel: Model;
|
|
62
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
51
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
52
|
+
readonly sources: readonly {
|
|
53
|
+
readonly kind: "Book";
|
|
54
|
+
readonly id: string;
|
|
55
|
+
}[];
|
|
56
|
+
}, readonly Readonly<{
|
|
57
|
+
name: string;
|
|
58
|
+
args?: Record<string, unknown>;
|
|
59
|
+
key?: string;
|
|
60
|
+
effect: Effect.Effect<{
|
|
61
|
+
readonly _tag: "ClickedReload";
|
|
62
|
+
} | {
|
|
63
|
+
readonly _tag: "CompletedReloadSources";
|
|
64
|
+
readonly sources: readonly {
|
|
65
|
+
readonly kind: "Book";
|
|
66
|
+
readonly id: string;
|
|
67
|
+
}[];
|
|
68
|
+
} | {
|
|
69
|
+
readonly _tag: "SelectedSource";
|
|
70
|
+
readonly source: {
|
|
71
|
+
readonly kind: "Book";
|
|
72
|
+
readonly id: string;
|
|
73
|
+
};
|
|
74
|
+
} | {
|
|
75
|
+
readonly _tag: "SubmittedNewSourceId";
|
|
76
|
+
readonly id: string;
|
|
77
|
+
}, never, never>;
|
|
78
|
+
}>[]];
|
|
63
79
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Document;
|
|
64
80
|
//# sourceMappingURL=crashOnRender.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crashOnRender.d.ts","sourceRoot":"","sources":["../../../src/test/apps/crashOnRender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"crashOnRender.d.ts","sourceRoot":"","sources":["../../../src/test/apps/crashOnRender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEnD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAMhE,eAAO,MAAM,SAAS;;;EAGpB,CAAA;AACF,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAA;AAK7C,eAAO,MAAM,MAAM;;;EAGjB,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC,eAAO,MAAM,KAAK;;;;;EAEhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;EAKlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAMzC,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,SAAS,CAGpD,CAAA;AAED,eAAO,MAAM,aAAa;;;;;;iBAKxB,CAAA;AAIF,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,SAAS,CAEjD,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,SAAS,CAErD,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAAiC,CAAA;AAI5D,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;KAelD,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,QAkC5D,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Array, Effect,
|
|
1
|
+
import { Array, Effect, Schema as S } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
4
4
|
import { evo } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const RawSource = S.Struct({
|
|
@@ -18,18 +18,12 @@ export const Model = S.Struct({
|
|
|
18
18
|
sources: S.Array(RawSource),
|
|
19
19
|
});
|
|
20
20
|
// MESSAGE
|
|
21
|
-
export const
|
|
22
|
-
|
|
23
|
-
sources: S.Array(RawSource),
|
|
21
|
+
export const Message = defineMessageUnion({
|
|
22
|
+
ClickedReload: {},
|
|
23
|
+
CompletedReloadSources: { sources: S.Array(RawSource) },
|
|
24
|
+
SelectedSource: { source: Source },
|
|
25
|
+
SubmittedNewSourceId: { id: S.String },
|
|
24
26
|
});
|
|
25
|
-
export const SelectedSource = m('SelectedSource', { source: Source });
|
|
26
|
-
export const SubmittedNewSourceId = m('SubmittedNewSourceId', { id: S.String });
|
|
27
|
-
export const Message = S.Union([
|
|
28
|
-
ClickedReload,
|
|
29
|
-
CompletedReloadSources,
|
|
30
|
-
SelectedSource,
|
|
31
|
-
SubmittedNewSourceId,
|
|
32
|
-
]);
|
|
33
27
|
// COMMAND
|
|
34
28
|
// NOTE: the malformed entry (empty id) sits inertly as a RawSource until the
|
|
35
29
|
// view rebuilds its SelectedSource handler, which constructs a Source and throws.
|
|
@@ -38,8 +32,8 @@ export const reloadedSources = [
|
|
|
38
32
|
{ kind: 'Book', id: '' },
|
|
39
33
|
];
|
|
40
34
|
export const ReloadSources = Command.define('ReloadSources', {
|
|
41
|
-
messages: [CompletedReloadSources],
|
|
42
|
-
execute: Effect.succeed(CompletedReloadSources({ sources: reloadedSources })),
|
|
35
|
+
messages: [Message.CompletedReloadSources],
|
|
36
|
+
execute: Effect.succeed(Message.CompletedReloadSources({ sources: reloadedSources })),
|
|
43
37
|
});
|
|
44
38
|
// INIT
|
|
45
39
|
export const validSources = [
|
|
@@ -50,7 +44,7 @@ export const malformedSources = [
|
|
|
50
44
|
];
|
|
51
45
|
export const initialModel = { sources: validSources };
|
|
52
46
|
// UPDATE
|
|
53
|
-
export const update = (model, message) =>
|
|
47
|
+
export const update = (model, message) => Message.match(message, {
|
|
54
48
|
ClickedReload: () => [model, [ReloadSources()]],
|
|
55
49
|
CompletedReloadSources: ({ sources }) => [
|
|
56
50
|
evo(model, { sources: () => sources }),
|
|
@@ -61,14 +55,17 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
|
|
|
61
55
|
const source = Source.make({ kind: 'Book', id });
|
|
62
56
|
return [evo(model, { sources: Array.append(source) }), []];
|
|
63
57
|
},
|
|
64
|
-
})
|
|
58
|
+
});
|
|
65
59
|
// VIEW
|
|
66
60
|
export const view = (model, h) => {
|
|
67
61
|
const body = h.div([], [
|
|
68
|
-
h.button([h.OnClick(ClickedReload()), h.Role('button')], ['Reload']),
|
|
69
|
-
h.button([h.OnClick(SubmittedNewSourceId({ id: '' })), h.Role('button')], ['Add source']),
|
|
62
|
+
h.button([h.OnClick(Message.ClickedReload()), h.Role('button')], ['Reload']),
|
|
63
|
+
h.button([h.OnClick(Message.SubmittedNewSourceId({ id: '' })), h.Role('button')], ['Add source']),
|
|
70
64
|
h.ul([h.Role('list')], Array.map(model.sources, source => h.keyed('li')(source.id, [], [
|
|
71
|
-
h.button([
|
|
65
|
+
h.button([
|
|
66
|
+
h.OnClick(Message.SelectedSource({ source })),
|
|
67
|
+
h.Role('button'),
|
|
68
|
+
], [`Select ${source.id}`]),
|
|
72
69
|
]))),
|
|
73
70
|
]);
|
|
74
71
|
return { title: 'Sources', body };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Effect, Schema as S } from 'effect';
|
|
2
|
-
import * as Command from '../../command/index.js';
|
|
3
2
|
import type { Document, HtmlBuilder } from '../../html/index.js';
|
|
4
3
|
export declare const SaveStatus: S.Literals<readonly ["Editing", "Saving", "Saved"]>;
|
|
5
4
|
export type SaveStatus = typeof SaveStatus.Type;
|
|
@@ -8,13 +7,12 @@ export declare const Model: S.Struct<{
|
|
|
8
7
|
readonly status: S.Literals<readonly ["Editing", "Saving", "Saved"]>;
|
|
9
8
|
}>;
|
|
10
9
|
export type Model = typeof Model.Type;
|
|
11
|
-
export declare const
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
11
|
+
readonly ClickedSaveDraft: {};
|
|
12
|
+
readonly SucceededSaveDraft: {
|
|
13
|
+
readonly revision: S.Number;
|
|
14
|
+
};
|
|
14
15
|
}>;
|
|
15
|
-
export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ClickedSaveDraft", {}>, import("../../schema/index.js").CallableTaggedStruct<"SucceededSaveDraft", {
|
|
16
|
-
revision: S.Number;
|
|
17
|
-
}>]>;
|
|
18
16
|
export type Message = typeof Message.Type;
|
|
19
17
|
export declare const SaveDraftArgs: S.Struct<{
|
|
20
18
|
readonly revision: S.Number;
|
|
@@ -27,6 +25,19 @@ export declare const SaveDraft: import("../../command/interruptible/interruptibl
|
|
|
27
25
|
readonly revision: number;
|
|
28
26
|
}, never, never>>;
|
|
29
27
|
export declare const initialModel: Model;
|
|
30
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
28
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
29
|
+
readonly revision: number;
|
|
30
|
+
readonly status: "Editing" | "Saving" | "Saved";
|
|
31
|
+
}, readonly Readonly<{
|
|
32
|
+
name: string;
|
|
33
|
+
args?: Record<string, unknown>;
|
|
34
|
+
key?: string;
|
|
35
|
+
effect: Effect.Effect<{
|
|
36
|
+
readonly _tag: "ClickedSaveDraft";
|
|
37
|
+
} | {
|
|
38
|
+
readonly _tag: "SucceededSaveDraft";
|
|
39
|
+
readonly revision: number;
|
|
40
|
+
}, never, never>;
|
|
41
|
+
}>[]];
|
|
31
42
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Document;
|
|
32
43
|
//# sourceMappingURL=drafts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../../src/test/apps/drafts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"drafts.d.ts","sourceRoot":"","sources":["../../../src/test/apps/drafts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAG5C,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAMhE,eAAO,MAAM,UAAU,qDAA6C,CAAA;AACpE,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;EAGlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,aAAa;;EAAmC,CAAA;AAC7D,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAErD,eAAO,MAAM,SAAS;;;;;iBAMpB,CAAA;AAIF,eAAO,MAAM,YAAY,EAAE,KAA0C,CAAA;AAIrE,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;;;;;;;;;;KAUlD,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,QAU5D,CAAA"}
|