effect-app 4.0.0-beta.24 → 4.0.0-beta.241

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 (244) hide show
  1. package/CHANGELOG.md +1060 -0
  2. package/dist/Array.d.ts +3 -2
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +4 -4
  5. package/dist/Chunk.d.ts +1 -1
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Config/SecretURL.d.ts +4 -2
  8. package/dist/Config/SecretURL.d.ts.map +1 -1
  9. package/dist/Config/SecretURL.js +3 -6
  10. package/dist/Config/internal/configSecretURL.d.ts +1 -1
  11. package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
  12. package/dist/Config/internal/configSecretURL.js +2 -2
  13. package/dist/Config.d.ts +7 -0
  14. package/dist/Config.d.ts.map +1 -0
  15. package/dist/Config.js +6 -0
  16. package/dist/ConfigProvider.d.ts +39 -0
  17. package/dist/ConfigProvider.d.ts.map +1 -0
  18. package/dist/ConfigProvider.js +42 -0
  19. package/dist/Context.d.ts +42 -0
  20. package/dist/Context.d.ts.map +1 -0
  21. package/dist/Context.js +67 -0
  22. package/dist/Effect.d.ts +11 -10
  23. package/dist/Effect.d.ts.map +1 -1
  24. package/dist/Effect.js +5 -7
  25. package/dist/Function.d.ts +1 -1
  26. package/dist/Function.d.ts.map +1 -1
  27. package/dist/Inputify.type.d.ts +1 -1
  28. package/dist/Layer.d.ts +11 -7
  29. package/dist/Layer.d.ts.map +1 -1
  30. package/dist/Layer.js +3 -2
  31. package/dist/NonEmptySet.d.ts +4 -2
  32. package/dist/NonEmptySet.d.ts.map +1 -1
  33. package/dist/NonEmptySet.js +2 -2
  34. package/dist/Option.d.ts +2 -1
  35. package/dist/Option.d.ts.map +1 -1
  36. package/dist/Option.js +3 -1
  37. package/dist/Pure.d.ts +8 -6
  38. package/dist/Pure.d.ts.map +1 -1
  39. package/dist/Pure.js +17 -14
  40. package/dist/Schema/Class.d.ts +66 -20
  41. package/dist/Schema/Class.d.ts.map +1 -1
  42. package/dist/Schema/Class.js +192 -23
  43. package/dist/Schema/FastCheck.d.ts +1 -1
  44. package/dist/Schema/FastCheck.d.ts.map +1 -1
  45. package/dist/Schema/Methods.d.ts +1 -1
  46. package/dist/Schema/SchemaParser.d.ts +5 -0
  47. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  48. package/dist/Schema/SchemaParser.js +6 -0
  49. package/dist/Schema/SpecialJsonSchema.d.ts +34 -0
  50. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
  51. package/dist/Schema/SpecialJsonSchema.js +118 -0
  52. package/dist/Schema/SpecialOpenApi.d.ts +32 -0
  53. package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
  54. package/dist/Schema/SpecialOpenApi.js +123 -0
  55. package/dist/Schema/brand.d.ts +5 -3
  56. package/dist/Schema/brand.d.ts.map +1 -1
  57. package/dist/Schema/brand.js +3 -1
  58. package/dist/Schema/email.d.ts +1 -1
  59. package/dist/Schema/email.d.ts.map +1 -1
  60. package/dist/Schema/email.js +7 -4
  61. package/dist/Schema/ext.d.ts +339 -56
  62. package/dist/Schema/ext.d.ts.map +1 -1
  63. package/dist/Schema/ext.js +358 -53
  64. package/dist/Schema/moreStrings.d.ts +108 -26
  65. package/dist/Schema/moreStrings.d.ts.map +1 -1
  66. package/dist/Schema/moreStrings.js +45 -16
  67. package/dist/Schema/numbers.d.ts +55 -15
  68. package/dist/Schema/numbers.d.ts.map +1 -1
  69. package/dist/Schema/numbers.js +60 -12
  70. package/dist/Schema/phoneNumber.d.ts +1 -1
  71. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  72. package/dist/Schema/phoneNumber.js +6 -3
  73. package/dist/Schema/schema.d.ts +1 -1
  74. package/dist/Schema/strings.d.ts +5 -5
  75. package/dist/Schema/strings.d.ts.map +1 -1
  76. package/dist/Schema/strings.js +1 -5
  77. package/dist/Schema.d.ts +214 -8
  78. package/dist/Schema.d.ts.map +1 -1
  79. package/dist/Schema.js +190 -11
  80. package/dist/Set.d.ts +5 -2
  81. package/dist/Set.d.ts.map +1 -1
  82. package/dist/Set.js +3 -2
  83. package/dist/TypeTest.d.ts +1 -1
  84. package/dist/Types.d.ts +1 -1
  85. package/dist/Widen.type.d.ts +1 -1
  86. package/dist/_ext/Array.d.ts +2 -2
  87. package/dist/_ext/Array.d.ts.map +1 -1
  88. package/dist/_ext/Array.js +4 -2
  89. package/dist/_ext/date.d.ts +1 -1
  90. package/dist/_ext/misc.d.ts +5 -2
  91. package/dist/_ext/misc.d.ts.map +1 -1
  92. package/dist/_ext/misc.js +4 -2
  93. package/dist/_ext/ord.ext.d.ts +3 -2
  94. package/dist/_ext/ord.ext.d.ts.map +1 -1
  95. package/dist/_ext/ord.ext.js +2 -2
  96. package/dist/builtin.d.ts +1 -1
  97. package/dist/builtin.d.ts.map +1 -1
  98. package/dist/client/InvalidationKeys.d.ts +29 -0
  99. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  100. package/dist/client/InvalidationKeys.js +33 -0
  101. package/dist/client/apiClientFactory.d.ts +20 -32
  102. package/dist/client/apiClientFactory.d.ts.map +1 -1
  103. package/dist/client/apiClientFactory.js +104 -34
  104. package/dist/client/clientFor.d.ts +51 -17
  105. package/dist/client/clientFor.d.ts.map +1 -1
  106. package/dist/client/clientFor.js +9 -1
  107. package/dist/client/errors.d.ts +49 -25
  108. package/dist/client/errors.d.ts.map +1 -1
  109. package/dist/client/errors.js +43 -17
  110. package/dist/client/makeClient.d.ts +481 -33
  111. package/dist/client/makeClient.d.ts.map +1 -1
  112. package/dist/client/makeClient.js +66 -24
  113. package/dist/client.d.ts +6 -5
  114. package/dist/client.d.ts.map +1 -1
  115. package/dist/client.js +2 -1
  116. package/dist/faker.d.ts +1 -1
  117. package/dist/faker.d.ts.map +1 -1
  118. package/dist/http/Request.d.ts +2 -2
  119. package/dist/http/Request.d.ts.map +1 -1
  120. package/dist/http/Request.js +2 -2
  121. package/dist/http/internal/lib.d.ts +1 -1
  122. package/dist/http.d.ts +1 -1
  123. package/dist/ids.d.ts +40 -12
  124. package/dist/ids.d.ts.map +1 -1
  125. package/dist/ids.js +25 -3
  126. package/dist/index.d.ts +5 -8
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +6 -8
  129. package/dist/logger.d.ts +1 -1
  130. package/dist/middleware.d.ts +14 -8
  131. package/dist/middleware.d.ts.map +1 -1
  132. package/dist/middleware.js +14 -8
  133. package/dist/rpc/Invalidation.d.ts +402 -0
  134. package/dist/rpc/Invalidation.d.ts.map +1 -0
  135. package/dist/rpc/Invalidation.js +150 -0
  136. package/dist/rpc/MiddlewareMaker.d.ts +11 -7
  137. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  138. package/dist/rpc/MiddlewareMaker.js +59 -38
  139. package/dist/rpc/RpcContextMap.d.ts +4 -4
  140. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  141. package/dist/rpc/RpcContextMap.js +4 -4
  142. package/dist/rpc/RpcMiddleware.d.ts +14 -10
  143. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  144. package/dist/rpc/RpcMiddleware.js +1 -1
  145. package/dist/rpc.d.ts +2 -2
  146. package/dist/rpc.d.ts.map +1 -1
  147. package/dist/rpc.js +2 -2
  148. package/dist/transform.d.ts +2 -2
  149. package/dist/transform.d.ts.map +1 -1
  150. package/dist/transform.js +4 -5
  151. package/dist/utils/effectify.d.ts +2 -2
  152. package/dist/utils/effectify.d.ts.map +1 -1
  153. package/dist/utils/effectify.js +2 -2
  154. package/dist/utils/extend.d.ts +1 -1
  155. package/dist/utils/extend.d.ts.map +1 -1
  156. package/dist/utils/gen.d.ts +5 -5
  157. package/dist/utils/gen.d.ts.map +1 -1
  158. package/dist/utils/logLevel.d.ts +3 -3
  159. package/dist/utils/logLevel.d.ts.map +1 -1
  160. package/dist/utils/logger.d.ts +5 -4
  161. package/dist/utils/logger.d.ts.map +1 -1
  162. package/dist/utils/logger.js +4 -4
  163. package/dist/utils.d.ts +40 -45
  164. package/dist/utils.d.ts.map +1 -1
  165. package/dist/utils.js +19 -27
  166. package/dist/validation/validators.d.ts +1 -1
  167. package/dist/validation/validators.d.ts.map +1 -1
  168. package/dist/validation.d.ts +1 -1
  169. package/dist/validation.d.ts.map +1 -1
  170. package/package.json +46 -24
  171. package/src/Array.ts +3 -3
  172. package/src/Config/SecretURL.ts +5 -2
  173. package/src/Config/internal/configSecretURL.ts +1 -1
  174. package/src/Config.ts +14 -0
  175. package/src/ConfigProvider.ts +48 -0
  176. package/src/{ServiceMap.ts → Context.ts} +56 -63
  177. package/src/Effect.ts +13 -14
  178. package/src/Layer.ts +10 -6
  179. package/src/NonEmptySet.ts +3 -1
  180. package/src/Option.ts +2 -0
  181. package/src/Pure.ts +21 -19
  182. package/src/Schema/Class.ts +274 -64
  183. package/src/Schema/SchemaParser.ts +12 -0
  184. package/src/Schema/SpecialJsonSchema.ts +139 -0
  185. package/src/Schema/SpecialOpenApi.ts +130 -0
  186. package/src/Schema/brand.ts +22 -2
  187. package/src/Schema/email.ts +7 -2
  188. package/src/Schema/ext.ts +443 -88
  189. package/src/Schema/moreStrings.ts +93 -37
  190. package/src/Schema/numbers.ts +64 -16
  191. package/src/Schema/phoneNumber.ts +5 -1
  192. package/src/Schema/strings.ts +4 -8
  193. package/src/Schema.ts +374 -10
  194. package/src/Set.ts +5 -1
  195. package/src/_ext/Array.ts +3 -1
  196. package/src/_ext/misc.ts +4 -1
  197. package/src/_ext/ord.ext.ts +2 -1
  198. package/src/client/InvalidationKeys.ts +50 -0
  199. package/src/client/apiClientFactory.ts +230 -131
  200. package/src/client/clientFor.ts +95 -29
  201. package/src/client/errors.ts +52 -26
  202. package/src/client/makeClient.ts +572 -71
  203. package/src/client.ts +5 -4
  204. package/src/http/Request.ts +1 -1
  205. package/src/ids.ts +25 -3
  206. package/src/index.ts +5 -10
  207. package/src/middleware.ts +13 -9
  208. package/src/rpc/Invalidation.ts +226 -0
  209. package/src/rpc/MiddlewareMaker.ts +82 -74
  210. package/src/rpc/README.md +2 -2
  211. package/src/rpc/RpcContextMap.ts +6 -5
  212. package/src/rpc/RpcMiddleware.ts +14 -11
  213. package/src/rpc.ts +1 -1
  214. package/src/transform.ts +3 -3
  215. package/src/utils/effectify.ts +1 -1
  216. package/src/utils/gen.ts +8 -8
  217. package/src/utils/logLevel.ts +1 -1
  218. package/src/utils/logger.ts +4 -3
  219. package/src/utils.ts +62 -139
  220. package/test/dist/rpc.test.d.ts.map +1 -1
  221. package/test/dist/secretURL.test.d.ts.map +1 -0
  222. package/test/dist/special.test.d.ts.map +1 -0
  223. package/test/dist/stream-error.types.d.ts +2 -0
  224. package/test/dist/stream-error.types.d.ts.map +1 -0
  225. package/test/dist/stream-error.types.js +27 -0
  226. package/test/moreStrings.test.ts +1 -1
  227. package/test/rpc.test.ts +46 -6
  228. package/test/schema.test.ts +459 -30
  229. package/test/secretURL.test.ts +160 -0
  230. package/test/special.test.ts +1026 -0
  231. package/test/utils.test.ts +7 -7
  232. package/tsconfig.base.json +6 -5
  233. package/tsconfig.json +2 -1
  234. package/tsconfig.json.bak +2 -2
  235. package/tsconfig.src.json +29 -29
  236. package/tsconfig.test.json +2 -2
  237. package/dist/Operations.d.ts +0 -123
  238. package/dist/Operations.d.ts.map +0 -1
  239. package/dist/Operations.js +0 -29
  240. package/dist/ServiceMap.d.ts +0 -44
  241. package/dist/ServiceMap.d.ts.map +0 -1
  242. package/dist/ServiceMap.js +0 -91
  243. package/eslint.config.mjs +0 -26
  244. package/src/Operations.ts +0 -55
package/CHANGELOG.md CHANGED
@@ -1,5 +1,1065 @@
1
1
  # @effect-app/prelude
2
2
 
3
+ ## 4.0.0-beta.241
4
+
5
+ ### Patch Changes
6
+
7
+ - b035b1c: Isolate per-call `Effect.provide(layers)` / `Stream.provide(layers)` in the
8
+ RPC api client factory via `{ local: true }`.
9
+
10
+ `layers` here is built per RPC invocation from a caller-supplied
11
+ `requestLevelLayers` plus a fresh `RequestName` layer. Today both pieces are
12
+ stateless, so no observable bug — but `Effect.provide(layer)` without
13
+ `local: true` resolves its `MemoMap` from the ambient fiber context, and on a
14
+ long-lived runtime (browser app, server fiber) any stateful layer slipped into
15
+ `requestLevelLayers` by a caller would be memoized and shared across every
16
+ subsequent RPC call. `{ local: true }` builds the layer fresh per call and
17
+ skips the ambient MemoMap entirely.
18
+
19
+ Also documents the rule in `AGENTS.md` ("Per-request `Effect.provide(layer)`
20
+ must isolate its MemoMap") so the pattern is enforceable in code review and
21
+ caught early. Companion to the `provideOnRequestScope` MemoMap fix in
22
+ `@effect-app/infra`.
23
+
24
+ ## 4.0.0-beta.240
25
+
26
+ ## 4.0.0-beta.239
27
+
28
+ ## 4.0.0-beta.238
29
+
30
+ ## 4.0.0-beta.237
31
+
32
+ ## 4.0.0-beta.236
33
+
34
+ ## 4.0.0-beta.235
35
+
36
+ ### Patch Changes
37
+
38
+ - ba4bdc3: improve: support .ts extension
39
+ - 6cfd83d: update effect to latest beta
40
+
41
+ ## 4.0.0-beta.234
42
+
43
+ ## 4.0.0-beta.233
44
+
45
+ ### Patch Changes
46
+
47
+ - 57a1862: Update to effect 4.0.0-beta.67. Switch deps from `pkg.pr.new` snapshot back to npm beta tag.
48
+
49
+ ## 4.0.0-beta.232
50
+
51
+ ### Patch Changes
52
+
53
+ - 0263827: Fix `Date` / `DateValid` default helpers to pipe from their own schema.
54
+
55
+ `withConstructorDefault` and `withDecodingDefaultType` on `DateValid` previously piped from `DateFromString`, dropping the `isDateValid()` check (and, after the recent identifier split, the `DateValid` annotations) from the resulting defaulted schema. Both `Date` and `DateValid` now use `extendM` so the helpers attach to the underlying schema (`DateFromString` / `DateValidFromString`).
56
+
57
+ - 0263827: Distinguish `Date` and `DateValid` in JSON Schema output.
58
+
59
+ - `Date` now emits identifier `DateOrInvalid` with description noting the value may be invalid.
60
+ - `DateValid` now emits its own annotated string (identifier `Date`) with description stating a valid ISO 8601 date is required.
61
+
62
+ - 0263827: Update to effect `pkg.pr.new` snapshot at `a42ef66` (4.0.0-beta.66). Remove `Yieldable` and `asEffect()` (service tags are now `Effect` directly).
63
+
64
+ ## 4.0.0-beta.231
65
+
66
+ ### Patch Changes
67
+
68
+ - 7ca66ce: Update to effect 4.0.0-beta.66. Remove `Yieldable` and `asEffect()` (service tags are now `Effect` directly).
69
+
70
+ ## 4.0.0-beta.230
71
+
72
+ ## 4.0.0-beta.229
73
+
74
+ ## 4.0.0-beta.228
75
+
76
+ ## 4.0.0-beta.227
77
+
78
+ ## 4.0.0-beta.226
79
+
80
+ ## 4.0.0-beta.225
81
+
82
+ ## 4.0.0-beta.224
83
+
84
+ ## 4.0.0-beta.223
85
+
86
+ ## 4.0.0-beta.222
87
+
88
+ ## 4.0.0-beta.221
89
+
90
+ ### Patch Changes
91
+
92
+ - 439cbeb: Adopt module system from effect-smol: replace barrel imports with specific submodule imports (`import * as X from "effect-app/X"` / `import * as X from "effect/X"`).
93
+
94
+ ## 4.0.0-beta.220
95
+
96
+ ## 4.0.0-beta.219
97
+
98
+ ### Patch Changes
99
+
100
+ - d738811: remove double prefix
101
+
102
+ ## 4.0.0-beta.218
103
+
104
+ ## 4.0.0-beta.217
105
+
106
+ ### Patch Changes
107
+
108
+ - 0e824ef: add missing Brand
109
+
110
+ ## 4.0.0-beta.216
111
+
112
+ ## 4.0.0-beta.215
113
+
114
+ ## 4.0.0-beta.214
115
+
116
+ ## 4.0.0-beta.213
117
+
118
+ ## 4.0.0-beta.212
119
+
120
+ ### Patch Changes
121
+
122
+ - 8792221: Rename `withDefault` schema extensions to `withConstructorDefault` for clarity.
123
+
124
+ Document that `.withConstructorDefault` is **construction-only** (applied during `.make(...)` when a field is omitted) and is **not** applied during decode — it cannot be used to JIT-migrate database fields. Per-property JSDoc on every `.withConstructorDefault` / `.withDecodingDefaultType` exposed by `Schema/ext.ts`, `Schema/numbers.ts`, `Schema/moreStrings.ts`, and `ids.ts` so the caveat is visible on hover.
125
+
126
+ Re-export `withConstructorDefault`, `withDecodingDefault`, `withDecodingDefaultKey`, `withDecodingDefaultType`, and `withDecodingDefaultTypeKey` from `effect-app/Schema` with explicit JSDoc. `withDecodingDefault*` is discouraged for persisted data: a missing field may be data corruption rather than an old-shape document, and silently substituting a default hides the problem. Prefer an explicit, preferably versioned migration of database data over decode-time fallbacks.
127
+
128
+ ## 4.0.0-beta.211
129
+
130
+ ## 4.0.0-beta.210
131
+
132
+ ## 4.0.0-beta.209
133
+
134
+ ### Patch Changes
135
+
136
+ - c991be1: update packages
137
+ - 3bae238: Remove lodash type imports from utils.ts, replacing with native TypeScript equivalents.
138
+
139
+ ## 4.0.0-beta.208
140
+
141
+ ## 4.0.0-beta.207
142
+
143
+ ### Patch Changes
144
+
145
+ - 8fffc3c: cleanup
146
+
147
+ ## 4.0.0-beta.206
148
+
149
+ ### Patch Changes
150
+
151
+ - 54bfc59: Require middleware to flow through `makeRpcClient` and the live layer through `makeRouter`.
152
+
153
+ ### `makeRpcClient(middleware, generalErrors?)`
154
+
155
+ Signature drops the `rcs` (request-context map wrapper) parameter. `rcs` was only load-bearing on the type side for `RequestConfig` inference; that information is now derived from `middleware.requestContextMap`. `middleware` is required — the previous "rcs + optional middleware" overload is gone.
156
+
157
+ **Migration**:
158
+
159
+ ```diff
160
+ -makeRpcClient(RequestContextMap, undefined, AppMiddleware)
161
+ +makeRpcClient(AppMiddleware)
162
+ ```
163
+
164
+ For tests/clients without a real middleware, build a minimal stub (`{ requestContextMap, requestContext }`) or pass any value satisfying `ClientMiddleware<RCM>`.
165
+
166
+ ### `makeRouter(middlewareLive)`
167
+
168
+ `makeRouter()` no longer infers the live middleware layer from `meta.middleware.Default`. The Live layer is now passed explicitly to `makeRouter`, and the request classes only carry the middleware tag (schema-only). This decouples the router from any assumption that the middleware tag exposes a `Default` static.
169
+
170
+ **Migration**:
171
+
172
+ ```diff
173
+ -export const { Router, matchAll } = makeRouter()
174
+ +export const { Router, matchAll } = makeRouter(AppMiddleware.Default)
175
+ ```
176
+
177
+ ## 4.0.0-beta.205
178
+
179
+ ### Patch Changes
180
+
181
+ - f313973: fix type make interface
182
+
183
+ ## 4.0.0-beta.204
184
+
185
+ ### Patch Changes
186
+
187
+ - 0a0030f: fix missing overloads
188
+
189
+ ## 4.0.0-beta.203
190
+
191
+ ### Patch Changes
192
+
193
+ - 992d9fa: fix more branded types
194
+
195
+ ## 4.0.0-beta.202
196
+
197
+ ### Patch Changes
198
+
199
+ - 1186b09: improve branded types, keep types through Rebuild
200
+
201
+ ## 4.0.0-beta.201
202
+
203
+ ### Patch Changes
204
+
205
+ - d67d17a: Source middleware errors exclusively from the rpc middleware tag, and move command/stream invalidation wrap/unwrap entirely into the routing layer (server) and `apiClientFactory` (client). `InvalidationMiddleware` and `InvalidationMiddlewareLive` are removed.
206
+
207
+ ### Resource error schemas
208
+
209
+ Three sites that used to fold `RequestContextMap[*].error` into a request's own error schema now stop doing so:
210
+
211
+ - `makeRpcClient` / `makeRequestClass` — `failureSchema` is just `config.error` (still merged with the optional `generalErrors` parameter, which is the only remaining error mix on both type and runtime levels).
212
+ - `MiddlewareMaker.rpc()` — `error: options.error` only; the previous union with `rcm.config[*].error` is gone.
213
+ - Routing and `apiClientFactory.makeRpcGroupFromRequestsAndModuleName` — `Invalidation.makeCommandRpc` is called with `error: resource.error` (no widening with the composite middleware error union).
214
+
215
+ Middleware errors reach the client through the rpc's `middlewares[*].error` failure-union channel of `Rpc.exitSchema`, exposed by attaching the middleware tag to the rpc on both sides:
216
+
217
+ - **Server**: `makeRouter(middleware)` attaches the live composite tag (existing behavior).
218
+ - **Client**: new `middleware` option on `ClientForOptions` / `ApiClientFactory.makeFor(layer, { middleware })` attaches the same tag schema-only (no Live invoked). Threaded through `makeRpcGroupFromRequestsAndModuleName` to `RpcGroup.middleware(tag)`. Without it, stream rpcs (whose top-level `errorSchema` is forced to `Never` by effect-rpc) hit `SchemaError: Expected never | { _tag: "error", ... }` decoding middleware-thrown errors that bypass the in-stream `Stream.catch` wrap.
219
+
220
+ **Migration**: handlers that yield errors previously sourced from rcm (e.g. `yield* new UnauthorizedError()`) now require those errors to be declared explicitly on the resource — `Req.Query<T>()("...", fields, { success, error: UnauthorizedError })`. The handler error type no longer auto-includes the rcm union.
221
+
222
+ ### Invalidation wrap/unwrap
223
+
224
+ - `routing.ts` (server) provides a per-request `InvalidationSet` for commands, wraps the success value as `CommandResponseWithMetaData`, and converts handler-thrown failures into `CommandFailureWithMetaData` so accumulated invalidation keys reach the client on either path. Stream wrap (per-chunk envelope + final `done` chunk) was already in routing and is unchanged.
225
+ - `apiClientFactory.ts` (client) `unwrapCommand` strips both envelopes and forwards keys to `InvalidationKeysFromServer`.
226
+ - `InvalidationMiddleware` (the tag) and `InvalidationMiddlewareLive` (the layer) are **removed**. The middleware was the previous home of the wrap; with the wrap moved to routing/apiClientFactory, the middleware became a thin pass-through and is no longer needed. `DefaultGenericMiddlewares` and `DefaultGenericMiddlewaresLive` shrink accordingly — no migration needed for callers that used the defaults; callers that referenced `InvalidationMiddleware` / `InvalidationMiddlewareLive` directly should drop those imports.
227
+
228
+ Middleware-thrown errors are never wrapped: by definition the handler never ran, so there is nothing to invalidate. They flow raw on the Cause and the client decodes them via the middleware-tag failure-union channel described above.
229
+
230
+ ## 4.0.0-beta.200
231
+
232
+ ### Patch Changes
233
+
234
+ - 8f1cf6a: able to configure schema concurrency
235
+ - 0cff7c1: workaround middleware error issue
236
+
237
+ ## 4.0.0-beta.199
238
+
239
+ ## 4.0.0-beta.198
240
+
241
+ ### Patch Changes
242
+
243
+ - 32dbc54: fix stream type when no success specified
244
+
245
+ ## 4.0.0-beta.197
246
+
247
+ ### Minor Changes
248
+
249
+ - 3dc0d2a: Add streaming as a `stream: true` config option on `Query` / `Command` instead of a separate request type.
250
+
251
+ `TaggedRequestFor` now exposes only `Query` and `Command` factories — the standalone `Stream` factory is removed. To produce a Stream of `success` values, pass `stream: true` in the request config. The request `type` field stays `"command" | "query"`; a new `stream: boolean` field carries the streaming flag (stripped from the stored handler config).
252
+
253
+ ```ts
254
+ // Query that streams results
255
+ Req.Query<T>()("Tag", {}, { stream: true, success: ... })
256
+
257
+ // Command that streams results
258
+ Req.Command<T>()("Tag", {}, { stream: true, success: ... })
259
+ ```
260
+
261
+ Vue client mapping (per-handler properties mirror the non-stream API — `.query`, `.fn`, `.mutate`):
262
+
263
+ - `query` + `stream: true` → exposes `.query` (read-only streaming, tracked Vue Query). Helper map key: `${name}Query`.
264
+ - `command` + `stream: true` → exposes `.fn` and `.mutate` (mutating streaming).
265
+ - Plain `query` / `command` unchanged.
266
+
267
+ Server routing dispatches via the new `stream` flag (`makeStreamRpc` for streaming commands/queries, `makeCommandRpc` / `Rpc.make` otherwise).
268
+
269
+ Also lifts the `Struct` / `TaggedStruct` and `Opaque` definitions in `effect-app/Schema` to use `S.Bottom` / `S.Opaque` directly, exposing `fields`, `mapFields`, and a `MakeIn` that allows `void` when all fields are optional. `TaggedRequestFor` request classes now use `Opaque(TaggedStruct(...))` instead of `TaggedClass`, and decoding/encoding services are derived from `success` / `error` rather than stored on the request.
270
+
271
+ **Migration**: replace `Req.Stream` with `Req.Query` or `Req.Command` and add `stream: true` to the config — `Query` for read-only streams, `Command` for mutating streams.
272
+
273
+ ## 4.0.0-beta.196
274
+
275
+ ## 4.0.0-beta.195
276
+
277
+ ### Patch Changes
278
+
279
+ - 774a9b3: `MiddlewareMaker.makeMiddlewareBasic` now derives each middleware's effective error from both the static `error` field on the tag AND the `rcm` config entry referenced by `dynamic.key`, rather than relying on the static field alone.
280
+
281
+ Middlewares declared with `dynamic: RequestContextMap.get("foo")` (instead of an explicit static `error: ...`) end up with `tag.error = Schema.Never` at runtime — `RpcMiddleware.Tag` defaults the static error to `Never` when not provided. The composite `MiddlewareMaker.Tag(...).middleware(...)` walked `make[*].error` to build its own error union, collapsing to `Union<Never, ...> ≡ Never`.
282
+
283
+ `Rpc.exitSchema` walks `rpc.middlewares[*].error` when building the wire-level failure union for every rpc kind. Empty-union meant middleware-thrown errors (`NotLoggedInError`, `UnauthorizedError`, etc.) never reached the wire schema. Query/command happened to work because their wire `errorSchema = resource.error` already covered the merge from `makeRpcClient`. Stream rpcs have `errorSchema` force-set to `Schema.Never` by effect-rpc, so the resource-level merge never reached the wire — middleware errors decoded as "Expected never, got X".
284
+
285
+ Per middleware, the new logic pushes both the static `_.error` (if non-`Never`) and `rcm[_.dynamic.key].error` (if non-`Never`) into the composite's failure union.
286
+
287
+ ## 4.0.0-beta.194
288
+
289
+ ## 4.0.0-beta.193
290
+
291
+ ## 4.0.0-beta.192
292
+
293
+ ## 4.0.0-beta.191
294
+
295
+ ### Patch Changes
296
+
297
+ - 50ce7e6: Replace typescript-eslint with oxlint-tsgolint for type-aware lint. Drop ESLint entirely from non-vue packages (cli, effect-app, infra) — they now use only `oxlint --type-aware`. Vue packages keep ESLint to run `@effect-app/no-await-effect` (no tsgolint equivalent) via `@typescript-eslint/parser` + `vue-eslint-parser`.
298
+
299
+ ## 4.0.0-beta.190
300
+
301
+ ### Patch Changes
302
+
303
+ - 985176b: Align request handler input typing with the request's `make` signature. Handlers are now classified as no-input only when the request schema declares no payload fields; any payload (even fully-optional) yields a function handler whose input matches `make`'s first parameter. Adds `HandlerInput<I>` and threads it through `CommandFromRequest`.
304
+
305
+ ## 4.0.0-beta.189
306
+
307
+ ### Patch Changes
308
+
309
+ - ea32222: Update to effect 4.0.0-beta.60 and use native `Rpc.custom` constructors (`makeCommandRpc`, `makeStreamRpc`) for metadata-wrapped RPC schemas instead of manually wrapping/unwrapping schemas inline.
310
+
311
+ ## 4.0.0-beta.188
312
+
313
+ ### Patch Changes
314
+
315
+ - b2e438f: Remove Operations service and repo
316
+
317
+ ## 4.0.0-beta.187
318
+
319
+ ### Patch Changes
320
+
321
+ - 0d4e0b8: Fix `isGeneratorFunction` using `isObject` instead of `isFunction`: generator functions have `typeof === "function"`, not `"object"`, so the check always returned `false`. This caused `Command.streamFn` generator-form handlers to silently pass a raw `Generator` object rather than an `Effect<Stream>`, meaning the mutation was never executed.
322
+
323
+ ## 4.0.0-beta.186
324
+
325
+ ## 4.0.0-beta.185
326
+
327
+ ## 4.0.0-beta.184
328
+
329
+ ## 4.0.0-beta.183
330
+
331
+ ## 4.0.0-beta.182
332
+
333
+ ## 4.0.0-beta.181
334
+
335
+ ### Patch Changes
336
+
337
+ - 583393f: Default the stream `mutateStream` execute resolved value to the request's success type when no `final` schema is declared.
338
+
339
+ Previously the type defaulted to `void`, but the runtime already resolves with the last emitted value. Types now match runtime behaviour: `execute` returns `Final` if a `final` schema is set, otherwise the success type.
340
+
341
+ ## 4.0.0-beta.180
342
+
343
+ ### Minor Changes
344
+
345
+ - 7fa3045: V1/V2/V3: stream and command requests carry invalidation metadata
346
+
347
+ **V1** – stream final response includes metadata
348
+
349
+ - `Invalidation.StreamResponseChunk` wraps each stream item as `{ _tag: "value", value }` and appends `{ _tag: "done", metadata }` at the end carrying all accumulated invalidation keys.
350
+
351
+ **V2** – invalidation keys included in failures
352
+
353
+ - `Invalidation.CommandFailureWithMetaData` and `Invalidation.StreamFailureChunk` carry keys accumulated up to the point of failure, so clients can invalidate queries even when a command or stream errors.
354
+ - `InvalidationMiddlewareLive` wraps command failures; `routing.ts` wraps stream failures.
355
+ - `apiClientFactory.ts` unwraps both on the client side, forwarding keys before re-failing with the original error.
356
+
357
+ **V3** – mid-stream metadata chunks
358
+
359
+ - `Invalidation.StreamResponseChunk` now also includes `{ _tag: "metadata", metadata }` for mid-stream invalidation.
360
+ - After each emitted value, the server drains accumulated keys and emits a "metadata" chunk if any keys were collected since the last drain (bucket reset via `InvalidationSet.drain`).
361
+ - `apiClientFactory.ts` processes "metadata" chunks the same as "done" chunks, forwarding keys to `InvalidationKeysFromServer` immediately.
362
+ - `makeInvalidationKeysService` accepts an optional `onAdded` callback that fires after each key addition, enabling `mutate.ts` to trigger query invalidation mid-stream without waiting for the stream to complete.
363
+
364
+ ## 4.0.0-beta.179
365
+
366
+ ### Minor Changes
367
+
368
+ - 828d264: Stream requests now support an optional `final` schema that models the final success type of the stream. When declared, `mutateStream`'s execute effect resolves with the last emitted value typed as `Final` instead of `void`.
369
+
370
+ ```ts
371
+ class MyStream extends SomethingStream<MyStream>()(
372
+ "MyStream",
373
+ { id: S.String },
374
+ {
375
+ success: S.Union([OperationProgress, ExportComplete]),
376
+ final: ExportComplete, // execute now resolves with ExportComplete
377
+ }
378
+ ) {}
379
+ ```
380
+
381
+ ## 4.0.0-beta.178
382
+
383
+ ## 4.0.0-beta.177
384
+
385
+ ### Minor Changes
386
+
387
+ - 89d8b3a: Add Effect RPC `Stream` support to the wrapper.
388
+
389
+ - New `Stream` request constructor on `TaggedRequestFor` parallel to `Query`/`Command`. Emits resources with `type: "stream"`.
390
+ - Server router (`@effect-app/infra` `routing.ts`) accepts stream resources whose handlers return a `Stream.Stream<A, E, R>` (or a function from input to one). Forwards `stream: true` to `Rpc.make` so `RpcSchema.Stream` wrapping is applied. Streams bypass `applyRequestTypeInterruptibility` and the `Effect.withSpan` wrapping (the RPC server adds its own span).
391
+ - Client (`apiClientFactory.ts`) detects stream resources, forwards `stream: true` when constructing `RpcGroup`, and exposes the per-request `handler` as a `Stream.Stream` (via `Stream.unwrap` over the `ManagedRuntime` context) instead of an `Effect`. `Invalidation.CommandResponseWithMetaData` continues to apply only to commands.
392
+ - New `RequestStreamHandler` / `RequestStreamHandlerWithInput` shapes in `clientFor.ts`; `RequestHandlers` dispatches on `type: "stream"`.
393
+
394
+ ## 4.0.0-beta.176
395
+
396
+ ### Patch Changes
397
+
398
+ - pass options
399
+
400
+ ## 4.0.0-beta.175
401
+
402
+ ## 4.0.0-beta.174
403
+
404
+ ### Minor Changes
405
+
406
+ - 821468d: Add server-driven cache invalidation via RPC response headers.
407
+
408
+ - `effect-app/rpc`: new `Invalidation` module with `InvalidationKey` / `InvalidationKeys` schemas, `Invalidates` annotation (for declaring static invalidation on Rpc definitions), `InvalidationSet` reference (request-scoped accumulator), and `makeInvalidationSet` helper.
409
+ - `effect-app/middleware`: new `InvalidationMiddleware` RPC middleware tag; included in `DefaultGenericMiddlewares`.
410
+ - `effect-app/client`: new `InvalidationKeys` module with `InvalidationKeysFromServer` reference and `makeInvalidationKeysService` helper; `apiClientFactory` now taps HTTP responses to read the `x-invalidate` header and forward keys to `InvalidationKeysFromServer`.
411
+ - `@effect-app/infra`: new `InvalidationMiddlewareLive` RPC middleware implementation that owns the full lifecycle — creates a request-scoped `InvalidationSet` (backed by a `Ref`), pre-populates it from the `Invalidates` annotation, provides it to the handler, and after the handler completes registers an HTTP pre-response handler (via `appendPreResponseHandlerUnsafe`) to write the accumulated keys as an `x-invalidate` response header. No separate HTTP middleware is needed.
412
+ - `@effect-app/vue`: `invalidateQueries` / `useMutation` now reads server-provided invalidation keys from `InvalidationKeysFromServer` after each mutation and applies them alongside the client-side invalidation.
413
+
414
+ ## 4.0.0-beta.173
415
+
416
+ ## 4.0.0-beta.172
417
+
418
+ ## 4.0.0-beta.171
419
+
420
+ ### Patch Changes
421
+
422
+ - d71d976: fix
423
+
424
+ ## 4.0.0-beta.170
425
+
426
+ ### Patch Changes
427
+
428
+ - 8f09f77: fix
429
+
430
+ ## 4.0.0-beta.169
431
+
432
+ ### Patch Changes
433
+
434
+ - 8ae8b53: input mess
435
+
436
+ ## 4.0.0-beta.168
437
+
438
+ ### Patch Changes
439
+
440
+ - 178480a: Fix request handler input classification to use request schema fields instead of `make` parameters, preventing defaulted/nullable input fields from being treated as no-input handlers.
441
+
442
+ ## 4.0.0-beta.167
443
+
444
+ ### Patch Changes
445
+
446
+ - 140e192: Relax invalidation resource value constraints to allow arbitrary values while preserving query-only filtering in invalidation handling.
447
+
448
+ ## 4.0.0-beta.166
449
+
450
+ ### Patch Changes
451
+
452
+ - dbcc53b: Refactor command invalidation typing: declare resources via `Command<Self, Resources>()`, pass `invalidatesQueries` as the optional 4th argument, and enforce exact `clientFor` invalidation resources when required.
453
+
454
+ ## 4.0.0-beta.165
455
+
456
+ ### Minor Changes
457
+
458
+ - f88ea34: Move `makeQueryKey` into `effect-app/client` and update Vue source and tests to import it from the shared client module. Vue still re-exports `makeQueryKey` from `src/lib` for compatibility.
459
+
460
+ ## 4.0.0-beta.164
461
+
462
+ ### Minor Changes
463
+
464
+ - 8cb3de4: Add command invalidation helpers that preserve query-only resource types and pass mutation input and `Exit` results into invalidation callbacks. Update Vue `clientFor` to merge request-level invalidation config with call-site invalidation and require matching invalidation resources.
465
+
466
+ ## 4.0.0-beta.163
467
+
468
+ ### Patch Changes
469
+
470
+ - b952f19: bye cruft
471
+
472
+ ## 4.0.0-beta.162
473
+
474
+ ### Patch Changes
475
+
476
+ - b52b424: restore annotations for now
477
+
478
+ ## 4.0.0-beta.161
479
+
480
+ ## 4.0.0-beta.160
481
+
482
+ ### Patch Changes
483
+
484
+ - 505bfa9: Add concurrent decode helper APIs and migrate decode callsites to use them.
485
+
486
+ - Add `withDefaultParseOptions` and keep `DefaultParseOptions` centralized.
487
+ - Export `decodeEffectConcurrently` and `decodeUnknownEffectConcurrently` from Schema and SchemaParser modules.
488
+ - Update repository, queue, client, form, and CLI decode paths to use concurrent decode helpers.
489
+ - Keep schema constructors free of hardcoded parse concurrency overrides.
490
+
491
+ ## 4.0.0-beta.159
492
+
493
+ ### Patch Changes
494
+
495
+ - c1e73de:
496
+
497
+ ## 4.0.0-beta.158
498
+
499
+ ### Patch Changes
500
+
501
+ - 3c1f52d: improve: class strictness enabled by default again, allow `strict: false` as opt out for now.
502
+ - 6ae3050: Preserve class annotation parseOptions in relaxed declaration struct decoding so custom parse options (including concurrency defaults) are applied consistently.
503
+
504
+ ## 4.0.0-beta.157
505
+
506
+ ### Patch Changes
507
+
508
+ - 6fff09c: unify encoded function for when you use encodedKeys
509
+
510
+ ## 4.0.0-beta.156
511
+
512
+ ## 4.0.0-beta.155
513
+
514
+ ### Patch Changes
515
+
516
+ - c215db8: align TaggedUnion with array arg
517
+
518
+ ## 4.0.0-beta.154
519
+
520
+ ## 4.0.0-beta.153
521
+
522
+ ## 4.0.0-beta.152
523
+
524
+ ## 4.0.0-beta.151
525
+
526
+ ## 4.0.0-beta.150
527
+
528
+ ### Patch Changes
529
+
530
+ - 85a8275: Expose `make`, `makeOption`, and `makeEffect` static helpers on request classes created via `Query`/`Command`.
531
+
532
+ ## 4.0.0-beta.149
533
+
534
+ ### Patch Changes
535
+
536
+ - f317c5e: Preserve omitted-input make helpers through Schema.Opaque when the wrapped schema allows optional or default-only constructor input.
537
+
538
+ ## 4.0.0-beta.148
539
+
540
+ ### Patch Changes
541
+
542
+ - 199e9a5: Allow Struct and TaggedStruct make helpers to omit input when every constructor field is optional or defaulted, and preserve widening copy typings through a lighter named public type to improve TypeScript editor responsiveness.
543
+
544
+ ## 4.0.0-beta.147
545
+
546
+ ### Patch Changes
547
+
548
+ - 47e3742: Preserve Struct.copy through `annotate`, `annotateKey`, and `mapFields` chains, and add tests covering chained copy behavior on Struct schemas.
549
+
550
+ ## 4.0.0-beta.146
551
+
552
+ ### Patch Changes
553
+
554
+ - a4dff57: Adjust Struct and TaggedStruct copy typing to follow class-style widening constraints while keeping structural copy runtime behavior.
555
+
556
+ ## 4.0.0-beta.145
557
+
558
+ ### Patch Changes
559
+
560
+ - 12abb55: Refine schema copy behavior by keeping class copy constructor-based while using structural copy for Struct and TaggedStruct helpers.
561
+
562
+ ## 4.0.0-beta.144
563
+
564
+ ### Patch Changes
565
+
566
+ - 11422f8: Update request helper typing and runtime invocation to rely on schema `.make` instead of class constructors, avoiding `new`-based assumptions for request schemas.
567
+ - d31253f: Refactor eligible schema classes and tagged classes to Opaque schemas, and migrate constructor call sites to use `.make` for those models.
568
+
569
+ ## 4.0.0-beta.143
570
+
571
+ ### Patch Changes
572
+
573
+ - 79eb019: Remove redundant schema `title` annotations when they duplicate the schema `identifier`.
574
+
575
+ ## 4.0.0-beta.142
576
+
577
+ ### Minor Changes
578
+
579
+ - 025de47: Fold the encoded-override support from `ExtendedClass` and `ExtendedTaggedClass` into `Class`, `TaggedClass`, `ErrorClass`, and `TaggedErrorClass`, and update model codegen to detect the new second-generic form.
580
+
581
+ ### Patch Changes
582
+
583
+ - 3436d44: Extend `Schema.Opaque` in `effect-app/Schema` to support an optional encoded-type generic while preserving the original single-generic behavior.
584
+
585
+ ## 4.0.0-beta.141
586
+
587
+ ### Patch Changes
588
+
589
+ - 7c25dbb: Add relaxed wrapper support for `ErrorClass` and `TaggedErrorClass` in `effect-app/Schema`, matching the existing class wrapper behavior (`copy`, cached `ast`, and unbounded parse concurrency).
590
+
591
+ ## 4.0.0-beta.140
592
+
593
+ ## 4.0.0-beta.139
594
+
595
+ ## 4.0.0-beta.138
596
+
597
+ ## 4.0.0-beta.137
598
+
599
+ ## 4.0.0-beta.136
600
+
601
+ ## 4.0.0-beta.135
602
+
603
+ ### Patch Changes
604
+
605
+ - c7bbc41: fix - class should check type side
606
+
607
+ ## 4.0.0-beta.134
608
+
609
+ ### Patch Changes
610
+
611
+ - 9d3495e: Preserve field-level schema decode errors for relaxed Class and TaggedClass declarations so decode failures report nested constraints (for example min-length violations) instead of only a generic class-type mismatch.
612
+ - f353d48: Rename the Class/TaggedClass relaxed declaration option to `strict` (default `false`) and apply it to `Class`, `TaggedClass`, `ExtendedClass`, and `ExtendedTaggedClass`.
613
+
614
+ When `strict: true`, class decoding keeps strict class-level declaration behavior; by default, decoding remains relaxed and preserves field-level schema errors.
615
+
616
+ ## 4.0.0-beta.133
617
+
618
+ ### Patch Changes
619
+
620
+ - c3299f7: update packages
621
+
622
+ ## 4.0.0-beta.132
623
+
624
+ ## 4.0.0-beta.131
625
+
626
+ ## 4.0.0-beta.130
627
+
628
+ ### Patch Changes
629
+
630
+ - ea1bd46: fix: prevent expansion of nominal brands
631
+
632
+ ## 4.0.0-beta.129
633
+
634
+ ## 4.0.0-beta.128
635
+
636
+ ### Patch Changes
637
+
638
+ - 57db551: Split `TaggedRequestFor` into `Query` and `Command` factories, and mark generated request classes with `type: "query" | "command"`.
639
+
640
+ Vue client helpers now expose query-only helpers (`query`, `suspense`, `fetch`) for query requests and mutation-only helpers (`mutate`, `fetch`) for command requests.
641
+
642
+ ## 4.0.0-beta.127
643
+
644
+ ## 4.0.0-beta.126
645
+
646
+ ### Patch Changes
647
+
648
+ - 458bb1b: fix type
649
+
650
+ ## 4.0.0-beta.125
651
+
652
+ ## 4.0.0-beta.124
653
+
654
+ ### Patch Changes
655
+
656
+ - 256ae85: cleanup
657
+
658
+ ## 4.0.0-beta.123
659
+
660
+ ### Patch Changes
661
+
662
+ - 14aba14: fix: clientFor
663
+
664
+ ## 4.0.0-beta.122
665
+
666
+ ### Patch Changes
667
+
668
+ - f052d38: Replace `(...) => Effect.gen` with `Effect.fnUntraced` in `apiClientFactory`.
669
+
670
+ ## 4.0.0-beta.121
671
+
672
+ ### Patch Changes
673
+
674
+ - 5ac46cb: Make `Schema.provide` dual (pipeable)
675
+
676
+ ## 4.0.0-beta.120
677
+
678
+ ### Minor Changes
679
+
680
+ - f21190c: Add `copy` property to `Class` and `TaggedClass` for creating modified instances with updated fields. The `copy` method is cached per-class and supports both object and function-based updates, with pipeline support.
681
+
682
+ ## 4.0.0-beta.119
683
+
684
+ ## 4.0.0-beta.118
685
+
686
+ ### Minor Changes
687
+
688
+ - 08d2e70: Add `concurrency: "unbounded"` parseOptions annotation to Schema constructors (Struct, Array, NonEmptyArray, Record, TaggedStruct, ReadonlySet, ReadonlyMap, Class, TaggedClass) so all encode/decode operations automatically run with unbounded concurrency. Also override `mapFields` on Struct and Class/TaggedClass to preserve the annotation.
689
+
690
+ ### Patch Changes
691
+
692
+ - bd26832: Add nested anyOf flattening to JSON Schema post-processing
693
+ - Update effect packages to 4.0.0-beta.52
694
+
695
+ ## 4.0.0-beta.117
696
+
697
+ ## 4.0.0-beta.116
698
+
699
+ ## 4.0.0-beta.115
700
+
701
+ ## 4.0.0-beta.114
702
+
703
+ ## 4.0.0-beta.113
704
+
705
+ ## 4.0.0-beta.112
706
+
707
+ ## 4.0.0-beta.111
708
+
709
+ ### Patch Changes
710
+
711
+ - ca94edf: fix typo
712
+
713
+ ## 4.0.0-beta.110
714
+
715
+ ## 4.0.0-beta.109
716
+
717
+ ## 4.0.0-beta.108
718
+
719
+ ### Patch Changes
720
+
721
+ - 3e46e7b: allow excess props in openapi schemas
722
+
723
+ ## 4.0.0-beta.107
724
+
725
+ ## 4.0.0-beta.106
726
+
727
+ ## 4.0.0-beta.105
728
+
729
+ ## 4.0.0-beta.104
730
+
731
+ ### Minor Changes
732
+
733
+ - e944bca: Add `generateGuards` and `generateGuardsFor` to `TaggedUnion` / `ExtendTaggedUnion` for property-scoped type guards.
734
+
735
+ - `generateGuards("key")` — generic per-guard, no need to specify the container type
736
+ - `generateGuardsFor<A>()("key")` — curried, fixes `A` for concrete guard signatures
737
+
738
+ Both return `{ is{Tag}, isAnyOf }` guards that narrow the container type by its tagged union property.
739
+
740
+ ## 4.0.0-beta.103
741
+
742
+ ### Minor Changes
743
+
744
+ - 7119320: Add `generateGuards` to `TaggedUnion` / `ExtendTaggedUnion` for generating property-scoped type guards.
745
+
746
+ Usage: `MyUnion.generateGuards<MyType>()("propertyKey")` returns `{ is{Tag}, isAnyOf }` guards that narrow the container type by its tagged union property.
747
+
748
+ ## 4.0.0-beta.102
749
+
750
+ ## 4.0.0-beta.101
751
+
752
+ ## 4.0.0-beta.100
753
+
754
+ ## 4.0.0-beta.99
755
+
756
+ ## 4.0.0-beta.98
757
+
758
+ ## 4.0.0-beta.97
759
+
760
+ ## 4.0.0-beta.96
761
+
762
+ ### Patch Changes
763
+
764
+ - 5615e47: bs
765
+
766
+ ## 4.0.0-beta.95
767
+
768
+ ### Patch Changes
769
+
770
+ - 88838fb: Remove pick/omit customizations from Class/TaggedClass/Struct/TaggedStruct. Use `Struct.pick(X.fields, [...])` from `effect-app` instead.
771
+
772
+ ## 4.0.0-beta.94
773
+
774
+ ## 4.0.0-beta.93
775
+
776
+ ## 4.0.0-beta.92
777
+
778
+ ## 4.0.0-beta.91
779
+
780
+ ### Minor Changes
781
+
782
+ - 738b482: Add pick/omit to Struct and TaggedStruct
783
+
784
+ ## 4.0.0-beta.90
785
+
786
+ ## 4.0.0-beta.89
787
+
788
+ ## 4.0.0-beta.88
789
+
790
+ ## 4.0.0-beta.87
791
+
792
+ ## 4.0.0-beta.86
793
+
794
+ ## 4.0.0-beta.85
795
+
796
+ ## 4.0.0-beta.84
797
+
798
+ ## 4.0.0-beta.83
799
+
800
+ ## 4.0.0-beta.82
801
+
802
+ ## 4.0.0-beta.81
803
+
804
+ ## 4.0.0-beta.80
805
+
806
+ ## 4.0.0-beta.79
807
+
808
+ ### Minor Changes
809
+
810
+ - d16845e: Remove `TaggedRequest` from `makeRpcClient`, now only `TaggedRequestFor` is returned. Remove all legacy `meta.moduleName` support — `id` and `moduleName` are now required on `Req` type. Remove `makeRpcGroup` (use `makeRpcGroupFromRequestsAndModuleName` instead).
811
+
812
+ ## 4.0.0-beta.78
813
+
814
+ ## 4.0.0-beta.77
815
+
816
+ ### Minor Changes
817
+
818
+ - 3613e87: Add `TaggedRequestFor` helper to `makeRpcClient` that curries a `moduleName`, producing request classes with static `id` and `moduleName` properties. This enables passing request classes directly to `makeQueryKey` without going through `clientFor` first. The `clientFor` function no longer requires a `meta` property on the module when requests carry `moduleName`. The meta codegen preset now generates `Req = TaggedRequestFor(moduleName)`. Original `TaggedRequest` remains for backwards compatibility.
819
+
820
+ ## 4.0.0-beta.76
821
+
822
+ ### Patch Changes
823
+
824
+ - a5248a9: use new schema features
825
+ - fac725d: update effect to latest beta
826
+
827
+ ## 4.0.0-beta.75
828
+
829
+ ### Patch Changes
830
+
831
+ - 24f0a5a: rename Literal to Literals, no longer hiding Schema's singular Literal.
832
+
833
+ ## 4.0.0-beta.74
834
+
835
+ ### Patch Changes
836
+
837
+ - 54ec1ef: fix bs
838
+
839
+ ## 4.0.0-beta.73
840
+
841
+ ## 4.0.0-beta.72
842
+
843
+ ### Patch Changes
844
+
845
+ - 0541f0d: fix withDefault types
846
+
847
+ ## 4.0.0-beta.71
848
+
849
+ ### Minor Changes
850
+
851
+ - beae3a0: Remove `withDefaultConstructor` wrapper, use `S.withConstructorDefault` directly with `Effect.succeed`/`Effect.sync`.
852
+
853
+ ## 4.0.0-beta.70
854
+
855
+ ## 4.0.0-beta.69
856
+
857
+ ### Patch Changes
858
+
859
+ - dc465e3: update to latest effect beta
860
+
861
+ ## 4.0.0-beta.68
862
+
863
+ ### Patch Changes
864
+
865
+ - e6f2341: Add SecretURL tests and switch secretURL config to use Config.nonEmptyString
866
+
867
+ ## 4.0.0-beta.67
868
+
869
+ ## 4.0.0-beta.66
870
+
871
+ ### Patch Changes
872
+
873
+ - edc52e4: update
874
+
875
+ ## 4.0.0-beta.65
876
+
877
+ ### Minor Changes
878
+
879
+ - 1f103b2: Replace `proxify` with explicit service accessor helpers: `accessFn`, `accessEffectFn`, `accessCn`, `accessEffectCn`.
880
+
881
+ ### Patch Changes
882
+
883
+ - 31739d7: Fix JSON schema output for Email, Date, PhoneNumber, and Url schemas. The `jsonSchema` annotation key is not recognized by Effect v4's JSON schema generator — use proper v4 annotations (`format`, `description`) and built-in checks (`isMinLength`, `isMaxLength`) instead.
884
+
885
+ ## 4.0.0-beta.64
886
+
887
+ ### Patch Changes
888
+
889
+ - c1a6fdc: fix proxify
890
+
891
+ ## 4.0.0-beta.63
892
+
893
+ ## 4.0.0-beta.62
894
+
895
+ ### Patch Changes
896
+
897
+ - 0b21a02: fix: flatten simple allOf constraints in JSON Schema output for better codegen compatibility
898
+
899
+ ## 4.0.0-beta.61
900
+
901
+ ## 4.0.0-beta.60
902
+
903
+ ## 4.0.0-beta.59
904
+
905
+ ### Patch Changes
906
+
907
+ - cec026d: update packages
908
+
909
+ ## 4.0.0-beta.58
910
+
911
+ ## 4.0.0-beta.57
912
+
913
+ ## 4.0.0-beta.56
914
+
915
+ ## 4.0.0-beta.55
916
+
917
+ ## 4.0.0-beta.54
918
+
919
+ ### Patch Changes
920
+
921
+ - d867272: the return of `Context`
922
+
923
+ ## 4.0.0-beta.53
924
+
925
+ ### Patch Changes
926
+
927
+ - ee9694e: fix type issue?
928
+
929
+ ## 4.0.0-beta.52
930
+
931
+ ### Minor Changes
932
+
933
+ - 6252808: Add `ReadonlySetFromArray` and `ReadonlyMapFromArray` schema transformations that decode from annotated arrays to Set/Map. Update `ReadonlySet` and `ReadonlyMap` to use these internally.
934
+
935
+ ## 4.0.0-beta.51
936
+
937
+ ## 4.0.0-beta.50
938
+
939
+ ## 4.0.0-beta.49
940
+
941
+ ### Patch Changes
942
+
943
+ - e585c9c: fix config nested
944
+
945
+ ## 4.0.0-beta.48
946
+
947
+ ### Patch Changes
948
+
949
+ - 0c88f78: Remove `TaggedError` compatibility re-export, use `TaggedErrorClass` directly
950
+
951
+ ## 4.0.0-beta.47
952
+
953
+ ### Patch Changes
954
+
955
+ - 3365758: workaround effect error messages
956
+
957
+ ## 4.0.0-beta.46
958
+
959
+ ## 4.0.0-beta.45
960
+
961
+ ### Patch Changes
962
+
963
+ - 10b55ff: update packages
964
+
965
+ ## 4.0.0-beta.44
966
+
967
+ ### Patch Changes
968
+
969
+ - a37aa38: Update to effect beta 43
970
+
971
+ ## 4.0.0-beta.43
972
+
973
+ ## 4.0.0-beta.42
974
+
975
+ ## 4.0.0-beta.41
976
+
977
+ ## 4.0.0-beta.40
978
+
979
+ ## 4.0.0-beta.39
980
+
981
+ ### Patch Changes
982
+
983
+ - 10e90d5: fix: TaggedRequest should be an Opaque Schema Class
984
+
985
+ ## 4.0.0-beta.38
986
+
987
+ ### Patch Changes
988
+
989
+ - 0b3e00e: fix bug
990
+
991
+ ## 4.0.0-beta.37
992
+
993
+ ### Patch Changes
994
+
995
+ - 947fe20: fix input date
996
+
997
+ ## 4.0.0-beta.36
998
+
999
+ ## 4.0.0-beta.35
1000
+
1001
+ ## 4.0.0-beta.34
1002
+
1003
+ ### Patch Changes
1004
+
1005
+ - 8c645d5: update to latest effect
1006
+
1007
+ ## 4.0.0-beta.33
1008
+
1009
+ ### Patch Changes
1010
+
1011
+ - 4b95009: use Finite instead of Number
1012
+
1013
+ ## 4.0.0-beta.32
1014
+
1015
+ ### Patch Changes
1016
+
1017
+ - 01d862a: again
1018
+
1019
+ ## 4.0.0-beta.31
1020
+
1021
+ ### Patch Changes
1022
+
1023
+ - 6b6d601: fix ForceVOid
1024
+
1025
+ ## 4.0.0-beta.30
1026
+
1027
+ ### Patch Changes
1028
+
1029
+ - 5ec1f45: fix ForceVoid for real
1030
+
1031
+ ## 4.0.0-beta.29
1032
+
1033
+ ### Patch Changes
1034
+
1035
+ - a899d46: Replace `ForceVoid` in `makeClient` with a typed codec transformation instead of an unsafe cast.
1036
+
1037
+ ## 4.0.0-beta.28
1038
+
1039
+ ### Patch Changes
1040
+
1041
+ - 0099208: Refactor `Pure` helpers to use typed `useSync` calls instead of unsafe casts.
1042
+
1043
+ ## 4.0.0-beta.27
1044
+
1045
+ ### Patch Changes
1046
+
1047
+ - 601a1ff: update effect to 4.0.0-beta.37 and drop the Schema Class disableValidation workaround now that the patched effect schema covers it
1048
+
1049
+ ## 4.0.0-beta.26
1050
+
1051
+ ### Patch Changes
1052
+
1053
+ - 4da28e2: Change `Schema.Class` and `Schema.TaggedClass` wrappers to default constructor options to `{ disableValidation: true }`.
1054
+
1055
+ This avoids strict class identifier validation by default when constructing wrapper classes (for example passing a compatible view class), while keeping existing behavior when explicit options are provided.
1056
+
1057
+ ## 4.0.0-beta.25
1058
+
1059
+ ### Patch Changes
1060
+
1061
+ - 6282d4b: Update `Effect.allLower` to call `svc.asEffect()` when available, ensuring service entries are normalized before `Effect.all` evaluation.
1062
+
3
1063
  ## 4.0.0-beta.24
4
1064
 
5
1065
  ### Patch Changes