@effect-app/vue 4.0.0-beta.33 → 4.0.0-beta.331

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 (148) hide show
  1. package/CHANGELOG.md +2463 -0
  2. package/dist/atomQuery.d.ts +120 -0
  3. package/dist/atomQuery.d.ts.map +1 -0
  4. package/dist/atomQuery.js +434 -0
  5. package/dist/commander.d.ts +634 -0
  6. package/dist/commander.d.ts.map +1 -0
  7. package/dist/commander.js +1068 -0
  8. package/dist/{experimental/confirm.d.ts → confirm.d.ts} +6 -4
  9. package/dist/confirm.d.ts.map +1 -0
  10. package/dist/confirm.js +26 -0
  11. package/dist/dependencyMetadata.d.ts +18 -0
  12. package/dist/dependencyMetadata.d.ts.map +1 -0
  13. package/dist/dependencyMetadata.js +67 -0
  14. package/dist/errorReporter.d.ts +6 -4
  15. package/dist/errorReporter.d.ts.map +1 -1
  16. package/dist/errorReporter.js +14 -19
  17. package/dist/form.d.ts +5 -5
  18. package/dist/form.d.ts.map +1 -1
  19. package/dist/form.js +42 -16
  20. package/dist/internal/tanstackQuery.d.ts +9 -0
  21. package/dist/internal/tanstackQuery.d.ts.map +1 -0
  22. package/dist/internal/tanstackQuery.js +204 -0
  23. package/dist/intl.d.ts +15 -0
  24. package/dist/intl.d.ts.map +1 -0
  25. package/dist/intl.js +9 -0
  26. package/dist/lib.d.ts +7 -9
  27. package/dist/lib.d.ts.map +1 -1
  28. package/dist/lib.js +35 -10
  29. package/dist/liveQueryInvalidation.d.ts +16 -0
  30. package/dist/liveQueryInvalidation.d.ts.map +1 -0
  31. package/dist/liveQueryInvalidation.js +115 -0
  32. package/dist/makeClient.d.ts +236 -336
  33. package/dist/makeClient.d.ts.map +1 -1
  34. package/dist/makeClient.js +417 -408
  35. package/dist/makeContext.d.ts.map +1 -1
  36. package/dist/makeIntl.d.ts.map +1 -1
  37. package/dist/{experimental/makeUseCommand.d.ts → makeUseCommand.d.ts} +4 -3
  38. package/dist/makeUseCommand.d.ts.map +1 -0
  39. package/dist/makeUseCommand.js +13 -0
  40. package/dist/mutate.d.ts +109 -40
  41. package/dist/mutate.d.ts.map +1 -1
  42. package/dist/mutate.js +235 -58
  43. package/dist/query.d.ts +158 -45
  44. package/dist/query.d.ts.map +1 -1
  45. package/dist/query.js +380 -122
  46. package/dist/queryLifetime.d.ts +25 -0
  47. package/dist/queryLifetime.d.ts.map +1 -0
  48. package/dist/queryLifetime.js +54 -0
  49. package/dist/routeParams.d.ts +4 -4
  50. package/dist/routeParams.d.ts.map +1 -1
  51. package/dist/routeParams.js +4 -3
  52. package/dist/runtime.d.ts +1 -14
  53. package/dist/runtime.d.ts.map +1 -1
  54. package/dist/runtime.js +2 -26
  55. package/dist/suspense.d.ts +19 -0
  56. package/dist/suspense.d.ts.map +1 -0
  57. package/dist/suspense.js +38 -0
  58. package/dist/toast.d.ts +2 -0
  59. package/dist/toast.d.ts.map +1 -0
  60. package/dist/toast.js +2 -0
  61. package/dist/withToast.d.ts +2 -0
  62. package/dist/withToast.d.ts.map +1 -0
  63. package/dist/withToast.js +2 -0
  64. package/docs/atom-query-api-redesign.md +207 -0
  65. package/docs/mutation-command-atoms.md +40 -0
  66. package/docs/query-key-invalidation.md +107 -0
  67. package/examples/streamMutation.ts +72 -0
  68. package/package.json +36 -95
  69. package/src/atomQuery.ts +600 -0
  70. package/src/commander.ts +3408 -0
  71. package/src/{experimental/confirm.ts → confirm.ts} +13 -15
  72. package/src/dependencyMetadata.ts +84 -0
  73. package/src/errorReporter.ts +65 -75
  74. package/src/form.ts +57 -21
  75. package/src/index.ts +7 -7
  76. package/src/internal/tanstackQuery.ts +308 -0
  77. package/src/intl.ts +12 -0
  78. package/src/lib.ts +49 -21
  79. package/src/liveQueryInvalidation.ts +138 -0
  80. package/src/makeClient.ts +971 -1159
  81. package/src/makeIntl.ts +2 -2
  82. package/src/{experimental/makeUseCommand.ts → makeUseCommand.ts} +9 -6
  83. package/src/mutate.ts +406 -153
  84. package/src/query.ts +763 -260
  85. package/src/queryLifetime.ts +74 -0
  86. package/src/routeParams.ts +7 -7
  87. package/src/runtime.ts +1 -31
  88. package/src/suspense.ts +43 -0
  89. package/src/toast.ts +1 -0
  90. package/src/withToast.ts +1 -0
  91. package/test/Mutation.test.ts +181 -24
  92. package/test/dependencyInvalidation.test.ts +444 -0
  93. package/test/dist/dependencyInvalidation.test.d.ts.map +1 -0
  94. package/test/dist/form.test.d.ts.map +1 -1
  95. package/test/dist/inactiveInvalidation.test.d.ts.map +1 -0
  96. package/test/dist/interrupt-refetch-repro.test.d.ts.map +1 -0
  97. package/test/dist/lib.test.d.ts.map +1 -0
  98. package/test/dist/liveQueryInvalidation.test.d.ts.map +1 -0
  99. package/test/dist/query-span.test.d.ts.map +1 -0
  100. package/test/dist/queryOptions.test.d.ts.map +1 -0
  101. package/test/dist/streamFinal.test.d.ts.map +1 -0
  102. package/test/dist/streamFn.test.d.ts.map +1 -0
  103. package/test/dist/stubs.d.ts +3751 -120
  104. package/test/dist/stubs.d.ts.map +1 -1
  105. package/test/dist/stubs.js +190 -30
  106. package/test/dist/suspense-regression.test.d.ts.map +1 -0
  107. package/test/dist/suspense.test.d.ts.map +1 -0
  108. package/test/form-validation-errors.test.ts +24 -19
  109. package/test/form.test.ts +25 -6
  110. package/test/inactiveInvalidation.test.ts +172 -0
  111. package/test/interrupt-refetch-repro.test.ts +625 -0
  112. package/test/lib.test.ts +240 -0
  113. package/test/liveQueryInvalidation.test.ts +108 -0
  114. package/test/makeClient.test.ts +437 -38
  115. package/test/query-span.test.ts +92 -0
  116. package/test/queryOptions.test.ts +88 -0
  117. package/test/streamFinal.test.ts +64 -0
  118. package/test/streamFn.test.ts +457 -0
  119. package/test/stubs.ts +227 -42
  120. package/test/suspense-regression.test.ts +168 -0
  121. package/test/suspense.test.ts +160 -0
  122. package/tsconfig.examples.json +20 -0
  123. package/tsconfig.json +9 -2
  124. package/tsconfig.src.json +34 -34
  125. package/tsconfig.test.json +2 -2
  126. package/vitest.config.ts +5 -5
  127. package/dist/experimental/commander.d.ts +0 -359
  128. package/dist/experimental/commander.d.ts.map +0 -1
  129. package/dist/experimental/commander.js +0 -557
  130. package/dist/experimental/confirm.d.ts.map +0 -1
  131. package/dist/experimental/confirm.js +0 -28
  132. package/dist/experimental/intl.d.ts +0 -16
  133. package/dist/experimental/intl.d.ts.map +0 -1
  134. package/dist/experimental/intl.js +0 -5
  135. package/dist/experimental/makeUseCommand.d.ts.map +0 -1
  136. package/dist/experimental/makeUseCommand.js +0 -13
  137. package/dist/experimental/toast.d.ts +0 -47
  138. package/dist/experimental/toast.d.ts.map +0 -1
  139. package/dist/experimental/toast.js +0 -41
  140. package/dist/experimental/withToast.d.ts +0 -25
  141. package/dist/experimental/withToast.d.ts.map +0 -1
  142. package/dist/experimental/withToast.js +0 -45
  143. package/eslint.config.mjs +0 -24
  144. package/src/experimental/commander.ts +0 -1835
  145. package/src/experimental/intl.ts +0 -9
  146. package/src/experimental/toast.ts +0 -66
  147. package/src/experimental/withToast.ts +0 -99
  148. package/tsconfig.json.bak +0 -12
@@ -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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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCxG,CAAA"}
@@ -1,15 +1,20 @@
1
1
  import * as Intl from "@formatjs/intl";
2
- import { Effect, Layer, ManagedRuntime, Option, S } from "effect-app";
3
2
  import { ApiClientFactory, makeRpcClient } from "effect-app/client";
3
+ import * as Effect from "effect-app/Effect";
4
+ import * as Layer from "effect-app/Layer";
5
+ import * as Option from "effect-app/Option";
4
6
  import { RpcContextMap } from "effect-app/rpc";
7
+ import * as S from "effect-app/Schema";
8
+ import * as Exit from "effect/Exit";
9
+ import * as ManagedRuntime from "effect/ManagedRuntime";
5
10
  import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
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";
11
+ import { createApp, ref } from "vue";
12
+ import { Commander } from "../src/commander.js";
13
+ import { I18n } from "../src/intl.js";
14
+ import { makeClient } from "../src/makeClient.js";
15
+ import { makeUseCommand } from "../src/makeUseCommand.js";
16
+ import * as Toast from "../src/toast.js";
17
+ import { WithToast } from "../src/withToast.js";
13
18
  const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(() => {
14
19
  const dismiss = (id) => {
15
20
  const idx = toasts.findIndex((_) => _.id === id);
@@ -19,33 +24,41 @@ const fakeToastLayer = (toasts = []) => Layer.effect(Toast.Toast, Effect.sync(()
19
24
  toasts.splice(idx, 1);
20
25
  }
21
26
  };
22
- const fakeToast = (message, options) => {
27
+ const scheduleAutoDismiss = (toast, timeout) => {
28
+ // Treat Infinity / undefined as "stays until explicitly replaced/dismissed".
29
+ // Node's setTimeout silently clamps Infinity to 1ms which would otherwise
30
+ // cause the toast to disappear before assertions can observe it.
31
+ if (timeout === undefined || !Number.isFinite(timeout))
32
+ return;
33
+ toast.timeoutId = setTimeout(() => {
34
+ const i = toasts.indexOf(toast);
35
+ if (i > -1)
36
+ toasts.splice(i, 1);
37
+ }, timeout);
38
+ };
39
+ const fakeToast = (type) => (message, options) => {
23
40
  const id = options?.id ?? Math.random().toString(36).substring(2, 15);
24
- console.log(`Toast [${id}]: ${message}`, options);
41
+ console.log(`Toast [${type}][${id}]: ${message}`, options);
25
42
  options = { ...options, id };
26
43
  const idx = toasts.findIndex((_) => _.id === id);
27
44
  if (idx > -1) {
28
45
  const toast = toasts[idx];
29
46
  clearTimeout(toast.timeoutId);
30
- Object.assign(toast, { message, options });
31
- toast.timeoutId = setTimeout(() => {
32
- toasts.splice(idx, 1);
33
- }, options?.timeout ?? 3000);
47
+ Object.assign(toast, { type, message, options });
48
+ scheduleAutoDismiss(toast, options?.timeout ?? 3000);
34
49
  }
35
50
  else {
36
- const toast = { id, message, options };
37
- toast.timeoutId = setTimeout(() => {
38
- toasts.splice(idx, 1);
39
- }, options?.timeout ?? 3000);
51
+ const toast = { id, type, message, options };
40
52
  toasts.push(toast);
53
+ scheduleAutoDismiss(toast, options?.timeout ?? 3000);
41
54
  }
42
55
  return id;
43
56
  };
44
57
  return Toast.Toast.of(Toast.wrap({
45
- error: fakeToast,
46
- warning: fakeToast,
47
- success: fakeToast,
48
- info: fakeToast,
58
+ error: fakeToast("error"),
59
+ warning: fakeToast("warning"),
60
+ success: fakeToast("success"),
61
+ info: fakeToast("info"),
49
62
  dismiss
50
63
  }));
51
64
  }));
@@ -74,14 +87,38 @@ export const useExperimental = (options) => {
74
87
  const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer);
75
88
  return Effect.runSync(makeUseCommand(Layer.empty).pipe(Effect.provide(layers)));
76
89
  };
90
+ // Effect-returning variant: keeps the caller's runtime context (e.g. a TestClock
91
+ // provided by `it.effect`) so virtual-time advances reach the runtime captured
92
+ // inside Commander.
93
+ export const useExperimentalE = (options) => {
94
+ const FakeIntlLayer = fakeIntlLayer(options?.messages);
95
+ const FakeToastLayer = fakeToastLayer(options?.toasts);
96
+ const CommanderLayer = Commander.Default.pipe(Layer.provide([FakeIntlLayer, FakeToastLayer]));
97
+ const WithToastLayer = WithToast.Default.pipe(Layer.provide(FakeToastLayer));
98
+ const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer);
99
+ return makeUseCommand(Layer.empty).pipe(Effect.provide(layers));
100
+ };
77
101
  export class RequestContextMap extends RpcContextMap.makeMap({}) {
78
102
  }
79
- export const { TaggedRequest: Req } = makeRpcClient(RequestContextMap);
80
- export class GetSomething2 extends Req()("GetSomething2", {
103
+ const stubMiddleware = {
104
+ requestContextMap: RequestContextMap.config,
105
+ requestContext: undefined
106
+ };
107
+ export const { TaggedRequestFor } = makeRpcClient(stubMiddleware);
108
+ export const SomethingReq = TaggedRequestFor("Something");
109
+ const SomethingQuery = SomethingReq.Query;
110
+ const SomethingCommand = SomethingReq.Command;
111
+ class SomethingGetSomething2 extends SomethingQuery()("GetSomething2", {
81
112
  id: S.String
82
113
  }, { success: S.FiniteFromString }) {
83
114
  }
84
- export class GetSomething2WithDependencies extends Req()("GetSomething2", {
115
+ class SomethingGetSomething3 extends SomethingQuery()("GetSomething3", {
116
+ id: S.NullOr(S.String).withConstructorDefault
117
+ }, { success: S.FiniteFromString }) {
118
+ }
119
+ class SomethingGetSomething4 extends SomethingQuery()("GetSomething4", {}, { success: S.FiniteFromString }) {
120
+ }
121
+ class SomethingGetSomething2WithDependencies extends SomethingQuery()("GetSomething2", {
85
122
  id: S.String
86
123
  }, {
87
124
  // this is intentilally fake, to simulate a codec that requires a dependency
@@ -89,16 +126,139 @@ export class GetSomething2WithDependencies extends Req()("GetSomething2", {
89
126
  error: S.String
90
127
  }) {
91
128
  }
92
- export const Something = { GetSomething2, GetSomething2WithDependencies, meta: { moduleName: "Something" } };
129
+ // command stubs covering the input-shape matrix
130
+ class SomethingDoNoProps extends SomethingCommand()("DoNoProps", {}) {
131
+ }
132
+ class SomethingDoOptionalOnly extends SomethingCommand()("DoOptionalOnly", {
133
+ name: S.optional(S.String)
134
+ }) {
135
+ }
136
+ class SomethingDoRequiredOnly extends SomethingCommand()("DoRequiredOnly", {
137
+ id: S.String
138
+ }) {
139
+ }
140
+ class SomethingDoMixed extends SomethingCommand()("DoMixed", {
141
+ id: S.String,
142
+ name: S.optional(S.String)
143
+ }) {
144
+ }
145
+ class SomethingDoSomething extends SomethingCommand()("DoSomething", {
146
+ id: S.String
147
+ }, {
148
+ success: S.FiniteFromString
149
+ }, (queryKey, { Something }, input, output) => {
150
+ return [
151
+ { filters: { queryKey } },
152
+ {
153
+ filters: {
154
+ queryKey: [
155
+ Something["GetSomething2"].id,
156
+ input.id,
157
+ Exit.isSuccess(output) ? output.value.toString() : "failed"
158
+ ]
159
+ }
160
+ }
161
+ ];
162
+ }) {
163
+ }
164
+ // success schema has encoded shape { a: string | null } — used to test projection constraints
165
+ class SomethingGetStructNullable extends SomethingQuery()("GetStructNullable", {}, {
166
+ success: S.Struct({ a: S.NullOr(S.String) })
167
+ }) {
168
+ }
169
+ class SomethingStreamQuery extends SomethingQuery()("StreamQuery", {
170
+ id: S.String
171
+ }, {
172
+ stream: true,
173
+ success: S.FiniteFromString
174
+ }) {
175
+ }
176
+ /** Stream event: intermediate progress update. */
177
+ export class OperationProgress extends S.TaggedClass()("OperationProgress", {
178
+ completed: S.NonNegativeInt,
179
+ total: S.NonNegativeInt
180
+ }) {
181
+ }
182
+ /** Stream event: final completion result. */
183
+ export class ExportComplete extends S.TaggedClass()("ExportComplete", {
184
+ fileUrl: S.NonEmptyString
185
+ }) {
186
+ }
187
+ /** Stream with no `final` schema — execute resolves with `void`. */
188
+ class SomethingStreamWithoutFinal extends SomethingCommand()("StreamWithoutFinal", {
189
+ id: S.String
190
+ }, {
191
+ stream: true,
192
+ success: S.Union([OperationProgress, ExportComplete])
193
+ }) {
194
+ }
195
+ /** Stream with a `final` schema — execute resolves with `ExportComplete`. */
196
+ class SomethingStreamWithFinal extends SomethingCommand()("StreamWithFinal", {
197
+ id: S.String
198
+ }, {
199
+ stream: true,
200
+ success: S.Union([OperationProgress, ExportComplete]),
201
+ final: ExportComplete
202
+ }) {
203
+ }
204
+ export const Something = {
205
+ GetSomething2: SomethingGetSomething2,
206
+ GetSomething2WithDependencies: SomethingGetSomething2WithDependencies,
207
+ GetSomething3: SomethingGetSomething3,
208
+ GetSomething4: SomethingGetSomething4,
209
+ DoNoProps: SomethingDoNoProps,
210
+ DoOptionalOnly: SomethingDoOptionalOnly,
211
+ DoRequiredOnly: SomethingDoRequiredOnly,
212
+ DoMixed: SomethingDoMixed,
213
+ DoSomething: SomethingDoSomething,
214
+ GetStructNullable: SomethingGetStructNullable,
215
+ StreamQuery: SomethingStreamQuery,
216
+ StreamWithoutFinal: SomethingStreamWithoutFinal,
217
+ StreamWithFinal: SomethingStreamWithFinal
218
+ };
219
+ export const SomethingElseReq = TaggedRequestFor("SomethingElse");
220
+ const SomethingElseQuery = SomethingElseReq.Query;
221
+ class SomethingElseGetSomething2 extends SomethingElseQuery()("GetSomething2", {
222
+ id: S.String
223
+ }, { success: S.FiniteFromString }) {
224
+ }
225
+ class SomethingElseGetSomething2WithDependencies extends SomethingElseQuery()("GetSomething2", {
226
+ id: S.String
227
+ }, {
228
+ success: S.FiniteFromString,
229
+ error: S.String
230
+ }) {
231
+ }
232
+ export const SomethingElse = {
233
+ GetSomething2: SomethingElseGetSomething2,
234
+ GetSomething2WithDependencies: SomethingElseGetSomething2WithDependencies
235
+ };
93
236
  export const useClient = (options) => {
94
237
  const FakeIntlLayer = fakeIntlLayer(options?.messages);
95
238
  const FakeToastLayer = fakeToastLayer(options?.toasts);
96
239
  const CommanderLayer = Commander.Default.pipe(Layer.provide([FakeIntlLayer, FakeToastLayer]));
97
240
  const WithToastLayer = WithToast.Default.pipe(Layer.provide(FakeToastLayer));
98
241
  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);
242
+ const layers = Layer.mergeAll(CommanderLayer, WithToastLayer, FakeToastLayer, FakeIntlLayer, api);
101
243
  const clientFor_ = ApiClientFactory.makeFor(Layer.empty);
102
- return makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty);
244
+ const rawClient = makeClient(() => ManagedRuntime.make(layers), clientFor_, Layer.empty);
245
+ // Provide a Vue injection context so composition-API hooks called during client
246
+ // initialisation work outside a component setup() function.
247
+ const vueApp = createApp({});
248
+ const origClientFor = rawClient.clientFor;
249
+ const clientFor = function (m, ...args) {
250
+ const proxy = origClientFor(m, ...args);
251
+ // Warm up lazy mutation-hook initialisation inside the Vue injection context.
252
+ // After the first property access, useMutation() is cached and subsequent
253
+ // accesses outside the context succeed.
254
+ const firstPropertyName = Object.keys(m)[0];
255
+ if (firstPropertyName !== undefined) {
256
+ vueApp.runWithContext(() => {
257
+ void proxy[firstPropertyName];
258
+ });
259
+ }
260
+ return proxy;
261
+ };
262
+ return { ...rawClient, clientFor };
103
263
  };
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R1YnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zdHVicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUMsT0FBTyxLQUFLLGVBQWUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3RFLE9BQU8sS0FBSyxLQUFLLE1BQU0sOEJBQThCLENBQUE7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFHakUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxTQUFnQixFQUFFLEVBQUUsRUFBRSxDQUM1QyxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQUssQ0FBQyxLQUFLLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDZixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQWlCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDYixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekIsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN2QixDQUFDO0lBQ0gsQ0FBQyxDQUFBO0lBQ0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFlLEVBQUUsT0FBeUIsRUFBRSxFQUFFO1FBQy9ELE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFakQsT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUE7UUFDNUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNoRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUMxQyxLQUFLLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3ZCLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFBO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLEdBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFBO1lBQzNDLEtBQUssQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDdkIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUE7WUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNwQixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDLENBQUE7SUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDL0IsS0FBSyxFQUFFLFNBQVM7UUFDaEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsSUFBSSxFQUFFLFNBQVM7UUFDZixPQUFPO0tBQ1IsQ0FBQyxDQUFRLENBQUE7QUFDWixDQUFDLENBQUMsQ0FDSCxDQUFBO0FBRUgsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBNEUsRUFBRSxFQUFFLEVBQUU7SUFDN0csTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQWEsQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFzQjtRQUNoRCxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDcEIsUUFBUTtLQUNULEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFYixPQUFPO1FBQ0wsTUFBTTtRQUNOLElBQUk7UUFDSixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDO1FBQ3pELElBQUksYUFBYTtZQUNmLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUMzQixDQUFDO0tBQytDLENBQUE7QUFDcEQsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsV0FBNEUsRUFBRSxFQUFFLEVBQUUsQ0FDOUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUV4RSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FDN0IsT0FBdUcsRUFDdkcsRUFBRTtJQUNGLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDdEQsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN0RCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM3RixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7SUFDNUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUU1RixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFpQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pILENBQUMsQ0FBQTtBQUVELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztDQUFHO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0FBQ3RFLE1BQU0sT0FBTyxhQUFjLFNBQVEsR0FBRyxFQUFpQixDQUFDLGVBQWUsRUFBRTtJQUN2RSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDYixFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0NBQUc7QUFFdEMsTUFBTSxPQUFPLDZCQUE4QixTQUFRLEdBQUcsRUFBaUMsQ0FBQyxlQUFlLEVBQUU7SUFDdkcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNO0NBQ2IsRUFBRTtJQUNELDRFQUE0RTtJQUM1RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLGdCQUFvRDtJQUMvRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDaEIsQ0FBQztDQUFHO0FBRUwsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsYUFBYSxFQUFFLDZCQUE2QixFQUFFLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxXQUFvQixFQUFFLEVBQUUsQ0FBQTtBQUVySCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FDdkIsT0FBdUcsRUFDdkcsRUFBRTtJQUNGLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDdEQsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN0RCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM3RixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7SUFDNUUsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9FLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUNyQyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdEYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRXJHLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDeEQsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9FLENBQUMsQ0FBQSJ9
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R1YnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zdHVicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssSUFBSSxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNuRSxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxLQUFLLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssY0FBYyxNQUFNLHVCQUF1QixDQUFBO0FBQ3ZELE9BQU8sS0FBSyxlQUFlLE1BQU0sc0NBQXNDLENBQUE7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3pELE9BQU8sS0FBSyxLQUFLLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRS9DLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBTSxHQUFVLEVBQUUsRUFBRSxFQUFFLENBQzVDLEtBQUssQ0FBQyxNQUFNLENBQ1YsS0FBSyxDQUFDLEtBQUssRUFDWCxNQUFN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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspense-regression.test.d.ts","sourceRoot":"","sources":["../suspense-regression.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspense.test.d.ts","sourceRoot":"","sources":["../suspense.test.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
- import { Effect, S } from "effect-app"
1
+ import * as Effect from "effect-app/Effect"
2
+ import * as S from "effect-app/Schema"
2
3
  import { buildFieldInfoFromFieldsRoot, translate } from "../src/form.js"
3
4
 
4
5
  // test schema with integer field
@@ -137,22 +138,26 @@ it("validates integer field with valid integer", () =>
137
138
  .pipe(Effect.runPromise))
138
139
 
139
140
  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\"")
141
+ // test the actual error message format from Effect Schema (both old "actual" and new "got" formats)
142
+ const errorMessageOld = `Expected an integer, actual 59.5`
143
+ const errorMessageNew = `SchemaError(Expected an integer, got 59.5)`
144
+
145
+ const oldMatch = errorMessageOld.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
146
+ expect(oldMatch).toBeTruthy()
147
+ expect(oldMatch![1]).toBe("59.5")
148
+
149
+ const newMatch = errorMessageNew.match(/Expected.*integer.*(?:actual|got)\s+([^)]+)/i)
150
+ expect(newMatch).toBeTruthy()
151
+ expect(newMatch![1]).toBe("59.5")
152
+
153
+ const numberErrorOld = `Expected a number, actual "not-a-number"`
154
+ const numberErrorNew = `SchemaError(Expected a finite number, got "not-a-number")`
155
+
156
+ const numOldMatch = numberErrorOld.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
157
+ expect(numOldMatch).toBeTruthy()
158
+ expect(numOldMatch![1]).toBe("\"not-a-number\"")
159
+
160
+ const numNewMatch = numberErrorNew.match(/Expected.*number.*(?:actual|got)\s+([^)]+)/i)
161
+ expect(numNewMatch).toBeTruthy()
162
+ expect(numNewMatch![1]).toBe("\"not-a-number\"")
158
163
  })
package/test/form.test.ts CHANGED
@@ -1,15 +1,20 @@
1
- import { Effect, S } from "effect-app"
2
- import { buildFieldInfoFromFieldsRoot, type DiscriminatedUnionFieldInfo, type FieldInfo, type NestedFieldInfo, type UnionFieldInfo } from "../src/form.js"
1
+ import * as Effect from "effect-app/Effect"
2
+ import * as S from "effect-app/Schema"
3
+ import { buildFieldInfoFromFieldsRoot, type DiscriminatedUnionFieldInfo, type FieldInfo, getMetadataFromSchema, type NestedFieldInfo, type UnionFieldInfo } from "../src/form.js"
3
4
 
4
5
  export class NestedSchema extends S.Class<NestedSchema>("NestedSchema")({
5
6
  shallow: S.String,
6
7
  nested: S.Struct({
7
8
  deep: S.NonEmptyString,
8
9
  nested: S.Struct({
9
- deepest: S.Finite
10
+ deepest: S.Number
10
11
  })
11
12
  }),
12
- age: S.Struct({ nfs: S.FiniteFromString.pipe(S.decodeTo(S.PositiveInt)) })
13
+ age: S.Struct({ nfs: S.NumberFromString.pipe(S.decodeTo(S.PositiveInt)) }),
14
+ testNumber: S.Number,
15
+ testFinite: S.Finite,
16
+ testNullableNummber: S.NullOr(S.Number),
17
+ testOptionalNumber: S.optional(S.Number)
13
18
  }) {}
14
19
 
15
20
  export class SchemaContainsClass extends S.Class<SchemaContainsClass>("SchemaContainsClass")({
@@ -33,7 +38,7 @@ class Square extends S.TaggedClass<Square>()("Square", {
33
38
 
34
39
  class Triangle extends S.TaggedClass<Triangle>()("Triangle", {
35
40
  base: S.PositiveInt,
36
- height: S.Finite
41
+ height: S.Number
37
42
  }) {}
38
43
 
39
44
  const CircleStruct = S.Struct({
@@ -49,7 +54,7 @@ const SquareStruct = S.Struct({
49
54
  const TriangleStruct = S.Struct({
50
55
  _tag: S.Literal("TriangleStruct"),
51
56
  base: S.PositiveInt,
52
- height: S.Finite
57
+ height: S.Number
53
58
  })
54
59
 
55
60
  const ShapeWithStructs = S.Union([CircleStruct, SquareStruct, TriangleStruct])
@@ -156,6 +161,15 @@ function testDiscriminatedUnionFieldInfo<T extends Record<PropertyKey, any>>(duf
156
161
  )
157
162
  }
158
163
 
164
+ it("getMetadataFromSchema handles composed numeric schemas", () => {
165
+ expect(getMetadataFromSchema(S.Number.ast).type).toBe("float")
166
+ expect(getMetadataFromSchema(S.Finite.ast).type).toBe("float")
167
+ expect(getMetadataFromSchema(S.PositiveNumber.ast).type).toBe("float")
168
+ expect(getMetadataFromSchema(S.Int.ast).type).toBe("int")
169
+ expect(getMetadataFromSchema(S.PositiveInt.ast).type).toBe("int")
170
+ expect(getMetadataFromSchema(S.NullOr(S.Number).ast).type).toBe("float")
171
+ })
172
+
159
173
  it("buildFieldInfo", () =>
160
174
  Effect
161
175
  .gen(function*() {
@@ -176,6 +190,11 @@ it("buildFieldInfo", () =>
176
190
  testNestedFieldInfo(nestedFieldinfo)
177
191
  testNestedFieldInfo(nestedFieldinfo.fields.nested)
178
192
  testNestedFieldInfo(nestedFieldinfo.fields.age)
193
+
194
+ expect(nestedFieldinfo.fields.testNumber.type).toBe("float")
195
+ expect(nestedFieldinfo.fields.testFinite.type).toBe("float")
196
+ expect(nestedFieldinfo.fields.testNullableNummber.type).toBe("float")
197
+ expect(nestedFieldinfo.fields.testOptionalNumber.type).toBe("float")
179
198
  })
180
199
  .pipe(Effect.runPromise))
181
200
 
@@ -0,0 +1,172 @@
1
+ import { defaultRegistry, registryKey } from "@effect/atom-vue"
2
+ import { DataDependencies, makeQueryKey } from "effect-app/client"
3
+ import * as Context from "effect-app/Context"
4
+ import * as Effect from "effect-app/Effect"
5
+ import * as Option from "effect-app/Option"
6
+ import * as Latch from "effect/Latch"
7
+ import * as Layer from "effect/Layer"
8
+ import * as ManagedRuntime from "effect/ManagedRuntime"
9
+ import * as AsyncResult from "effect/unstable/reactivity/AsyncResult"
10
+ import * as Reactivity from "effect/unstable/reactivity/Reactivity"
11
+ import { describe, expect, it } from "vitest"
12
+ import { createApp, nextTick } from "vue"
13
+ import { buildQueryFamily, invalidateAndAwait, makeAtomClientRuntime, withQueryOptions } from "../src/atomQuery.js"
14
+ import { useAtomSuspense } from "../src/query.js"
15
+
16
+ const tick = () => new Promise((resolve) => setTimeout(resolve, 0))
17
+ const ticks = async (n: number) => {
18
+ for (let i = 0; i < n; i++) {
19
+ await nextTick()
20
+ await tick()
21
+ }
22
+ }
23
+
24
+ const makeEnv = () => {
25
+ const mrt = ManagedRuntime.make(Reactivity.layer)
26
+ const baseContext = mrt.runSync(Effect.context<Reactivity.Reactivity>())
27
+ const reactivity = Context.get(baseContext, Reactivity.Reactivity)
28
+ const rt = makeAtomClientRuntime(
29
+ () => Layer.succeedContext(baseContext) as Layer.Layer<any, never, never>,
30
+ mrt.memoMap
31
+ )
32
+ return {
33
+ rt,
34
+ invalidate: (keys: ReadonlyArray<ReadonlyArray<unknown>>) =>
35
+ invalidateAndAwait(keys).pipe(Effect.provideService(Reactivity.Reactivity, reactivity))
36
+ }
37
+ }
38
+
39
+ const makeCounted = (id: string, repo: DataDependencies.DataDependency) => {
40
+ let starts = 0
41
+ const self = {
42
+ id,
43
+ handler: () =>
44
+ Effect.gen(function*() {
45
+ yield* DataDependencies.read(repo)
46
+ return ++starts
47
+ })
48
+ }
49
+ return { self, starts: () => starts }
50
+ }
51
+
52
+ const result = (atom: any): AsyncResult.AsyncResult<number, never> => defaultRegistry.get(atom)
53
+ const served = (atom: any): number | undefined => Option.getOrUndefined(AsyncResult.value(result(atom)))
54
+
55
+ const queryAtom = (rt: any, self: any) =>
56
+ withQueryOptions(buildQueryFamily(rt, self)(undefined), { gcTime: "infinity", revalidateOnFocus: false })
57
+
58
+ const mountSuspense = (atom: any) => {
59
+ let promise: Promise<any> | undefined
60
+ const host = document.createElement("div")
61
+ const app = createApp({
62
+ setup() {
63
+ promise = useAtomSuspense(() => atom)
64
+ return () => null
65
+ }
66
+ })
67
+ app.provide(registryKey, defaultRegistry)
68
+ app.mount(host)
69
+ return { app, getPromise: () => promise }
70
+ }
71
+
72
+ const settle = (p: Promise<any> | undefined) =>
73
+ Promise.race([
74
+ Promise.resolve(p).then(() => "resolved" as const, () => "rejected" as const),
75
+ new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 40))
76
+ ])
77
+
78
+ const fullKeyOf = (self: { id: string }) => [...makeQueryKey(self), undefined]
79
+
80
+ describe("inactive invalidation (refetchType: active)", () => {
81
+ it("does not refetch an unmounted query; remount does", async () => {
82
+ defaultRegistry.reset()
83
+ const { rt, invalidate } = makeEnv()
84
+ const repo = DataDependencies.repo("IdleRepo")
85
+ const g = makeCounted("Idle.List", repo)
86
+ const atom = queryAtom(rt, g.self)
87
+
88
+ const m1 = mountSuspense(atom)
89
+ await settle(m1.getPromise())
90
+ await ticks(2)
91
+ expect(served(atom)).toBe(1)
92
+
93
+ m1.app.unmount()
94
+ await ticks(2)
95
+
96
+ await Effect.runPromise(invalidate([fullKeyOf(g.self)]))
97
+ await ticks(2)
98
+ expect(g.starts()).toBe(1)
99
+
100
+ const m2 = mountSuspense(atom)
101
+ await settle(m2.getPromise())
102
+ await ticks(2)
103
+ expect(g.starts()).toBeGreaterThanOrEqual(2)
104
+ expect(served(atom)).not.toBe(1)
105
+ m2.app.unmount()
106
+ defaultRegistry.reset()
107
+ })
108
+
109
+ it("still refetches a mounted query immediately", async () => {
110
+ defaultRegistry.reset()
111
+ const { rt, invalidate } = makeEnv()
112
+ const repo = DataDependencies.repo("ActiveRepo")
113
+ const g = makeCounted("Active.List", repo)
114
+ const atom = queryAtom(rt, g.self)
115
+
116
+ const mounted = mountSuspense(atom)
117
+ await settle(mounted.getPromise())
118
+ await ticks(2)
119
+ expect(g.starts()).toBe(1)
120
+
121
+ await Effect.runPromise(invalidate([fullKeyOf(g.self)]))
122
+ await ticks(2)
123
+ expect(g.starts()).toBeGreaterThanOrEqual(2)
124
+ mounted.app.unmount()
125
+ defaultRegistry.reset()
126
+ })
127
+
128
+ it("waits for a mounted refetch to finish before invalidateAndAwait resolves", async () => {
129
+ defaultRegistry.reset()
130
+ const { rt, invalidate } = makeEnv()
131
+ const repo = DataDependencies.repo("AwaitRepo")
132
+ let starts = 0
133
+ let completes = 0
134
+ const latches: Array<Latch.Latch> = []
135
+ const self = {
136
+ id: "Await.List",
137
+ handler: () =>
138
+ Effect.gen(function*() {
139
+ yield* DataDependencies.read(repo)
140
+ const n = ++starts
141
+ if (n > 1) {
142
+ const latch = Latch.makeUnsafe(false)
143
+ latches.push(latch)
144
+ yield* latch.await
145
+ }
146
+ completes++
147
+ return n
148
+ })
149
+ }
150
+ const atom = queryAtom(rt, self)
151
+
152
+ const mounted = mountSuspense(atom)
153
+ await settle(mounted.getPromise())
154
+ await ticks(2)
155
+ expect(completes).toBe(1)
156
+
157
+ let settled = false
158
+ const waiting = Effect.runPromise(invalidate([fullKeyOf(self)])).then(() => {
159
+ settled = true
160
+ })
161
+ await ticks(4)
162
+ expect(starts).toBeGreaterThanOrEqual(2)
163
+ expect(settled, "must not resolve while the mounted refetch is in flight").toBe(false)
164
+
165
+ latches.splice(0).forEach((latch) => latch.openUnsafe())
166
+ await waiting
167
+ expect(settled).toBe(true)
168
+ expect(completes).toBeGreaterThanOrEqual(2)
169
+ mounted.app.unmount()
170
+ defaultRegistry.reset()
171
+ })
172
+ })