foldkit 0.43.1 → 0.44.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.
Files changed (48) hide show
  1. package/dist/devtools/overlay.d.ts.map +1 -1
  2. package/dist/devtools/overlay.js +4 -67
  3. package/dist/devtools/store.d.ts +10 -2
  4. package/dist/devtools/store.d.ts.map +1 -1
  5. package/dist/devtools/store.js +79 -2
  6. package/dist/index.d.ts +2 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -1
  9. package/dist/runtime/runtime.d.ts.map +1 -1
  10. package/dist/runtime/runtime.js +2 -2
  11. package/dist/test/apps/counter.d.ts +38 -0
  12. package/dist/test/apps/counter.d.ts.map +1 -0
  13. package/dist/test/apps/counter.js +25 -0
  14. package/dist/test/apps/formChild.d.ts +69 -0
  15. package/dist/test/apps/formChild.d.ts.map +1 -0
  16. package/dist/test/apps/formChild.js +84 -0
  17. package/dist/test/apps/keypress.d.ts +23 -0
  18. package/dist/test/apps/keypress.d.ts.map +1 -0
  19. package/dist/test/apps/keypress.js +39 -0
  20. package/dist/test/apps/login.d.ts +46 -0
  21. package/dist/test/apps/login.d.ts.map +1 -0
  22. package/dist/test/apps/login.js +83 -0
  23. package/dist/test/apps/logoutButton.d.ts +17 -0
  24. package/dist/test/apps/logoutButton.d.ts.map +1 -0
  25. package/dist/test/apps/logoutButton.js +22 -0
  26. package/dist/test/internal.d.ts +25 -0
  27. package/dist/test/internal.d.ts.map +1 -0
  28. package/dist/test/internal.js +39 -0
  29. package/dist/test/matchers.d.ts +94 -0
  30. package/dist/test/matchers.d.ts.map +1 -0
  31. package/dist/test/matchers.js +283 -0
  32. package/dist/test/public.d.ts +2 -2
  33. package/dist/test/public.d.ts.map +1 -1
  34. package/dist/test/public.js +2 -1
  35. package/dist/test/query.d.ts +87 -0
  36. package/dist/test/query.d.ts.map +1 -0
  37. package/dist/test/query.js +226 -0
  38. package/dist/test/scene.d.ts +106 -0
  39. package/dist/test/scene.d.ts.map +1 -0
  40. package/dist/test/scene.js +373 -0
  41. package/dist/test/{index.d.ts → story.d.ts} +13 -17
  42. package/dist/test/story.d.ts.map +1 -0
  43. package/dist/test/{index.js → story.js} +8 -36
  44. package/dist/test/vitest-setup.d.ts +19 -0
  45. package/dist/test/vitest-setup.d.ts.map +1 -0
  46. package/dist/test/vitest-setup.js +3 -0
  47. package/package.json +5 -5
  48. package/dist/test/index.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devtools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,MAAM,EACN,OAAO,EAGP,MAAM,EAQP,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AAKrC,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAMxE,OAAO,EAAE,KAAK,aAAa,EAA+B,MAAM,SAAS,CAAA;AAwQzE,eAAO,MAAM,MAAM;;EAA0C,CAAA;AAC7D,eAAO,MAAM,YAAY;;;;;;EAGxB,CAAA;AACD,eAAO,MAAM,aAAa;;;;;;EAGzB,CAAA;AACD,eAAO,MAAM,MAAM;;EAA4C,CAAA;AAC/D,eAAO,MAAM,KAAK;;EAA0C,CAAA;AAC5D,eAAO,MAAM,UAAU;;EAA6C,CAAA;AACpE,eAAO,MAAM,YAAY;;EAAiD,CAAA;AAC1E,eAAO,MAAM,WAAW;;EAA+C,CAAA;AAymCvE,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sCA4ChC,CAAA"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devtools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,MAAM,EACN,OAAO,EAGP,MAAM,EAQP,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AAKrC,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAMxE,OAAO,EAAE,KAAK,aAAa,EAA+B,MAAM,SAAS,CAAA;AA0KzE,eAAO,MAAM,MAAM;;EAA0C,CAAA;AAC7D,eAAO,MAAM,YAAY;;;;;;EAGxB,CAAA;AACD,eAAO,MAAM,aAAa;;;;;;EAGzB,CAAA;AACD,eAAO,MAAM,MAAM;;EAA4C,CAAA;AAC/D,eAAO,MAAM,KAAK;;EAA0C,CAAA;AAC5D,eAAO,MAAM,UAAU;;EAA6C,CAAA;AACpE,eAAO,MAAM,YAAY;;EAAiD,CAAA;AAC1E,eAAO,MAAM,WAAW;;EAA+C,CAAA;AAkmCvE,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sCA4ChC,CAAA"}
@@ -117,67 +117,6 @@ const objectPreview = (value) => pipe(value, Record.keys, Array_.filter(key => k
117
117
  },
118
118
  }));
119
119
  const collapsedPreview = (value) => M.value(value).pipe(M.when(Array.isArray, array => `(${array.length})`), M.when(Predicate.isReadonlyRecord, objectPreview), M.orElse(() => ''));
120
- const emptyDiff = {
121
- changedPaths: HashSet.empty(),
122
- affectedPaths: HashSet.empty(),
123
- };
124
- const computeDiff = (previous, current) => {
125
- const changed = new Set();
126
- const walk = (prev, curr, path) => {
127
- if (prev === curr) {
128
- return;
129
- }
130
- if (!isExpandable(curr) || !isExpandable(prev)) {
131
- changed.add(path);
132
- return;
133
- }
134
- if (Array.isArray(curr) && Array.isArray(prev)) {
135
- walkArray(prev, curr, path);
136
- }
137
- else if (Predicate.isReadonlyRecord(curr) &&
138
- Predicate.isReadonlyRecord(prev)) {
139
- walkObject(prev, curr, path);
140
- }
141
- else {
142
- changed.add(path);
143
- }
144
- };
145
- const walkObject = (prev, curr, path) => {
146
- pipe(curr, Record.keys, Array_.forEach(key => {
147
- const childPath = `${path}.${key}`;
148
- if (Record.has(prev, key)) {
149
- walk(prev[key], curr[key], childPath);
150
- }
151
- else {
152
- changed.add(childPath);
153
- }
154
- }));
155
- };
156
- const walkArray = (prev, curr, path) => {
157
- curr.forEach((item, index) => {
158
- const childPath = `${path}.${index}`;
159
- if (index < prev.length) {
160
- walk(prev[index], item, childPath);
161
- }
162
- else {
163
- changed.add(childPath);
164
- }
165
- });
166
- };
167
- walk(previous, current, 'root');
168
- const affected = new Set(changed);
169
- const addAncestors = (path) => {
170
- pipe(path, String_.lastIndexOf('.'), Option.map(lastDot => path.substring(0, lastDot)), Option.filter(parent => !affected.has(parent)), Option.map(parent => {
171
- affected.add(parent);
172
- addAncestors(parent);
173
- }));
174
- };
175
- changed.forEach(addAncestors);
176
- return {
177
- changedPaths: HashSet.fromIterable(changed),
178
- affectedPaths: HashSet.fromIterable(affected),
179
- };
180
- };
181
120
  // UPDATE
182
121
  export const JumpTo = Command.define('JumpTo', CompletedJump);
183
122
  export const InspectState = Command.define('InspectState', ReceivedInspectedState);
@@ -195,9 +134,7 @@ const makeUpdate = (store, shadow, mode) => {
195
134
  const inspectState = (index) => InspectState(Effect.gen(function* () {
196
135
  const model = yield* store.getModelAtIndex(index);
197
136
  const maybeMessage = yield* store.getMessageAtIndex(index);
198
- const diff = index === INIT_INDEX
199
- ? emptyDiff
200
- : yield* pipe(store.getModelAtIndex(index - 1), Effect.map(previousModel => computeDiff(previousModel, model)), Effect.catchAll(() => Effect.succeed(emptyDiff)));
137
+ const diff = yield* store.getDiffAtIndex(index);
201
138
  return ReceivedInspectedState({ model, maybeMessage, ...diff });
202
139
  }));
203
140
  const inspectLatest = InspectLatest(Effect.gen(function* () {
@@ -329,13 +266,13 @@ const makeUpdate = (store, shadow, mode) => {
329
266
  };
330
267
  // SUBSCRIPTION
331
268
  const SubscriptionDeps = S.Struct({
332
- storeUpdates: S.Null,
269
+ storeUpdates: S.Boolean,
333
270
  mobileBreakpoint: S.Null,
334
271
  });
335
272
  const makeOverlaySubscriptions = (store) => makeSubscriptions(SubscriptionDeps)({
336
273
  storeUpdates: {
337
- modelToDependencies: () => null,
338
- dependenciesToStream: () => Stream.concat(Stream.fromEffect(pipe(SubscriptionRef.get(store.stateRef), Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), pipe(store.stateRef.changes, Stream.map(state => ReceivedStoreUpdate(toDisplayState(state))))),
274
+ modelToDependencies: ({ isOpen }) => isOpen,
275
+ dependenciesToStream: isOpen => Stream.when(Stream.concat(Stream.fromEffect(SubscriptionRef.get(store.stateRef).pipe(Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), Stream.map(store.stateRef.changes, state => ReceivedStoreUpdate(toDisplayState(state)))), () => isOpen),
339
276
  },
340
277
  mobileBreakpoint: {
341
278
  modelToDependencies: () => null,
@@ -1,11 +1,18 @@
1
- import { Effect, HashMap, Option, SubscriptionRef } from 'effect';
1
+ import { Effect, HashMap, HashSet, Option, SubscriptionRef } from 'effect';
2
2
  export declare const INIT_INDEX = -1;
3
+ export type DiffResult = Readonly<{
4
+ changedPaths: HashSet.HashSet<string>;
5
+ affectedPaths: HashSet.HashSet<string>;
6
+ }>;
7
+ export declare const emptyDiff: DiffResult;
8
+ export declare const computeDiff: (previous: unknown, current: unknown) => DiffResult;
3
9
  export type HistoryEntry = Readonly<{
4
10
  tag: string;
5
11
  message: unknown;
6
12
  commandNames: ReadonlyArray<string>;
7
13
  timestamp: number;
8
14
  isModelChanged: boolean;
15
+ diff: DiffResult;
9
16
  }>;
10
17
  export type StoreState = Readonly<{
11
18
  entries: ReadonlyArray<HistoryEntry>;
@@ -26,9 +33,10 @@ export type DevtoolsStore = Readonly<{
26
33
  recordInit: (model: unknown, commandNames: ReadonlyArray<string>) => Effect.Effect<void>;
27
34
  recordMessage: (message: Readonly<{
28
35
  _tag: string;
29
- }>, modelAfterUpdate: unknown, commandNames: ReadonlyArray<string>, isModelChanged: boolean) => Effect.Effect<void>;
36
+ }>, modelBeforeUpdate: unknown, modelAfterUpdate: unknown, commandNames: ReadonlyArray<string>, isModelChanged: boolean) => Effect.Effect<void>;
30
37
  getModelAtIndex: (index: number) => Effect.Effect<unknown>;
31
38
  getMessageAtIndex: (index: number) => Effect.Effect<Option.Option<unknown>>;
39
+ getDiffAtIndex: (index: number) => Effect.Effect<DiffResult>;
32
40
  jumpTo: (index: number) => Effect.Effect<void>;
33
41
  resume: Effect.Effect<void>;
34
42
  clear: Effect.Effect<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devtools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAQ,MAAM,QAAQ,CAAA;AAE9E,eAAO,MAAM,UAAU,KAAK,CAAA;AAI5B,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,OAAO,CAAA;CACxB,CAAC,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACpC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtC,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IACrD,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/C,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;CACxC,CAAC,CAAA;AAYF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,MAAM,EACd,mBAAgC,KAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,CA6J1B,CAAA;AAEJ,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,UAAU,EAAE,CACV,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxB,aAAa,EAAE,CACb,OAAO,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EACnC,gBAAgB,EAAE,OAAO,EACzB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EACnC,cAAc,EAAE,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC1D,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3E,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,QAAQ,EAAE,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;CACtD,CAAC,CAAA"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devtools/store.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,69 @@
1
- import { Array, Effect, HashMap, Option, SubscriptionRef, pipe } from 'effect';
1
+ import { Array, Effect, HashMap, HashSet, Option, Predicate, Record, String as String_, SubscriptionRef, pipe, } from 'effect';
2
2
  export const INIT_INDEX = -1;
3
3
  const KEYFRAME_INTERVAL = 31;
4
4
  const DEFAULT_MAX_ENTRIES = 500;
5
+ export const emptyDiff = {
6
+ changedPaths: HashSet.empty(),
7
+ affectedPaths: HashSet.empty(),
8
+ };
9
+ const isExpandable = (value) => Predicate.isNotNull(value) && typeof value === 'object';
10
+ export const computeDiff = (previous, current) => {
11
+ const changed = new Set();
12
+ const walk = (prev, curr, path) => {
13
+ if (prev === curr) {
14
+ return;
15
+ }
16
+ if (!isExpandable(curr) || !isExpandable(prev)) {
17
+ changed.add(path);
18
+ return;
19
+ }
20
+ if (Array.isArray(curr) && Array.isArray(prev)) {
21
+ walkArray(prev, curr, path);
22
+ }
23
+ else if (Predicate.isReadonlyRecord(curr) &&
24
+ Predicate.isReadonlyRecord(prev)) {
25
+ walkObject(prev, curr, path);
26
+ }
27
+ else {
28
+ changed.add(path);
29
+ }
30
+ };
31
+ const walkObject = (prev, curr, path) => {
32
+ pipe(curr, Record.keys, Array.forEach(key => {
33
+ const childPath = `${path}.${key}`;
34
+ if (Record.has(prev, key)) {
35
+ walk(prev[key], curr[key], childPath);
36
+ }
37
+ else {
38
+ changed.add(childPath);
39
+ }
40
+ }));
41
+ };
42
+ const walkArray = (prev, curr, path) => {
43
+ curr.forEach((item, index) => {
44
+ const childPath = `${path}.${index}`;
45
+ if (index < prev.length) {
46
+ walk(prev[index], item, childPath);
47
+ }
48
+ else {
49
+ changed.add(childPath);
50
+ }
51
+ });
52
+ };
53
+ walk(previous, current, 'root');
54
+ const affected = new Set(changed);
55
+ const addAncestors = (path) => {
56
+ pipe(path, String_.lastIndexOf('.'), Option.map(lastDot => path.substring(0, lastDot)), Option.filter(parent => !affected.has(parent)), Option.map(parent => {
57
+ affected.add(parent);
58
+ addAncestors(parent);
59
+ }));
60
+ };
61
+ changed.forEach(addAncestors);
62
+ return {
63
+ changedPaths: HashSet.fromIterable(changed),
64
+ affectedPaths: HashSet.fromIterable(affected),
65
+ };
66
+ };
5
67
  const emptyState = {
6
68
  entries: [],
7
69
  keyframes: HashMap.empty(),
@@ -41,8 +103,11 @@ export const createDevtoolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
41
103
  initCommandNames: commandNames,
42
104
  keyframes: HashMap.set(state.keyframes, 0, model),
43
105
  }));
44
- const recordMessage = (message, modelAfterUpdate, commandNames, isModelChanged) => SubscriptionRef.update(stateRef, state => {
106
+ const recordMessage = (message, modelBeforeUpdate, modelAfterUpdate, commandNames, isModelChanged) => SubscriptionRef.update(stateRef, state => {
45
107
  const absoluteIndex = state.startIndex + state.entries.length;
108
+ const diff = isModelChanged
109
+ ? computeDiff(modelBeforeUpdate, modelAfterUpdate)
110
+ : emptyDiff;
46
111
  const nextState = {
47
112
  ...state,
48
113
  entries: Array.append(state.entries, {
@@ -51,6 +116,7 @@ export const createDevtoolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
51
116
  commandNames,
52
117
  timestamp: performance.now(),
53
118
  isModelChanged,
119
+ diff,
54
120
  }),
55
121
  keyframes: addKeyframeIfNeeded(state.keyframes, absoluteIndex + 1, modelAfterUpdate),
56
122
  };
@@ -91,11 +157,22 @@ export const createDevtoolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
91
157
  onSome: model => HashMap.set(HashMap.empty(), 0, model),
92
158
  }),
93
159
  }));
160
+ const getDiffAtIndex = (index) => Effect.gen(function* () {
161
+ if (index === INIT_INDEX) {
162
+ return emptyDiff;
163
+ }
164
+ const state = yield* SubscriptionRef.get(stateRef);
165
+ return pipe(state.entries, Array.get(index - state.startIndex), Option.match({
166
+ onNone: () => emptyDiff,
167
+ onSome: ({ diff }) => diff,
168
+ }));
169
+ });
94
170
  return {
95
171
  recordInit,
96
172
  recordMessage,
97
173
  getModelAtIndex,
98
174
  getMessageAtIndex,
175
+ getDiffAtIndex,
99
176
  jumpTo,
100
177
  resume,
101
178
  clear,
package/dist/index.d.ts CHANGED
@@ -10,7 +10,8 @@ export * as Schema from './schema/public';
10
10
  export * as Struct from './struct/public';
11
11
  export * as Subscription from './subscription/public';
12
12
  export * as Task from './task/public';
13
- export * as Test from './test/public';
13
+ export * as Scene from './test/scene';
14
+ export * as Story from './test/story';
14
15
  export * as Ui from './ui';
15
16
  export * as Url from './url/public';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,EAAE,MAAM,MAAM,CAAA;AAC1B,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,EAAE,MAAM,MAAM,CAAA;AAC1B,OAAO,KAAK,GAAG,MAAM,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ export * as Schema from './schema/public';
10
10
  export * as Struct from './struct/public';
11
11
  export * as Subscription from './subscription/public';
12
12
  export * as Task from './task/public';
13
- export * as Test from './test/public';
13
+ export * as Scene from './test/scene';
14
+ export * as Story from './test/story';
14
15
  export * as Ui from './ui';
15
16
  export * as Url from './url/public';
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,OAAO,EACP,MAAM,EAGN,KAAK,EAEL,MAAM,EAMN,MAAM,EAKP,MAAM,QAAQ,CAAA;AAGf,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,GAAG,EAA+B,MAAM,QAAQ,CAAA;AAOzD,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAOzC,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,YAAY,GACZ,UAAU,GACV,SAAS,CAAA;AAEb,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAA;AAEjD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAA;AAEnD;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,QAAQ,CAAC;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC,CAAA;AAMN,sFAAsF;AACtF,MAAM,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IACrD,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC,CAAA;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,IACrC,KAAK,GACL,QAAQ,CAAC;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAChE,CAAC,CAAA;;4BA6BsB,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;2BAC1C,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;;AALrD,8EAA8E;AAC9E,qBAAa,QAAS,SAAQ,aAM3B;CAAG;AAEN,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,oFAAoF;AACpF,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAA;CACnC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IAClD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,iFAAiF;AACjF,MAAM,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACzD,CAAC,CAAA;AA6DF,KAAK,iBAAiB,CACpB,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,QAAQ,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,MAAM,EAAE,CACN,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,KACb,SAAS;QACZ,KAAK;QACL,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;KAC5E,CAAA;IACD,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,aAAa,CAC3B,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,GAAG,uBAAuB,CACpC,CAAA;IACD,SAAS,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,QAAQ,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACzC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAA;IAC5E,oFAAoF;IACpF,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B,CAAC,CAAA;AAEF,kEAAkE;AAClE,MAAM,MAAM,6BAA6B,CACvC,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,CACJ,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,KACL,SAAS;QACZ,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,qEAAqE;AACrE,MAAM,MAAM,oBAAoB,CAC9B,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,CACJ,GAAG,EAAE,GAAG,KACL,SAAS;QACZ,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,CAChC,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,IAAI,EAAE,CACJ,KAAK,EAAE,KAAK,KACT,SAAS;QACZ,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,oEAAoE;AACpE,MAAM,MAAM,aAAa,CACvB,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,SAAS;QACnB,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,iEAAiE;AACjE,MAAM,MAAM,WAAW,CACrB,KAAK,EACL,OAAO,EACP,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,KAAK,SAAS,IAAI,GAClB,MAAM,SAAS;IACb,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,GACD,CACE,KAAK,EAAE,KAAK,KACT,SAAS;IACZ,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,CAAA;AAEL,2GAA2G;AAC3G,MAAM,MAAM,kBAAkB,CAC5B,KAAK,EACL,OAAO,EACP,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,KAAK,SAAS,IAAI,GAClB,CACE,GAAG,EAAE,GAAG,KACL,SAAS;IACZ,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,GACD,CACE,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,KACL,SAAS;IACZ,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,CAAA;AAEL,wGAAwG;AACxG,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAwlB3E,2HAA2H;AAC3H,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,6BAA6B,CACnC,KAAK,EACL,OAAO,EACP,aAAa,EACb,KAAK,EACL,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAEpB,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,oBAAoB,CAC1B,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAEpB,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,sBAAsB,CAC5B,KAAK,EACL,OAAO,EACP,aAAa,EACb,KAAK,EACL,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAEpB,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,aAAa,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAiLpB,kEAAkE;AAClE,eAAO,MAAM,GAAG,GAAI,gBAAgB,iBAAiB,KAAG,IA+BvD,CAAA"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,OAAO,EACP,MAAM,EAGN,KAAK,EAEL,MAAM,EAMN,MAAM,EAKP,MAAM,QAAQ,CAAA;AAGf,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,GAAG,EAA+B,MAAM,QAAQ,CAAA;AAOzD,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAOzC,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,YAAY,GACZ,UAAU,GACV,SAAS,CAAA;AAEb,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAA;AAEjD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAA;AAEnD;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,QAAQ,CAAC;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC,CAAA;AAMN,sFAAsF;AACtF,MAAM,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IACrD,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC,CAAA;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,IACrC,KAAK,GACL,QAAQ,CAAC;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAChE,CAAC,CAAA;;4BA6BsB,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;2BAC1C,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;;AALrD,8EAA8E;AAC9E,qBAAa,QAAS,SAAQ,aAM3B;CAAG;AAEN,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,oFAAoF;AACpF,MAAM,MAAM,aAAa,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC5C,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAA;IAC9C,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAA;CACnC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IAClD,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,iFAAiF;AACjF,MAAM,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACzD,CAAC,CAAA;AA6DF,KAAK,iBAAiB,CACpB,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,QAAQ,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,MAAM,EAAE,CACN,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,KACb,SAAS;QACZ,KAAK;QACL,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAAC;KAC5E,CAAA;IACD,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,aAAa,CAC3B,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,GAAG,uBAAuB,CACpC,CAAA;IACD,SAAS,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,QAAQ,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACzC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAA;IAC5E,oFAAoF;IACpF,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B,CAAC,CAAA;AAEF,kEAAkE;AAClE,MAAM,MAAM,6BAA6B,CACvC,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,CACJ,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,KACL,SAAS;QACZ,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,qEAAqE;AACrE,MAAM,MAAM,oBAAoB,CAC9B,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,CACJ,GAAG,EAAE,GAAG,KACL,SAAS;QACZ,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,CAChC,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3B,IAAI,EAAE,CACJ,KAAK,EAAE,KAAK,KACT,SAAS;QACZ,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,oEAAoE;AACpE,MAAM,MAAM,aAAa,CACvB,KAAK,EACL,OAAO,EACP,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,iBAAiB,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACC,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,SAAS;QACnB,KAAK;QACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;KACF,CAAA;CACF,CAAC,CAAA;AAEJ,iEAAiE;AACjE,MAAM,MAAM,WAAW,CACrB,KAAK,EACL,OAAO,EACP,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,KAAK,SAAS,IAAI,GAClB,MAAM,SAAS;IACb,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,GACD,CACE,KAAK,EAAE,KAAK,KACT,SAAS;IACZ,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,CAAA;AAEL,2GAA2G;AAC3G,MAAM,MAAM,kBAAkB,CAC5B,KAAK,EACL,OAAO,EACP,KAAK,GAAG,IAAI,EACZ,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,IAC7B,KAAK,SAAS,IAAI,GAClB,CACE,GAAG,EAAE,GAAG,KACL,SAAS;IACZ,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,GACD,CACE,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,KACL,SAAS;IACZ,KAAK;IACL,aAAa,CACX,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,uBAAuB,CAAC,CAC7D;CACF,CAAA;AAEL,wGAAwG;AACxG,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAylB3E,2HAA2H;AAC3H,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,6BAA6B,CACnC,KAAK,EACL,OAAO,EACP,aAAa,EACb,KAAK,EACL,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAEpB,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,oBAAoB,CAC1B,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAEpB,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,sBAAsB,CAC5B,KAAK,EACL,OAAO,EACP,aAAa,EACb,KAAK,EACL,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAEpB,wBAAgB,WAAW,CACzB,KAAK,EACL,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAChC,aAAa,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACzD,SAAS,GAAG,KAAK,EACjB,uBAAuB,GAAG,KAAK,EAE/B,MAAM,EAAE,aAAa,CACnB,KAAK,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,uBAAuB,CACxB,GACA,iBAAiB,CAAA;AAiLpB,kEAAkE;AAClE,eAAO,MAAM,GAAG,GAAI,gBAAgB,iBAAiB,KAAG,IA+BvD,CAAA"}
@@ -111,9 +111,9 @@ const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscript
111
111
  onNone: () => Effect.void,
112
112
  onSome: store => store.recordMessage(
113
113
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
114
- message, nextModel, Array.map(
114
+ message, currentModel, nextModel, Array.map(
115
115
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
116
- commands, command => command.name), !modelEquivalence(currentModel, nextModel)),
116
+ commands, command => command.name), currentModel !== nextModel),
117
117
  });
118
118
  });
119
119
  const runProcessMessage = (message, messageEffect) => (runtime) => {
@@ -0,0 +1,38 @@
1
+ import { Effect, Schema as S } from 'effect';
2
+ import * as Command from '../../command';
3
+ export declare const Model: S.Struct<{
4
+ count: typeof S.Number;
5
+ }>;
6
+ export type Model = typeof Model.Type;
7
+ export declare const ClickedIncrement: import("../../schema").CallableTaggedStruct<"ClickedIncrement", {}>;
8
+ export declare const ClickedDecrement: import("../../schema").CallableTaggedStruct<"ClickedDecrement", {}>;
9
+ export declare const ClickedFetch: import("../../schema").CallableTaggedStruct<"ClickedFetch", {}>;
10
+ export declare const SucceededFetchCount: import("../../schema").CallableTaggedStruct<"SucceededFetchCount", {
11
+ count: typeof S.Number;
12
+ }>;
13
+ export declare const FailedFetchCount: import("../../schema").CallableTaggedStruct<"FailedFetchCount", {
14
+ error: typeof S.String;
15
+ }>;
16
+ export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"ClickedIncrement", {}>, import("../../schema").CallableTaggedStruct<"ClickedDecrement", {}>, import("../../schema").CallableTaggedStruct<"ClickedFetch", {}>, import("../../schema").CallableTaggedStruct<"SucceededFetchCount", {
17
+ count: typeof S.Number;
18
+ }>, import("../../schema").CallableTaggedStruct<"FailedFetchCount", {
19
+ error: typeof S.String;
20
+ }>]>;
21
+ export type Message = typeof Message.Type;
22
+ export declare const FetchCount: Command.CommandDefinition<"FetchCount", {
23
+ readonly _tag: "SucceededFetchCount";
24
+ readonly count: number;
25
+ } | {
26
+ readonly _tag: "FailedFetchCount";
27
+ readonly error: string;
28
+ }>;
29
+ export declare const fetchCount: Readonly<{
30
+ name: "FetchCount";
31
+ effect: Effect.Effect<{
32
+ readonly _tag: "SucceededFetchCount";
33
+ readonly count: number;
34
+ }, never, never>;
35
+ }>;
36
+ export declare const initialModel: Model;
37
+ export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<Command.Command<Message>>];
38
+ //# sourceMappingURL=counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../../src/test/apps/counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAKxC,eAAO,MAAM,KAAK;;EAAgC,CAAA;AAClD,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,gBAAgB,qEAAwB,CAAA;AACrD,eAAO,MAAM,gBAAgB,qEAAwB,CAAA;AACrD,eAAO,MAAM,YAAY,iEAAoB,CAAA;AAC7C,eAAO,MAAM,mBAAmB;;EAAgD,CAAA;AAChF,eAAO,MAAM,gBAAgB;;EAA6C,CAAA;AAE1E,eAAO,MAAM,OAAO;;;;IAMnB,CAAA;AACD,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,UAAU;;;;;;EAItB,CAAA;AAED,eAAO,MAAM,UAAU;;;;;;EAEtB,CAAA;AAID,eAAO,MAAM,YAAY,EAAE,KAAoB,CAAA;AAI/C,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAYxD,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { Effect, Match as M, Schema as S } from 'effect';
2
+ import * as Command from '../../command';
3
+ import { m } from '../../message';
4
+ // MODEL
5
+ export const Model = S.Struct({ count: S.Number });
6
+ // MESSAGE
7
+ export const ClickedIncrement = m('ClickedIncrement');
8
+ export const ClickedDecrement = m('ClickedDecrement');
9
+ export const ClickedFetch = m('ClickedFetch');
10
+ export const SucceededFetchCount = m('SucceededFetchCount', { count: S.Number });
11
+ export const FailedFetchCount = m('FailedFetchCount', { error: S.String });
12
+ export const Message = S.Union(ClickedIncrement, ClickedDecrement, ClickedFetch, SucceededFetchCount, FailedFetchCount);
13
+ // COMMAND
14
+ export const FetchCount = Command.define('FetchCount', SucceededFetchCount, FailedFetchCount);
15
+ export const fetchCount = FetchCount(Effect.sync(() => SucceededFetchCount({ count: 0 })));
16
+ // INIT
17
+ export const initialModel = { count: 0 };
18
+ // UPDATE
19
+ export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
20
+ ClickedIncrement: () => [{ count: model.count + 1 }, []],
21
+ ClickedDecrement: () => [{ count: model.count - 1 }, []],
22
+ ClickedFetch: () => [model, [fetchCount]],
23
+ SucceededFetchCount: ({ count }) => [{ count }, []],
24
+ FailedFetchCount: () => [model, []],
25
+ }));
@@ -0,0 +1,69 @@
1
+ import { Effect, Option, Schema as S } from 'effect';
2
+ import * as Command from '../../command';
3
+ export declare const ChildModel: S.Struct<{
4
+ status: S.Literal<["Idle", "Submitting", "Submitted"]>;
5
+ }>;
6
+ export type ChildModel = typeof ChildModel.Type;
7
+ export declare const SubmittedForm: import("../../schema").CallableTaggedStruct<"SubmittedForm", {}>;
8
+ export declare const SucceededSubmit: import("../../schema").CallableTaggedStruct<"SucceededSubmit", {
9
+ id: typeof S.String;
10
+ }>;
11
+ export declare const CancelledForm: import("../../schema").CallableTaggedStruct<"CancelledForm", {}>;
12
+ export declare const CompletedReset: import("../../schema").CallableTaggedStruct<"CompletedReset", {}>;
13
+ export declare const ChildMessage: S.Union<[import("../../schema").CallableTaggedStruct<"SubmittedForm", {}>, import("../../schema").CallableTaggedStruct<"SucceededSubmit", {
14
+ id: typeof S.String;
15
+ }>, import("../../schema").CallableTaggedStruct<"CancelledForm", {}>, import("../../schema").CallableTaggedStruct<"CompletedReset", {}>]>;
16
+ export type ChildMessage = typeof ChildMessage.Type;
17
+ export declare const RequestedSave: import("../../schema").CallableTaggedStruct<"RequestedSave", {
18
+ id: typeof S.String;
19
+ }>;
20
+ export declare const RequestedCancel: import("../../schema").CallableTaggedStruct<"RequestedCancel", {}>;
21
+ export declare const ChildOutMessage: S.Union<[import("../../schema").CallableTaggedStruct<"RequestedSave", {
22
+ id: typeof S.String;
23
+ }>, import("../../schema").CallableTaggedStruct<"RequestedCancel", {}>]>;
24
+ export type ChildOutMessage = typeof ChildOutMessage.Type;
25
+ export declare const SubmitForm: Command.CommandDefinition<"SubmitForm", {
26
+ readonly _tag: "SucceededSubmit";
27
+ readonly id: string;
28
+ }>;
29
+ export declare const submitForm: Readonly<{
30
+ name: "SubmitForm";
31
+ effect: Effect.Effect<{
32
+ readonly _tag: "SucceededSubmit";
33
+ readonly id: string;
34
+ }, never, never>;
35
+ }>;
36
+ export declare const ResetForm: Command.CommandDefinition<"ResetForm", {
37
+ readonly _tag: "CompletedReset";
38
+ }>;
39
+ export declare const resetForm: Readonly<{
40
+ name: "ResetForm";
41
+ effect: Effect.Effect<{
42
+ readonly _tag: "CompletedReset";
43
+ }, never, never>;
44
+ }>;
45
+ export declare const initialChildModel: ChildModel;
46
+ export declare const childUpdate: (_model: ChildModel, message: ChildMessage) => readonly [ChildModel, ReadonlyArray<Command.Command<ChildMessage>>, Option.Option<ChildOutMessage>];
47
+ export declare const ParentModel: S.Struct<{
48
+ child: S.Struct<{
49
+ status: S.Literal<["Idle", "Submitting", "Submitted"]>;
50
+ }>;
51
+ savedIds: S.Array$<typeof S.String>;
52
+ cancelled: typeof S.Boolean;
53
+ }>;
54
+ export type ParentModel = typeof ParentModel.Type;
55
+ export declare const GotChildMessage: import("../../schema").CallableTaggedStruct<"GotChildMessage", {
56
+ message: S.Union<[import("../../schema").CallableTaggedStruct<"SubmittedForm", {}>, import("../../schema").CallableTaggedStruct<"SucceededSubmit", {
57
+ id: typeof S.String;
58
+ }>, import("../../schema").CallableTaggedStruct<"CancelledForm", {}>, import("../../schema").CallableTaggedStruct<"CompletedReset", {}>]>;
59
+ }>;
60
+ export declare const CompletedParentReset: import("../../schema").CallableTaggedStruct<"CompletedParentReset", {}>;
61
+ export declare const ParentMessage: S.Union<[import("../../schema").CallableTaggedStruct<"GotChildMessage", {
62
+ message: S.Union<[import("../../schema").CallableTaggedStruct<"SubmittedForm", {}>, import("../../schema").CallableTaggedStruct<"SucceededSubmit", {
63
+ id: typeof S.String;
64
+ }>, import("../../schema").CallableTaggedStruct<"CancelledForm", {}>, import("../../schema").CallableTaggedStruct<"CompletedReset", {}>]>;
65
+ }>, import("../../schema").CallableTaggedStruct<"CompletedParentReset", {}>]>;
66
+ export type ParentMessage = typeof ParentMessage.Type;
67
+ export declare const initialParentModel: ParentModel;
68
+ export declare const parentUpdate: (parentModel: ParentModel, message: ParentMessage) => readonly [ParentModel, ReadonlyArray<Command.Command<ChildMessage>>];
69
+ //# sourceMappingURL=formChild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formChild.d.ts","sourceRoot":"","sources":["../../../src/test/apps/formChild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhE,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAKxC,eAAO,MAAM,UAAU;;EAErB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAI/C,eAAO,MAAM,aAAa,kEAAqB,CAAA;AAC/C,eAAO,MAAM,eAAe;;EAAyC,CAAA;AACrE,eAAO,MAAM,aAAa,kEAAqB,CAAA;AAC/C,eAAO,MAAM,cAAc,mEAAsB,CAAA;AAEjD,eAAO,MAAM,YAAY;;yIAKxB,CAAA;AACD,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAInD,eAAO,MAAM,aAAa;;EAAuC,CAAA;AACjE,eAAO,MAAM,eAAe,oEAAuB,CAAA;AAEnD,eAAO,MAAM,eAAe;;wEAA0C,CAAA;AACtE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAIzD,eAAO,MAAM,UAAU;;;EAAgD,CAAA;AACvE,eAAO,MAAM,UAAU;;;;;;EAEtB,CAAA;AAED,eAAO,MAAM,SAAS;;EAA8C,CAAA;AACpE,eAAO,MAAM,SAAS;;;;;EAAiD,CAAA;AAIvE,eAAO,MAAM,iBAAiB,EAAE,UAA+B,CAAA;AAI/D,eAAO,MAAM,WAAW,GACtB,QAAQ,UAAU,EAClB,SAAS,YAAY,KACpB,SAAS,CACV,UAAU,EACV,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC5C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CA4B7B,CAAA;AAIH,eAAO,MAAM,WAAW;;;;;;EAItB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAIjD,eAAO,MAAM,eAAe;;;;EAE1B,CAAA;AACF,eAAO,MAAM,oBAAoB,yEAA4B,CAAA;AAE7D,eAAO,MAAM,aAAa;;;;6EAAiD,CAAA;AAC3E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAIrD,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAA;AAID,eAAO,MAAM,YAAY,GACvB,aAAa,WAAW,EACxB,SAAS,aAAa,KACrB,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAkCnE,CAAA"}
@@ -0,0 +1,84 @@
1
+ import { Effect, Match as M, Option, Schema as S } from 'effect';
2
+ import * as Command from '../../command';
3
+ import { m } from '../../message';
4
+ // CHILD MODEL
5
+ export const ChildModel = S.Struct({
6
+ status: S.Literal('Idle', 'Submitting', 'Submitted'),
7
+ });
8
+ // CHILD MESSAGE
9
+ export const SubmittedForm = m('SubmittedForm');
10
+ export const SucceededSubmit = m('SucceededSubmit', { id: S.String });
11
+ export const CancelledForm = m('CancelledForm');
12
+ export const CompletedReset = m('CompletedReset');
13
+ export const ChildMessage = S.Union(SubmittedForm, SucceededSubmit, CancelledForm, CompletedReset);
14
+ // CHILD OUT MESSAGE
15
+ export const RequestedSave = m('RequestedSave', { id: S.String });
16
+ export const RequestedCancel = m('RequestedCancel');
17
+ export const ChildOutMessage = S.Union(RequestedSave, RequestedCancel);
18
+ // CHILD COMMAND
19
+ export const SubmitForm = Command.define('SubmitForm', SucceededSubmit);
20
+ export const submitForm = SubmitForm(Effect.sync(() => SucceededSubmit({ id: 'abc' })));
21
+ export const ResetForm = Command.define('ResetForm', CompletedReset);
22
+ export const resetForm = ResetForm(Effect.sync(() => CompletedReset()));
23
+ // CHILD INIT
24
+ export const initialChildModel = { status: 'Idle' };
25
+ // CHILD UPDATE
26
+ export const childUpdate = (_model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
27
+ SubmittedForm: () => [
28
+ { status: 'Submitting' },
29
+ [submitForm],
30
+ Option.none(),
31
+ ],
32
+ SucceededSubmit: ({ id }) => [
33
+ { status: 'Submitted' },
34
+ [resetForm],
35
+ Option.some(RequestedSave({ id })),
36
+ ],
37
+ CancelledForm: () => [
38
+ { status: 'Idle' },
39
+ [],
40
+ Option.some(RequestedCancel()),
41
+ ],
42
+ CompletedReset: () => [{ status: 'Idle' }, [], Option.none()],
43
+ }));
44
+ // PARENT MODEL
45
+ export const ParentModel = S.Struct({
46
+ child: ChildModel,
47
+ savedIds: S.Array(S.String),
48
+ cancelled: S.Boolean,
49
+ });
50
+ // PARENT MESSAGE
51
+ export const GotChildMessage = m('GotChildMessage', {
52
+ message: ChildMessage,
53
+ });
54
+ export const CompletedParentReset = m('CompletedParentReset');
55
+ export const ParentMessage = S.Union(GotChildMessage, CompletedParentReset);
56
+ // PARENT INIT
57
+ export const initialParentModel = {
58
+ child: { status: 'Idle' },
59
+ savedIds: [],
60
+ cancelled: false,
61
+ };
62
+ // PARENT UPDATE
63
+ export const parentUpdate = (parentModel, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
64
+ GotChildMessage: ({ message: childMessage }) => {
65
+ const [nextChild, commands, maybeOutMessage] = childUpdate(parentModel.child, childMessage);
66
+ const nextParent = Option.match(maybeOutMessage, {
67
+ onNone: () => ({ ...parentModel, child: nextChild }),
68
+ onSome: outMessage => M.value(outMessage).pipe(M.withReturnType(), M.tagsExhaustive({
69
+ RequestedSave: ({ id }) => ({
70
+ ...parentModel,
71
+ child: nextChild,
72
+ savedIds: [...parentModel.savedIds, id],
73
+ }),
74
+ RequestedCancel: () => ({
75
+ ...parentModel,
76
+ child: nextChild,
77
+ cancelled: true,
78
+ }),
79
+ })),
80
+ });
81
+ return [nextParent, commands];
82
+ },
83
+ CompletedParentReset: () => [parentModel, []],
84
+ }));
@@ -0,0 +1,23 @@
1
+ import { Schema as S } from 'effect';
2
+ import type { Html } from '../../html';
3
+ export declare const Model: S.Struct<{
4
+ lastKey: typeof S.String;
5
+ isShifted: typeof S.Boolean;
6
+ }>;
7
+ export type Model = typeof Model.Type;
8
+ export declare const PressedKey: import("../../schema").CallableTaggedStruct<"PressedKey", {
9
+ key: typeof S.String;
10
+ }>;
11
+ export declare const PressedShiftKey: import("../../schema").CallableTaggedStruct<"PressedShiftKey", {
12
+ key: typeof S.String;
13
+ }>;
14
+ export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"PressedKey", {
15
+ key: typeof S.String;
16
+ }>, import("../../schema").CallableTaggedStruct<"PressedShiftKey", {
17
+ key: typeof S.String;
18
+ }>]>;
19
+ export type Message = typeof Message.Type;
20
+ export declare const initialModel: Model;
21
+ export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<never>];
22
+ export declare const view: (model: Model) => Html;
23
+ //# sourceMappingURL=keypress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypress.d.ts","sourceRoot":"","sources":["../../../src/test/apps/keypress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAMtC,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,UAAU;;EAAqC,CAAA;AAC5D,eAAO,MAAM,eAAe;;EAA0C,CAAA;AAEtE,eAAO,MAAM,OAAO;;;;IAAuC,CAAA;AAC3D,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY,EAAE,KAG1B,CAAA;AAID,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAarC,CAAA;AAMH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,KAAG,IAiBjC,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { Match as M, Schema as S } from 'effect';
2
+ import { html } from '../../html';
3
+ import { m } from '../../message';
4
+ // MODEL
5
+ export const Model = S.Struct({
6
+ lastKey: S.String,
7
+ isShifted: S.Boolean,
8
+ });
9
+ // MESSAGE
10
+ export const PressedKey = m('PressedKey', { key: S.String });
11
+ export const PressedShiftKey = m('PressedShiftKey', { key: S.String });
12
+ export const Message = S.Union(PressedKey, PressedShiftKey);
13
+ // INIT
14
+ export const initialModel = {
15
+ lastKey: '',
16
+ isShifted: false,
17
+ };
18
+ // UPDATE
19
+ export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
20
+ PressedKey: ({ key }) => [
21
+ { ...model, lastKey: key, isShifted: false },
22
+ [],
23
+ ],
24
+ PressedShiftKey: ({ key }) => [
25
+ { ...model, lastKey: key, isShifted: true },
26
+ [],
27
+ ],
28
+ }));
29
+ // VIEW
30
+ const { div, span, Id, Class, AriaLabel, Role, OnKeyDown } = html();
31
+ export const view = (model) => div([
32
+ Id('key-app'),
33
+ Role('application'),
34
+ AriaLabel('Key press area'),
35
+ OnKeyDown((key, modifiers) => modifiers.shiftKey ? PressedShiftKey({ key }) : PressedKey({ key })),
36
+ ], [
37
+ span([Class('last-key'), AriaLabel('Last key')], [model.lastKey]),
38
+ span([Class('shifted'), AriaLabel('Shift pressed')], [model.isShifted ? 'true' : 'false']),
39
+ ]);