effect-app 4.0.0-beta.99 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/CHANGELOG.md +2028 -0
  2. package/dist/Array.d.ts +2 -1
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +4 -4
  5. package/dist/Chunk.d.ts +2 -2
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Config/SecretURL.d.ts +3 -1
  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.map +1 -1
  11. package/dist/Config/internal/configSecretURL.js +2 -2
  12. package/dist/Config.d.ts +0 -5
  13. package/dist/Config.d.ts.map +1 -1
  14. package/dist/Config.js +7 -5
  15. package/dist/ConfigProvider.d.ts +0 -37
  16. package/dist/ConfigProvider.d.ts.map +1 -1
  17. package/dist/ConfigProvider.js +5 -41
  18. package/dist/Context.d.ts +6 -4
  19. package/dist/Context.d.ts.map +1 -1
  20. package/dist/Context.js +4 -3
  21. package/dist/DataDependencies.d.ts +136 -0
  22. package/dist/DataDependencies.d.ts.map +1 -0
  23. package/dist/DataDependencies.js +112 -0
  24. package/dist/Effect.d.ts +3 -3
  25. package/dist/Effect.d.ts.map +1 -1
  26. package/dist/Effect.js +6 -9
  27. package/dist/Emailer.d.ts +51 -0
  28. package/dist/Emailer.d.ts.map +1 -0
  29. package/dist/Emailer.js +7 -0
  30. package/dist/Function.d.ts.map +1 -1
  31. package/dist/Layer.d.ts +6 -3
  32. package/dist/Layer.d.ts.map +1 -1
  33. package/dist/Layer.js +3 -2
  34. package/dist/Model/Repository/Registry.d.ts +22 -0
  35. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  36. package/dist/Model/Repository/Registry.js +18 -0
  37. package/dist/Model/Repository/dependency.d.ts +6 -0
  38. package/dist/Model/Repository/dependency.d.ts.map +1 -0
  39. package/dist/Model/Repository/dependency.js +29 -0
  40. package/dist/Model/Repository/ext.d.ts +60 -0
  41. package/dist/Model/Repository/ext.d.ts.map +1 -0
  42. package/dist/Model/Repository/ext.js +124 -0
  43. package/dist/Model/Repository/internal/internal.d.ts +68 -0
  44. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  45. package/dist/Model/Repository/internal/internal.js +611 -0
  46. package/dist/Model/Repository/legacy.d.ts +21 -0
  47. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  48. package/dist/Model/Repository/legacy.js +2 -0
  49. package/dist/Model/Repository/makeRepo.d.ts +71 -0
  50. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  51. package/dist/Model/Repository/makeRepo.js +30 -0
  52. package/dist/Model/Repository/service.d.ts +121 -0
  53. package/dist/Model/Repository/service.d.ts.map +1 -0
  54. package/dist/Model/Repository/service.js +2 -0
  55. package/dist/Model/Repository/validation.d.ts +72 -0
  56. package/dist/Model/Repository/validation.d.ts.map +1 -0
  57. package/dist/Model/Repository/validation.js +39 -0
  58. package/dist/Model/Repository.d.ts +8 -0
  59. package/dist/Model/Repository.d.ts.map +1 -0
  60. package/dist/Model/Repository.js +8 -0
  61. package/dist/Model/dsl.d.ts +33 -0
  62. package/dist/Model/dsl.d.ts.map +1 -0
  63. package/dist/Model/dsl.js +43 -0
  64. package/dist/Model/filter/filterApi.d.ts +30 -0
  65. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  66. package/dist/Model/filter/filterApi.js +2 -0
  67. package/dist/Model/filter/types/errors.d.ts +29 -0
  68. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  69. package/dist/Model/filter/types/errors.js +2 -0
  70. package/dist/Model/filter/types/fields.d.ts +15 -0
  71. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  72. package/dist/Model/filter/types/fields.js +2 -0
  73. package/dist/Model/filter/types/path/common.d.ts +316 -0
  74. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  75. package/dist/Model/filter/types/path/common.js +2 -0
  76. package/dist/Model/filter/types/path/eager.d.ts +94 -0
  77. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  78. package/dist/Model/filter/types/path/eager.js +36 -0
  79. package/dist/Model/filter/types/path/index.d.ts +4 -0
  80. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  81. package/dist/Model/filter/types/path/index.js +3 -0
  82. package/dist/Model/filter/types/utils.d.ts +79 -0
  83. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  84. package/dist/Model/filter/types/utils.js +2 -0
  85. package/dist/Model/filter/types/validator.d.ts +30 -0
  86. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  87. package/dist/Model/filter/types/validator.js +2 -0
  88. package/dist/Model/filter/types.d.ts +5 -0
  89. package/dist/Model/filter/types.d.ts.map +1 -0
  90. package/dist/Model/filter/types.js +7 -0
  91. package/dist/Model/query/dsl.d.ts +630 -0
  92. package/dist/Model/query/dsl.d.ts.map +1 -0
  93. package/dist/Model/query/dsl.js +376 -0
  94. package/dist/Model/query/new-kid-interpreter.d.ts +132 -0
  95. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  96. package/dist/Model/query/new-kid-interpreter.js +370 -0
  97. package/dist/Model/query.d.ts +15 -0
  98. package/dist/Model/query.d.ts.map +1 -0
  99. package/dist/Model/query.js +3 -0
  100. package/dist/Model.d.ts +6 -0
  101. package/dist/Model.d.ts.map +1 -0
  102. package/dist/Model.js +6 -0
  103. package/dist/NonEmptySet.d.ts +3 -1
  104. package/dist/NonEmptySet.d.ts.map +1 -1
  105. package/dist/NonEmptySet.js +2 -2
  106. package/dist/Option.d.ts +1 -0
  107. package/dist/Option.d.ts.map +1 -1
  108. package/dist/Option.js +3 -1
  109. package/dist/Pure.d.ts +5 -3
  110. package/dist/Pure.d.ts.map +1 -1
  111. package/dist/Pure.js +5 -2
  112. package/dist/QueueMaker.d.ts +11 -0
  113. package/dist/QueueMaker.d.ts.map +1 -0
  114. package/dist/QueueMaker.js +11 -0
  115. package/dist/RequestContext.d.ts +87 -0
  116. package/dist/RequestContext.d.ts.map +1 -0
  117. package/dist/RequestContext.js +45 -0
  118. package/dist/RequestScopedDependencies.d.ts +21 -0
  119. package/dist/RequestScopedDependencies.d.ts.map +1 -0
  120. package/dist/RequestScopedDependencies.js +16 -0
  121. package/dist/Schema/Class.d.ts +163 -16
  122. package/dist/Schema/Class.d.ts.map +1 -1
  123. package/dist/Schema/Class.js +193 -21
  124. package/dist/Schema/FastCheck.d.ts.map +1 -1
  125. package/dist/Schema/SchemaParser.d.ts +5 -0
  126. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  127. package/dist/Schema/SchemaParser.js +6 -0
  128. package/dist/Schema/SpecialJsonSchema.d.ts +15 -2
  129. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -1
  130. package/dist/Schema/SpecialJsonSchema.js +70 -12
  131. package/dist/Schema/SpecialOpenApi.d.ts +1 -1
  132. package/dist/Schema/SpecialOpenApi.js +3 -3
  133. package/dist/Schema/brand.d.ts +5 -5
  134. package/dist/Schema/brand.d.ts.map +1 -1
  135. package/dist/Schema/brand.js +6 -4
  136. package/dist/Schema/email.d.ts.map +1 -1
  137. package/dist/Schema/email.js +8 -5
  138. package/dist/Schema/ext.d.ts +297 -72
  139. package/dist/Schema/ext.d.ts.map +1 -1
  140. package/dist/Schema/ext.js +331 -67
  141. package/dist/Schema/moreStrings.d.ts +82 -48
  142. package/dist/Schema/moreStrings.d.ts.map +1 -1
  143. package/dist/Schema/moreStrings.js +85 -51
  144. package/dist/Schema/numbers.d.ts +33 -21
  145. package/dist/Schema/numbers.d.ts.map +1 -1
  146. package/dist/Schema/numbers.js +64 -12
  147. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  148. package/dist/Schema/phoneNumber.js +6 -6
  149. package/dist/Schema/schema.d.ts +1 -1
  150. package/dist/Schema/schema.d.ts.map +1 -1
  151. package/dist/Schema/schema.js +2 -2
  152. package/dist/Schema/strings.d.ts +18 -4
  153. package/dist/Schema/strings.d.ts.map +1 -1
  154. package/dist/Schema/strings.js +1 -5
  155. package/dist/Schema.d.ts +223 -6
  156. package/dist/Schema.d.ts.map +1 -1
  157. package/dist/Schema.js +189 -23
  158. package/dist/SchemaAST.d.ts +2 -0
  159. package/dist/SchemaAST.d.ts.map +1 -0
  160. package/dist/SchemaAST.js +2 -0
  161. package/dist/Set.d.ts +4 -1
  162. package/dist/Set.d.ts.map +1 -1
  163. package/dist/Set.js +3 -2
  164. package/dist/Store.d.ts +215 -0
  165. package/dist/Store.d.ts.map +1 -0
  166. package/dist/Store.js +113 -0
  167. package/dist/_ext/Array.d.ts +1 -1
  168. package/dist/_ext/Array.d.ts.map +1 -1
  169. package/dist/_ext/Array.js +4 -2
  170. package/dist/_ext/misc.d.ts +4 -1
  171. package/dist/_ext/misc.d.ts.map +1 -1
  172. package/dist/_ext/misc.js +4 -2
  173. package/dist/_ext/ord.ext.d.ts +2 -1
  174. package/dist/_ext/ord.ext.d.ts.map +1 -1
  175. package/dist/_ext/ord.ext.js +2 -2
  176. package/dist/builtin.d.ts +2 -14
  177. package/dist/builtin.d.ts.map +1 -1
  178. package/dist/builtin.js +1 -1
  179. package/dist/client/InvalidationKeys.d.ts +30 -0
  180. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  181. package/dist/client/InvalidationKeys.js +37 -0
  182. package/dist/client/apiClientFactory.d.ts +13 -8
  183. package/dist/client/apiClientFactory.d.ts.map +1 -1
  184. package/dist/client/apiClientFactory.js +148 -29
  185. package/dist/client/clientFor.d.ts +48 -13
  186. package/dist/client/clientFor.d.ts.map +1 -1
  187. package/dist/client/clientFor.js +9 -1
  188. package/dist/client/errors.d.ts +74 -28
  189. package/dist/client/errors.d.ts.map +1 -1
  190. package/dist/client/errors.js +41 -10
  191. package/dist/client/makeClient.d.ts +487 -32
  192. package/dist/client/makeClient.d.ts.map +1 -1
  193. package/dist/client/makeClient.js +47 -21
  194. package/dist/client.d.ts +2 -0
  195. package/dist/client.d.ts.map +1 -1
  196. package/dist/client.js +3 -1
  197. package/dist/faker.d.ts.map +1 -1
  198. package/dist/http/Request.d.ts +2 -2
  199. package/dist/http/Request.d.ts.map +1 -1
  200. package/dist/http/Request.js +2 -2
  201. package/dist/http/internal/lib.d.ts +12 -12
  202. package/dist/http/internal/lib.d.ts.map +1 -1
  203. package/dist/http/internal/lib.js +13 -13
  204. package/dist/ids.d.ts +32 -14
  205. package/dist/ids.d.ts.map +1 -1
  206. package/dist/ids.js +38 -7
  207. package/dist/index.d.ts +3 -0
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +5 -1
  210. package/dist/middleware.d.ts +12 -6
  211. package/dist/middleware.d.ts.map +1 -1
  212. package/dist/middleware.js +13 -7
  213. package/dist/rpc/Invalidation.d.ts +1124 -0
  214. package/dist/rpc/Invalidation.d.ts.map +1 -0
  215. package/dist/rpc/Invalidation.js +178 -0
  216. package/dist/rpc/MiddlewareMaker.d.ts +10 -7
  217. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  218. package/dist/rpc/MiddlewareMaker.js +57 -37
  219. package/dist/rpc/RpcContextMap.d.ts +2 -2
  220. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  221. package/dist/rpc/RpcMiddleware.d.ts +13 -10
  222. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  223. package/dist/rpc/RpcMiddleware.js +2 -2
  224. package/dist/rpc.d.ts +1 -1
  225. package/dist/rpc.d.ts.map +1 -1
  226. package/dist/rpc.js +2 -2
  227. package/dist/runtime.d.ts +19 -0
  228. package/dist/runtime.d.ts.map +1 -0
  229. package/dist/runtime.js +40 -0
  230. package/dist/setupRequest.d.ts +20 -0
  231. package/dist/setupRequest.d.ts.map +1 -0
  232. package/dist/setupRequest.js +72 -0
  233. package/dist/toast.d.ts +51 -0
  234. package/dist/toast.d.ts.map +1 -0
  235. package/dist/toast.js +34 -0
  236. package/dist/transform.d.ts +1 -1
  237. package/dist/transform.d.ts.map +1 -1
  238. package/dist/transform.js +4 -5
  239. package/dist/utils/effectify.d.ts +1 -1
  240. package/dist/utils/effectify.d.ts.map +1 -1
  241. package/dist/utils/effectify.js +2 -2
  242. package/dist/utils/extend.d.ts +6 -1
  243. package/dist/utils/extend.d.ts.map +1 -1
  244. package/dist/utils/extend.js +24 -6
  245. package/dist/utils/gen.d.ts +4 -4
  246. package/dist/utils/gen.d.ts.map +1 -1
  247. package/dist/utils/logLevel.d.ts +2 -2
  248. package/dist/utils/logLevel.d.ts.map +1 -1
  249. package/dist/utils/logger.d.ts +2 -1
  250. package/dist/utils/logger.d.ts.map +1 -1
  251. package/dist/utils/logger.js +2 -2
  252. package/dist/utils.d.ts +34 -39
  253. package/dist/utils.d.ts.map +1 -1
  254. package/dist/utils.js +33 -37
  255. package/dist/validation/validators.d.ts.map +1 -1
  256. package/dist/validation.d.ts.map +1 -1
  257. package/dist/withToast.d.ts +30 -0
  258. package/dist/withToast.d.ts.map +1 -0
  259. package/dist/withToast.js +64 -0
  260. package/package.json +26 -266
  261. package/src/Array.ts +5 -5
  262. package/src/Chunk.ts +3 -3
  263. package/src/Config/SecretURL.ts +6 -3
  264. package/src/Config/internal/configSecretURL.ts +2 -2
  265. package/src/Config.ts +6 -13
  266. package/src/ConfigProvider.ts +4 -47
  267. package/src/Context.ts +9 -8
  268. package/src/DataDependencies.ts +171 -0
  269. package/src/Effect.ts +9 -12
  270. package/src/Emailer.ts +51 -0
  271. package/src/Inputify.type.ts +1 -1
  272. package/src/Layer.ts +8 -5
  273. package/src/Model/Repository/Registry.ts +35 -0
  274. package/src/Model/Repository/dependency.ts +32 -0
  275. package/src/Model/Repository/ext.ts +374 -0
  276. package/src/Model/Repository/internal/internal.ts +988 -0
  277. package/src/Model/Repository/legacy.ts +29 -0
  278. package/src/Model/Repository/makeRepo.ts +168 -0
  279. package/src/Model/Repository/service.ts +676 -0
  280. package/src/Model/Repository/validation.ts +38 -0
  281. package/src/Model/Repository.ts +7 -0
  282. package/src/Model/dsl.ts +129 -0
  283. package/src/Model/filter/filterApi.ts +78 -0
  284. package/src/Model/filter/types/errors.ts +47 -0
  285. package/src/Model/filter/types/fields.ts +50 -0
  286. package/src/Model/filter/types/path/common.ts +404 -0
  287. package/src/Model/filter/types/path/eager.ts +329 -0
  288. package/src/Model/filter/types/path/index.ts +4 -0
  289. package/src/Model/filter/types/utils.ts +128 -0
  290. package/src/Model/filter/types/validator.ts +46 -0
  291. package/src/Model/filter/types.ts +6 -0
  292. package/src/Model/query/dsl.ts +3092 -0
  293. package/src/Model/query/new-kid-interpreter.ts +532 -0
  294. package/src/Model/query.ts +13 -0
  295. package/src/Model.ts +5 -0
  296. package/src/NonEmptySet.ts +6 -4
  297. package/src/Option.ts +2 -0
  298. package/src/Pure.ts +6 -3
  299. package/src/QueueMaker.ts +11 -0
  300. package/src/RequestContext.ts +48 -0
  301. package/src/RequestScopedDependencies.ts +45 -0
  302. package/src/Schema/Class.ts +550 -56
  303. package/src/Schema/SchemaParser.ts +12 -0
  304. package/src/Schema/SpecialJsonSchema.ts +75 -7
  305. package/src/Schema/SpecialOpenApi.ts +5 -5
  306. package/src/Schema/brand.ts +27 -12
  307. package/src/Schema/email.ts +9 -7
  308. package/src/Schema/ext.ts +408 -91
  309. package/src/Schema/moreStrings.ts +213 -88
  310. package/src/Schema/numbers.ts +107 -29
  311. package/src/Schema/phoneNumber.ts +8 -9
  312. package/src/Schema/schema.ts +1 -1
  313. package/src/Schema/strings.ts +23 -14
  314. package/src/Schema.ts +403 -46
  315. package/src/SchemaAST.ts +1 -0
  316. package/src/Set.ts +6 -2
  317. package/src/Store.ts +325 -0
  318. package/src/_ext/Array.ts +4 -2
  319. package/src/_ext/misc.ts +4 -1
  320. package/src/_ext/ord.ext.ts +2 -1
  321. package/src/builtin-json.d.ts +24 -0
  322. package/src/builtin.ts +16 -21
  323. package/src/client/InvalidationKeys.ts +55 -0
  324. package/src/client/apiClientFactory.ts +291 -126
  325. package/src/client/clientFor.ts +101 -33
  326. package/src/client/errors.ts +66 -20
  327. package/src/client/makeClient.ts +519 -60
  328. package/src/client.ts +6 -4
  329. package/src/http/Request.ts +4 -4
  330. package/src/http/internal/lib.ts +12 -12
  331. package/src/http.ts +1 -1
  332. package/src/ids.ts +45 -8
  333. package/src/index.ts +20 -16
  334. package/src/middleware.ts +12 -8
  335. package/src/rpc/Invalidation.ts +278 -0
  336. package/src/rpc/MiddlewareMaker.ts +86 -79
  337. package/src/rpc/README.md +2 -2
  338. package/src/rpc/RpcContextMap.ts +4 -4
  339. package/src/rpc/RpcMiddleware.ts +18 -13
  340. package/src/rpc.ts +4 -4
  341. package/src/runtime.ts +57 -0
  342. package/src/setupRequest.ts +138 -0
  343. package/src/toast.ts +54 -0
  344. package/src/transform.ts +4 -4
  345. package/src/utils/effectify.ts +1 -1
  346. package/src/utils/extend.ts +24 -5
  347. package/src/utils/gen.ts +7 -7
  348. package/src/utils/logLevel.ts +1 -1
  349. package/src/utils/logger.ts +3 -2
  350. package/src/utils.ts +85 -158
  351. package/src/validation.ts +2 -2
  352. package/src/withToast.ts +133 -0
  353. package/test/dist/rpc.test.d.ts.map +1 -1
  354. package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
  355. package/test/moreStrings.test.ts +55 -10
  356. package/test/rpc.test.ts +28 -11
  357. package/test/rpcMiddlewareContext.test.ts +63 -0
  358. package/test/schema.test.ts +318 -55
  359. package/test/secretURL.test.ts +4 -1
  360. package/test/special.test.ts +663 -131
  361. package/test/utils.test.ts +5 -5
  362. package/tsconfig.base.json +6 -4
  363. package/tsconfig.json +9 -1
  364. package/tsconfig.src.json +29 -29
  365. package/tsconfig.test.json +2 -2
  366. package/dist/Operations.d.ts +0 -124
  367. package/dist/Operations.d.ts.map +0 -1
  368. package/dist/Operations.js +0 -29
  369. package/eslint.config.mjs +0 -26
  370. package/src/Operations.ts +0 -55
  371. package/tsconfig.json.bak +0 -12
@@ -1,21 +1,105 @@
1
- import { SchemaTransformation } from "effect"
2
- import { type GetContextConfig, type GetEffectError, type RequestContextMapTagAny } from "../rpc/RpcContextMap.js"
3
- import * as S from "../Schema.js"
4
- import { AST } from "../Schema.js"
1
+ import type * as Exit from "effect/Exit"
2
+ import { type GetContextConfig, type RpcContextMap } from "../rpc/RpcContextMap.ts"
3
+ import * as S from "../Schema.ts"
4
+ import { AST } from "../Schema.ts"
5
+ import type { ClientForOptions } from "./clientFor.ts"
6
+
7
+ /**
8
+ * Minimal structural shape for an rpc-client middleware tag.
9
+ * Captures only what `makeRpcClient` and routing/client factory consume from it
10
+ * (no `Default` layer required — that is provided to `makeRouter`).
11
+ */
12
+ export interface ClientMiddleware<RequestContextMap extends Record<string, RpcContextMap.Any>> {
13
+ readonly requestContextMap: RequestContextMap
14
+ readonly requestContext: unknown
15
+ readonly provides?: unknown
16
+ readonly requires?: unknown
17
+ }
5
18
 
6
19
  const merge = (a: any, b: Array<any>) =>
7
20
  a !== undefined && b.length ? S.Union([a, ...b]) : a !== undefined ? a : b.length ? S.Union(b) : S.Never
8
21
 
22
+ type SchemaOrFields<T> = T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct<T> : S.Void
23
+
24
+ type TaggedRequestSchema<Tag extends string, Payload extends S.Struct.Fields> = S.Struct<
25
+ { readonly _tag: S.tag<Tag> } & Payload
26
+ >
27
+
28
+ type QueryOnlyRequests<Resource> = {
29
+ [K in keyof Resource as Resource[K] extends { readonly type: "query" } ? K : never]: Resource[K]
30
+ }
31
+
32
+ type QueryOnlyResources<Resources> = {
33
+ [K in keyof Resources]: QueryOnlyRequests<Resources[K]>
34
+ }
35
+
36
+ type InputFromPayload<Payload extends S.Struct.Fields> = keyof Payload extends never ? void
37
+ : S.Struct<Payload>["Type"]
38
+
39
+ type OutputFromSuccess<Success extends S.Top> = Success extends typeof S.Void ? void : Success["Type"]
40
+
41
+ type InvalidationResources = Record<string, Record<string, unknown>>
42
+
9
43
  /**
10
- * Whatever the input, we will only decode or encode to void
44
+ * An invalidation instruction returned from `invalidatesQueries`. One of:
45
+ * - a raw query key (`ReadonlyArray<string>`)
46
+ * - an RPC handler object (`{ id, options? }`) — query key derived from `id`
47
+ * - a compatibility `{ filters: { queryKey }, options? }` shape
48
+ *
49
+ * Predicate filters are intentionally not represented: atom invalidation is keyed by
50
+ * concrete query keys.
11
51
  */
12
- export const ForceVoid = S
13
- .declare((_: unknown): _ is unknown => true)
14
- .pipe(
15
- S.decodeTo(S.Any, SchemaTransformation.transform<unknown, unknown>({ decode: () => void 0, encode: () => void 0 }))
16
- )
52
+ export type InvalidateQueryInstruction<
53
+ Filters = { readonly queryKey: ReadonlyArray<unknown> },
54
+ Options = Record<string, unknown>
55
+ > =
56
+ | ReadonlyArray<string>
57
+ | {
58
+ readonly id: string
59
+ readonly options?: ClientForOptions
60
+ }
61
+ | {
62
+ readonly filters: Filters
63
+ readonly options?: Options
64
+ }
17
65
 
18
- type SchemaOrFields<T> = T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct<T> : S.Void
66
+ export type InvalidationCallback<Resources, Input = unknown, Success = unknown, Failure = unknown> = (
67
+ queryKey: readonly string[],
68
+ resources: QueryOnlyResources<Resources>,
69
+ ...args: [Input] extends [void] ? [exit: Exit.Exit<Success, Failure>]
70
+ : [input: Input, exit: Exit.Exit<Success, Failure>]
71
+ ) => ReadonlyArray<InvalidateQueryInstruction>
72
+
73
+ export type InvalidationConfig<Resources, Input = unknown, Success = unknown, Failure = unknown> = {
74
+ readonly invalidatesQueries: InvalidationCallback<Resources, Input, Success, Failure>
75
+ readonly invalidationResources?: Resources
76
+ readonly disableQueryInvalidation?: boolean
77
+ }
78
+
79
+ type InvalidationConfigForCommand<
80
+ Resources,
81
+ Payload extends S.Struct.Fields,
82
+ Success extends S.Top,
83
+ Error extends S.Top
84
+ > = InvalidationConfig<
85
+ Resources,
86
+ InputFromPayload<Payload>,
87
+ OutputFromSuccess<Success>,
88
+ Error["Type"]
89
+ >
90
+
91
+ export const configureInvalidation = <Resources>() =>
92
+ <Input, Success, Failure>(
93
+ invalidatesQueries: InvalidationCallback<Resources, NoInfer<Input>, NoInfer<Success>, NoInfer<Failure>>
94
+ ): InvalidationConfig<Resources, Input, Success, Failure> => ({ invalidatesQueries })
95
+
96
+ export const configureInvalidationCallback = <Resources>() =>
97
+ <Input, Success, Failure>(
98
+ invalidatesQueries: InvalidationCallback<Resources, NoInfer<Input>, NoInfer<Success>, NoInfer<Failure>>
99
+ ): InvalidationCallback<Resources, Input, Success, Failure> => invalidatesQueries
100
+
101
+ export const configureInvalidationResources = <Resources>() =>
102
+ ({}) as Pick<InvalidationConfig<Resources>, "invalidationResources">
19
103
 
20
104
  type TaggedRequestForResult<
21
105
  Self,
@@ -24,119 +108,451 @@ type TaggedRequestForResult<
24
108
  Success extends S.Top,
25
109
  Error extends S.Top,
26
110
  Config,
27
- ModuleName extends string
111
+ ModuleName extends string,
112
+ Type extends "command" | "query",
113
+ Stream extends boolean,
114
+ Resources = never,
115
+ Final extends S.Top = never,
116
+ Middleware = unknown
28
117
  > =
29
- & S.EnhancedClass<Self, S.TaggedStruct<Tag, Payload>, {}>
118
+ & S.Opaque<Self, S.ExtendedSchemaNoEncoded, TaggedRequestSchema<Tag, Payload>, {}>
30
119
  & {
120
+ readonly fields: TaggedRequestSchema<Tag, Payload>["fields"]
31
121
  readonly _tag: Tag
32
122
  readonly success: Success
33
123
  readonly error: Error
34
124
  readonly config: Config
35
- readonly "~decodingServices": S.Codec.DecodingServices<Success> | S.Codec.DecodingServices<Error>
36
- readonly "~encodingServices": S.Codec.EncodingServices<Success> | S.Codec.EncodingServices<Error>
37
125
  readonly id: `${ModuleName}.${Tag}`
38
126
  readonly moduleName: ModuleName
127
+ readonly type: Type
128
+ readonly stream: Stream
129
+ readonly middleware?: Middleware
130
+ readonly "~invalidationResources"?: Resources
39
131
  }
132
+ & ([Final] extends [never] ? {} : { readonly final: Final })
40
133
 
41
134
  export const makeRpcClient = <
42
- RequestContextMap extends RequestContextMapTagAny,
135
+ Middleware extends ClientMiddleware<Record<string, RpcContextMap.Any>>,
43
136
  GeneralErrors extends S.Top = never
44
- >(rcs: RequestContextMap, generalErrors?: GeneralErrors) => {
137
+ >(middleware: Middleware, generalErrors?: GeneralErrors) => {
45
138
  // Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc... (??)
46
139
  type ServiceMap = {
47
140
  success: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
48
141
  error: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
142
+ final?: S.Top | S.Struct.Fields // optional final-value schema for stream requests
143
+ stream?: boolean // request metadata — stripped from stored config
49
144
  }
50
145
 
51
- type RequestConfig = GetContextConfig<RequestContextMap["config"]>
146
+ type RequestConfig = GetContextConfig<Middleware["requestContextMap"]>
52
147
 
148
+ // Errors raised by RPC middleware (e.g. `NotLoggedInError` from auth) used to
149
+ // be merged into `resource.error` here so they would surface in the wire
150
+ // failure schema. That merging is gone — the canonical source for middleware
151
+ // errors is now the middleware tag attached to the rpc on both server and
152
+ // client (see `ApiClientFactory.makeFor({ middleware })`). `Rpc.exitSchema`
153
+ // unions in `rpc.middlewares[*].error` automatically.
53
154
  type MergeError<E> = [GeneralErrors] extends [never] ? SchemaOrFields<E> : S.Union<[SchemaOrFields<E>, GeneralErrors]>
54
155
  type ErrorResult<C> = C extends { error: infer E } ? MergeError<E>
55
- : [GeneralErrors] extends [never] ? GetEffectError<RequestContextMap["config"], C>
56
- : MergeError<GetEffectError<RequestContextMap["config"], C>>
57
-
58
- // TODO: filter errors based on config + take care of inversion
59
- const errorSchemas = Object.values(rcs.config).map((_) => _.error)
156
+ : [GeneralErrors] extends [never] ? typeof S.Never
157
+ : GeneralErrors
60
158
 
61
- function makeRequestClass<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap>(
159
+ function makeRequestClass<Tag extends string, Fields extends S.Struct.Fields, C extends Partial<ServiceMap>>(
62
160
  tag: Tag,
63
161
  fields: Fields,
64
162
  config?: C
65
163
  ) {
66
164
  const failureSchema = merge(
67
165
  config?.error ? S.isSchema(config.error) ? config.error : S.Struct(config.error) : undefined,
68
- [...errorSchemas, generalErrors].filter(Boolean)
166
+ [generalErrors].filter(Boolean)
69
167
  )
70
168
  const successSchema = config?.success
71
169
  ? S.isSchema(config.success)
72
- ? AST.isVoid(config.success.ast) ? ForceVoid : config.success
170
+ ? AST.isVoid(config.success.ast) ? S.Void : config.success
73
171
  : S.Struct(config.success)
74
- : ForceVoid
172
+ : S.Void
173
+
174
+ const finalConfig = (config as any)?.final
175
+ const finalSchema = finalConfig && S.isSchema(finalConfig) ? finalConfig : undefined
176
+
177
+ // Strip stream from the stored config — it's request metadata, not handler config
178
+ const { stream: _stream, ...restConfig } = config ?? ({} as C)
75
179
 
76
- const RequestClass = S.TaggedClass<any>()(tag, fields)
180
+ const RequestClass = S.Opaque()(S.TaggedStruct(tag, fields))
77
181
  Object.assign(RequestClass, {
78
182
  _tag: tag,
79
183
  success: successSchema,
80
184
  error: failureSchema,
81
- config
185
+ ...(finalSchema !== undefined ? { final: finalSchema } : {}),
186
+ config: restConfig
82
187
  })
83
188
 
84
189
  return RequestClass
85
190
  }
86
191
 
87
- function TaggedRequestFor<ModuleName extends string>(moduleName: ModuleName) {
88
- function TaggedRequestWithMeta<Self>(): {
89
- <Tag extends string, Payload extends S.Struct.Fields, C extends ServiceMap>(
192
+ function makeTaggedRequestWithMeta<
193
+ ModuleName extends string,
194
+ Type extends "command" | "query"
195
+ >(
196
+ moduleName: ModuleName,
197
+ type: Type
198
+ ) {
199
+ function TaggedRequestWithMeta<Self, Resources extends InvalidationResources = never>(): {
200
+ // ─── stream: true overloads (must come before non-stream so TypeScript picks them) ───────────
201
+ <
202
+ Tag extends string,
203
+ Payload extends S.Struct.Fields,
204
+ Success extends S.Top | S.Struct.Fields,
205
+ Error extends S.Top | S.Struct.Fields,
206
+ Final extends S.Top | S.Struct.Fields = never,
207
+ C extends RequestConfig & Record<string, any> = RequestConfig & Record<string, any>
208
+ >(
90
209
  tag: Tag,
91
210
  fields: Payload,
92
- config: RequestConfig & C
211
+ config:
212
+ & Omit<C, "invalidatesQueries">
213
+ & { stream: true; success: Success; error: Error; final?: Final },
214
+ invalidatesQueries?: InvalidationCallback<
215
+ Resources,
216
+ InputFromPayload<Payload>,
217
+ OutputFromSuccess<SchemaOrFields<Success>>,
218
+ ErrorResult<C & { success: Success; error: Error }>["Type"]
219
+ >
93
220
  ): TaggedRequestForResult<
94
221
  Self,
95
222
  Tag,
96
223
  Payload,
97
- SchemaOrFields<C["success"]>,
98
- ErrorResult<C>,
99
- Omit<C, "success" | "error">,
100
- ModuleName
224
+ SchemaOrFields<Success>,
225
+ ErrorResult<C & { success: Success; error: Error }>,
226
+ Omit<
227
+ & Omit<C, "invalidatesQueries">
228
+ & {
229
+ success: Success
230
+ error: Error
231
+ }
232
+ & Partial<
233
+ InvalidationConfigForCommand<
234
+ Resources,
235
+ Payload,
236
+ SchemaOrFields<Success>,
237
+ ErrorResult<C & { success: Success; error: Error }>
238
+ >
239
+ >,
240
+ "success" | "error" | "stream"
241
+ >,
242
+ ModuleName,
243
+ Type,
244
+ true,
245
+ Resources,
246
+ [Final] extends [never] ? never : SchemaOrFields<Final>,
247
+ Middleware
101
248
  >
102
- <Tag extends string, Payload extends S.Struct.Fields, C extends Pick<ServiceMap, "success">>(
249
+ <
250
+ Tag extends string,
251
+ Payload extends S.Struct.Fields,
252
+ Success extends S.Top | S.Struct.Fields,
253
+ Final extends S.Top | S.Struct.Fields = never,
254
+ C extends RequestConfig & Record<string, any> & { error?: never } =
255
+ & RequestConfig
256
+ & Record<string, any>
257
+ & { error?: never }
258
+ >(
103
259
  tag: Tag,
104
260
  fields: Payload,
105
- config: RequestConfig & C
261
+ config:
262
+ & Omit<C, "invalidatesQueries">
263
+ & { stream: true; success: Success; final?: Final },
264
+ invalidatesQueries?: InvalidationCallback<
265
+ Resources,
266
+ InputFromPayload<Payload>,
267
+ OutputFromSuccess<SchemaOrFields<Success>>,
268
+ ErrorResult<C & { success: Success }>["Type"]
269
+ >
106
270
  ): TaggedRequestForResult<
107
271
  Self,
108
272
  Tag,
109
273
  Payload,
110
- SchemaOrFields<C["success"]>,
111
- ErrorResult<C>,
112
- Omit<C, "success" | "error">,
113
- ModuleName
274
+ SchemaOrFields<Success>,
275
+ ErrorResult<C & { success: Success }>,
276
+ Omit<
277
+ & Omit<C, "invalidatesQueries">
278
+ & { success: Success }
279
+ & Partial<
280
+ InvalidationConfigForCommand<
281
+ Resources,
282
+ Payload,
283
+ SchemaOrFields<Success>,
284
+ ErrorResult<C & { success: Success }>
285
+ >
286
+ >,
287
+ "success" | "error" | "stream"
288
+ >,
289
+ ModuleName,
290
+ Type,
291
+ true,
292
+ Resources,
293
+ [Final] extends [never] ? never : SchemaOrFields<Final>,
294
+ Middleware
114
295
  >
115
- <Tag extends string, Payload extends S.Struct.Fields, C extends Pick<ServiceMap, "error">>(
296
+ // ─── stream: true without `success` overloads ────────────────────────────────────────────────
297
+ <
298
+ Tag extends string,
299
+ Payload extends S.Struct.Fields,
300
+ Error extends S.Top | S.Struct.Fields,
301
+ C extends RequestConfig & Record<string, any> & { success?: never } =
302
+ & RequestConfig
303
+ & Record<string, any>
304
+ & { success?: never }
305
+ >(
116
306
  tag: Tag,
117
307
  fields: Payload,
118
- config: RequestConfig & C
308
+ config:
309
+ & Omit<C, "invalidatesQueries">
310
+ & { stream: true; error: Error },
311
+ invalidatesQueries?: InvalidationCallback<
312
+ Resources,
313
+ InputFromPayload<Payload>,
314
+ void,
315
+ ErrorResult<C & { error: Error }>["Type"]
316
+ >
119
317
  ): TaggedRequestForResult<
120
318
  Self,
121
319
  Tag,
122
320
  Payload,
123
- typeof ForceVoid,
321
+ typeof S.Void,
322
+ ErrorResult<C & { error: Error }>,
323
+ Omit<
324
+ & Omit<C, "invalidatesQueries">
325
+ & { error: Error }
326
+ & Partial<
327
+ InvalidationConfigForCommand<
328
+ Resources,
329
+ Payload,
330
+ typeof S.Void,
331
+ ErrorResult<C & { error: Error }>
332
+ >
333
+ >,
334
+ "success" | "error" | "stream"
335
+ >,
336
+ ModuleName,
337
+ Type,
338
+ true,
339
+ Resources,
340
+ never,
341
+ Middleware
342
+ >
343
+ <
344
+ Tag extends string,
345
+ Payload extends S.Struct.Fields,
346
+ C extends RequestConfig & Record<string, any> & { success?: never; error?: never } =
347
+ & RequestConfig
348
+ & Record<string, any>
349
+ & { success?: never; error?: never }
350
+ >(
351
+ tag: Tag,
352
+ fields: Payload,
353
+ config:
354
+ & Omit<C, "invalidatesQueries">
355
+ & { stream: true },
356
+ invalidatesQueries?: InvalidationCallback<
357
+ Resources,
358
+ InputFromPayload<Payload>,
359
+ void,
360
+ ErrorResult<C>["Type"]
361
+ >
362
+ ): TaggedRequestForResult<
363
+ Self,
364
+ Tag,
365
+ Payload,
366
+ typeof S.Void,
124
367
  ErrorResult<C>,
125
- Omit<C, "success" | "error">,
126
- ModuleName
368
+ Omit<
369
+ & Omit<C, "invalidatesQueries">
370
+ & Partial<InvalidationConfigForCommand<Resources, Payload, typeof S.Void, ErrorResult<C>>>,
371
+ "success" | "error" | "stream"
372
+ >,
373
+ ModuleName,
374
+ Type,
375
+ true,
376
+ Resources,
377
+ never,
378
+ Middleware
379
+ >
380
+ // ─── non-stream overloads ────────────────────────────────────────────────────────────────────
381
+ <
382
+ Tag extends string,
383
+ Payload extends S.Struct.Fields,
384
+ Success extends S.Top | S.Struct.Fields,
385
+ Error extends S.Top | S.Struct.Fields,
386
+ Final extends S.Top | S.Struct.Fields = never,
387
+ C extends RequestConfig & Record<string, any> = RequestConfig & Record<string, any>
388
+ >(
389
+ tag: Tag,
390
+ fields: Payload,
391
+ config:
392
+ & Omit<C, "invalidatesQueries">
393
+ & { success: Success; error: Error; final?: Final },
394
+ invalidatesQueries?: InvalidationCallback<
395
+ Resources,
396
+ InputFromPayload<Payload>,
397
+ OutputFromSuccess<SchemaOrFields<Success>>,
398
+ ErrorResult<C & { success: Success; error: Error }>["Type"]
399
+ >
400
+ ): TaggedRequestForResult<
401
+ Self,
402
+ Tag,
403
+ Payload,
404
+ SchemaOrFields<Success>,
405
+ ErrorResult<C & { success: Success; error: Error }>,
406
+ Omit<
407
+ & Omit<C, "invalidatesQueries">
408
+ & {
409
+ success: Success
410
+ error: Error
411
+ }
412
+ & Partial<
413
+ InvalidationConfigForCommand<
414
+ Resources,
415
+ Payload,
416
+ SchemaOrFields<Success>,
417
+ ErrorResult<C & { success: Success; error: Error }>
418
+ >
419
+ >,
420
+ "success" | "error" | "stream"
421
+ >,
422
+ ModuleName,
423
+ Type,
424
+ false,
425
+ Resources,
426
+ [Final] extends [never] ? never : SchemaOrFields<Final>,
427
+ Middleware
428
+ >
429
+ <
430
+ Tag extends string,
431
+ Payload extends S.Struct.Fields,
432
+ Success extends S.Top | S.Struct.Fields,
433
+ Final extends S.Top | S.Struct.Fields = never,
434
+ C extends RequestConfig & Record<string, any> & { error?: never } =
435
+ & RequestConfig
436
+ & Record<string, any>
437
+ & {
438
+ error?: never
439
+ }
440
+ >(
441
+ tag: Tag,
442
+ fields: Payload,
443
+ config:
444
+ & Omit<C, "invalidatesQueries">
445
+ & { success: Success; final?: Final },
446
+ invalidatesQueries?: InvalidationCallback<
447
+ Resources,
448
+ InputFromPayload<Payload>,
449
+ OutputFromSuccess<SchemaOrFields<Success>>,
450
+ ErrorResult<C & { success: Success }>["Type"]
451
+ >
452
+ ): TaggedRequestForResult<
453
+ Self,
454
+ Tag,
455
+ Payload,
456
+ SchemaOrFields<Success>,
457
+ ErrorResult<C & { success: Success }>,
458
+ Omit<
459
+ & Omit<C, "invalidatesQueries">
460
+ & {
461
+ success: Success
462
+ }
463
+ & Partial<
464
+ InvalidationConfigForCommand<
465
+ Resources,
466
+ Payload,
467
+ SchemaOrFields<Success>,
468
+ ErrorResult<C & { success: Success }>
469
+ >
470
+ >,
471
+ "success" | "error" | "stream"
472
+ >,
473
+ ModuleName,
474
+ Type,
475
+ false,
476
+ Resources,
477
+ [Final] extends [never] ? never : SchemaOrFields<Final>,
478
+ Middleware
479
+ >
480
+ <
481
+ Tag extends string,
482
+ Payload extends S.Struct.Fields,
483
+ Error extends S.Top | S.Struct.Fields,
484
+ C extends RequestConfig & Record<string, any> & { success?: never }
485
+ >(
486
+ tag: Tag,
487
+ fields: Payload,
488
+ config:
489
+ & Omit<C, "invalidatesQueries">
490
+ & { error: Error },
491
+ invalidatesQueries?: InvalidationCallback<
492
+ Resources,
493
+ InputFromPayload<Payload>,
494
+ void,
495
+ ErrorResult<C & { error: Error }>["Type"]
496
+ >
497
+ ): TaggedRequestForResult<
498
+ Self,
499
+ Tag,
500
+ Payload,
501
+ typeof S.Void,
502
+ ErrorResult<C & { error: Error }>,
503
+ Omit<
504
+ & Omit<C, "invalidatesQueries">
505
+ & {
506
+ error: Error
507
+ }
508
+ & Partial<
509
+ InvalidationConfigForCommand<
510
+ Resources,
511
+ Payload,
512
+ typeof S.Void,
513
+ ErrorResult<C & { error: Error }>
514
+ >
515
+ >,
516
+ "success" | "error" | "stream"
517
+ >,
518
+ ModuleName,
519
+ Type,
520
+ false,
521
+ Resources,
522
+ never,
523
+ Middleware
127
524
  >
128
- <Tag extends string, Payload extends S.Struct.Fields, C extends Record<string, any>>(
525
+ <
526
+ Tag extends string,
527
+ Payload extends S.Struct.Fields,
528
+ C extends RequestConfig & Record<string, any> & { success?: never; error?: never }
529
+ >(
129
530
  tag: Tag,
130
531
  fields: Payload,
131
- config: C & RequestConfig
532
+ config: Omit<C, "invalidatesQueries">,
533
+ invalidatesQueries?: InvalidationCallback<
534
+ Resources,
535
+ InputFromPayload<Payload>,
536
+ void,
537
+ ErrorResult<C>["Type"]
538
+ >
132
539
  ): TaggedRequestForResult<
133
540
  Self,
134
541
  Tag,
135
542
  Payload,
136
- typeof ForceVoid,
543
+ typeof S.Void,
137
544
  ErrorResult<C>,
138
- Omit<C, "success" | "error">,
139
- ModuleName
545
+ Omit<
546
+ & Omit<C, "invalidatesQueries">
547
+ & Partial<InvalidationConfigForCommand<Resources, Payload, typeof S.Void, ErrorResult<C>>>,
548
+ "success" | "error" | "stream"
549
+ >,
550
+ ModuleName,
551
+ Type,
552
+ false,
553
+ Resources,
554
+ never,
555
+ Middleware
140
556
  >
141
557
  <Tag extends string, Payload extends S.Struct.Fields>(
142
558
  tag: Tag,
@@ -145,23 +561,66 @@ export const makeRpcClient = <
145
561
  Self,
146
562
  Tag,
147
563
  Payload,
148
- typeof ForceVoid,
564
+ typeof S.Void,
149
565
  ErrorResult<{}>,
150
- Record<string, never>,
151
- ModuleName
566
+ // Empty config, NOT `Record<string, never>`: the config type flows into
567
+ // `GetEffectContext`/`GetEffectError` as `T`, and `keyof Record<string, never>`
568
+ // is `string` — so an inverted key like `allowAnonymous` would satisfy
569
+ // `key extends keyof T`, then `T[key]` (`never`) `extends true` (true, since
570
+ // `never` is assignable to everything) and the middleware wrongly takes the
571
+ // "allowAnonymous: true" (anonymous) branch, dropping `UserProfile`. `{}` has
572
+ // `keyof {} = never`, so no config key is treated as set and the defaults
573
+ // (auth required, `UserProfile` provided) apply — same as passing `{}` explicitly.
574
+ {},
575
+ ModuleName,
576
+ Type,
577
+ false,
578
+ never,
579
+ never,
580
+ Middleware
152
581
  >
153
582
  } {
154
583
  return (<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap>(
155
584
  tag: Tag,
156
585
  fields: Fields,
157
- config?: C
586
+ config?: C,
587
+ invalidatesQueries?: InvalidationCallback<Resources>
158
588
  ) => {
159
- const cls = makeRequestClass(tag, fields, config)
160
- Object.assign(cls, { id: `${moduleName}.${tag}`, moduleName })
589
+ const isStream = (config as any)?.stream === true
590
+ const requestConfig = invalidatesQueries === undefined ? config : { ...config, invalidatesQueries }
591
+ const cls = makeRequestClass(tag, fields, requestConfig)
592
+ Object.assign(cls, {
593
+ id: `${moduleName}.${tag}`,
594
+ moduleName,
595
+ type,
596
+ stream: isStream,
597
+ middleware
598
+ })
161
599
  return cls
162
600
  }) as any
163
601
  }
164
- return Object.assign(TaggedRequestWithMeta, { moduleName } as const)
602
+ return Object.assign(TaggedRequestWithMeta, { moduleName, type } as const)
603
+ }
604
+
605
+ function TaggedRequestFor<ModuleName extends string>(moduleName: ModuleName) {
606
+ const Query = makeTaggedRequestWithMeta(moduleName, "query")
607
+ const Command = makeTaggedRequestWithMeta(moduleName, "command")
608
+
609
+ return {
610
+ moduleName,
611
+ /**
612
+ * Create query request classes for this module.
613
+ * Queries read state and should not mutate server state.
614
+ * Pass `stream: true` in the config to produce a Stream of `success` values (QueryStream behaviour).
615
+ */
616
+ Query,
617
+ /**
618
+ * Create command request classes for this module.
619
+ * Commands mutate state and should avoid returning complex read models.
620
+ * Pass `stream: true` in the config to produce a Stream of `success` values (CommandStream behaviour).
621
+ */
622
+ Command
623
+ } as const
165
624
  }
166
625
 
167
626
  return {