foldkit 0.135.0 → 0.137.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 (49) hide show
  1. package/dist/asyncData/asyncData.d.ts +4 -6
  2. package/dist/asyncData/asyncData.d.ts.map +1 -1
  3. package/dist/asyncData/asyncData.js +4 -6
  4. package/dist/command/brand.d.ts +9 -0
  5. package/dist/command/brand.d.ts.map +1 -0
  6. package/dist/command/brand.js +15 -0
  7. package/dist/command/index.d.ts +124 -24
  8. package/dist/command/index.d.ts.map +1 -1
  9. package/dist/command/index.js +76 -26
  10. package/dist/command/interruptible/interruptible.d.ts +9 -94
  11. package/dist/command/interruptible/interruptible.d.ts.map +1 -1
  12. package/dist/command/interruptible/interruptible.js +9 -75
  13. package/dist/command/interruptible/public.d.ts +1 -1
  14. package/dist/command/interruptible/public.d.ts.map +1 -1
  15. package/dist/command/interruptible/public.js +1 -1
  16. package/dist/command/public.d.ts +1 -1
  17. package/dist/command/public.d.ts.map +1 -1
  18. package/dist/file/select.d.ts +2 -2
  19. package/dist/file/select.js +2 -2
  20. package/dist/http/http.d.ts +4 -7
  21. package/dist/http/http.d.ts.map +1 -1
  22. package/dist/http/http.js +4 -7
  23. package/dist/port/port.d.ts +8 -9
  24. package/dist/port/port.d.ts.map +1 -1
  25. package/dist/port/port.js +8 -9
  26. package/dist/test/apps/counter.d.ts.map +1 -1
  27. package/dist/test/apps/counter.js +9 -2
  28. package/dist/test/apps/crashOnRender.d.ts +3 -3
  29. package/dist/test/apps/crashOnRender.d.ts.map +1 -1
  30. package/dist/test/apps/crashOnRender.js +9 -4
  31. package/dist/test/apps/drafts.d.ts +1 -2
  32. package/dist/test/apps/drafts.d.ts.map +1 -1
  33. package/dist/test/apps/drafts.js +7 -2
  34. package/dist/test/apps/formChild.d.ts +5 -5
  35. package/dist/test/apps/formChild.d.ts.map +1 -1
  36. package/dist/test/apps/formChild.js +11 -5
  37. package/dist/test/apps/login.d.ts.map +1 -1
  38. package/dist/test/apps/login.js +4 -1
  39. package/dist/test/apps/resumeUpload.d.ts +3 -3
  40. package/dist/test/apps/resumeUpload.d.ts.map +1 -1
  41. package/dist/test/apps/resumeUpload.js +15 -8
  42. package/dist/test/apps/uploads.d.ts +4 -4
  43. package/dist/test/apps/uploads.d.ts.map +1 -1
  44. package/dist/test/apps/uploads.js +10 -1
  45. package/dist/test/internal.d.ts +2 -2
  46. package/dist/test/internal.js +1 -1
  47. package/dist/test/scene.d.ts +1 -1
  48. package/dist/test/story.d.ts +1 -1
  49. package/package.json +1 -1
@@ -11,7 +11,7 @@ export const Model = S.Struct({
11
11
  });
12
12
  // MESSAGE
13
13
  export const ClickedChooseResume = m('ClickedChooseResume');
14
- export const SelectedResume = m('SelectedResume', {
14
+ export const CompletedSelectResume = m('CompletedSelectResume', {
15
15
  file: File.File,
16
16
  });
17
17
  export const CancelledSelectResume = m('CancelledSelectResume');
@@ -22,18 +22,25 @@ export const FailedReadPreview = m('FailedReadPreview');
22
22
  export const ClickedRemoveResume = m('ClickedRemoveResume');
23
23
  export const Message = S.Union([
24
24
  ClickedChooseResume,
25
- SelectedResume,
25
+ CompletedSelectResume,
26
26
  CancelledSelectResume,
27
27
  SucceededReadPreview,
28
28
  FailedReadPreview,
29
29
  ClickedRemoveResume,
30
30
  ]);
31
31
  // COMMAND
32
- export const SelectResume = Command.define('SelectResume', SelectedResume, CancelledSelectResume)(File.select(['application/pdf']).pipe(Effect.map(Option.match({
33
- onNone: () => CancelledSelectResume(),
34
- onSome: file => SelectedResume({ file }),
35
- }))));
36
- export const ReadResumePreview = Command.define('ReadResumePreview', { file: File.File }, SucceededReadPreview, FailedReadPreview)(({ file }) => File.readAsDataUrl(file).pipe(Effect.map(dataUrl => SucceededReadPreview({ dataUrl })), Effect.catch(() => Effect.succeed(FailedReadPreview()))));
32
+ export const SelectResume = Command.define('SelectResume', {
33
+ messages: [CompletedSelectResume, CancelledSelectResume],
34
+ execute: File.select(['application/pdf']).pipe(Effect.map(Option.match({
35
+ onNone: () => CancelledSelectResume(),
36
+ onSome: file => CompletedSelectResume({ file }),
37
+ }))),
38
+ });
39
+ export const ReadResumePreview = Command.define('ReadResumePreview', {
40
+ args: { file: File.File },
41
+ messages: [SucceededReadPreview, FailedReadPreview],
42
+ execute: ({ file }) => File.readAsDataUrl(file).pipe(Effect.map(dataUrl => SucceededReadPreview({ dataUrl })), Effect.catch(() => Effect.succeed(FailedReadPreview()))),
43
+ });
37
44
  // INIT
38
45
  export const initialModel = {
39
46
  maybeResume: Option.none(),
@@ -42,7 +49,7 @@ export const initialModel = {
42
49
  };
43
50
  export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
44
51
  ClickedChooseResume: () => [model, [SelectResume()]],
45
- SelectedResume: ({ file }) => [
52
+ CompletedSelectResume: ({ file }) => [
46
53
  evo(model, {
47
54
  maybeResume: () => Option.some(file),
48
55
  maybePreviewDataUrl: () => Option.none(),
@@ -53,17 +53,17 @@ export declare const UploadFileArgs: S.Struct<{
53
53
  export type UploadFileArgs = typeof UploadFileArgs.Type;
54
54
  export declare const UploadFile: Interruptible.DefinitionWithArgs<"UploadFile", {
55
55
  readonly uploadId: S.Number;
56
- }, {
56
+ }, Pick<{
57
57
  readonly uploadId: number;
58
- }, Effect.Effect<{
58
+ }, "uploadId">, Effect.Effect<{
59
59
  readonly _tag: "SucceededUploadFile";
60
60
  readonly uploadId: number;
61
61
  }, never, never>>;
62
62
  export declare const CancelUploadFile: ({ uploadId }: UploadFileArgs) => Readonly<{
63
63
  name: "UploadFile.Interrupt";
64
- args: {
64
+ args: Pick<{
65
65
  readonly uploadId: number;
66
- };
66
+ }, "uploadId">;
67
67
  interruptsKey: string;
68
68
  effect: Effect.Effect<{
69
69
  readonly _tag: "CompletedCancelUploadFile";
@@ -1 +1 @@
1
- {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../src/test/apps/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEvE,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAMhE,eAAO,MAAM,YAAY,mEAKvB,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,kBAAkB,gFAA0B,CAAA;AACzD,eAAO,MAAM,kBAAkB;;EAE7B,CAAA;AACF,eAAO,MAAM,mBAAmB;;EAE9B,CAAA;AACF,eAAO,MAAM,mBAAmB;;EAE9B,CAAA;AACF,eAAO,MAAM,gBAAgB;;EAAgD,CAAA;AAC7E,eAAO,MAAM,yBAAyB;;;EAGpC,CAAA;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;IAOlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,cAAc;;EAAmC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;iBAMwD,CAAA;AAE/E,eAAO,MAAM,gBAAgB,GAAI,cAAc,cAAc;;;;;;;;;;;;;;;EAG1D,CAAA;AAIH,eAAO,MAAM,YAAY,EAAE,KAAoC,CAAA;AAS/D,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAiDxD,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,QAyB5D,CAAA"}
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../src/test/apps/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEvE,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAMhE,eAAO,MAAM,YAAY,mEAKvB,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,kBAAkB,gFAA0B,CAAA;AACzD,eAAO,MAAM,kBAAkB;;EAE7B,CAAA;AACF,eAAO,MAAM,mBAAmB;;EAE9B,CAAA;AACF,eAAO,MAAM,mBAAmB;;EAE9B,CAAA;AACF,eAAO,MAAM,gBAAgB;;EAAgD,CAAA;AAC7E,eAAO,MAAM,yBAAyB;;;EAGpC,CAAA;AAEF,eAAO,MAAM,OAAO;;;;;;;;;;;IAOlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,cAAc;;EAAmC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;;;iBASrB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAAI,cAAc,cAAc;;;;;;;;;;;;;;;EAG1D,CAAA;AAIH,eAAO,MAAM,YAAY,EAAE,KAAoC,CAAA;AAS/D,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAiDxD,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,QAyB5D,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { Array, Effect, Match as M, Number, Schema as S } from 'effect';
2
+ import * as Command from '../../command/index.js';
2
3
  import * as Interruptible from '../../command/interruptible/index.js';
3
4
  import { m } from '../../message/index.js';
4
5
  import { evo } from '../../struct/index.js';
@@ -43,7 +44,15 @@ export const Message = S.Union([
43
44
  ]);
44
45
  // COMMAND
45
46
  export const UploadFileArgs = S.Struct({ uploadId: S.Number });
46
- export const UploadFile = Interruptible.define('UploadFile', UploadFileArgs.fields, ({ uploadId }) => String(uploadId), SucceededUploadFile, FailedUploadFile)(({ uploadId }) => Effect.as(Effect.never, SucceededUploadFile({ uploadId })));
47
+ export const UploadFile = Command.define('UploadFile', {
48
+ args: UploadFileArgs.fields,
49
+ messages: [SucceededUploadFile, FailedUploadFile],
50
+ interrupt: {
51
+ keyFields: ['uploadId'],
52
+ toKey: ({ uploadId }) => String(uploadId),
53
+ },
54
+ execute: ({ uploadId }) => Effect.as(Effect.never, SucceededUploadFile({ uploadId })),
55
+ });
47
56
  export const CancelUploadFile = ({ uploadId }) => UploadFile.Interrupt({ uploadId }, outcome => CompletedCancelUploadFile({ uploadId, outcome }));
48
57
  // INIT
49
58
  export const initialModel = { uploadId: 0, uploads: [] };
@@ -12,7 +12,7 @@ import { type MountDefinition } from '../mount/index.js';
12
12
  * without the test restating it. Absent on synthetic matchers built for
13
13
  * formatting; treated as empty then.
14
14
  *
15
- * `key` is present on Commands built with `Command.Interruptible.define`:
15
+ * `key` is present on Commands built with an interruptible `Command.define`:
16
16
  * such Commands may stay pending across Messages (they model long-running
17
17
  * work). `interruptsKey` is present on Interrupt Commands: resolving one
18
18
  * drops every pending Command holding that key, mirroring the runtime
@@ -144,7 +144,7 @@ export declare const assertExactCommands: (commands: ReadonlyArray<AnyCommand>,
144
144
  /** Throws if there are any pending Commands. */
145
145
  export declare const assertZeroCommands: (commands: ReadonlyArray<AnyCommand>) => void;
146
146
  /** Throws when trying to send a message with unresolved Commands. Keyed
147
- * Commands (built with `Command.Interruptible.define`) and Interrupt
147
+ * Commands (built with an interruptible `Command.define`) and Interrupt
148
148
  * Commands are exempt: they model in-flight async work that legitimately
149
149
  * stays pending while later Messages arrive, so a story can dispatch the
150
150
  * Message that interrupts a keyed Command, or keep typing while a
@@ -164,7 +164,7 @@ export const assertZeroCommands = (commands) => {
164
164
  }
165
165
  };
166
166
  /** Throws when trying to send a message with unresolved Commands. Keyed
167
- * Commands (built with `Command.Interruptible.define`) and Interrupt
167
+ * Commands (built with an interruptible `Command.define`) and Interrupt
168
168
  * Commands are exempt: they model in-flight async work that legitimately
169
169
  * stays pending while later Messages arrive, so a story can dispatch the
170
170
  * Message that interrupts a keyed Command, or keep typing while a
@@ -64,7 +64,7 @@ type SceneCommandInstance<ResultMessage = unknown> = Readonly<{
64
64
  }>;
65
65
  /** A Command Definition accepted by `Scene.Command.resolve` as a name matcher:
66
66
  * a plain `Command.define` Definition or an interruptible
67
- * `Command.Interruptible.define` Definition. Both carry the
67
+ * interruptible `Command.define` Definition. Both carry the
68
68
  * `CommandDefinitionTypeId` brand and match by name at runtime, so `resolve`
69
69
  * accepts either, the way `expectHas`/`expectExact` already do. */
70
70
  type ResolvableCommandDefinition<Name extends string, ResultMessage> = CommandDefinition<Name, ResultMessage> | Interruptible.DefinitionNoArgs<Name, Effect.Effect<ResultMessage, any, any>> | Interruptible.DefinitionWithArgs<Name, any, any, Effect.Effect<ResultMessage, any, any>> | Interruptible.DefinitionWithArgsNameKeyed<Name, any, Effect.Effect<ResultMessage, any, any>>;
@@ -13,7 +13,7 @@ type AnyCommandInstance<ResultMessage = unknown> = Readonly<{
13
13
  }>;
14
14
  /** A Command Definition accepted by `Story.Command.resolve` as a name matcher:
15
15
  * a plain `Command.define` Definition or an interruptible
16
- * `Command.Interruptible.define` Definition. Both carry the
16
+ * interruptible `Command.define` Definition. Both carry the
17
17
  * `CommandDefinitionTypeId` brand and match by name at runtime, so `resolve`
18
18
  * accepts either, the way `expectHas`/`expectExact` already do. */
19
19
  type ResolvableCommandDefinition<Name extends string, ResultMessage> = CommandDefinition<Name, ResultMessage> | Interruptible.DefinitionNoArgs<Name, Effect.Effect<ResultMessage, any, any>> | Interruptible.DefinitionWithArgs<Name, any, any, Effect.Effect<ResultMessage, any, any>> | Interruptible.DefinitionWithArgsNameKeyed<Name, any, Effect.Effect<ResultMessage, any, any>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.135.0",
3
+ "version": "0.137.0",
4
4
  "description": "A TypeScript frontend framework, built on Effect and architected like Elm",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",