@effect-app/vue 4.0.0-beta.16 → 4.0.0-beta.160

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 (91) hide show
  1. package/CHANGELOG.md +1016 -0
  2. package/dist/commander.d.ts +370 -0
  3. package/dist/commander.d.ts.map +1 -0
  4. package/dist/commander.js +587 -0
  5. package/dist/confirm.d.ts +19 -0
  6. package/dist/confirm.d.ts.map +1 -0
  7. package/dist/confirm.js +24 -0
  8. package/dist/errorReporter.d.ts +4 -4
  9. package/dist/errorReporter.d.ts.map +1 -1
  10. package/dist/errorReporter.js +12 -18
  11. package/dist/form.d.ts +13 -4
  12. package/dist/form.d.ts.map +1 -1
  13. package/dist/form.js +41 -12
  14. package/dist/index.d.ts +1 -1
  15. package/dist/intl.d.ts +15 -0
  16. package/dist/intl.d.ts.map +1 -0
  17. package/dist/intl.js +9 -0
  18. package/dist/lib.d.ts +1 -1
  19. package/dist/lib.d.ts.map +1 -1
  20. package/dist/makeClient.d.ts +97 -276
  21. package/dist/makeClient.d.ts.map +1 -1
  22. package/dist/makeClient.js +94 -353
  23. package/dist/makeContext.d.ts +1 -1
  24. package/dist/makeContext.d.ts.map +1 -1
  25. package/dist/makeIntl.d.ts +1 -1
  26. package/dist/makeIntl.d.ts.map +1 -1
  27. package/dist/makeUseCommand.d.ts +8 -0
  28. package/dist/makeUseCommand.d.ts.map +1 -0
  29. package/dist/makeUseCommand.js +13 -0
  30. package/dist/mutate.d.ts +2 -2
  31. package/dist/mutate.d.ts.map +1 -1
  32. package/dist/mutate.js +1 -1
  33. package/dist/query.d.ts +11 -15
  34. package/dist/query.d.ts.map +1 -1
  35. package/dist/query.js +17 -26
  36. package/dist/routeParams.d.ts +1 -1
  37. package/dist/runtime.d.ts +5 -2
  38. package/dist/runtime.d.ts.map +1 -1
  39. package/dist/runtime.js +27 -17
  40. package/dist/toast.d.ts +46 -0
  41. package/dist/toast.d.ts.map +1 -0
  42. package/dist/toast.js +32 -0
  43. package/dist/withToast.d.ts +26 -0
  44. package/dist/withToast.d.ts.map +1 -0
  45. package/dist/withToast.js +49 -0
  46. package/eslint.config.mjs +2 -2
  47. package/package.json +48 -48
  48. package/src/{experimental/commander.ts → commander.ts} +922 -249
  49. package/src/{experimental/confirm.ts → confirm.ts} +10 -14
  50. package/src/errorReporter.ts +60 -72
  51. package/src/form.ts +55 -16
  52. package/src/intl.ts +12 -0
  53. package/src/makeClient.ts +305 -1015
  54. package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +3 -3
  55. package/src/query.ts +37 -48
  56. package/src/runtime.ts +39 -18
  57. package/src/{experimental/toast.ts → toast.ts} +11 -25
  58. package/src/{experimental/withToast.ts → withToast.ts} +15 -6
  59. package/test/Mutation.test.ts +130 -10
  60. package/test/dist/form.test.d.ts.map +1 -1
  61. package/test/dist/stubs.d.ts +1103 -118
  62. package/test/dist/stubs.d.ts.map +1 -1
  63. package/test/dist/stubs.js +56 -23
  64. package/test/form-validation-errors.test.ts +23 -19
  65. package/test/form.test.ts +20 -2
  66. package/test/makeClient.test.ts +93 -39
  67. package/test/stubs.ts +83 -41
  68. package/tsconfig.json +0 -1
  69. package/tsconfig.json.bak +2 -2
  70. package/tsconfig.src.json +34 -34
  71. package/tsconfig.test.json +2 -2
  72. package/vitest.config.ts +5 -5
  73. package/dist/experimental/commander.d.ts +0 -359
  74. package/dist/experimental/commander.d.ts.map +0 -1
  75. package/dist/experimental/commander.js +0 -557
  76. package/dist/experimental/confirm.d.ts +0 -19
  77. package/dist/experimental/confirm.d.ts.map +0 -1
  78. package/dist/experimental/confirm.js +0 -28
  79. package/dist/experimental/intl.d.ts +0 -16
  80. package/dist/experimental/intl.d.ts.map +0 -1
  81. package/dist/experimental/intl.js +0 -5
  82. package/dist/experimental/makeUseCommand.d.ts +0 -8
  83. package/dist/experimental/makeUseCommand.d.ts.map +0 -1
  84. package/dist/experimental/makeUseCommand.js +0 -13
  85. package/dist/experimental/toast.d.ts +0 -47
  86. package/dist/experimental/toast.d.ts.map +0 -1
  87. package/dist/experimental/toast.js +0 -41
  88. package/dist/experimental/withToast.d.ts +0 -25
  89. package/dist/experimental/withToast.d.ts.map +0 -1
  90. package/dist/experimental/withToast.js +0 -45
  91. package/src/experimental/intl.ts +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../stubs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,OAAO,EAAU,KAAK,EAA0B,CAAC,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAElD,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AA8CxD,eAAO,MAAM,YAAY,GAAI,WAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAM,KAepG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,WAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAM,oCACpC,CAAA;AAExE,eAAO,MAAM,eAAe,GAC1B,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,EAAE,CAAA;CAAE,6GASxG,CAAA;;;;;;;;AAED,qBAAa,iBAAkB,SAAQ,sBAAyB;CAAG;AACnE,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqC,CAAA;;;;;;;;;;;;;;;;;;AACtE,qBAAa,aAAc,SAAQ,kBAEA;CAAG;;;;;;;;;;;;;;iBAML,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;;;;;AAJjE,qBAAa,6BAA8B,SAAQ,kCAMjD;CAAG;AAEL,eAAO,MAAM,SAAS;;;;;;CAA+F,CAAA;AAErH,eAAO,MAAM,SAAS,GACpB,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,EAAE,CAAA;CAAE;;;;;;;;;CAcxG,CAAA"}
1
+ {"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../stubs.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,12 @@ import { ApiClientFactory, makeRpcClient } from "effect-app/client";
4
4
  import { RpcContextMap } from "effect-app/rpc";
5
5
  import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
6
6
  import { ref } from "vue";
7
- import { Commander } from "../src/experimental/commander.js";
8
- import { I18n } from "../src/experimental/intl.js";
9
- import { makeUseCommand } from "../src/experimental/makeUseCommand.js";
10
- import * as Toast from "../src/experimental/toast.js";
11
- import { WithToast } from "../src/experimental/withToast.js";
12
- import { LegacyMutation, makeClient } from "../src/makeClient.js";
7
+ import { Commander } from "../src/commander.js";
8
+ import { I18n } from "../src/intl.js";
9
+ import { makeClient } from "../src/makeClient.js";
10
+ import { makeUseCommand } from "../src/makeUseCommand.js";
11
+ import * as Toast from "../src/toast.js";
12
+ import { WithToast } from "../src/withToast.js";
13
13
  const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(() => {
14
14
  const dismiss = (id) => {
15
15
  const idx = toasts.findIndex((_) => _.id === id);
@@ -19,21 +19,21 @@ const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(()
19
19
  toasts.splice(idx, 1);
20
20
  }
21
21
  };
22
- const fakeToast = (message, options) => {
22
+ const fakeToast = (type) => (message, options) => {
23
23
  const id = options?.id ?? Math.random().toString(36).substring(2, 15);
24
- console.log(`Toast [${id}]: ${message}`, options);
24
+ console.log(`Toast [${type}][${id}]: ${message}`, options);
25
25
  options = { ...options, id };
26
26
  const idx = toasts.findIndex((_) => _.id === id);
27
27
  if (idx > -1) {
28
28
  const toast = toasts[idx];
29
29
  clearTimeout(toast.timeoutId);
30
- Object.assign(toast, { message, options });
30
+ Object.assign(toast, { type, message, options });
31
31
  toast.timeoutId = setTimeout(() => {
32
32
  toasts.splice(idx, 1);
33
33
  }, options?.timeout ?? 3000);
34
34
  }
35
35
  else {
36
- const toast = { id, message, options };
36
+ const toast = { id, type, message, options };
37
37
  toast.timeoutId = setTimeout(() => {
38
38
  toasts.splice(idx, 1);
39
39
  }, options?.timeout ?? 3000);
@@ -42,10 +42,10 @@ const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(()
42
42
  return id;
43
43
  };
44
44
  return Toast.Toast.of(Toast.wrap({
45
- error: fakeToast,
46
- warning: fakeToast,
47
- success: fakeToast,
48
- info: fakeToast,
45
+ error: fakeToast("error"),
46
+ warning: fakeToast("warning"),
47
+ success: fakeToast("success"),
48
+ info: fakeToast("info"),
49
49
  dismiss
50
50
  }));
51
51
  }));
@@ -76,29 +76,62 @@ export const useExperimental = (options) => {
76
76
  };
77
77
  export class RequestContextMap extends RpcContextMap.makeMap({}) {
78
78
  }
79
- export const { TaggedRequest: Req } = makeRpcClient(RequestContextMap);
80
- export class GetSomething2 extends Req()("GetSomething2", {
79
+ export const { TaggedRequestFor } = makeRpcClient(RequestContextMap);
80
+ export const SomethingReq = TaggedRequestFor("Something");
81
+ const SomethingQuery = SomethingReq.Query;
82
+ const SomethingCommand = SomethingReq.Command;
83
+ class SomethingGetSomething2 extends SomethingQuery()("GetSomething2", {
81
84
  id: S.String
82
- }, { success: S.NumberFromString }) {
85
+ }, { success: S.FiniteFromString }) {
83
86
  }
84
- export class GetSomething2WithDependencies extends Req()("GetSomething2", {
87
+ class SomethingGetSomething2WithDependencies extends SomethingQuery()("GetSomething2", {
85
88
  id: S.String
86
89
  }, {
87
90
  // this is intentilally fake, to simulate a codec that requires a dependency
88
- success: S.NumberFromString,
91
+ success: S.FiniteFromString,
89
92
  error: S.String
90
93
  }) {
91
94
  }
92
- export const Something = { GetSomething2, GetSomething2WithDependencies, meta: { moduleName: "Something" } };
95
+ class SomethingDoSomething extends SomethingCommand()("DoSomething", {
96
+ id: S.String
97
+ }, { success: S.FiniteFromString }) {
98
+ }
99
+ // success schema has encoded shape { a: string | null } — used to test projection constraints
100
+ class SomethingGetStructNullable extends SomethingQuery()("GetStructNullable", {}, {
101
+ success: S.Struct({ a: S.NullOr(S.String) })
102
+ }) {
103
+ }
104
+ export const Something = {
105
+ GetSomething2: SomethingGetSomething2,
106
+ GetSomething2WithDependencies: SomethingGetSomething2WithDependencies,
107
+ DoSomething: SomethingDoSomething,
108
+ GetStructNullable: SomethingGetStructNullable
109
+ };
110
+ export const SomethingElseReq = TaggedRequestFor("SomethingElse");
111
+ const SomethingElseQuery = SomethingElseReq.Query;
112
+ class SomethingElseGetSomething2 extends SomethingElseQuery()("GetSomething2", {
113
+ id: S.String
114
+ }, { success: S.FiniteFromString }) {
115
+ }
116
+ class SomethingElseGetSomething2WithDependencies extends SomethingElseQuery()("GetSomething2", {
117
+ id: S.String
118
+ }, {
119
+ success: S.FiniteFromString,
120
+ error: S.String
121
+ }) {
122
+ }
123
+ export const SomethingElse = {
124
+ GetSomething2: SomethingElseGetSomething2,
125
+ GetSomething2WithDependencies: SomethingElseGetSomething2WithDependencies
126
+ };
93
127
  export const useClient = (options) => {
94
128
  const FakeIntlLayer = fakeIntlLayer(options?.messages);
95
129
  const FakeToastLayer = fakeToastLayer(options?.toasts);
96
130
  const CommanderLayer = Commander.Default.pipe(Layer.provide([FakeIntlLayer, FakeToastLayer]));
97
131
  const WithToastLayer = WithToast.Default.pipe(Layer.provide(FakeToastLayer));
98
132
  const api = ApiClientFactory.layer({ url: "bogus", headers: Option.none() }).pipe(Layer.provide(FetchHttpClient.layer));
99
- const lm = LegacyMutation.Default.pipe(Layer.provide([FakeIntlLayer, FakeToastLayer]));
100
- const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api, lm);
133
+ const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api);
101
134
  const clientFor_ = ApiClientFactory.makeFor(Layer.empty);
102
135
  return makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty);
103
136
  };
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R1YnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zdHVicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUMsT0FBTyxLQUFLLGVBQWUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3RFLE9BQU8sS0FBSyxLQUFLLE1BQU0sOEJBQThCLENBQUE7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFHakUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxTQUFnQixFQUFFLEVBQUUsRUFBRSxDQUM1QyxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQUssQ0FBQyxLQUFLLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQWlCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxL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
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R1YnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zdHVicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUMsT0FBTyxLQUFLLGVBQWUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRWpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN6RCxPQUFPLEtBQUssS0FBSyxNQUFNLGlCQUFpQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUUvQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sR0FBVSxFQUFFLEVBQUUsRUFBRSxDQUM1QyxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQUssQ0FBQyxLQUFLLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQWlCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVB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
@@ -4,7 +4,7 @@ import { buildFieldInfoFromFieldsRoot, translate } from "../src/form.js"
4
4
  // test schema with integer field
5
5
  class TestSchema extends S.Class<TestSchema>("TestSchema")({
6
6
  integerField: S.Int,
7
- numberField: S.Number,
7
+ numberField: S.Finite,
8
8
  stringField: S.String
9
9
  }) {}
10
10
 
@@ -137,22 +137,26 @@ it("validates integer field with valid integer", () =>
137
137
  .pipe(Effect.runPromise))
138
138
 
139
139
  it("error message format matches regex pattern", () => {
140
- // test the actual error message format from Effect Schema
141
- const errorMessage = `Int
142
- └─ From side refinement failure
143
- └─ Int
144
- └─ Predicate refinement failure
145
- └─ Expected an integer, actual 59.5`
146
-
147
- const integerMatch = errorMessage.match(/Expected.*integer.*actual\s+(.+)/i)
148
- expect(integerMatch).toBeTruthy()
149
- expect(integerMatch![1]).toBe("59.5")
150
-
151
- const numberErrorMessage = `Number
152
- └─ Type side transformation failure
153
- └─ Expected a number, actual "not-a-number"`
154
-
155
- const numberMatch = numberErrorMessage.match(/Expected.*number.*actual\s+(.+)/i)
156
- expect(numberMatch).toBeTruthy()
157
- expect(numberMatch![1]).toBe("\"not-a-number\"")
140
+ // test the actual error message format from Effect Schema (both old "actual" and new "got" formats)
141
+ const errorMessageOld = `Expected an integer, actual 59.5`
142
+ const errorMessageNew = `SchemaError(Expected an integer, got 59.5)`
143
+
144
+ const oldMatch = errorMessageOld.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
145
+ expect(oldMatch).toBeTruthy()
146
+ expect(oldMatch![1]).toBe("59.5")
147
+
148
+ const newMatch = errorMessageNew.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
149
+ expect(newMatch).toBeTruthy()
150
+ expect(newMatch![1]).toBe("59.5")
151
+
152
+ const numberErrorOld = `Expected a number, actual "not-a-number"`
153
+ const numberErrorNew = `SchemaError(Expected a finite number, got "not-a-number")`
154
+
155
+ const numOldMatch = numberErrorOld.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
156
+ expect(numOldMatch).toBeTruthy()
157
+ expect(numOldMatch![1]).toBe("\"not-a-number\"")
158
+
159
+ const numNewMatch = numberErrorNew.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
160
+ expect(numNewMatch).toBeTruthy()
161
+ expect(numNewMatch![1]).toBe("\"not-a-number\"")
158
162
  })
package/test/form.test.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Effect, S } from "effect-app"
2
- import { buildFieldInfoFromFieldsRoot, type DiscriminatedUnionFieldInfo, type FieldInfo, type NestedFieldInfo, type UnionFieldInfo } from "../src/form.js"
2
+ import { buildFieldInfoFromFieldsRoot, type DiscriminatedUnionFieldInfo, type FieldInfo, getMetadataFromSchema, type NestedFieldInfo, type UnionFieldInfo } from "../src/form.js"
3
3
 
4
4
  export class NestedSchema extends S.Class<NestedSchema>("NestedSchema")({
5
5
  shallow: S.String,
@@ -9,7 +9,11 @@ export class NestedSchema extends S.Class<NestedSchema>("NestedSchema")({
9
9
  deepest: S.Number
10
10
  })
11
11
  }),
12
- age: S.Struct({ nfs: S.NumberFromString.pipe(S.decodeTo(S.PositiveInt)) })
12
+ age: S.Struct({ nfs: S.NumberFromString.pipe(S.decodeTo(S.PositiveInt)) }),
13
+ testNumber: S.Number,
14
+ testFinite: S.Finite,
15
+ testNullableNummber: S.NullOr(S.Number),
16
+ testOptionalNumber: S.optional(S.Number)
13
17
  }) {}
14
18
 
15
19
  export class SchemaContainsClass extends S.Class<SchemaContainsClass>("SchemaContainsClass")({
@@ -156,6 +160,15 @@ function testDiscriminatedUnionFieldInfo<T extends Record<PropertyKey, any>>(duf
156
160
  )
157
161
  }
158
162
 
163
+ it("getMetadataFromSchema handles composed numeric schemas", () => {
164
+ expect(getMetadataFromSchema(S.Number.ast).type).toBe("float")
165
+ expect(getMetadataFromSchema(S.Finite.ast).type).toBe("float")
166
+ expect(getMetadataFromSchema(S.PositiveNumber.ast).type).toBe("float")
167
+ expect(getMetadataFromSchema(S.Int.ast).type).toBe("int")
168
+ expect(getMetadataFromSchema(S.PositiveInt.ast).type).toBe("int")
169
+ expect(getMetadataFromSchema(S.NullOr(S.Number).ast).type).toBe("float")
170
+ })
171
+
159
172
  it("buildFieldInfo", () =>
160
173
  Effect
161
174
  .gen(function*() {
@@ -176,6 +189,11 @@ it("buildFieldInfo", () =>
176
189
  testNestedFieldInfo(nestedFieldinfo)
177
190
  testNestedFieldInfo(nestedFieldinfo.fields.nested)
178
191
  testNestedFieldInfo(nestedFieldinfo.fields.age)
192
+
193
+ expect(nestedFieldinfo.fields.testNumber.type).toBe("float")
194
+ expect(nestedFieldinfo.fields.testFinite.type).toBe("float")
195
+ expect(nestedFieldinfo.fields.testNullableNummber.type).toBe("float")
196
+ expect(nestedFieldinfo.fields.testOptionalNumber.type).toBe("float")
179
197
  })
180
198
  .pipe(Effect.runPromise))
181
199
 
@@ -1,95 +1,149 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { type Effect } from "effect-app"
3
- import { Something, useClient, useExperimental } from "./stubs.js"
4
-
5
- it.skip("works2", () => {
6
- const { legacy } = useClient()
7
- const n = legacy.useQuery({
8
- Request: null as any,
9
- handler: null as any as (a: string) => Effect.Effect<number>,
10
- id: "id"
11
- })
2
+ import { S } from "effect-app"
3
+ import { makeQueryKey } from "../src/lib.js"
4
+ import { Something, SomethingElse, SomethingElseReq, SomethingReq, useClient, useExperimental } from "./stubs.js"
5
+
6
+ it("TaggedRequestFor .moduleName and request .id / .moduleName", () => {
7
+ expectTypeOf(SomethingReq.moduleName).toEqualTypeOf<"Something">()
8
+ expectTypeOf(SomethingElseReq.moduleName).toEqualTypeOf<"SomethingElse">()
9
+
10
+ expectTypeOf(Something.GetSomething2.moduleName).toEqualTypeOf<"Something">()
11
+ expectTypeOf(Something.GetSomething2.id).toEqualTypeOf<"Something.GetSomething2">()
12
+ expectTypeOf(Something.GetSomething2.type).toEqualTypeOf<"query">()
13
+ expectTypeOf(Something.DoSomething.type).toEqualTypeOf<"command">()
14
+
15
+ expectTypeOf(SomethingElse.GetSomething2.moduleName).toEqualTypeOf<"SomethingElse">()
16
+ expectTypeOf(SomethingElse.GetSomething2.id).toEqualTypeOf<"SomethingElse.GetSomething2">()
17
+ })
18
+
19
+ it.skip("query type tests", () => {
20
+ const { clientFor } = useClient()
21
+ const client = clientFor(Something, () => ({
22
+ GetSomething2WithDependencies: (queryKey) => [
23
+ { filters: { queryKey } },
24
+ {
25
+ filters: {
26
+ queryKey: makeQueryKey(
27
+ SomethingElse
28
+ .GetSomething2
29
+ )
30
+ }
31
+ }
32
+ ]
33
+ }))
34
+
35
+ const q = client.GetSomething2.query
12
36
 
13
- const [, z] = n("a")
37
+ const [, z] = q({ id: "a" })
14
38
  const valz = z.value
15
39
  expectTypeOf(valz).toEqualTypeOf<number | undefined>()
16
40
 
17
- const [, a] = n("a", { placeholderData: () => 123 })
41
+ const [, a] = q({ id: "a" }, { placeholderData: () => 123 })
18
42
  const val1 = a.value
19
43
  expectTypeOf(val1).toEqualTypeOf<number>()
20
44
 
21
- const [, bbbb] = n("a", { select: (data) => data.toString() })
45
+ const [, bbbb] = q({ id: "a" }, { select: (data) => data.toString() })
22
46
  const val = bbbb.value
23
47
  expectTypeOf(val).toEqualTypeOf<string | undefined>()
24
48
 
25
- const [, ccc] = n("a", { placeholderData: () => 123, select: (data) => data.toString() })
49
+ const [, ccc] = q({ id: "a" }, { placeholderData: () => 123, select: (data) => data.toString() })
26
50
  const val2 = ccc.value
27
51
  expectTypeOf(val2).toEqualTypeOf<string>()
28
52
 
29
- const [, ddd] = n("a", { initialData: 123, select: (data) => data.toString() })
53
+ const [, ddd] = q({ id: "a" }, { initialData: 123, select: (data) => data.toString() })
30
54
  const val3 = ddd.value
31
55
  expectTypeOf(val3).toEqualTypeOf<string>()
32
56
 
33
- const [, eee] = n("a", { initialData: 123, placeholderData: () => 123, select: (data) => data.toString() })
57
+ const [, eee] = q({ id: "a" }, { initialData: 123, placeholderData: () => 123, select: (data) => data.toString() })
34
58
  const val4 = eee.value
35
59
  expectTypeOf(val4).toEqualTypeOf<string>()
36
60
  })
37
61
 
38
62
  it.skip("works", () => {
39
- const { clientFor, legacy } = useClient()
63
+ const { clientFor } = useClient()
40
64
  const client = clientFor(Something)
41
65
  const Command = useExperimental()
42
66
 
43
67
  // just for jsdoc / type testing.
44
- const a0 = client.GetSomething2(null as any)
45
- const a00 = client.GetSomething2.mutate(null as any)
68
+ const a0 = client.GetSomething2.request(null as any)
69
+ const a00 = client.DoSomething.mutate(null as any)
46
70
  const a = client.GetSomething2.suspense(null as any)
47
71
  const b = client.GetSomething2.query(null as any)
48
72
 
49
- const c0 = legacy.useSafeMutation(null as any)
50
- const c = legacy.useQuery(null as any)
51
- const d = legacy.useSuspenseQuery(null as any)
52
-
73
+ // @ts-expect-error query requests no longer expose command helpers
53
74
  const e = client.GetSomething2.wrap(null as any)
75
+ // @ts-expect-error query requests no longer expose command helpers
54
76
  const f = client.GetSomething2.fn(null as any)
55
77
 
56
- // @ts-expect-error dependencies required that are not provided
57
- const e0 = client.GetSomething2WithDependencies.wrap().handle // not available as we require dependencies not provided by the runtime
58
- // @ts-expect-error dependencies required that are not provided
59
- const e000 = Command.wrap(client.GetSomething2WithDependencies)().handle // not available as we require dependencies not provided by the runtime
60
- const e00 = client.GetSomething2WithDependencies.wrap((_) => _ as Effect.Effect<number, never, never>).handle(
61
- null as any
62
- )
63
- const e0000 =
64
- Command.wrap(client.GetSomething2WithDependencies)((_) => _ as Effect.Effect<number, never, never>).handle
78
+ // @ts-expect-error query requests no longer expose command helpers
79
+ const e0 = client.GetSomething2WithDependencies.wrap
80
+ // @ts-expect-error query request does not match Command.wrap mutation signature
81
+ const e000 = Command.wrap(client.GetSomething2WithDependencies)
82
+ const e00 = client.GetSomething2WithDependencies.request(null as any)
65
83
  // @ts-expect-error dependencies required that are not provided
66
84
  const e1 = client.GetSomething2WithDependencies.suspense(null as any)
67
85
  // @ts-expect-error dependencies required that are not provided
68
86
  const e2 = client.GetSomething2WithDependencies.query(null as any)
87
+ // @ts-expect-error query requests no longer expose command helpers
69
88
  const f0 = client.GetSomething2WithDependencies.fn(null as any)
70
89
 
71
- const g = client.GetSomething2.mutate.wrap(null as any)
72
- const h = client.GetSomething2.mutate.fn(null as any)
90
+ const g0 = client.DoSomething.wrap(null as any)
91
+ const g = client.DoSomething.mutate.wrap(null as any)
92
+ const g1 = client.DoSomething.mutate.project(S.String)
93
+ const g2 = g1(null as any)
94
+ const g3 = g1.wrap(null as any)
95
+ const g4 = client.helpers.doSomethingMutation.project(S.String)
96
+ const g5 = g4(null as any)
97
+ const g6 = g4.wrap(null as any)
98
+ // @ts-expect-error mutate no longer exposes fn, use client.DoSomething.fn
99
+ const h = client.DoSomething.mutate.fn(null as any)
100
+
101
+ // projection
102
+ // GetSomething2 uses FiniteFromString, that means Codec is String -> Number
103
+ // when we project that to S.String, it should work as the encoded shapes are identical
104
+ // aka, when we project, we skip decoding with the original codec, and instead use the provided one
105
+ // we have to make sure the Encoded shape of the provided projection schema matches the Encoded Shape of the original codec.
106
+ const projected = client.GetSomething2.project(S.String)
107
+ // @ts-expect-error encoded type mismatch: original encodes to string, S.Number encodes to number
108
+ const _projectedBad = client.GetSomething2.project(S.Number)
109
+ const p0 = projected.request(null as any)
110
+
111
+ // struct example: success schema encodes to { a: string | null }
112
+ // good: projection schema also expects { a: string | null } on the encoded side
113
+ const projectedStruct = client.GetStructNullable.project(S.Struct({ a: S.NullOr(S.String) }))
114
+ // bad: { a: S.String } has encoded type { a: string } — does not accept null
115
+ // @ts-expect-error encoded type mismatch: original encodes to { a: string | null }, projection expects { a: string }
116
+ const _projectedStructBad = client.GetStructNullable.project(S.Struct({ a: S.String }))
117
+
118
+ const p00 = projected.query(null as any)
119
+ const p = projected.suspense(null as any)
73
120
 
74
121
  expect(true).toBe(true)
75
122
  console.log({
76
123
  a,
77
124
  a0,
78
125
  a00,
79
- c0,
80
126
  b,
81
- c,
82
- d,
83
127
  e,
84
128
  e0,
85
129
  e00,
86
130
  e000,
87
- e0000,
88
131
  e1,
89
132
  e2,
90
133
  f,
91
134
  f0,
135
+ g0,
92
136
  g,
93
- h
137
+ g1,
138
+ g2,
139
+ g3,
140
+ g4,
141
+ g5,
142
+ g6,
143
+ h,
144
+ p0,
145
+ p00,
146
+ p,
147
+ projectedStruct
94
148
  })
95
149
  })
package/test/stubs.ts CHANGED
@@ -6,13 +6,13 @@ import { ApiClientFactory, makeRpcClient } from "effect-app/client"
6
6
  import { RpcContextMap } from "effect-app/rpc"
7
7
  import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient"
8
8
  import { ref } from "vue"
9
- import { Commander } from "../src/experimental/commander.js"
10
- import { I18n } from "../src/experimental/intl.js"
11
- import { makeUseCommand } from "../src/experimental/makeUseCommand.js"
12
- import * as Toast from "../src/experimental/toast.js"
13
- import { WithToast } from "../src/experimental/withToast.js"
14
- import { LegacyMutation, makeClient } from "../src/makeClient.js"
9
+ import { Commander } from "../src/commander.js"
10
+ import { I18n } from "../src/intl.js"
11
+ import { makeClient } from "../src/makeClient.js"
15
12
  import { type MakeIntlReturn } from "../src/makeIntl.js"
13
+ import { makeUseCommand } from "../src/makeUseCommand.js"
14
+ import * as Toast from "../src/toast.js"
15
+ import { WithToast } from "../src/withToast.js"
16
16
 
17
17
  const fakeToastLayer = (toasts: any[] = []) =>
18
18
  Layer.effect(
@@ -26,33 +26,34 @@ const fakeToastLayer = (toasts: any[] = []) =>
26
26
  toasts.splice(idx, 1)
27
27
  }
28
28
  }
29
- const fakeToast = (message: string, options?: Toast.ToastOpts) => {
30
- const id = options?.id ?? Math.random().toString(36).substring(2, 15)
31
- console.log(`Toast [${id}]: ${message}`, options)
29
+ const fakeToast =
30
+ (type: "error" | "warning" | "success" | "info") => (message: string, options?: Toast.ToastOpts) => {
31
+ const id = options?.id ?? Math.random().toString(36).substring(2, 15)
32
+ console.log(`Toast [${type}][${id}]: ${message}`, options)
32
33
 
33
- options = { ...options, id }
34
- const idx = toasts.findIndex((_) => _.id === id)
35
- if (idx > -1) {
36
- const toast = toasts[idx]
37
- clearTimeout(toast.timeoutId)
38
- Object.assign(toast, { message, options })
39
- toast.timeoutId = setTimeout(() => {
40
- toasts.splice(idx, 1)
41
- }, options?.timeout ?? 3000)
42
- } else {
43
- const toast: any = { id, message, options }
44
- toast.timeoutId = setTimeout(() => {
45
- toasts.splice(idx, 1)
46
- }, options?.timeout ?? 3000)
47
- toasts.push(toast)
34
+ options = { ...options, id }
35
+ const idx = toasts.findIndex((_) => _.id === id)
36
+ if (idx > -1) {
37
+ const toast = toasts[idx]
38
+ clearTimeout(toast.timeoutId)
39
+ Object.assign(toast, { type, message, options })
40
+ toast.timeoutId = setTimeout(() => {
41
+ toasts.splice(idx, 1)
42
+ }, options?.timeout ?? 3000)
43
+ } else {
44
+ const toast: any = { id, type, message, options }
45
+ toast.timeoutId = setTimeout(() => {
46
+ toasts.splice(idx, 1)
47
+ }, options?.timeout ?? 3000)
48
+ toasts.push(toast)
49
+ }
50
+ return id
48
51
  }
49
- return id
50
- }
51
52
  return Toast.Toast.of(Toast.wrap({
52
- error: fakeToast,
53
- warning: fakeToast,
54
- success: fakeToast,
55
- info: fakeToast,
53
+ error: fakeToast("error"),
54
+ warning: fakeToast("warning"),
55
+ success: fakeToast("success"),
56
+ info: fakeToast("info"),
56
57
  dismiss
57
58
  })) as any
58
59
  })
@@ -92,20 +93,62 @@ export const useExperimental = (
92
93
  }
93
94
 
94
95
  export class RequestContextMap extends RpcContextMap.makeMap({}) {}
95
- export const { TaggedRequest: Req } = makeRpcClient(RequestContextMap)
96
- export class GetSomething2 extends Req<GetSomething2>()("GetSomething2", {
96
+ export const { TaggedRequestFor } = makeRpcClient(RequestContextMap)
97
+
98
+ export const SomethingReq = TaggedRequestFor("Something")
99
+ const SomethingQuery = SomethingReq.Query
100
+ const SomethingCommand = SomethingReq.Command
101
+
102
+ class SomethingGetSomething2 extends SomethingQuery<SomethingGetSomething2>()("GetSomething2", {
97
103
  id: S.String
98
- }, { success: S.NumberFromString }) {}
104
+ }, { success: S.FiniteFromString }) {}
105
+
106
+ class SomethingGetSomething2WithDependencies
107
+ extends SomethingQuery<SomethingGetSomething2WithDependencies>()("GetSomething2", {
108
+ id: S.String
109
+ }, {
110
+ // this is intentilally fake, to simulate a codec that requires a dependency
111
+ success: S.FiniteFromString as S.Codec<number, string, "dep-a">,
112
+ error: S.String
113
+ })
114
+ {}
99
115
 
100
- export class GetSomething2WithDependencies extends Req<GetSomething2WithDependencies>()("GetSomething2", {
116
+ class SomethingDoSomething extends SomethingCommand<SomethingDoSomething>()("DoSomething", {
101
117
  id: S.String
102
- }, {
103
- // this is intentilally fake, to simulate a codec that requires a dependency
104
- success: S.NumberFromString as S.Codec<number, string, "dep-a">,
105
- error: S.String
118
+ }, { success: S.FiniteFromString }) {}
119
+
120
+ // success schema has encoded shape { a: string | null } — used to test projection constraints
121
+ class SomethingGetStructNullable extends SomethingQuery<SomethingGetStructNullable>()("GetStructNullable", {}, {
122
+ success: S.Struct({ a: S.NullOr(S.String) })
106
123
  }) {}
107
124
 
108
- export const Something = { GetSomething2, GetSomething2WithDependencies, meta: { moduleName: "Something" as const } }
125
+ export const Something = {
126
+ GetSomething2: SomethingGetSomething2,
127
+ GetSomething2WithDependencies: SomethingGetSomething2WithDependencies,
128
+ DoSomething: SomethingDoSomething,
129
+ GetStructNullable: SomethingGetStructNullable
130
+ }
131
+
132
+ export const SomethingElseReq = TaggedRequestFor("SomethingElse")
133
+ const SomethingElseQuery = SomethingElseReq.Query
134
+
135
+ class SomethingElseGetSomething2 extends SomethingElseQuery<SomethingElseGetSomething2>()("GetSomething2", {
136
+ id: S.String
137
+ }, { success: S.FiniteFromString }) {}
138
+
139
+ class SomethingElseGetSomething2WithDependencies
140
+ extends SomethingElseQuery<SomethingElseGetSomething2WithDependencies>()("GetSomething2", {
141
+ id: S.String
142
+ }, {
143
+ success: S.FiniteFromString as S.Codec<number, string, "dep-a">,
144
+ error: S.String
145
+ })
146
+ {}
147
+
148
+ export const SomethingElse = {
149
+ GetSomething2: SomethingElseGetSomething2,
150
+ GetSomething2WithDependencies: SomethingElseGetSomething2WithDependencies
151
+ }
109
152
 
110
153
  export const useClient = (
111
154
  options?: { messages?: Record<string, string> | Record<string, MessageFormatElement[]>; toasts: any[] }
@@ -117,8 +160,7 @@ export const useClient = (
117
160
  const api = ApiClientFactory.layer({ url: "bogus", headers: Option.none() }).pipe(
118
161
  Layer.provide(FetchHttpClient.layer)
119
162
  )
120
- const lm = LegacyMutation.Default.pipe(Layer.provide([FakeIntlLayer, FakeToastLayer]))
121
- const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api, lm)
163
+ const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api)
122
164
 
123
165
  const clientFor_ = ApiClientFactory.makeFor(Layer.empty)
124
166
  return makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty)
package/tsconfig.json CHANGED
@@ -32,7 +32,6 @@
32
32
  "outDir": "build/dist",
33
33
  "resolveJsonModule": true,
34
34
  "moduleResolution": "Node16",
35
- "downlevelIteration": true,
36
35
  "noErrorTruncation": true,
37
36
  "forceConsistentCasingInFileNames": true,
38
37
  "types": [
package/tsconfig.json.bak CHANGED
@@ -8,5 +8,5 @@
8
8
  {
9
9
  "path": "./tsconfig.test.json"
10
10
  }
11
- ],
12
- }
11
+ ]
12
+ }