foldkit 0.161.0 → 0.162.0-canary.01d0205a4e2b
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 +4 -4
- package/dist/asyncData/asyncData.d.ts +1 -1
- package/dist/asyncData/asyncData.js +1 -1
- package/dist/devTools/store.d.ts.map +1 -1
- package/dist/devTools/store.js +16 -16
- package/dist/experimental/machine/machine.d.ts +1 -1
- package/dist/experimental/machine/machine.js +1 -1
- package/dist/experimental/server/server.d.ts +9 -6
- package/dist/experimental/server/server.d.ts.map +1 -1
- package/dist/experimental/server/server.js +3 -28
- package/dist/html/index.d.ts +24 -16
- package/dist/html/index.d.ts.map +1 -1
- package/dist/runtime/deepFreeze.d.ts +1 -1
- package/dist/runtime/deepFreeze.js +1 -1
- package/dist/runtime/documentMetadata.d.ts.map +1 -1
- package/dist/runtime/documentMetadata.js +69 -47
- package/dist/runtime/managedResourceFibers.d.ts +1 -1
- package/dist/runtime/managedResourceFibers.d.ts.map +1 -1
- package/dist/runtime/managedResourceFibers.js +3 -2
- package/dist/runtime/subscriptionFibers.d.ts +1 -1
- package/dist/runtime/subscriptionFibers.d.ts.map +1 -1
- package/dist/runtime/subscriptionFibers.js +3 -2
- package/dist/struct/index.d.ts +4 -4
- package/dist/struct/index.d.ts.map +1 -1
- package/dist/struct/index.js +4 -4
- package/dist/struct/public.d.ts +1 -1
- package/dist/struct/public.d.ts.map +1 -1
- package/dist/struct/public.js +1 -1
- package/dist/submodel/submodel.d.ts +3 -3
- package/dist/subscription/{keyboardShortcuts.d.ts → keyBindings.d.ts} +23 -23
- package/dist/subscription/keyBindings.d.ts.map +1 -0
- package/dist/subscription/{keyboardShortcuts.js → keyBindings.js} +42 -43
- package/dist/subscription/public.d.ts +2 -2
- package/dist/subscription/public.d.ts.map +1 -1
- package/dist/subscription/public.js +1 -1
- package/dist/test/apps/bubbling.js +5 -5
- package/dist/test/apps/colorPicker.js +2 -2
- package/dist/test/apps/contentEditableEditor.js +3 -3
- package/dist/test/apps/contextMenu.js +2 -2
- package/dist/test/apps/counter.d.ts.map +1 -1
- package/dist/test/apps/counter.js +8 -5
- package/dist/test/apps/crashOnRender.js +3 -3
- package/dist/test/apps/drafts.js +3 -3
- package/dist/test/apps/feedSocket.js +5 -5
- package/dist/test/apps/fileUpload.js +2 -2
- package/dist/test/apps/focusBoundary.js +3 -3
- package/dist/test/apps/formChild.js +4 -4
- package/dist/test/apps/interactions.js +7 -7
- package/dist/test/apps/keypress.js +3 -3
- package/dist/test/apps/keypressSelf.js +2 -2
- package/dist/test/apps/login.js +7 -7
- package/dist/test/apps/mountPanel.js +4 -4
- package/dist/test/apps/multiRole.js +2 -2
- package/dist/test/apps/pointer.js +3 -3
- package/dist/test/apps/resumeUpload.js +5 -5
- package/dist/test/apps/scorePanel.js +2 -2
- package/dist/test/apps/selectiveKeys.d.ts.map +1 -1
- package/dist/test/apps/selectiveKeys.js +5 -3
- package/dist/test/apps/uploads.d.ts.map +1 -1
- package/dist/test/apps/uploads.js +13 -7
- package/dist/test/query.js +5 -5
- package/dist/update/update.d.ts +4 -4
- package/dist/update/update.js +3 -3
- package/package.json +1 -1
- package/dist/subscription/keyboardShortcuts.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Array, Effect, Schema } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const RawSource = Schema.Struct({
|
|
7
7
|
kind: Schema.Literal('Book'),
|
|
@@ -47,12 +47,12 @@ export const initialModel = { sources: validSources };
|
|
|
47
47
|
export const update = (model, message) => Message.match(message, {
|
|
48
48
|
ClickedReload: () => ({ model, commands: [ReloadSources()] }),
|
|
49
49
|
CompletedReloadSources: ({ sources }) => ({
|
|
50
|
-
model:
|
|
50
|
+
model: modifyFields(model, { sources: () => sources }),
|
|
51
51
|
}),
|
|
52
52
|
SelectedSource: () => ({ model }),
|
|
53
53
|
SubmittedNewSourceId: ({ id }) => {
|
|
54
54
|
const source = Source.make({ kind: 'Book', id });
|
|
55
|
-
return { model:
|
|
55
|
+
return { model: modifyFields(model, { sources: Array.append(source) }) };
|
|
56
56
|
},
|
|
57
57
|
});
|
|
58
58
|
// VIEW
|
package/dist/test/apps/drafts.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Schema } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const SaveStatus = Schema.Literals(['Editing', 'Saving', 'Saved']);
|
|
7
7
|
export const Model = Schema.Struct({
|
|
@@ -26,11 +26,11 @@ export const initialModel = { revision: 0, status: 'Editing' };
|
|
|
26
26
|
// UPDATE
|
|
27
27
|
export const update = (model, message) => Message.match(message, {
|
|
28
28
|
ClickedSaveDraft: () => ({
|
|
29
|
-
model:
|
|
29
|
+
model: modifyFields(model, { status: () => 'Saving' }),
|
|
30
30
|
commands: [SaveDraft({ revision: model.revision })],
|
|
31
31
|
}),
|
|
32
32
|
SucceededSaveDraft: () => ({
|
|
33
|
-
model:
|
|
33
|
+
model: modifyFields(model, { status: () => 'Saved' }),
|
|
34
34
|
}),
|
|
35
35
|
});
|
|
36
36
|
// VIEW
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Boolean, Effect, Option, Schema } from 'effect';
|
|
2
2
|
import * as ManagedResource from '../../managedResource/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const Model = Schema.Struct({
|
|
7
7
|
isFeedOpen: Schema.Boolean,
|
|
@@ -44,16 +44,16 @@ export const initialModel = Model.make({
|
|
|
44
44
|
// UPDATE
|
|
45
45
|
export const update = (model, message) => Message.match(message, {
|
|
46
46
|
ClickedToggleFeed: () => ({
|
|
47
|
-
model:
|
|
47
|
+
model: modifyFields(model, { isFeedOpen: Boolean.not }),
|
|
48
48
|
}),
|
|
49
49
|
AcquiredFeedSocket: () => ({
|
|
50
|
-
model:
|
|
50
|
+
model: modifyFields(model, { status: () => 'Connected' }),
|
|
51
51
|
}),
|
|
52
52
|
ReleasedFeedSocket: () => ({
|
|
53
|
-
model:
|
|
53
|
+
model: modifyFields(model, { status: () => 'Disconnected' }),
|
|
54
54
|
}),
|
|
55
55
|
FailedAcquireFeedSocket: () => ({
|
|
56
|
-
model:
|
|
56
|
+
model: modifyFields(model, { status: () => 'Failed' }),
|
|
57
57
|
}),
|
|
58
58
|
});
|
|
59
59
|
// VIEW
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
2
|
import { File } from '../../file/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
export const initialModel = { receivedFiles: [] };
|
|
6
6
|
// MESSAGE
|
|
7
7
|
export const Message = defineMessageUnion({
|
|
@@ -10,7 +10,7 @@ export const Message = defineMessageUnion({
|
|
|
10
10
|
// UPDATE
|
|
11
11
|
export const update = (model, message) => Message.match(message, {
|
|
12
12
|
ReceivedFiles: ({ files }) => ({
|
|
13
|
-
model:
|
|
13
|
+
model: modifyFields(model, { receivedFiles: () => files }),
|
|
14
14
|
}),
|
|
15
15
|
});
|
|
16
16
|
// VIEW
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
const FocusState = Schema.Literals(['Outside', 'Within']);
|
|
6
6
|
export const Model = Schema.Struct({
|
|
@@ -18,10 +18,10 @@ export const initialModel = {
|
|
|
18
18
|
// UPDATE
|
|
19
19
|
export const update = (model, message) => Message.match(message, {
|
|
20
20
|
EnteredFocusRegion: () => ({
|
|
21
|
-
model:
|
|
21
|
+
model: modifyFields(model, { focusState: () => 'Within' }),
|
|
22
22
|
}),
|
|
23
23
|
LeftFocusRegion: () => ({
|
|
24
|
-
model:
|
|
24
|
+
model: modifyFields(model, { focusState: () => 'Outside' }),
|
|
25
25
|
}),
|
|
26
26
|
});
|
|
27
27
|
// VIEW
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Array, Effect, Option, Schema } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
import * as Update from '../../update/index.js';
|
|
6
6
|
// CHILD MODEL
|
|
7
7
|
export const ChildModel = Schema.Struct({
|
|
@@ -67,16 +67,16 @@ export const initialParentModel = {
|
|
|
67
67
|
// PARENT UPDATE
|
|
68
68
|
const foldChildOutMessage = ChildOutMessage.match({
|
|
69
69
|
RequestedSave: ({ id }) => model => ({
|
|
70
|
-
model:
|
|
70
|
+
model: modifyFields(model, { savedIds: Array.append(id) }),
|
|
71
71
|
}),
|
|
72
72
|
RequestedCancel: () => model => ({
|
|
73
|
-
model:
|
|
73
|
+
model: modifyFields(model, { cancelled: () => true }),
|
|
74
74
|
}),
|
|
75
75
|
});
|
|
76
76
|
const foldChildUpdate = Update.foldChild({
|
|
77
77
|
update: childUpdate,
|
|
78
78
|
read: (model) => Option.some(model.child),
|
|
79
|
-
write: (model, nextChild) =>
|
|
79
|
+
write: (model, nextChild) => modifyFields(model, { child: () => nextChild }),
|
|
80
80
|
toParentMessage: message => ParentMessage.GotChildMessage({ message }),
|
|
81
81
|
foldOutMessage: foldChildOutMessage,
|
|
82
82
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Number, Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = Schema.Struct({
|
|
6
6
|
clicks: Schema.Number,
|
|
@@ -29,22 +29,22 @@ export const initialModel = {
|
|
|
29
29
|
// UPDATE
|
|
30
30
|
export const update = (model, message) => Message.match(message, {
|
|
31
31
|
ClickedButton: () => ({
|
|
32
|
-
model:
|
|
32
|
+
model: modifyFields(model, { clicks: Number.increment }),
|
|
33
33
|
}),
|
|
34
34
|
DoubleClickedButton: () => ({
|
|
35
|
-
model:
|
|
35
|
+
model: modifyFields(model, { doubleClicks: Number.increment }),
|
|
36
36
|
}),
|
|
37
37
|
HoveredTarget: () => ({
|
|
38
|
-
model:
|
|
38
|
+
model: modifyFields(model, { hovered: () => true }),
|
|
39
39
|
}),
|
|
40
40
|
FocusedInput: () => ({
|
|
41
|
-
model:
|
|
41
|
+
model: modifyFields(model, { focused: () => true }),
|
|
42
42
|
}),
|
|
43
43
|
BlurredInput: () => ({
|
|
44
|
-
model:
|
|
44
|
+
model: modifyFields(model, { focused: () => false }),
|
|
45
45
|
}),
|
|
46
46
|
ChangedSelect: ({ value }) => ({
|
|
47
|
-
model:
|
|
47
|
+
model: modifyFields(model, { changed: () => value }),
|
|
48
48
|
}),
|
|
49
49
|
});
|
|
50
50
|
// VIEW
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = Schema.Struct({
|
|
6
6
|
lastKey: Schema.String,
|
|
@@ -19,13 +19,13 @@ export const initialModel = {
|
|
|
19
19
|
// UPDATE
|
|
20
20
|
export const update = (model, message) => Message.match(message, {
|
|
21
21
|
PressedKey: ({ key }) => ({
|
|
22
|
-
model:
|
|
22
|
+
model: modifyFields(model, {
|
|
23
23
|
lastKey: () => key,
|
|
24
24
|
isShifted: () => false,
|
|
25
25
|
}),
|
|
26
26
|
}),
|
|
27
27
|
PressedShiftKey: ({ key }) => ({
|
|
28
|
-
model:
|
|
28
|
+
model: modifyFields(model, {
|
|
29
29
|
lastKey: () => key,
|
|
30
30
|
isShifted: () => true,
|
|
31
31
|
}),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = Schema.Struct({
|
|
6
6
|
lastKey: Schema.String,
|
|
@@ -16,7 +16,7 @@ export const initialModel = {
|
|
|
16
16
|
// UPDATE
|
|
17
17
|
export const update = (model, message) => Message.match(message, {
|
|
18
18
|
PressedSelfKey: ({ key }) => ({
|
|
19
|
-
model:
|
|
19
|
+
model: modifyFields(model, { lastKey: () => key }),
|
|
20
20
|
}),
|
|
21
21
|
});
|
|
22
22
|
// VIEW
|
package/dist/test/apps/login.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Match, Schema } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const Model = Schema.Struct({
|
|
7
7
|
email: Schema.String,
|
|
@@ -35,26 +35,26 @@ export const initialModel = {
|
|
|
35
35
|
// UPDATE
|
|
36
36
|
export const update = (model, message) => Message.match(message, {
|
|
37
37
|
UpdatedEmail: ({ value }) => ({
|
|
38
|
-
model:
|
|
38
|
+
model: modifyFields(model, { email: () => value }),
|
|
39
39
|
}),
|
|
40
40
|
UpdatedPassword: ({ value }) => ({
|
|
41
|
-
model:
|
|
41
|
+
model: modifyFields(model, { password: () => value }),
|
|
42
42
|
}),
|
|
43
43
|
SubmittedLogin: () => ({
|
|
44
|
-
model:
|
|
44
|
+
model: modifyFields(model, { status: () => 'Submitting' }),
|
|
45
45
|
commands: [Authenticate()],
|
|
46
46
|
}),
|
|
47
47
|
SucceededAuthenticate: ({ username }) => ({
|
|
48
|
-
model:
|
|
48
|
+
model: modifyFields(model, {
|
|
49
49
|
status: () => 'LoggedIn',
|
|
50
50
|
username: () => username,
|
|
51
51
|
}),
|
|
52
52
|
}),
|
|
53
53
|
FailedAuthenticate: ({ error }) => ({
|
|
54
|
-
model:
|
|
54
|
+
model: modifyFields(model, { status: () => 'Error', error: () => error }),
|
|
55
55
|
}),
|
|
56
56
|
ClickedLogout: () => ({
|
|
57
|
-
model:
|
|
57
|
+
model: modifyFields(model, {
|
|
58
58
|
status: () => 'Idle',
|
|
59
59
|
username: () => '',
|
|
60
60
|
email: () => '',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Number, Option, Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
import * as Mount from '../../mount/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const Model = Schema.Struct({
|
|
7
7
|
isOpen: Schema.Boolean,
|
|
@@ -52,15 +52,15 @@ export const initialModel = {
|
|
|
52
52
|
// UPDATE
|
|
53
53
|
export const update = (model, message) => Message.match(message, {
|
|
54
54
|
ClickedToggle: () => ({
|
|
55
|
-
model:
|
|
55
|
+
model: modifyFields(model, { isOpen: isOpen => !isOpen }),
|
|
56
56
|
}),
|
|
57
57
|
MeasuredPanel: ({ width }) => ({
|
|
58
|
-
model:
|
|
58
|
+
model: modifyFields(model, { measuredWidth: () => Option.some(width) }),
|
|
59
59
|
}),
|
|
60
60
|
CompletedFocusButton: () => ({ model }),
|
|
61
61
|
FailedMountSidebar: () => ({ model }),
|
|
62
62
|
ClickedIncrement: () => ({
|
|
63
|
-
model:
|
|
63
|
+
model: modifyFields(model, { count: Number.increment }),
|
|
64
64
|
}),
|
|
65
65
|
ScrolledTo: () => ({ model }),
|
|
66
66
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Number, Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = Schema.Struct({ clicks: Schema.Number });
|
|
6
6
|
// MESSAGE
|
|
@@ -12,7 +12,7 @@ export const initialModel = { clicks: 0 };
|
|
|
12
12
|
// UPDATE
|
|
13
13
|
export const update = (model, message) => Message.match(message, {
|
|
14
14
|
ClickedFallback: () => ({
|
|
15
|
-
model:
|
|
15
|
+
model: modifyFields(model, { clicks: Number.increment }),
|
|
16
16
|
}),
|
|
17
17
|
});
|
|
18
18
|
// VIEW
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Number, Option, Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = Schema.Struct({
|
|
6
6
|
pointerDownCount: Schema.Number,
|
|
@@ -21,13 +21,13 @@ export const initialModel = {
|
|
|
21
21
|
// UPDATE
|
|
22
22
|
export const update = (model, message) => Message.match(message, {
|
|
23
23
|
PressedPointerDown: ({ pointerType }) => ({
|
|
24
|
-
model:
|
|
24
|
+
model: modifyFields(model, {
|
|
25
25
|
pointerDownCount: Number.increment,
|
|
26
26
|
lastPointerType: () => pointerType,
|
|
27
27
|
}),
|
|
28
28
|
}),
|
|
29
29
|
ReleasedPointerUp: ({ pointerType }) => ({
|
|
30
|
-
model:
|
|
30
|
+
model: modifyFields(model, {
|
|
31
31
|
pointerUpCount: Number.increment,
|
|
32
32
|
lastPointerType: () => pointerType,
|
|
33
33
|
}),
|
|
@@ -2,7 +2,7 @@ import { Effect, Match, Option, Schema } from 'effect';
|
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import * as File from '../../file/index.js';
|
|
4
4
|
import { defineMessageUnion } from '../../message/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { modifyFields } from '../../struct/index.js';
|
|
6
6
|
// MODEL
|
|
7
7
|
export const Model = Schema.Struct({
|
|
8
8
|
maybeResume: Schema.Option(File.File),
|
|
@@ -41,7 +41,7 @@ export const initialModel = {
|
|
|
41
41
|
export const update = (model, message) => Message.match(message, {
|
|
42
42
|
ClickedChooseResume: () => ({ model, commands: [SelectResume()] }),
|
|
43
43
|
CompletedSelectResume: ({ file }) => ({
|
|
44
|
-
model:
|
|
44
|
+
model: modifyFields(model, {
|
|
45
45
|
maybeResume: () => Option.some(file),
|
|
46
46
|
maybePreviewDataUrl: () => Option.none(),
|
|
47
47
|
readStatus: () => 'Reading',
|
|
@@ -50,16 +50,16 @@ export const update = (model, message) => Message.match(message, {
|
|
|
50
50
|
}),
|
|
51
51
|
CancelledSelectResume: () => ({ model }),
|
|
52
52
|
SucceededReadPreview: ({ dataUrl }) => ({
|
|
53
|
-
model:
|
|
53
|
+
model: modifyFields(model, {
|
|
54
54
|
maybePreviewDataUrl: () => Option.some(dataUrl),
|
|
55
55
|
readStatus: () => 'Idle',
|
|
56
56
|
}),
|
|
57
57
|
}),
|
|
58
58
|
FailedReadPreview: () => ({
|
|
59
|
-
model:
|
|
59
|
+
model: modifyFields(model, { readStatus: () => 'Failed' }),
|
|
60
60
|
}),
|
|
61
61
|
ClickedRemoveResume: () => ({
|
|
62
|
-
model:
|
|
62
|
+
model: modifyFields(model, {
|
|
63
63
|
maybeResume: () => Option.none(),
|
|
64
64
|
maybePreviewDataUrl: () => Option.none(),
|
|
65
65
|
readStatus: () => 'Idle',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Number, Schema } from 'effect';
|
|
2
2
|
import { defineMessageUnion } from '../../message/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../../struct/index.js';
|
|
4
4
|
import { defineView } from '../../submodel/public.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const Model = Schema.Struct({ score: Schema.Number });
|
|
@@ -13,7 +13,7 @@ export const initialModel = Model.make({ score: 0 });
|
|
|
13
13
|
// UPDATE
|
|
14
14
|
export const update = (model, message) => Message.match(message, {
|
|
15
15
|
ClickedIncrement: () => ({
|
|
16
|
-
model:
|
|
16
|
+
model: modifyFields(model, { score: Number.increment }),
|
|
17
17
|
}),
|
|
18
18
|
});
|
|
19
19
|
export const view = defineView((model, viewInputs, h) => h.div([], [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectiveKeys.d.ts","sourceRoot":"","sources":["../../../src/test/apps/selectiveKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEvD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAG5D,OAAO,KAAK,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAIpD,eAAO,MAAM,KAAK;;EAEhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;EAIlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC;mEACmE;AACnE,eAAO,MAAM,WAAW;;iBAGtB,CAAA;AAIF,eAAO,MAAM,YAAY,EAAE,KAAsB,CAAA;AAIjD,eAAO,MAAM,MAAM,UAAW,KAAK,WAAW,OAAO;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"selectiveKeys.d.ts","sourceRoot":"","sources":["../../../src/test/apps/selectiveKeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEvD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAG5D,OAAO,KAAK,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAIpD,eAAO,MAAM,KAAK;;EAEhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;EAIlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC;mEACmE;AACnE,eAAO,MAAM,WAAW;;iBAGtB,CAAA;AAIF,eAAO,MAAM,YAAY,EAAE,KAAsB,CAAA;AAIjD,eAAO,MAAM,MAAM,UAAW,KAAK,WAAW,OAAO;;;;;;;;;;;;EAUjD,CAAA;AAIJ,eAAO,MAAM,KAAK,mBAAmB,CAAA;AACrC,eAAO,MAAM,OAAO,yBAAyB,CAAA;AAE7C,eAAO,MAAM,IAAI,UAAW,KAAK,KAAK,WAAW,CAAC,OAAO,CAAC,KAAG,IAY1D,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Number, Option, Schema } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import { defineMessageUnion } from '../../message/index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { modifyFields } from '../../struct/index.js';
|
|
5
5
|
// MODEL
|
|
6
6
|
export const Model = Schema.Struct({
|
|
7
7
|
commits: Schema.Number,
|
|
@@ -22,9 +22,11 @@ export const RecordReset = Command.define('RecordReset', {
|
|
|
22
22
|
export const initialModel = { commits: 0 };
|
|
23
23
|
// UPDATE
|
|
24
24
|
export const update = (model, message) => Message.match(message, {
|
|
25
|
-
Committed: () => ({
|
|
25
|
+
Committed: () => ({
|
|
26
|
+
model: modifyFields(model, { commits: Number.increment }),
|
|
27
|
+
}),
|
|
26
28
|
Reset: () => ({
|
|
27
|
-
model:
|
|
29
|
+
model: modifyFields(model, { commits: () => 0 }),
|
|
28
30
|
commands: [RecordReset()],
|
|
29
31
|
}),
|
|
30
32
|
CompletedRecordReset: () => ({ model }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../src/test/apps/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGtD,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGhE,OAAO,KAAK,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAIpD,eAAO,MAAM,YAAY,wEAKvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD,eAAO,MAAM,MAAM;;;EAGjB,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC,eAAO,MAAM,KAAK;;;;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;QAEI,QAAQ;;;QACP,QAAQ;;;QACR,QAAQ;;;QACX,QAAQ;;;QAE1B,QAAQ;QACR,OAAO;;;;;EAET,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,cAAc;;EAA6C,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;iBASrB,CAAA;AAEF,eAAO,MAAM,gBAAgB,iBAAkB,cAAc;;;;;;;;;;;;;;;EAG1D,CAAA;AAIH,eAAO,MAAM,YAAY,EAAE,KAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../src/test/apps/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGtD,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGhE,OAAO,KAAK,KAAK,MAAM,MAAM,uBAAuB,CAAA;AAIpD,eAAO,MAAM,YAAY,wEAKvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAEnD,eAAO,MAAM,MAAM;;;EAGjB,CAAA;AACF,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC,eAAO,MAAM,KAAK;;;;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;QAEI,QAAQ;;;QACP,QAAQ;;;QACR,QAAQ;;;QACX,QAAQ;;;QAE1B,QAAQ;QACR,OAAO;;;;;EAET,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,cAAc;;EAA6C,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;iBASrB,CAAA;AAEF,eAAO,MAAM,gBAAgB,iBAAkB,cAAc;;;;;;;;;;;;;;;EAG1D,CAAA;AAIH,eAAO,MAAM,YAAY,EAAE,KAAoC,CAAA;AAa/D,eAAO,MAAM,MAAM,UAAW,KAAK,WAAW,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CjD,CAAA;AAIJ,eAAO,MAAM,IAAI,UAAW,KAAK,KAAK,WAAW,CAAC,OAAO,CAAC,KAAG,QA6B5D,CAAA"}
|
|
@@ -2,7 +2,7 @@ import { Array, Effect, Number, Schema } from 'effect';
|
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
3
|
import * as Interruptible from '../../command/interruptible/index.js';
|
|
4
4
|
import { defineMessageUnion } from '../../message/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { modifyFields } from '../../struct/index.js';
|
|
6
6
|
// MODEL
|
|
7
7
|
export const UploadStatus = Schema.Literals([
|
|
8
8
|
'Uploading',
|
|
@@ -45,7 +45,9 @@ export const CancelUploadFile = ({ uploadId }) => UploadFile.Interrupt({ uploadI
|
|
|
45
45
|
// INIT
|
|
46
46
|
export const initialModel = { uploadId: 0, uploads: [] };
|
|
47
47
|
// UPDATE
|
|
48
|
-
const setStatusById = (uploadId, status) => Array.map((upload) => upload.id === uploadId
|
|
48
|
+
const setStatusById = (uploadId, status) => Array.map((upload) => upload.id === uploadId
|
|
49
|
+
? modifyFields(upload, { status: () => status })
|
|
50
|
+
: upload);
|
|
49
51
|
export const update = (model, message) => Message.match(message, {
|
|
50
52
|
ClickedStartUpload: () => {
|
|
51
53
|
const startedUpload = {
|
|
@@ -53,7 +55,7 @@ export const update = (model, message) => Message.match(message, {
|
|
|
53
55
|
status: 'Uploading',
|
|
54
56
|
};
|
|
55
57
|
return {
|
|
56
|
-
model:
|
|
58
|
+
model: modifyFields(model, {
|
|
57
59
|
uploadId: Number.increment,
|
|
58
60
|
uploads: Array.append(startedUpload),
|
|
59
61
|
}),
|
|
@@ -61,7 +63,9 @@ export const update = (model, message) => Message.match(message, {
|
|
|
61
63
|
};
|
|
62
64
|
},
|
|
63
65
|
ClickedRetryUpload: ({ uploadId }) => ({
|
|
64
|
-
model:
|
|
66
|
+
model: modifyFields(model, {
|
|
67
|
+
uploads: setStatusById(uploadId, 'Uploading'),
|
|
68
|
+
}),
|
|
65
69
|
commands: [UploadFile({ uploadId })],
|
|
66
70
|
}),
|
|
67
71
|
ClickedCancelUpload: ({ uploadId }) => ({
|
|
@@ -69,14 +73,16 @@ export const update = (model, message) => Message.match(message, {
|
|
|
69
73
|
commands: [CancelUploadFile({ uploadId })],
|
|
70
74
|
}),
|
|
71
75
|
SucceededUploadFile: ({ uploadId }) => ({
|
|
72
|
-
model:
|
|
76
|
+
model: modifyFields(model, { uploads: setStatusById(uploadId, 'Done') }),
|
|
73
77
|
}),
|
|
74
78
|
FailedUploadFile: ({ uploadId }) => ({
|
|
75
|
-
model:
|
|
79
|
+
model: modifyFields(model, {
|
|
80
|
+
uploads: setStatusById(uploadId, 'Failed'),
|
|
81
|
+
}),
|
|
76
82
|
}),
|
|
77
83
|
CompletedCancelUploadFile: ({ uploadId, outcome }) => Interruptible.Outcome.match(outcome, {
|
|
78
84
|
Interrupted: () => ({
|
|
79
|
-
model:
|
|
85
|
+
model: modifyFields(model, {
|
|
80
86
|
uploads: setStatusById(uploadId, 'Cancelled'),
|
|
81
87
|
}),
|
|
82
88
|
}),
|
package/dist/test/query.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Array, Equal, Match, Number, Option, Predicate, Record, Result, String, flow, pipe, } from 'effect';
|
|
2
2
|
import { dual } from 'effect/Function';
|
|
3
|
-
import {
|
|
3
|
+
import { modifyFields } from '../struct/index.js';
|
|
4
4
|
const ID_PATTERN = /^#([a-zA-Z0-9_-]+)/;
|
|
5
5
|
const CLASS_PATTERN = /^\.([a-zA-Z0-9_-]+)/;
|
|
6
6
|
const ATTRIBUTE_PATTERN = /^\[([a-zA-Z][a-zA-Z0-9_-]*)(?:(\^)?="([^"]*)")?\]/;
|
|
@@ -16,15 +16,15 @@ const emptySelector = {
|
|
|
16
16
|
classes: [],
|
|
17
17
|
attributes: [],
|
|
18
18
|
};
|
|
19
|
-
const tryParseId = (input, accumulator) => pipe(input, matchGroup(ID_PATTERN), Option.map(({ consumed, group }) => parseModifiers(input.slice(consumed.length),
|
|
19
|
+
const tryParseId = (input, accumulator) => pipe(input, matchGroup(ID_PATTERN), Option.map(({ consumed, group }) => parseModifiers(input.slice(consumed.length), modifyFields(accumulator, {
|
|
20
20
|
id: () => Option.some(group),
|
|
21
21
|
}))));
|
|
22
|
-
const tryParseClass = (input, accumulator) => pipe(input, matchGroup(CLASS_PATTERN), Option.map(({ consumed, group }) => parseModifiers(input.slice(consumed.length),
|
|
22
|
+
const tryParseClass = (input, accumulator) => pipe(input, matchGroup(CLASS_PATTERN), Option.map(({ consumed, group }) => parseModifiers(input.slice(consumed.length), modifyFields(accumulator, {
|
|
23
23
|
classes: Array.append(group),
|
|
24
24
|
}))));
|
|
25
25
|
const tryParseAttribute = (input, accumulator) => pipe(input, String.match(ATTRIBUTE_PATTERN), Option.flatMap(match => pipe(match, Array.get(1), Option.map(name => {
|
|
26
26
|
const mode = match[2] === '^' ? 'StartsWith' : 'Exact';
|
|
27
|
-
return parseModifiers(input.slice(match[0].length),
|
|
27
|
+
return parseModifiers(input.slice(match[0].length), modifyFields(accumulator, {
|
|
28
28
|
attributes: Array.append({
|
|
29
29
|
name,
|
|
30
30
|
value: Option.fromNullishOr(match[3]),
|
|
@@ -43,7 +43,7 @@ const parseModifiers = (input, accumulator) => {
|
|
|
43
43
|
};
|
|
44
44
|
const parseCompoundSelector = (segment) => pipe(segment, String.match(TAG_PATTERN), Option.match({
|
|
45
45
|
onNone: () => parseModifiers(segment, emptySelector),
|
|
46
|
-
onSome: match => parseModifiers(segment.slice(match[0].length),
|
|
46
|
+
onSome: match => parseModifiers(segment.slice(match[0].length), modifyFields(emptySelector, { tag: () => Array.get(match, 1) })),
|
|
47
47
|
}));
|
|
48
48
|
export const parseSelector = (input) => {
|
|
49
49
|
const trimmed = String.trim(input);
|
package/dist/update/update.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export type Commands<Message, R = never> = ReadonlyArray<Command<Message, never,
|
|
|
22
22
|
* Message.match<Update.Return<Model, Message>>(message, {
|
|
23
23
|
* ClickedSave: () => ({ model, commands: [Save()] }),
|
|
24
24
|
* SucceededSave: ({ note }) => ({
|
|
25
|
-
* model:
|
|
25
|
+
* model: modifyFields(model, { note: () => note }),
|
|
26
26
|
* }),
|
|
27
27
|
* })
|
|
28
28
|
* ```
|
|
@@ -137,7 +137,7 @@ export type Refreshable<Model, Message, A, E, R = never> = Readonly<{
|
|
|
137
137
|
* const refreshAllNotes = refresh({
|
|
138
138
|
* read: model => Option.some(model.allNotes),
|
|
139
139
|
* revalidate: AsyncData.revalidate,
|
|
140
|
-
* write: (model, nextAllNotes) =>
|
|
140
|
+
* write: (model, nextAllNotes) => modifyFields(model, { allNotes: () => nextAllNotes }),
|
|
141
141
|
* load: LoadAllNotes(),
|
|
142
142
|
* })
|
|
143
143
|
* ``` */
|
|
@@ -293,7 +293,7 @@ export type FoldWithOutMessage<ParentModel, ParentMessage, Input, ParentOutMessa
|
|
|
293
293
|
* const foldSearch = Update.foldChild({
|
|
294
294
|
* update: Search.update,
|
|
295
295
|
* read: (model: Model) => Option.some(model.search),
|
|
296
|
-
* write: (model, nextSearch) =>
|
|
296
|
+
* write: (model, nextSearch) => modifyFields(model, { search: () => nextSearch }),
|
|
297
297
|
* toParentMessage: message => GotSearchMessage({ message }),
|
|
298
298
|
* })
|
|
299
299
|
*
|
|
@@ -464,7 +464,7 @@ export declare const foldChildStep: {
|
|
|
464
464
|
* ```ts
|
|
465
465
|
* const foldSearchOutMessage = Search.OutMessage.match<Update.Step<Model, Message>>({
|
|
466
466
|
* RequestedSearch: ({ query }) => model => ({
|
|
467
|
-
* model:
|
|
467
|
+
* model: modifyFields(model, { results: () => AsyncData.Loading() }),
|
|
468
468
|
* commands: [FetchResults({ query })],
|
|
469
469
|
* }),
|
|
470
470
|
* })
|
package/dist/update/update.js
CHANGED
|
@@ -65,7 +65,7 @@ export const combine = Function.dual(2, (model, steps) => {
|
|
|
65
65
|
* const refreshAllNotes = refresh({
|
|
66
66
|
* read: model => Option.some(model.allNotes),
|
|
67
67
|
* revalidate: AsyncData.revalidate,
|
|
68
|
-
* write: (model, nextAllNotes) =>
|
|
68
|
+
* write: (model, nextAllNotes) => modifyFields(model, { allNotes: () => nextAllNotes }),
|
|
69
69
|
* load: LoadAllNotes(),
|
|
70
70
|
* })
|
|
71
71
|
* ``` */
|
|
@@ -86,7 +86,7 @@ export const refresh = (refreshable) => model => pipe(refreshable.read(model), O
|
|
|
86
86
|
* const foldSearch = Update.foldChild({
|
|
87
87
|
* update: Search.update,
|
|
88
88
|
* read: (model: Model) => Option.some(model.search),
|
|
89
|
-
* write: (model, nextSearch) =>
|
|
89
|
+
* write: (model, nextSearch) => modifyFields(model, { search: () => nextSearch }),
|
|
90
90
|
* toParentMessage: message => GotSearchMessage({ message }),
|
|
91
91
|
* })
|
|
92
92
|
*
|
|
@@ -232,7 +232,7 @@ const appendOutMessageStep = (foldOutMessage, outMessage, context, modelWithChil
|
|
|
232
232
|
* ```ts
|
|
233
233
|
* const foldSearchOutMessage = Search.OutMessage.match<Update.Step<Model, Message>>({
|
|
234
234
|
* RequestedSearch: ({ query }) => model => ({
|
|
235
|
-
* model:
|
|
235
|
+
* model: modifyFields(model, { results: () => AsyncData.Loading() }),
|
|
236
236
|
* commands: [FetchResults({ query })],
|
|
237
237
|
* }),
|
|
238
238
|
* })
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyboardShortcuts.d.ts","sourceRoot":"","sources":["../../src/subscription/keyboardShortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAOR,MAAM,EAGP,MAAM,QAAQ,CAAA;AAEf,0FAA0F;AAC1F,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,CAAA;AAE9C,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAEhD,KAAK,WAAW,CAAC,OAAO,IAAI,QAAQ,CAAC;IACnC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAA;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,GACjE,CACI,QAAQ,CAAC;IACP,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAClC,CAAC,GACF,QAAQ,CAAC;IACP,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACtD,YAAY,CAAC,EAAE,KAAK,CAAA;CACrB,CAAC,CACL,CAAA;AAEH,KAAK,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;AAEhC,qEAAqE;AACrE,MAAM,MAAM,uBAAuB,CAAC,OAAO,IAAI,QAAQ,CAAC;IACtD,QAAQ,EAAE,aAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAA;IACzD,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;CACjC,CAAC,CAAA;AA8sBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,UAC/B,uBAAuB,CAAC,OAAO,CAAC,KACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CACwC,CAAA"}
|