@effect-app/vue 4.0.0-beta.5 → 4.0.0-beta.52

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 (66) hide show
  1. package/CHANGELOG.md +338 -0
  2. package/dist/{experimental/commander.d.ts → commander.d.ts} +5 -6
  3. package/dist/commander.d.ts.map +1 -0
  4. package/dist/{experimental/commander.js → commander.js} +3 -5
  5. package/dist/confirm.d.ts.map +1 -0
  6. package/dist/confirm.js +28 -0
  7. package/dist/form.d.ts +9 -0
  8. package/dist/form.d.ts.map +1 -1
  9. package/dist/form.js +38 -9
  10. package/dist/{experimental/intl.d.ts → intl.d.ts} +2 -2
  11. package/dist/intl.d.ts.map +1 -0
  12. package/dist/intl.js +5 -0
  13. package/dist/makeClient.d.ts +7 -6
  14. package/dist/makeClient.d.ts.map +1 -1
  15. package/dist/makeClient.js +9 -8
  16. package/dist/{experimental/makeUseCommand.d.ts → makeUseCommand.d.ts} +1 -1
  17. package/dist/makeUseCommand.d.ts.map +1 -0
  18. package/dist/makeUseCommand.js +13 -0
  19. package/dist/mutate.d.ts +1 -1
  20. package/dist/mutate.d.ts.map +1 -1
  21. package/dist/mutate.js +2 -2
  22. package/dist/query.d.ts +1 -1
  23. package/dist/query.d.ts.map +1 -1
  24. package/dist/query.js +16 -7
  25. package/dist/runtime.d.ts +3 -0
  26. package/dist/runtime.d.ts.map +1 -1
  27. package/dist/runtime.js +14 -2
  28. package/dist/toast.d.ts.map +1 -0
  29. package/dist/toast.js +41 -0
  30. package/dist/withToast.d.ts.map +1 -0
  31. package/dist/withToast.js +45 -0
  32. package/package.json +41 -41
  33. package/src/{experimental/commander.ts → commander.ts} +3 -5
  34. package/src/form.ts +46 -8
  35. package/src/{experimental/intl.ts → intl.ts} +1 -1
  36. package/src/makeClient.ts +12 -8
  37. package/src/mutate.ts +1 -1
  38. package/src/query.ts +16 -9
  39. package/src/runtime.ts +24 -1
  40. package/test/Mutation.test.ts +1 -1
  41. package/test/dist/form.test.d.ts.map +1 -1
  42. package/test/dist/stubs.d.ts +38 -54
  43. package/test/dist/stubs.d.ts.map +1 -1
  44. package/test/dist/stubs.js +8 -8
  45. package/test/form-validation-errors.test.ts +23 -19
  46. package/test/form.test.ts +20 -2
  47. package/test/stubs.ts +7 -7
  48. package/tsconfig.json +0 -1
  49. package/dist/experimental/commander.d.ts.map +0 -1
  50. package/dist/experimental/confirm.d.ts.map +0 -1
  51. package/dist/experimental/confirm.js +0 -28
  52. package/dist/experimental/intl.d.ts.map +0 -1
  53. package/dist/experimental/intl.js +0 -5
  54. package/dist/experimental/makeUseCommand.d.ts.map +0 -1
  55. package/dist/experimental/makeUseCommand.js +0 -13
  56. package/dist/experimental/toast.d.ts.map +0 -1
  57. package/dist/experimental/toast.js +0 -41
  58. package/dist/experimental/withToast.d.ts.map +0 -1
  59. package/dist/experimental/withToast.js +0 -45
  60. /package/dist/{experimental/confirm.d.ts → confirm.d.ts} +0 -0
  61. /package/dist/{experimental/toast.d.ts → toast.d.ts} +0 -0
  62. /package/dist/{experimental/withToast.d.ts → withToast.d.ts} +0 -0
  63. /package/src/{experimental/confirm.ts → confirm.ts} +0 -0
  64. /package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +0 -0
  65. /package/src/{experimental/toast.ts → toast.ts} +0 -0
  66. /package/src/{experimental/withToast.ts → withToast.ts} +0 -0
package/dist/runtime.js CHANGED
@@ -1,5 +1,6 @@
1
- import { ManagedRuntime } from "effect";
1
+ import { Exit, flow, ManagedRuntime } from "effect";
2
2
  import { Effect, Layer, Logger } from "effect-app";
3
+ import { KnownFiberFailure } from "./query.js";
3
4
  export function makeAppRuntime(layer) {
4
5
  return Effect.gen(function* () {
5
6
  const l = layer.pipe(Layer.provide(Logger.layer([Logger.consolePretty()])));
@@ -23,4 +24,15 @@ export function initializeAsync(layer) {
23
24
  return Effect
24
25
  .runPromise(makeAppRuntime(layer));
25
26
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRWxELE1BQU0sVUFBVSxjQUFjLENBQU8sS0FBd0I7SUFDM0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzdCLENBQUE7UUFDMUIsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFBO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDeEIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNkLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDMUMsQ0FBQztZQUVELENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFDbkIsT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDdEIsQ0FBQztTQUNGLENBQUMsQ0FBQSxDQUFDLHNEQUFzRDtJQUMzRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFPLEtBQStCO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDckQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQU8sS0FBK0I7SUFDbkUsT0FBTyxNQUFNO1NBQ1YsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBQ3RDLENBQUMifQ==
27
+ // we wrap into KnownFiberFailure because we want to keep the full cause of the failure.
28
+ export const makeRunPromise = (services) => flow(Effect.runPromiseExitWith(services), (_) => _.then(Exit.match({
29
+ onFailure: (cause) => Promise.reject(new KnownFiberFailure(cause)),
30
+ onSuccess: (value) => Promise.resolve(value)
31
+ })));
32
+ export const makeRunSync = (services) => flow(Effect.runSyncExitWith(services), Exit.match({
33
+ onFailure: (cause) => {
34
+ throw new KnownFiberFailure(cause);
35
+ },
36
+ onSuccess: (value) => value
37
+ }));
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTlDLE1BQU0sVUFBVSxjQUFjLENBQU8sS0FBd0I7SUFDM0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzdCLENBQUE7UUFDMUIsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFBO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDeEIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNkLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDMUMsQ0FBQztZQUVELENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFDbkIsT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUE7WUFDdEIsQ0FBQztTQUNGLENBQUMsQ0FBQSxDQUFDLHNEQUFzRDtJQUMzRCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFPLEtBQStCO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDckQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQU8sS0FBK0I7SUFDbkUsT0FBTyxNQUFNO1NBQ1YsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBQ3RDLENBQUM7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUksUUFBdUIsRUFBRSxFQUFFLENBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM5QyxDQUFDLENBQUMsSUFBSSxDQUNKLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDVCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0NBQzdDLENBQUMsQ0FDSCxDQUFDLENBQUE7QUFFTixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBSSxRQUF1QixFQUFFLEVBQUUsQ0FDeEQsSUFBSSxDQUNGLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDVCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNuQixNQUFNLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztDQUM1QixDQUFDLENBQ0gsQ0FBQSJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,UAAU,EAAE,MAAM,YAAY,CAAA;AAGvD,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AACrC,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAC1D,MAAM,MAAM,iBAAiB,GAAG;IAAE,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzE,MAAM,MAAM,QAAQ,GAAG,MAAM;IAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,KAAK,OAAO,CAAA;IACpE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,KAAK,OAAO,CAAA;IACtE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,KAAK,OAAO,CAAA;IACtE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,KAAK,OAAO,CAAA;IACnE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,KAAK,IAAI,CAAA;CAC3C,CAAA;;aAEgF,OAAO;;AAAxF,qBAAa,cAAe,SAAQ,mBAA2E;CAAG;AAElH,+FAA+F;AAC/F,eAAO,MAAM,IAAI,GAAI,OAAO,UAAU,CAAC,QAAQ,CAAC;qBAE3B,MAAM,YAAY,iBAAiB;oBAAnC,MAAM,YAAY,iBAAiB;uBAAnC,MAAM,YAAY,iBAAiB;uBAAnC,MAAM,YAAY,iBAAiB;uBAmBjC,OAAO;CAE7B,CAAA;;qBArBoB,MAAM,YAAY,iBAAiB;oBAAnC,MAAM,YAAY,iBAAiB;uBAAnC,MAAM,YAAY,iBAAiB;uBAAnC,MAAM,YAAY,iBAAiB;uBAmBjC,OAAO;;;;;;;;AAI9B,qBAAa,KACX,SAAQ,UAAuG;CAEhH"}
package/dist/toast.js ADDED
@@ -0,0 +1,41 @@
1
+ import { Effect, Option, ServiceMap } from "effect-app";
2
+ import { proxify } from "effect-app/ServiceMap";
3
+ export class CurrentToastId extends ServiceMap.Opaque()("CurrentToastId") {
4
+ }
5
+ /** fallback to CurrentToastId when available unless id is explicitly set to a value or null */
6
+ export const wrap = (toast) => {
7
+ const wrap = (toastHandler) => {
8
+ return (message, options) => Effect.serviceOption(CurrentToastId).pipe(Effect.flatMap((currentToast) => Effect.sync(() => {
9
+ const { id: _id, ...rest } = options ?? {};
10
+ const id = _id !== undefined
11
+ ? _id ?? undefined
12
+ : Option.getOrUndefined(Option.map(currentToast, (_) => _.toastId));
13
+ // when id is undefined, we may end up with no toast at all..
14
+ return toastHandler(message, id !== undefined ? { ...rest, id } : rest);
15
+ })));
16
+ };
17
+ return {
18
+ error: wrap(toast.error),
19
+ info: wrap(toast.info),
20
+ success: wrap(toast.success),
21
+ warning: wrap(toast.warning),
22
+ dismiss: (toastId) => Effect.sync(() => toast.dismiss(toastId))
23
+ };
24
+ };
25
+ export class Toast extends proxify(ServiceMap.Opaque()("Toast"))() {
26
+ }
27
+ // const a = Layer.effect(Toast, Effect.sync(() => Toast.of(null as any)))
28
+ // const A = Toast.of({
29
+ // error: () => Effect.succeed(null as any),
30
+ // info: () => Effect.succeed(null as any),
31
+ // success: () => Effect.succeed(null as any),
32
+ // warning: () => Effect.succeed(null as any),
33
+ // dismiss: () => Effect.succeed(null as any)
34
+ // })
35
+ // const b = Toast.info("test")
36
+ // const a2 = Toast.use((_) => _.error("test"))
37
+ // const b2 = Effect.gen(function*() {
38
+ // const toast = yield* Toast
39
+ // toast.error("test")
40
+ // })
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdG9hc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQWMvQyxNQUFNLE9BQU8sY0FBZSxTQUFRLFVBQVUsQ0FBQyxNQUFNLEVBQXdDLENBQUMsZ0JBQWdCLENBQUM7Q0FBRztBQUVsSCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBMkIsRUFBRSxFQUFFO0lBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUMsWUFBK0QsRUFBRSxFQUFFO1FBQy9FLE9BQU8sQ0FBQyxPQUFlLEVBQUUsT0FBMkIsRUFBRSxFQUFFLENBQ3RELE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7WUFDMUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxLQUFLLFNBQVM7Z0JBQzFCLENBQUMsQ0FBQyxHQUFHLElBQUksU0FBUztnQkFDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQ3JFLDZEQUE2RDtZQUM3RCxPQUFPLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekUsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFBO0lBQ0wsQ0FBQyxDQUFBO0lBQ0QsT0FBTztRQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM1QixPQUFPLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDekUsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sT0FBTyxLQUNYLFNBQVEsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQWtDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBa0M7Q0FFaEg7QUFFRCwwRUFBMEU7QUFFMUUsdUJBQXVCO0FBQ3ZCLDhDQUE4QztBQUM5Qyw2Q0FBNkM7QUFDN0MsZ0RBQWdEO0FBQ2hELGdEQUFnRDtBQUNoRCwrQ0FBK0M7QUFDL0MsS0FBSztBQUVMLCtCQUErQjtBQUUvQiwrQ0FBK0M7QUFFL0Msc0NBQXNDO0FBQ3RDLCtCQUErQjtBQUMvQix3QkFBd0I7QUFDeEIsS0FBSyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withToast.d.ts","sourceRoot":"","sources":["../src/withToast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { Cause, Effect, Layer, ServiceMap } from "effect-app";
2
+ import { wrapEffect } from "effect-app/utils";
3
+ import { CurrentToastId, Toast } from "./toast.js";
4
+ // @effect-diagnostics-next-line missingEffectServiceDependency:off
5
+ export class WithToast extends ServiceMap.Service()("WithToast", {
6
+ make: Effect.gen(function* () {
7
+ const toast = yield* Toast;
8
+ return (options) => Effect.fnUntraced(function* (self, ...args) {
9
+ const baseTimeout = options.timeout ?? 3_000;
10
+ const stableToastId = typeof options.stableToastId === "function"
11
+ ? options.stableToastId(...args)
12
+ : options.stableToastId;
13
+ const t = yield* wrapEffect(options.onWaiting)(...args);
14
+ const toastId = t === null ? stableToastId : yield* toast.info(t, { id: stableToastId ?? null } // TODO: timeout forever?
15
+ );
16
+ return yield* self.pipe(Effect.tap(Effect.fnUntraced(function* (a) {
17
+ const t = yield* wrapEffect(options.onSuccess)(a, ...args);
18
+ if (t === null) {
19
+ return;
20
+ }
21
+ yield* toast.success(t, toastId !== undefined ? { id: toastId, timeout: baseTimeout } : { timeout: baseTimeout });
22
+ })), Effect.tapCause(Effect.fnUntraced(function* (cause) {
23
+ yield* Effect.logDebug("WithToast - caught error cause: " + Cause.squash(cause), Cause.hasInterruptsOnly(cause), cause);
24
+ if (Cause.hasInterruptsOnly(cause)) {
25
+ if (toastId)
26
+ yield* toast.dismiss(toastId);
27
+ return;
28
+ }
29
+ const t = yield* wrapEffect(options.onFailure)(Cause.findErrorOption(cause), ...args);
30
+ const opts = { timeout: baseTimeout * 2 };
31
+ if (typeof t === "object") {
32
+ return t.level === "warn"
33
+ ? yield* toast.warning(t.message, toastId !== undefined ? { ...opts, id: toastId } : opts)
34
+ : yield* toast.error(t.message, toastId !== undefined ? { ...opts, id: toastId } : opts);
35
+ }
36
+ yield* toast.error(t, toastId !== undefined ? { ...opts, id: toastId } : opts);
37
+ }, Effect.uninterruptible)), toastId !== undefined ? Effect.provideService(CurrentToastId, CurrentToastId.of({ toastId })) : (_) => _);
38
+ });
39
+ })
40
+ }) {
41
+ static DefaultWithoutDependencies = Layer.effect(this, this.make);
42
+ static Default = this.DefaultWithoutDependencies;
43
+ static handle = (options) => (self, ...args) => this.use((_) => _(options)(self, ...args));
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aFRvYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dpdGhUb2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQWdDbEQsbUVBQW1FO0FBQ25FLE1BQU0sT0FBTyxTQUFVLFNBQVEsVUFBVSxDQUFDLE9BQU8sRUFBYSxDQUFDLFdBQVcsRUFBRTtJQUMxRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFBO1FBQzFCLE9BQU8sQ0FDTCxPQUFtRCxFQUNuRCxFQUFFLENBQ0YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUE0QixFQUFFLEdBQUcsSUFBVTtZQUNyRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQTtZQUU1QyxNQUFNLGFBQWEsR0FBRyxPQUFPLE9BQU8sQ0FBQyxhQUFhLEtBQUssVUFBVTtnQkFDL0QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFBO1lBRXpCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtZQUN2RCxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQzVELENBQUMsRUFDRCxFQUFFLEVBQUUsRUFBRSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUMseUJBQXlCO2FBQ3hELENBQUE7WUFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDO2dCQUN0QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO2dCQUMxRCxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDZixPQUFNO2dCQUNSLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDbEIsQ0FBQyxFQUNELE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUN6RixDQUFBO1lBQ0gsQ0FBQyxDQUFDLENBQUMsRUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSztnQkFDL0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsa0NBQWtDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFDeEQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUM5QixLQUFLLENBQ04sQ0FBQTtnQkFFRCxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNuQyxJQUFJLE9BQU87d0JBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDMUMsT0FBTTtnQkFDUixDQUFDO2dCQUVELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO2dCQUNyRixNQUFNLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUE7Z0JBRXpDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNO3dCQUN2QixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQzFGLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM1RixDQUFDO2dCQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNoRixDQUFDLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQzNCLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ3pHLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQztDQUNILENBQUM7SUFDQSxNQUFNLENBQVUsMEJBQTBCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFFLE1BQU0sQ0FBVSxPQUFPLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFBO0lBRXpELE1BQU0sQ0FBVSxNQUFNLEdBQUcsQ0FDdkIsT0FBbUQsRUFDdUQsRUFBRSxDQUM5RyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFrQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBIn0=
package/package.json CHANGED
@@ -1,36 +1,36 @@
1
1
  {
2
2
  "name": "@effect-app/vue",
3
- "version": "4.0.0-beta.5",
3
+ "version": "4.0.0-beta.52",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/effect-ts-app/libs/tree/main/packages/vue",
7
7
  "dependencies": {
8
- "@formatjs/intl": "^4.1.2",
8
+ "@formatjs/intl": "^4.1.5",
9
9
  "@tanstack/query-core": "5.83.1",
10
10
  "@tanstack/vue-query": "5.83.1",
11
11
  "@vueuse/core": "^14.2.1",
12
12
  "change-case": "^5.4.4",
13
13
  "query-string": "^9.3.1",
14
- "effect-app": "4.0.0-beta.5"
14
+ "effect-app": "4.0.0-beta.52"
15
15
  },
16
16
  "peerDependencies": {
17
- "@effect/atom-vue": "^4.0.0-beta.25",
18
- "@effect/platform-browser": "^4.0.0-beta.25",
19
- "@sentry/browser": "^10.40.0",
20
- "effect": "^4.0.0-beta.25",
21
- "vue": "^3.5.29"
17
+ "@effect/atom-vue": "^4.0.0-beta.43",
18
+ "@effect/platform-browser": "^4.0.0-beta.43",
19
+ "@sentry/browser": "^10.46.0",
20
+ "effect": "^4.0.0-beta.43",
21
+ "vue": "^3.5.31"
22
22
  },
23
23
  "devDependencies": {
24
- "@effect/vitest": "^4.0.0-beta.25",
25
- "@formatjs/icu-messageformat-parser": "^3.5.1",
26
- "@types/node": "25.3.3",
27
- "@vitejs/plugin-vue": "^6.0.4",
28
- "intl-messageformat": "^11.1.2",
24
+ "@effect/vitest": "^4.0.0-beta.43",
25
+ "@formatjs/icu-messageformat-parser": "^3.5.3",
26
+ "@types/node": "25.5.0",
27
+ "@vitejs/plugin-vue": "^6.0.5",
28
+ "intl-messageformat": "^11.2.0",
29
29
  "json5": "^2.2.3",
30
- "typescript": "~5.9.3",
31
- "vite": "^7.3.1",
32
- "vitest": "^4.0.18",
33
- "@effect-app/eslint-shared-config": "0.5.7-beta.1"
30
+ "typescript": "~6.0.2",
31
+ "vite": "^8.0.3",
32
+ "vitest": "^4.1.2",
33
+ "@effect-app/eslint-shared-config": "0.5.7-beta.6"
34
34
  },
35
35
  "typesVersions": {
36
36
  "*": {
@@ -44,38 +44,26 @@
44
44
  "types": "./dist/index.d.ts",
45
45
  "default": "./dist/index.js"
46
46
  },
47
+ "./commander": {
48
+ "types": "./dist/commander.d.ts",
49
+ "default": "./dist/commander.js"
50
+ },
51
+ "./confirm": {
52
+ "types": "./dist/confirm.d.ts",
53
+ "default": "./dist/confirm.js"
54
+ },
47
55
  "./errorReporter": {
48
56
  "types": "./dist/errorReporter.d.ts",
49
57
  "default": "./dist/errorReporter.js"
50
58
  },
51
- "./experimental/commander": {
52
- "types": "./dist/experimental/commander.d.ts",
53
- "default": "./dist/experimental/commander.js"
54
- },
55
- "./experimental/confirm": {
56
- "types": "./dist/experimental/confirm.d.ts",
57
- "default": "./dist/experimental/confirm.js"
58
- },
59
- "./experimental/intl": {
60
- "types": "./dist/experimental/intl.d.ts",
61
- "default": "./dist/experimental/intl.js"
62
- },
63
- "./experimental/makeUseCommand": {
64
- "types": "./dist/experimental/makeUseCommand.d.ts",
65
- "default": "./dist/experimental/makeUseCommand.js"
66
- },
67
- "./experimental/toast": {
68
- "types": "./dist/experimental/toast.d.ts",
69
- "default": "./dist/experimental/toast.js"
70
- },
71
- "./experimental/withToast": {
72
- "types": "./dist/experimental/withToast.d.ts",
73
- "default": "./dist/experimental/withToast.js"
74
- },
75
59
  "./form": {
76
60
  "types": "./dist/form.d.ts",
77
61
  "default": "./dist/form.js"
78
62
  },
63
+ "./intl": {
64
+ "types": "./dist/intl.d.ts",
65
+ "default": "./dist/intl.js"
66
+ },
79
67
  "./lib": {
80
68
  "types": "./dist/lib.d.ts",
81
69
  "default": "./dist/lib.js"
@@ -92,6 +80,10 @@
92
80
  "types": "./dist/makeIntl.d.ts",
93
81
  "default": "./dist/makeIntl.js"
94
82
  },
83
+ "./makeUseCommand": {
84
+ "types": "./dist/makeUseCommand.d.ts",
85
+ "default": "./dist/makeUseCommand.js"
86
+ },
95
87
  "./mutate": {
96
88
  "types": "./dist/mutate.d.ts",
97
89
  "default": "./dist/mutate.js"
@@ -107,6 +99,14 @@
107
99
  "./runtime": {
108
100
  "types": "./dist/runtime.d.ts",
109
101
  "default": "./dist/runtime.js"
102
+ },
103
+ "./toast": {
104
+ "types": "./dist/toast.d.ts",
105
+ "default": "./dist/toast.js"
106
+ },
107
+ "./withToast": {
108
+ "types": "./dist/withToast.d.ts",
109
+ "default": "./dist/withToast.js"
110
110
  }
111
111
  },
112
112
  "gitHead": "bd8e27eea3eff97db8739d577d67e7336c078d28",
@@ -1,12 +1,11 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { asResult, type MissingDependencies, reportRuntimeError } from "@effect-app/vue"
3
3
  import { reportMessage } from "@effect-app/vue/errorReporter"
4
- import { type AsyncResult } from "effect/unstable/reactivity/AsyncResult"
5
4
  import { Cause, Effect, type Exit, type Fiber, flow, Layer, Match, MutableHashMap, Option, Predicate, S, ServiceMap } from "effect-app"
6
5
  import { SupportedErrors } from "effect-app/client"
7
6
  import { OperationFailure, OperationSuccess } from "effect-app/Operations"
8
- import { wrapEffect } from "effect-app/utils"
9
- import { isGeneratorFunction } from "effect/Utils"
7
+ import { isGeneratorFunction, wrapEffect } from "effect-app/utils"
8
+ import { type AsyncResult } from "effect/unstable/reactivity/AsyncResult"
10
9
  import { type FormatXMLElementFn, type PrimitiveType } from "intl-messageformat"
11
10
  import { computed, type ComputedRef, reactive, ref } from "vue"
12
11
  import { Confirm } from "./confirm.js"
@@ -1686,7 +1685,7 @@ export class CommanderImpl<RT, RTHooks> {
1686
1685
  }
1687
1686
  )
1688
1687
 
1689
- /** @experimental @deprecated */
1688
+ /** @deprecated */
1690
1689
  alt2: <
1691
1690
  const Id extends string,
1692
1691
  MutArg,
@@ -1738,7 +1737,6 @@ export class CommanderImpl<RT, RTHooks> {
1738
1737
  )), baseInfo) as any
1739
1738
  }
1740
1739
 
1741
- /** @experimental */
1742
1740
  alt = this.makeCommand as unknown as <
1743
1741
  const Id extends string,
1744
1742
  const I18nKey extends string = Id,
package/src/form.ts CHANGED
@@ -22,6 +22,7 @@ function getObjectsAST(ast: S.AST.AST): S.AST.Objects | null {
22
22
  return null
23
23
  }
24
24
 
25
+ /** @deprecated Use OmegaForm instead */
25
26
  export function convertIn(v: string | null, type?: "text" | "float" | "int") {
26
27
  return v === null ? "" : type === "text" ? v : `${v}`
27
28
  }
@@ -30,8 +31,10 @@ export function convertIn(v: string | null, type?: "text" | "float" | "int") {
30
31
  * Makes sure our international number format is converted to js int/float format.
31
32
  * Right now assumes . for thousands and , for decimal.
32
33
  */
34
+ /** @deprecated Use OmegaForm instead */
33
35
  export const prepareNumberForLocale = (v: string) => v.replace(/\./g, "").replace(/,/g, ".")
34
36
 
37
+ /** @deprecated Use OmegaForm instead */
35
38
  export function convertOutInt(v: string, type?: "text" | "float" | "int") {
36
39
  v = v == null ? v : v.trim()
37
40
  const c = v === ""
@@ -49,6 +52,7 @@ export function convertOutInt(v: string, type?: "text" | "float" | "int") {
49
52
  return c
50
53
  }
51
54
 
55
+ /** @deprecated Use OmegaForm instead */
52
56
  export function convertOut(v: string, set: (v: {} | null) => void, type?: "text" | "float" | "int") {
53
57
  return set(convertOutInt(v, type))
54
58
  }
@@ -143,10 +147,18 @@ function handlePropertySignature(
143
147
  const typeLiteral = getObjectsAST(ps.type)
144
148
 
145
149
  const tagPropertySignature = typeLiteral?.propertySignatures.find((_) => _.name === "_tag")
146
- const tagLiteral = tagPropertySignature
147
- && S.AST.isLiteral(tagPropertySignature.type)
148
- && typeof tagPropertySignature.type.literal === "string"
149
- ? tagPropertySignature.type.literal
150
+ // unwrap single-element Union to Literal (S.Struct({ _tag: S.Literal("x") }) wraps as Union([Literal("x")]))
151
+ const tagType = tagPropertySignature
152
+ ? S.AST.isUnion(tagPropertySignature.type)
153
+ && tagPropertySignature.type.types.length === 1
154
+ && S.AST.isLiteral(tagPropertySignature.type.types[0]!)
155
+ ? tagPropertySignature.type.types[0]
156
+ : tagPropertySignature.type
157
+ : undefined
158
+ const tagLiteral = tagType
159
+ && S.AST.isLiteral(tagType)
160
+ && typeof tagType.literal === "string"
161
+ ? tagType.literal
150
162
  : void 0
151
163
 
152
164
  const toRet = handlePropertySignature(ps)
@@ -189,6 +201,7 @@ function handlePropertySignature(
189
201
  }
190
202
  }
191
203
 
204
+ /** @deprecated Use OmegaForm instead */
192
205
  export function buildFieldInfoFromFields<
193
206
  From extends Record<PropertyKey, any>,
194
207
  To extends Record<PropertyKey, any>
@@ -198,6 +211,7 @@ export function buildFieldInfoFromFields<
198
211
  return buildFieldInfoFromFieldsRoot(schema).fields
199
212
  }
200
213
 
214
+ /** @deprecated Use OmegaForm instead */
201
215
  export function buildFieldInfoFromFieldsRoot<
202
216
  From extends Record<PropertyKey, any>,
203
217
  To extends Record<PropertyKey, any>,
@@ -235,7 +249,9 @@ abstract class PhantomTypeParameter<
235
249
 
236
250
  const defaultIntl = createIntl({ locale: "en" })
237
251
 
252
+ /** @deprecated Use OmegaForm instead */
238
253
  export const translate = ref<IntlFormatters["formatMessage"]>(defaultIntl.formatMessage)
254
+ /** @deprecated Use OmegaForm instead */
239
255
  export const customSchemaErrors = ref<Map<S.AST.AST | string, (message: string, e: unknown, v: unknown) => string>>(
240
256
  new Map()
241
257
  )
@@ -269,7 +285,7 @@ function buildFieldInfo(
269
285
  }
270
286
 
271
287
  // parse specific error types for better translation support
272
- const integerMatch = err.match(/Expected.*integer.*actual\s+(.+)/i)
288
+ const integerMatch = err.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
273
289
  if (integerMatch) {
274
290
  return translate.value(
275
291
  { defaultMessage: "Expected an integer, actual {actualValue}", id: "validation.integer.expected" },
@@ -277,7 +293,7 @@ function buildFieldInfo(
277
293
  )
278
294
  }
279
295
 
280
- const numberMatch = err.match(/Expected.*number.*actual\s+(.+)/i)
296
+ const numberMatch = err.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
281
297
  if (numberMatch) {
282
298
  return translate.value(
283
299
  { defaultMessage: "Expected a number, actual {actualValue}", id: "validation.number.expected" },
@@ -398,6 +414,7 @@ function buildFieldInfo(
398
414
  return info as any
399
415
  }
400
416
 
417
+ /** @deprecated Use OmegaForm instead */
401
418
  export function getMetadataFromSchema(
402
419
  ast: S.AST.AST
403
420
  ): {
@@ -411,6 +428,27 @@ export function getMetadataFromSchema(
411
428
  required: boolean
412
429
  description?: string
413
430
  } {
431
+ const findJsonSchemaType = (
432
+ schema: any,
433
+ target: "number" | "integer"
434
+ ): boolean => {
435
+ if (!schema || typeof schema !== "object") {
436
+ return false
437
+ }
438
+
439
+ if (schema.type === target) {
440
+ return true
441
+ }
442
+
443
+ if (Array.isArray(schema.type) && schema.type.includes(target)) {
444
+ return true
445
+ }
446
+
447
+ return ["anyOf", "oneOf", "allOf"].some((key) =>
448
+ Array.isArray(schema[key]) && schema[key].some((member: any) => findJsonSchemaType(member, target))
449
+ )
450
+ }
451
+
414
452
  const nullable = S.AST.isUnion(ast) && ast.types.includes(S.Null.ast)
415
453
  const realSelf = nullable && S.AST.isUnion(ast)
416
454
  ? ast.types.filter((_) => _ !== S.Null.ast)[0]!
@@ -440,8 +478,8 @@ export function getMetadataFromSchema(
440
478
  // "title": "Int"
441
479
  // }
442
480
  // }
443
- const isNumber = jschema.type === "number" || jschema.type === "integer"
444
- const isInt = jschema.type === "integer"
481
+ const isInt = findJsonSchemaType(jschema, "integer")
482
+ const isNumber = isInt || findJsonSchemaType(jschema, "number")
445
483
  return {
446
484
  type: isInt ? "int" as const : isNumber ? "float" as const : "text" as const,
447
485
  minimum: jschema.minimum,
@@ -1,6 +1,6 @@
1
1
  import { ServiceMap } from "effect-app"
2
2
  import { proxify } from "effect-app/ServiceMap"
3
- import { type MakeIntlReturn } from "../makeIntl.js"
3
+ import { type MakeIntlReturn } from "./makeIntl.js"
4
4
 
5
5
  export class I18n extends proxify(ServiceMap.Opaque<I18n, ReturnType<MakeIntlReturn<string>["useIntl"]>>()("I18n"))<
6
6
  I18n,
package/src/makeClient.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
3
2
  import { type InvalidateOptions, type InvalidateQueryFilters, isCancelledError, type QueryObserverResult, type RefetchOptions, type UseQueryReturnType } from "@tanstack/vue-query"
4
3
  import { camelCase } from "change-case"
5
4
  import { Cause, Data, Effect, Exit, Layer, type ManagedRuntime, Match, Option, S, ServiceMap, Struct } from "effect-app"
@@ -10,16 +9,18 @@ import { constant, identity, pipe, tuple } from "effect-app/Function"
10
9
  import { type OperationFailure, OperationSuccess } from "effect-app/Operations"
11
10
  import { dropUndefinedT, extendM } from "effect-app/utils"
12
11
  import { type Fiber } from "effect/Fiber"
12
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
13
13
  import { computed, type ComputedRef, onBeforeUnmount, type Ref, ref, watch, type WatchSource } from "vue"
14
+ import { type Commander, CommanderStatic } from "./commander.js"
14
15
  import { reportMessage } from "./errorReporter.js"
15
- import { type Commander, CommanderStatic } from "./experimental/commander.js"
16
- import { I18n } from "./experimental/intl.js"
17
- import { type CommanderResolved, makeUseCommand } from "./experimental/makeUseCommand.js"
18
- import { Toast } from "./experimental/toast.js"
19
16
  import { buildFieldInfoFromFieldsRoot } from "./form.js"
17
+ import { I18n } from "./intl.js"
20
18
  import { reportRuntimeError } from "./lib.js"
19
+ import { type CommanderResolved, makeUseCommand } from "./makeUseCommand.js"
21
20
  import { asResult, makeMutation, type MutationOptions, type MutationOptionsBase, mutationResultToVue, type Res, useMakeMutation } from "./mutate.js"
22
21
  import { type CustomUndefinedInitialQueryOptions, makeQuery } from "./query.js"
22
+ import { makeRunPromise } from "./runtime.js"
23
+ import { Toast } from "./toast.js"
23
24
 
24
25
  const mapHandler = <A, E, R, I = void, A2 = A, E2 = E, R2 = R>(
25
26
  handler: Effect.Effect<A, E, R> | ((i: I) => Effect.Effect<A, E, R>),
@@ -1023,7 +1024,7 @@ export class LegacyMutationImpl<RT> {
1023
1024
  const isDirty = ref(false)
1024
1025
  const isValid = ref(true)
1025
1026
  const isLoading = ref(false)
1026
- const runPromise = Effect.runPromiseWith(this.getRuntime())
1027
+ const runPromise = makeRunPromise(this.getRuntime())
1027
1028
 
1028
1029
  const submit1 =
1029
1030
  (onSubmit: (a: To) => Effect.Effect<OnSubmitA, never, never>) =>
@@ -1163,7 +1164,7 @@ export class QueryImpl<R> {
1163
1164
  } = <Arg, E, A, Request extends Req, Name extends string>(
1164
1165
  self: RequestHandlerWithInput<Arg, A, E, R, Request, Name> | RequestHandler<A, E, R, Request, Name>
1165
1166
  ) => {
1166
- const runPromise = Effect.runPromiseWith(this.getRuntime())
1167
+ const runPromise = makeRunPromise(this.getRuntime())
1167
1168
  const q = this.useQuery(self as any) as any
1168
1169
  return (argOrOptions?: any, options?: any) => {
1169
1170
  const [resultRef, latestRef, fetch, uqrt] = q(argOrOptions, { ...options, suspense: true } // experimental_prefetchInRender: true }
@@ -1403,7 +1404,10 @@ export const makeClient = <RT_, RTHooks>(
1403
1404
  [Key in keyof typeof client]:
1404
1405
  & typeof client[Key]
1405
1406
  & RequestWithExtensions<RT | RTHooks, typeof client[Key]>
1406
- & { mutate: MutationWithExtensions<RT | RTHooks, typeof client[Key]> }
1407
+ & {
1408
+ mutate: MutationWithExtensions<RT | RTHooks, typeof client[Key]>
1409
+ Input: typeof client[Key] extends RequestHandlerWithInput<infer I, any, any, any, any, any> ? I : never
1410
+ }
1407
1411
  & Queries<RT, typeof client[Key]>
1408
1412
  }
1409
1413
  )
package/src/mutate.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
3
2
  import { type InvalidateOptions, type InvalidateQueryFilters, type QueryClient, useQueryClient } from "@tanstack/vue-query"
4
3
  import { type Cause, Effect, type Exit, Option } from "effect-app"
5
4
  import { type Req } from "effect-app/client"
6
5
  import type { ClientForOptions, RequestHandler, RequestHandlerWithInput } from "effect-app/client/clientFor"
7
6
  import { tuple } from "effect-app/Function"
7
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
8
8
  import { computed, type ComputedRef, shallowRef } from "vue"
9
9
  import { makeQueryKey } from "./lib.js"
10
10
 
package/src/query.ts CHANGED
@@ -2,16 +2,17 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-call */
3
3
  /* eslint-disable @typescript-eslint/no-unsafe-return */
4
4
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
- import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
6
5
  import { type DefaultError, type Enabled, type InitialDataFunction, type NonUndefinedGuard, type PlaceholderDataFunction, type QueryKey, type QueryObserverOptions, type QueryObserverResult, type RefetchOptions, useQuery as useTanstackQuery, useQueryClient, type UseQueryDefinedReturnType, type UseQueryReturnType } from "@tanstack/vue-query"
7
- import { Array, Cause, Effect, Exit, flow, Option, S, type ServiceMap } from "effect-app"
6
+ import { Array, Cause, Effect, Option, S, type ServiceMap } from "effect-app"
8
7
  import { type Req } from "effect-app/client"
9
8
  import type { RequestHandler, RequestHandlerWithInput } from "effect-app/client/clientFor"
10
9
  import { ServiceUnavailableError } from "effect-app/client/errors"
11
10
  import { type Span } from "effect/Tracer"
12
11
  import { isHttpClientError } from "effect/unstable/http/HttpClientError"
12
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
13
13
  import { computed, type ComputedRef, type MaybeRefOrGetter, ref, shallowRef, watch, type WatchSource } from "vue"
14
14
  import { makeQueryKey, reportRuntimeError } from "./lib.js"
15
+ import { makeRunPromise } from "./runtime.js"
15
16
 
16
17
  // we must use interface extends, or we get the dreaded typescript error of isn't portable blabla @tanstack/vue-query/build/modern/types.js
17
18
  // but because how they are dealing with some extends clause, we loose all properties except initialData
@@ -131,13 +132,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
131
132
  // TODO
132
133
  ) => {
133
134
  // we wrap into KnownFiberFailure because we want to keep the full cause of the failure.
134
- const runPromise = flow(Effect.runPromiseExitWith(getRuntime()), (_) =>
135
- _.then(
136
- Exit.match({
137
- onFailure: (cause) => Promise.reject(new KnownFiberFailure(cause)),
138
- onSuccess: (value) => Promise.resolve(value)
139
- })
140
- ))
135
+ const runPromise = makeRunPromise(getRuntime())
141
136
  const arr = arg
142
137
  const req: { value: I } = !arg
143
138
  ? undefined
@@ -151,9 +146,20 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
151
146
  const queryKey = makeQueryKey(q)
152
147
  const handler = q.handler
153
148
 
149
+ const defaultOptions = {
150
+ // we do not want to throw errors, because we turn the success and error responses into a Result type
151
+ // why don't we turn the error/success response into a Result type before returning to tanstack query? because we want to leverage tanstack query's retry and caching mechanism, which relies on throwing errors to trigger retries, and we don't want to interfere with that by catching the errors too early.
152
+ // but if we allow tanstack query to throw, it will trigger the error boundary in Vue - via a "watcher callback" error - which we currently report and log, which is not what we want.
153
+ // TODO: we might want to rethink the strategy of how to handle errors that happen after the initial load.
154
+ // For suspense, the initial load is captured by the suspense boundary.
155
+ // For subsequent loads (or non suspense use) we currently are required to use the QueryResult component to conditionally render error/loading/etc.
156
+ throwOnError: false
157
+ }
158
+
154
159
  const r = useTanstackQuery<A, KnownFiberFailure<E>, TData>(
155
160
  Effect.isEffect(handler)
156
161
  ? {
162
+ ...defaultOptions,
157
163
  ...options,
158
164
  retry: (retryCount, error) => {
159
165
  if (error instanceof KnownFiberFailure) {
@@ -177,6 +183,7 @@ export const makeQuery = <R>(getRuntime: () => ServiceMap.ServiceMap<R>) => {
177
183
  )
178
184
  }
179
185
  : {
186
+ ...defaultOptions,
180
187
  ...options,
181
188
  retry: (retryCount, error) => {
182
189
  if (error instanceof KnownFiberFailure) {
package/src/runtime.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { ManagedRuntime } from "effect"
1
+ import { Exit, flow, ManagedRuntime } from "effect"
2
2
  import { Effect, Layer, Logger } from "effect-app"
3
+ import { type ServiceMap } from "effect-app/ServiceMap"
4
+ import { KnownFiberFailure } from "./query.js"
3
5
 
4
6
  export function makeAppRuntime<A, E>(layer: Layer.Layer<A, E>) {
5
7
  return Effect.gen(function*() {
@@ -29,3 +31,24 @@ export function initializeAsync<A, E>(layer: Layer.Layer<A, E, never>) {
29
31
  return Effect
30
32
  .runPromise(makeAppRuntime(layer))
31
33
  }
34
+
35
+ // we wrap into KnownFiberFailure because we want to keep the full cause of the failure.
36
+ export const makeRunPromise = <T>(services: ServiceMap<T>) =>
37
+ flow(Effect.runPromiseExitWith(services), (_) =>
38
+ _.then(
39
+ Exit.match({
40
+ onFailure: (cause) => Promise.reject(new KnownFiberFailure(cause)),
41
+ onSuccess: (value) => Promise.resolve(value)
42
+ })
43
+ ))
44
+
45
+ export const makeRunSync = <T>(services: ServiceMap<T>) =>
46
+ flow(
47
+ Effect.runSyncExitWith(services),
48
+ Exit.match({
49
+ onFailure: (cause) => {
50
+ throw new KnownFiberFailure(cause)
51
+ },
52
+ onSuccess: (value) => value
53
+ })
54
+ )
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { it } from "@effect/vitest"
3
3
  import { Cause, Effect, Exit, Fiber, Option } from "effect-app"
4
- import { CommandContext, DefaultIntl } from "../src/experimental/commander.js"
4
+ import { CommandContext, DefaultIntl } from "../src/commander.js"
5
5
  import { AsyncResult } from "../src/lib.js"
6
6
  import { useExperimental } from "./stubs.js"
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"form.test.d.ts","sourceRoot":"","sources":["../form.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,CAAC,EAAE,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;AAGtC,qBAAa,YAAa,SAAQ,iBAShC;CAAG;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAEvC;CAAG;;;;;;;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAK/B;CAAG;;;;;;;;AAEL,cAAM,MAAO,SAAQ,WAEnB;CAAG;;;;;;;;AAEL,cAAM,MAAO,SAAQ,WAEnB;CAAG;;;;;;;;;;;AAEL,cAAM,QAAS,SAAQ,aAGrB;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBL,qBAAa,cAAe,SAAQ,mBAGlC;CAAG"}
1
+ {"version":3,"file":"form.test.d.ts","sourceRoot":"","sources":["../form.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,CAAC,EAAE,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGtC,qBAAa,YAAa,SAAQ,iBAahC;CAAG;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAEvC;CAAG;;;;;;;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAK/B;CAAG;;;;;;;;AAEL,cAAM,MAAO,SAAQ,WAEnB;CAAG;;;;;;;;AAEL,cAAM,MAAO,SAAQ,WAEnB;CAAG;;;;;;;;;;;AAEL,cAAM,QAAS,SAAQ,aAGrB;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBL,qBAAa,cAAe,SAAQ,mBAGlC;CAAG"}