effect-app 4.0.0-beta.30 → 4.0.0-beta.301

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 (365) hide show
  1. package/CHANGELOG.md +1435 -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.map +1 -1
  6. package/dist/Config/SecretURL.d.ts +3 -1
  7. package/dist/Config/SecretURL.d.ts.map +1 -1
  8. package/dist/Config/SecretURL.js +3 -6
  9. package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
  10. package/dist/Config/internal/configSecretURL.js +2 -2
  11. package/dist/Config.d.ts +2 -0
  12. package/dist/Config.d.ts.map +1 -0
  13. package/dist/Config.js +8 -0
  14. package/dist/ConfigProvider.d.ts +2 -0
  15. package/dist/ConfigProvider.d.ts.map +1 -0
  16. package/dist/ConfigProvider.js +6 -0
  17. package/dist/{ServiceMap.d.ts → Context.d.ts} +18 -20
  18. package/dist/Context.d.ts.map +1 -0
  19. package/dist/Context.js +67 -0
  20. package/dist/DataDependencies.d.ts +388 -0
  21. package/dist/DataDependencies.d.ts.map +1 -0
  22. package/dist/DataDependencies.js +64 -0
  23. package/dist/Effect.d.ts +10 -9
  24. package/dist/Effect.d.ts.map +1 -1
  25. package/dist/Effect.js +5 -8
  26. package/dist/Emailer.d.ts +51 -0
  27. package/dist/Emailer.d.ts.map +1 -0
  28. package/dist/Emailer.js +7 -0
  29. package/dist/Function.d.ts.map +1 -1
  30. package/dist/Layer.d.ts +10 -6
  31. package/dist/Layer.d.ts.map +1 -1
  32. package/dist/Layer.js +3 -2
  33. package/dist/Model/Repository/Registry.d.ts +22 -0
  34. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  35. package/dist/Model/Repository/Registry.js +18 -0
  36. package/dist/Model/Repository/ext.d.ts +60 -0
  37. package/dist/Model/Repository/ext.d.ts.map +1 -0
  38. package/dist/Model/Repository/ext.js +122 -0
  39. package/dist/Model/Repository/internal/internal.d.ts +63 -0
  40. package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
  41. package/dist/Model/Repository/internal/internal.js +438 -0
  42. package/dist/Model/Repository/legacy.d.ts +21 -0
  43. package/dist/Model/Repository/legacy.d.ts.map +1 -0
  44. package/dist/Model/Repository/legacy.js +2 -0
  45. package/dist/Model/Repository/makeRepo.d.ts +54 -0
  46. package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
  47. package/dist/Model/Repository/makeRepo.js +27 -0
  48. package/dist/Model/Repository/service.d.ts +121 -0
  49. package/dist/Model/Repository/service.d.ts.map +1 -0
  50. package/dist/Model/Repository/service.js +2 -0
  51. package/dist/Model/Repository/validation.d.ts +58 -0
  52. package/dist/Model/Repository/validation.d.ts.map +1 -0
  53. package/dist/Model/Repository/validation.js +32 -0
  54. package/dist/Model/Repository.d.ts +7 -0
  55. package/dist/Model/Repository.d.ts.map +1 -0
  56. package/dist/Model/Repository.js +7 -0
  57. package/dist/Model/dsl.d.ts +33 -0
  58. package/dist/Model/dsl.d.ts.map +1 -0
  59. package/dist/Model/dsl.js +43 -0
  60. package/dist/Model/filter/filterApi.d.ts +30 -0
  61. package/dist/Model/filter/filterApi.d.ts.map +1 -0
  62. package/dist/Model/filter/filterApi.js +2 -0
  63. package/dist/Model/filter/types/errors.d.ts +29 -0
  64. package/dist/Model/filter/types/errors.d.ts.map +1 -0
  65. package/dist/Model/filter/types/errors.js +2 -0
  66. package/dist/Model/filter/types/fields.d.ts +15 -0
  67. package/dist/Model/filter/types/fields.d.ts.map +1 -0
  68. package/dist/Model/filter/types/fields.js +2 -0
  69. package/dist/Model/filter/types/path/common.d.ts +316 -0
  70. package/dist/Model/filter/types/path/common.d.ts.map +1 -0
  71. package/dist/Model/filter/types/path/common.js +2 -0
  72. package/dist/Model/filter/types/path/eager.d.ts +94 -0
  73. package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
  74. package/dist/Model/filter/types/path/eager.js +36 -0
  75. package/dist/Model/filter/types/path/index.d.ts +4 -0
  76. package/dist/Model/filter/types/path/index.d.ts.map +1 -0
  77. package/dist/Model/filter/types/path/index.js +3 -0
  78. package/dist/Model/filter/types/utils.d.ts +79 -0
  79. package/dist/Model/filter/types/utils.d.ts.map +1 -0
  80. package/dist/Model/filter/types/utils.js +2 -0
  81. package/dist/Model/filter/types/validator.d.ts +30 -0
  82. package/dist/Model/filter/types/validator.d.ts.map +1 -0
  83. package/dist/Model/filter/types/validator.js +2 -0
  84. package/dist/Model/filter/types.d.ts +5 -0
  85. package/dist/Model/filter/types.d.ts.map +1 -0
  86. package/dist/Model/filter/types.js +7 -0
  87. package/dist/Model/query/dsl.d.ts +514 -0
  88. package/dist/Model/query/dsl.d.ts.map +1 -0
  89. package/dist/Model/query/dsl.js +376 -0
  90. package/dist/Model/query/new-kid-interpreter.d.ts +132 -0
  91. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
  92. package/dist/Model/query/new-kid-interpreter.js +361 -0
  93. package/dist/Model/query.d.ts +15 -0
  94. package/dist/Model/query.d.ts.map +1 -0
  95. package/dist/Model/query.js +3 -0
  96. package/dist/Model.d.ts +5 -0
  97. package/dist/Model.d.ts.map +1 -0
  98. package/dist/Model.js +5 -0
  99. package/dist/NonEmptySet.d.ts +3 -1
  100. package/dist/NonEmptySet.d.ts.map +1 -1
  101. package/dist/NonEmptySet.js +2 -2
  102. package/dist/Option.d.ts +1 -0
  103. package/dist/Option.d.ts.map +1 -1
  104. package/dist/Option.js +3 -1
  105. package/dist/Pure.d.ts +7 -5
  106. package/dist/Pure.d.ts.map +1 -1
  107. package/dist/Pure.js +7 -4
  108. package/dist/QueueMaker.d.ts +11 -0
  109. package/dist/QueueMaker.d.ts.map +1 -0
  110. package/dist/QueueMaker.js +11 -0
  111. package/dist/RequestContext.d.ts +87 -0
  112. package/dist/RequestContext.d.ts.map +1 -0
  113. package/dist/RequestContext.js +45 -0
  114. package/dist/RequestScopedDependencies.d.ts +21 -0
  115. package/dist/RequestScopedDependencies.d.ts.map +1 -0
  116. package/dist/RequestScopedDependencies.js +16 -0
  117. package/dist/Schema/Class.d.ts +188 -19
  118. package/dist/Schema/Class.d.ts.map +1 -1
  119. package/dist/Schema/Class.js +260 -17
  120. package/dist/Schema/FastCheck.d.ts.map +1 -1
  121. package/dist/Schema/SchemaParser.d.ts +5 -0
  122. package/dist/Schema/SchemaParser.d.ts.map +1 -0
  123. package/dist/Schema/SchemaParser.js +6 -0
  124. package/dist/Schema/SpecialJsonSchema.d.ts +34 -0
  125. package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
  126. package/dist/Schema/SpecialJsonSchema.js +118 -0
  127. package/dist/Schema/SpecialOpenApi.d.ts +32 -0
  128. package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
  129. package/dist/Schema/SpecialOpenApi.js +123 -0
  130. package/dist/Schema/brand.d.ts +4 -2
  131. package/dist/Schema/brand.d.ts.map +1 -1
  132. package/dist/Schema/brand.js +3 -1
  133. package/dist/Schema/email.d.ts.map +1 -1
  134. package/dist/Schema/email.js +7 -4
  135. package/dist/Schema/ext.d.ts +338 -55
  136. package/dist/Schema/ext.d.ts.map +1 -1
  137. package/dist/Schema/ext.js +358 -53
  138. package/dist/Schema/moreStrings.d.ts +82 -36
  139. package/dist/Schema/moreStrings.d.ts.map +1 -1
  140. package/dist/Schema/moreStrings.js +49 -42
  141. package/dist/Schema/numbers.d.ts +34 -21
  142. package/dist/Schema/numbers.d.ts.map +1 -1
  143. package/dist/Schema/numbers.js +55 -12
  144. package/dist/Schema/phoneNumber.d.ts.map +1 -1
  145. package/dist/Schema/phoneNumber.js +6 -3
  146. package/dist/Schema/schema.d.ts +1 -1
  147. package/dist/Schema/schema.d.ts.map +1 -1
  148. package/dist/Schema/schema.js +2 -2
  149. package/dist/Schema/strings.d.ts +18 -4
  150. package/dist/Schema/strings.d.ts.map +1 -1
  151. package/dist/Schema/strings.js +1 -5
  152. package/dist/Schema.d.ts +222 -8
  153. package/dist/Schema.d.ts.map +1 -1
  154. package/dist/Schema.js +191 -12
  155. package/dist/SchemaAST.d.ts +2 -0
  156. package/dist/SchemaAST.d.ts.map +1 -0
  157. package/dist/SchemaAST.js +2 -0
  158. package/dist/Set.d.ts +4 -1
  159. package/dist/Set.d.ts.map +1 -1
  160. package/dist/Set.js +3 -2
  161. package/dist/Store.d.ts +163 -0
  162. package/dist/Store.d.ts.map +1 -0
  163. package/dist/Store.js +113 -0
  164. package/dist/_ext/Array.d.ts +1 -1
  165. package/dist/_ext/Array.d.ts.map +1 -1
  166. package/dist/_ext/Array.js +4 -2
  167. package/dist/_ext/misc.d.ts +4 -1
  168. package/dist/_ext/misc.d.ts.map +1 -1
  169. package/dist/_ext/misc.js +4 -2
  170. package/dist/_ext/ord.ext.d.ts +2 -1
  171. package/dist/_ext/ord.ext.d.ts.map +1 -1
  172. package/dist/_ext/ord.ext.js +2 -2
  173. package/dist/builtin.d.ts +2 -14
  174. package/dist/builtin.d.ts.map +1 -1
  175. package/dist/builtin.js +1 -1
  176. package/dist/client/InvalidationKeys.d.ts +30 -0
  177. package/dist/client/InvalidationKeys.d.ts.map +1 -0
  178. package/dist/client/InvalidationKeys.js +37 -0
  179. package/dist/client/apiClientFactory.d.ts +19 -31
  180. package/dist/client/apiClientFactory.d.ts.map +1 -1
  181. package/dist/client/apiClientFactory.js +155 -35
  182. package/dist/client/clientFor.d.ts +54 -18
  183. package/dist/client/clientFor.d.ts.map +1 -1
  184. package/dist/client/clientFor.js +9 -1
  185. package/dist/client/errors.d.ts +82 -27
  186. package/dist/client/errors.d.ts.map +1 -1
  187. package/dist/client/errors.js +75 -19
  188. package/dist/client/makeClient.d.ts +490 -34
  189. package/dist/client/makeClient.d.ts.map +1 -1
  190. package/dist/client/makeClient.js +62 -28
  191. package/dist/client.d.ts +2 -0
  192. package/dist/client.d.ts.map +1 -1
  193. package/dist/client.js +3 -1
  194. package/dist/faker.d.ts.map +1 -1
  195. package/dist/http/Request.d.ts +1 -1
  196. package/dist/http/Request.d.ts.map +1 -1
  197. package/dist/http/Request.js +2 -2
  198. package/dist/ids.d.ts +42 -14
  199. package/dist/ids.d.ts.map +1 -1
  200. package/dist/ids.js +30 -5
  201. package/dist/index.d.ts +6 -7
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +8 -8
  204. package/dist/middleware.d.ts +13 -7
  205. package/dist/middleware.d.ts.map +1 -1
  206. package/dist/middleware.js +14 -8
  207. package/dist/rpc/Invalidation.d.ts +3140 -0
  208. package/dist/rpc/Invalidation.d.ts.map +1 -0
  209. package/dist/rpc/Invalidation.js +178 -0
  210. package/dist/rpc/MiddlewareMaker.d.ts +11 -7
  211. package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
  212. package/dist/rpc/MiddlewareMaker.js +59 -38
  213. package/dist/rpc/RpcContextMap.d.ts +3 -3
  214. package/dist/rpc/RpcContextMap.d.ts.map +1 -1
  215. package/dist/rpc/RpcContextMap.js +4 -4
  216. package/dist/rpc/RpcMiddleware.d.ts +14 -10
  217. package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
  218. package/dist/rpc/RpcMiddleware.js +1 -1
  219. package/dist/rpc.d.ts +1 -1
  220. package/dist/rpc.d.ts.map +1 -1
  221. package/dist/rpc.js +2 -2
  222. package/dist/runtime.d.ts +19 -0
  223. package/dist/runtime.d.ts.map +1 -0
  224. package/dist/runtime.js +40 -0
  225. package/dist/setupRequest.d.ts +20 -0
  226. package/dist/setupRequest.d.ts.map +1 -0
  227. package/dist/setupRequest.js +72 -0
  228. package/dist/toast.d.ts +51 -0
  229. package/dist/toast.d.ts.map +1 -0
  230. package/dist/toast.js +34 -0
  231. package/dist/transform.d.ts +1 -1
  232. package/dist/transform.d.ts.map +1 -1
  233. package/dist/transform.js +4 -5
  234. package/dist/utils/effectify.d.ts +1 -1
  235. package/dist/utils/effectify.d.ts.map +1 -1
  236. package/dist/utils/effectify.js +2 -2
  237. package/dist/utils/extend.d.ts.map +1 -1
  238. package/dist/utils/gen.d.ts +4 -4
  239. package/dist/utils/gen.d.ts.map +1 -1
  240. package/dist/utils/logLevel.d.ts +2 -2
  241. package/dist/utils/logLevel.d.ts.map +1 -1
  242. package/dist/utils/logger.d.ts +4 -3
  243. package/dist/utils/logger.d.ts.map +1 -1
  244. package/dist/utils/logger.js +4 -4
  245. package/dist/utils.d.ts +34 -39
  246. package/dist/utils.d.ts.map +1 -1
  247. package/dist/utils.js +33 -37
  248. package/dist/validation/validators.d.ts.map +1 -1
  249. package/dist/validation.d.ts.map +1 -1
  250. package/dist/withToast.d.ts +30 -0
  251. package/dist/withToast.d.ts.map +1 -0
  252. package/dist/withToast.js +64 -0
  253. package/package.json +27 -251
  254. package/src/Array.ts +5 -5
  255. package/src/Chunk.ts +3 -3
  256. package/src/Config/SecretURL.ts +6 -3
  257. package/src/Config/internal/configSecretURL.ts +2 -2
  258. package/src/Config.ts +7 -0
  259. package/src/ConfigProvider.ts +5 -0
  260. package/src/{ServiceMap.ts → Context.ts} +56 -63
  261. package/src/DataDependencies.ts +114 -0
  262. package/src/Effect.ts +14 -16
  263. package/src/Emailer.ts +51 -0
  264. package/src/Inputify.type.ts +1 -1
  265. package/src/Layer.ts +11 -7
  266. package/src/Model/Repository/Registry.ts +35 -0
  267. package/src/Model/Repository/ext.ts +375 -0
  268. package/src/Model/Repository/internal/internal.ts +755 -0
  269. package/src/Model/Repository/legacy.ts +29 -0
  270. package/src/Model/Repository/makeRepo.ts +145 -0
  271. package/src/Model/Repository/service.ts +676 -0
  272. package/src/Model/Repository/validation.ts +31 -0
  273. package/src/Model/Repository.ts +6 -0
  274. package/src/Model/dsl.ts +129 -0
  275. package/src/Model/filter/filterApi.ts +60 -0
  276. package/src/Model/filter/types/errors.ts +47 -0
  277. package/src/Model/filter/types/fields.ts +50 -0
  278. package/src/Model/filter/types/path/common.ts +404 -0
  279. package/src/Model/filter/types/path/eager.ts +329 -0
  280. package/src/Model/filter/types/path/index.ts +4 -0
  281. package/src/Model/filter/types/utils.ts +128 -0
  282. package/src/Model/filter/types/validator.ts +46 -0
  283. package/src/Model/filter/types.ts +6 -0
  284. package/src/Model/query/dsl.ts +2770 -0
  285. package/src/Model/query/new-kid-interpreter.ts +526 -0
  286. package/src/Model/query.ts +13 -0
  287. package/src/Model.ts +4 -0
  288. package/src/NonEmptySet.ts +6 -4
  289. package/src/Option.ts +2 -0
  290. package/src/Pure.ts +10 -7
  291. package/src/QueueMaker.ts +11 -0
  292. package/src/RequestContext.ts +48 -0
  293. package/src/RequestScopedDependencies.ts +45 -0
  294. package/src/Schema/Class.ts +633 -59
  295. package/src/Schema/SchemaParser.ts +12 -0
  296. package/src/Schema/SpecialJsonSchema.ts +139 -0
  297. package/src/Schema/SpecialOpenApi.ts +130 -0
  298. package/src/Schema/brand.ts +22 -2
  299. package/src/Schema/email.ts +9 -4
  300. package/src/Schema/ext.ts +446 -91
  301. package/src/Schema/moreStrings.ts +147 -68
  302. package/src/Schema/numbers.ts +97 -28
  303. package/src/Schema/phoneNumber.ts +9 -5
  304. package/src/Schema/schema.ts +1 -1
  305. package/src/Schema/strings.ts +23 -14
  306. package/src/Schema.ts +397 -26
  307. package/src/SchemaAST.ts +1 -0
  308. package/src/Set.ts +6 -2
  309. package/src/Store.ts +273 -0
  310. package/src/_ext/Array.ts +4 -2
  311. package/src/_ext/misc.ts +4 -1
  312. package/src/_ext/ord.ext.ts +2 -1
  313. package/src/builtin-json.d.ts +24 -0
  314. package/src/builtin.ts +16 -21
  315. package/src/client/InvalidationKeys.ts +55 -0
  316. package/src/client/apiClientFactory.ts +299 -134
  317. package/src/client/clientFor.ts +107 -34
  318. package/src/client/errors.ts +100 -29
  319. package/src/client/makeClient.ts +594 -78
  320. package/src/client.ts +6 -4
  321. package/src/http/Request.ts +3 -3
  322. package/src/http.ts +1 -1
  323. package/src/ids.ts +33 -6
  324. package/src/index.ts +20 -23
  325. package/src/middleware.ts +13 -9
  326. package/src/rpc/Invalidation.ts +278 -0
  327. package/src/rpc/MiddlewareMaker.ts +88 -80
  328. package/src/rpc/README.md +2 -2
  329. package/src/rpc/RpcContextMap.ts +7 -6
  330. package/src/rpc/RpcMiddleware.ts +19 -13
  331. package/src/rpc.ts +4 -4
  332. package/src/runtime.ts +56 -0
  333. package/src/setupRequest.ts +138 -0
  334. package/src/toast.ts +54 -0
  335. package/src/transform.ts +4 -4
  336. package/src/utils/effectify.ts +1 -1
  337. package/src/utils/gen.ts +8 -8
  338. package/src/utils/logLevel.ts +1 -1
  339. package/src/utils/logger.ts +4 -3
  340. package/src/utils.ts +85 -158
  341. package/src/validation.ts +2 -2
  342. package/src/withToast.ts +133 -0
  343. package/test/dist/rpc.test.d.ts.map +1 -1
  344. package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
  345. package/test/dist/secretURL.test.d.ts.map +1 -0
  346. package/test/dist/special.test.d.ts.map +1 -0
  347. package/test/moreStrings.test.ts +1 -1
  348. package/test/rpc.test.ts +42 -13
  349. package/test/rpcMiddlewareContext.test.ts +63 -0
  350. package/test/schema.test.ts +459 -30
  351. package/test/secretURL.test.ts +160 -0
  352. package/test/special.test.ts +1258 -0
  353. package/test/utils.test.ts +7 -7
  354. package/tsconfig.base.json +6 -5
  355. package/tsconfig.json +3 -1
  356. package/tsconfig.src.json +29 -29
  357. package/tsconfig.test.json +2 -2
  358. package/dist/Operations.d.ts +0 -123
  359. package/dist/Operations.d.ts.map +0 -1
  360. package/dist/Operations.js +0 -29
  361. package/dist/ServiceMap.d.ts.map +0 -1
  362. package/dist/ServiceMap.js +0 -91
  363. package/eslint.config.mjs +0 -26
  364. package/src/Operations.ts +0 -55
  365. package/tsconfig.json.bak +0 -12
@@ -1,113 +1,629 @@
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.Any.pipe(
13
- S.decodeTo(S.Any, SchemaTransformation.transform({ decode: () => void 0 as void, encode: () => void 0 }))
14
- )
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
+ }
15
65
 
16
- 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>
17
72
 
18
- type TaggedRequestResult<
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">
103
+
104
+ type TaggedRequestForResult<
105
+ Self,
19
106
  Tag extends string,
20
107
  Payload extends S.Struct.Fields,
21
108
  Success extends S.Top,
22
109
  Error extends S.Top,
23
- Config = Record<string, never>
110
+ Config,
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
24
117
  > =
25
- & S.TaggedStruct<Tag, Payload>
118
+ & S.Opaque<Self, S.ExtendedSchemaNoEncoded, TaggedRequestSchema<Tag, Payload>, {}>
26
119
  & {
27
- new(...args: any[]): any
120
+ readonly fields: TaggedRequestSchema<Tag, Payload>["fields"]
28
121
  readonly _tag: Tag
29
- readonly fields: { readonly _tag: S.tag<Tag> } & Payload
30
122
  readonly success: Success
31
123
  readonly error: Error
32
124
  readonly config: Config
33
- readonly "~decodingServices": S.Codec.DecodingServices<Success> | S.Codec.DecodingServices<Error>
125
+ readonly id: `${ModuleName}.${Tag}`
126
+ readonly moduleName: ModuleName
127
+ readonly type: Type
128
+ readonly stream: Stream
129
+ readonly middleware?: Middleware
130
+ readonly "~invalidationResources"?: Resources
34
131
  }
132
+ & ([Final] extends [never] ? {} : { readonly final: Final })
35
133
 
36
134
  export const makeRpcClient = <
37
- RequestContextMap extends RequestContextMapTagAny,
135
+ Middleware extends ClientMiddleware<Record<string, RpcContextMap.Any>>,
38
136
  GeneralErrors extends S.Top = never
39
- >(rcs: RequestContextMap, generalErrors?: GeneralErrors) => {
40
- // Long way around ServiceMap/C extends etc to support actual jsdoc from passed in RequestConfig etc... (??)
137
+ >(middleware: Middleware, generalErrors?: GeneralErrors) => {
138
+ // Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc... (??)
41
139
  type ServiceMap = {
42
140
  success: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
43
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
44
144
  }
45
145
 
46
- type RequestConfig = GetContextConfig<RequestContextMap["config"]>
146
+ type RequestConfig = GetContextConfig<Middleware["requestContextMap"]>
47
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.
48
154
  type MergeError<E> = [GeneralErrors] extends [never] ? SchemaOrFields<E> : S.Union<[SchemaOrFields<E>, GeneralErrors]>
49
155
  type ErrorResult<C> = C extends { error: infer E } ? MergeError<E>
50
- : [GeneralErrors] extends [never] ? GetEffectError<RequestContextMap["config"], C>
51
- : MergeError<GetEffectError<RequestContextMap["config"], C>>
52
-
53
- function TaggedRequest<_Self>(): {
54
- <Tag extends string, Payload extends S.Struct.Fields, C extends ServiceMap>(
55
- tag: Tag,
56
- fields: Payload,
57
- config: RequestConfig & C
58
- ): TaggedRequestResult<Tag, Payload, SchemaOrFields<C["success"]>, ErrorResult<C>, Omit<C, "success" | "error">>
59
- <Tag extends string, Payload extends S.Struct.Fields, C extends Pick<ServiceMap, "success">>(
60
- tag: Tag,
61
- fields: Payload,
62
- config: RequestConfig & C
63
- ): TaggedRequestResult<Tag, Payload, SchemaOrFields<C["success"]>, ErrorResult<C>, Omit<C, "success" | "error">>
64
- <Tag extends string, Payload extends S.Struct.Fields, C extends Pick<ServiceMap, "error">>(
65
- tag: Tag,
66
- fields: Payload,
67
- config: RequestConfig & C
68
- ): TaggedRequestResult<Tag, Payload, typeof ForceVoid, ErrorResult<C>, Omit<C, "success" | "error">>
69
- <Tag extends string, Payload extends S.Struct.Fields, C extends Record<string, any>>(
70
- tag: Tag,
71
- fields: Payload,
72
- config: C & RequestConfig
73
- ): TaggedRequestResult<Tag, Payload, typeof ForceVoid, ErrorResult<C>, Omit<C, "success" | "error">>
74
- <Tag extends string, Payload extends S.Struct.Fields>(
75
- tag: Tag,
76
- fields: Payload
77
- ): TaggedRequestResult<Tag, Payload, typeof ForceVoid, ErrorResult<{}>, Record<string, never>>
78
- } {
79
- // TODO: filter errors based on config + take care of inversion
80
- const errorSchemas = Object.values(rcs.config).map((_) => _.error)
81
- return (<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap>(
82
- tag: Tag,
83
- fields: Fields,
84
- config?: C
85
- ) => {
86
- // TODO: S.TaggedRequest removed in v4 — needs rework to use Rpc.make or Request.TaggedClass
87
- // For now, creating a simple tagged struct class with success/failure properties
88
- const failureSchema = merge(
89
- config?.error ? S.isSchema(config.error) ? config.error : S.Struct(config.error) : undefined,
90
- [...errorSchemas, generalErrors].filter(Boolean)
91
- )
92
- const successSchema = config?.success
93
- ? S.isSchema(config.success)
94
- ? AST.isVoid(config.success.ast) ? ForceVoid : config.success
95
- : S.Struct(config.success)
96
- : ForceVoid
97
-
98
- const RequestClass = S.TaggedClass<any>()(tag, fields)
99
- Object.assign(RequestClass, {
100
- _tag: tag,
101
- success: successSchema,
102
- error: failureSchema,
103
- config
104
- })
105
-
106
- return RequestClass
107
- }) as any
156
+ : [GeneralErrors] extends [never] ? typeof S.Never
157
+ : GeneralErrors
158
+
159
+ function makeRequestClass<Tag extends string, Fields extends S.Struct.Fields, C extends Partial<ServiceMap>>(
160
+ tag: Tag,
161
+ fields: Fields,
162
+ config?: C
163
+ ) {
164
+ const failureSchema = merge(
165
+ config?.error ? S.isSchema(config.error) ? config.error : S.Struct(config.error) : undefined,
166
+ [generalErrors].filter(Boolean)
167
+ )
168
+ const successSchema = config?.success
169
+ ? S.isSchema(config.success)
170
+ ? AST.isVoid(config.success.ast) ? S.Void : config.success
171
+ : S.Struct(config.success)
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)
179
+
180
+ const RequestClass = S.Opaque()(S.TaggedStruct(tag, fields))
181
+ Object.assign(RequestClass, {
182
+ _tag: tag,
183
+ success: successSchema,
184
+ error: failureSchema,
185
+ ...(finalSchema !== undefined ? { final: finalSchema } : {}),
186
+ config: restConfig
187
+ })
188
+
189
+ return RequestClass
190
+ }
191
+
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
+ >(
209
+ tag: Tag,
210
+ fields: Payload,
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
+ >
220
+ ): TaggedRequestForResult<
221
+ Self,
222
+ Tag,
223
+ Payload,
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
248
+ >
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
+ >(
259
+ tag: Tag,
260
+ fields: Payload,
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
+ >
270
+ ): TaggedRequestForResult<
271
+ Self,
272
+ Tag,
273
+ Payload,
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
295
+ >
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
+ >(
306
+ tag: Tag,
307
+ fields: Payload,
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
+ >
317
+ ): TaggedRequestForResult<
318
+ Self,
319
+ Tag,
320
+ Payload,
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,
367
+ ErrorResult<C>,
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
524
+ >
525
+ <
526
+ Tag extends string,
527
+ Payload extends S.Struct.Fields,
528
+ C extends RequestConfig & Record<string, any> & { success?: never; error?: never }
529
+ >(
530
+ tag: Tag,
531
+ fields: Payload,
532
+ config: Omit<C, "invalidatesQueries">,
533
+ invalidatesQueries?: InvalidationCallback<
534
+ Resources,
535
+ InputFromPayload<Payload>,
536
+ void,
537
+ ErrorResult<C>["Type"]
538
+ >
539
+ ): TaggedRequestForResult<
540
+ Self,
541
+ Tag,
542
+ Payload,
543
+ typeof S.Void,
544
+ ErrorResult<C>,
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
556
+ >
557
+ <Tag extends string, Payload extends S.Struct.Fields>(
558
+ tag: Tag,
559
+ fields: Payload
560
+ ): TaggedRequestForResult<
561
+ Self,
562
+ Tag,
563
+ Payload,
564
+ typeof S.Void,
565
+ ErrorResult<{}>,
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
581
+ >
582
+ } {
583
+ return (<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap>(
584
+ tag: Tag,
585
+ fields: Fields,
586
+ config?: C,
587
+ invalidatesQueries?: InvalidationCallback<Resources>
588
+ ) => {
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
+ })
599
+ return cls
600
+ }) as any
601
+ }
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
108
624
  }
109
625
 
110
626
  return {
111
- TaggedRequest
627
+ TaggedRequestFor
112
628
  }
113
629
  }