effect-app 4.0.0-beta.3 → 4.0.0-beta.300

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 +1592 -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/Context.d.ts +42 -0
  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 -7
  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 +17 -14
  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 +259 -22
  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 +11 -6
  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 +9 -5
  135. package/dist/Schema/ext.d.ts +340 -56
  136. package/dist/Schema/ext.d.ts.map +1 -1
  137. package/dist/Schema/ext.js +361 -63
  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 +53 -44
  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 +8 -4
  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 +238 -58
  153. package/dist/Schema.d.ts.map +1 -1
  154. package/dist/Schema.js +227 -69
  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 +160 -41
  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 +492 -32
  189. package/dist/client/makeClient.d.ts.map +1 -1
  190. package/dist/client/makeClient.js +62 -38
  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 +5 -5
  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 -8
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +8 -9
  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 +50 -37
  246. package/dist/utils.d.ts.map +1 -1
  247. package/dist/utils.js +51 -36
  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 -255
  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} +59 -65
  261. package/src/DataDependencies.ts +114 -0
  262. package/src/Effect.ts +15 -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 +22 -20
  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 +631 -63
  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 +34 -8
  299. package/src/Schema/email.ts +12 -5
  300. package/src/Schema/ext.ts +469 -106
  301. package/src/Schema/moreStrings.ts +155 -73
  302. package/src/Schema/numbers.ts +97 -28
  303. package/src/Schema/phoneNumber.ts +12 -6
  304. package/src/Schema/schema.ts +1 -1
  305. package/src/Schema/strings.ts +23 -14
  306. package/src/Schema.ts +468 -121
  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 +306 -144
  317. package/src/client/clientFor.ts +107 -34
  318. package/src/client/errors.ts +109 -29
  319. package/src/client/makeClient.ts +593 -87
  320. package/src/client.ts +6 -4
  321. package/src/http/Request.ts +9 -6
  322. package/src/http.ts +1 -1
  323. package/src/ids.ts +34 -7
  324. package/src/index.ts +20 -24
  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 +105 -156
  341. package/src/validation.ts +2 -2
  342. package/src/withToast.ts +133 -0
  343. package/test/dist/moreStrings.test.d.ts.map +1 -0
  344. package/test/dist/rpc.test.d.ts.map +1 -1
  345. package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
  346. package/test/dist/secretURL.test.d.ts.map +1 -0
  347. package/test/dist/special.test.d.ts.map +1 -0
  348. package/test/moreStrings.test.ts +17 -0
  349. package/test/rpc.test.ts +45 -6
  350. package/test/rpcMiddlewareContext.test.ts +63 -0
  351. package/test/schema.test.ts +613 -7
  352. package/test/secretURL.test.ts +160 -0
  353. package/test/special.test.ts +1258 -0
  354. package/test/utils.test.ts +7 -7
  355. package/tsconfig.base.json +6 -5
  356. package/tsconfig.json +3 -1
  357. package/tsconfig.src.json +29 -29
  358. package/tsconfig.test.json +2 -2
  359. package/dist/Operations.d.ts +0 -87
  360. package/dist/Operations.d.ts.map +0 -1
  361. package/dist/Operations.js +0 -29
  362. package/dist/ServiceMap.d.ts +0 -44
  363. package/dist/ServiceMap.d.ts.map +0 -1
  364. package/dist/ServiceMap.js +0 -91
  365. package/dist/Struct.d.ts +0 -44
  366. package/dist/Struct.d.ts.map +0 -1
  367. package/dist/Struct.js +0 -29
  368. package/eslint.config.mjs +0 -26
  369. package/src/Operations.ts +0 -55
  370. package/src/Struct.ts +0 -54
  371. package/tsconfig.json.bak +0 -12
@@ -2,12 +2,12 @@
2
2
  /* eslint-disable @typescript-eslint/no-explicit-any */
3
3
 
4
4
  import * as Record from "effect/Record"
5
- import type * as Request from "effect/Request"
5
+ import type * as Stream from "effect/Stream"
6
6
  import type { Path } from "path-parser"
7
7
  import qs from "query-string"
8
- import type * as Effect from "../Effect.js"
9
- import type * as S from "../Schema.js"
10
- import { type Req } from "./apiClientFactory.js"
8
+ import type * as Effect from "../Effect.ts"
9
+ import type * as S from "../Schema.ts"
10
+ import { type Req } from "./apiClientFactory.ts"
11
11
 
12
12
  export function makePathWithQuery(
13
13
  path: Path,
@@ -48,9 +48,14 @@ export function makePathWithBody(
48
48
  return path.build(pars, { ignoreSearch: true, ignoreConstraints: true })
49
49
  }
50
50
 
51
- export type Requests<ModuleName extends string = string> = { meta: { moduleName: ModuleName } } & RequestsAny
51
+ export type Requests = RequestsAny
52
52
  export type RequestsAny = Record<string, any>
53
53
 
54
+ export type ExtractModuleName<M extends RequestsAny> =
55
+ { [K in keyof M]: M[K] extends { moduleName: infer N extends string } ? N : never }[keyof M] extends
56
+ infer R extends string ? R
57
+ : string
58
+
54
59
  export type Client<M extends RequestsAny, ModuleName extends string> = RequestHandlers<
55
60
  never,
56
61
  never,
@@ -58,56 +63,124 @@ export type Client<M extends RequestsAny, ModuleName extends string> = RequestHa
58
63
  ModuleName
59
64
  >
60
65
 
61
- export type ExtractResponse<T> = T extends S.Codec<any> ? S.Schema.Type<T>
66
+ export type ExtractResponse<T> = T extends S.Codec<any> ? T["Type"]
62
67
  : T extends unknown ? void
63
68
  : never
64
69
 
65
- export type ExtractEResponse<T> = T extends S.Codec<any> ? S.Codec.Encoded<T>
70
+ export type ExtractEResponse<T> = T extends S.Codec<any> ? T["Encoded"]
66
71
  : T extends unknown ? void
67
72
  : never
68
73
 
69
- type IsEmpty<T> = keyof T extends never ? true
70
- : false
71
-
72
- // v4: Request.RequestTypeId, S.symbolSerializable, S.symbolWithResult removed — use keyof Request to filter internal props
73
- type Cruft = "_tag" | keyof Request.Request<any, any, any>
74
-
75
74
  export interface ClientForOptions {
76
75
  readonly skipQueryKey?: readonly string[]
76
+ /**
77
+ * Middleware tag to attach to every rpc on the client. Schema-only — the
78
+ * client never invokes the middleware (no Live impl required), but its
79
+ * declared `error` schema joins the rpc failure union via
80
+ * `Rpc.exitSchema`'s `rpc.middlewares[*].error` walk. Required when
81
+ * middleware can throw errors that aren't part of the resource's declared
82
+ * error union (e.g. auth middleware throwing `NotLoggedInError`); without
83
+ * it the client decode would fail with a `SchemaError` for stream rpcs.
84
+ */
77
85
  }
78
86
 
79
- export interface RequestHandler<A, E, R, Request extends Req, Id extends string> {
80
- handler: Effect.Effect<A, E, R>
87
+ // $Project/$Configuration.Index
88
+ // -> "$Project", "$Configuration", "Index"
89
+ export const makeQueryKey = ({ id, options }: { id: string; options?: ClientForOptions }) =>
90
+ id
91
+ .split("/")
92
+ .filter((segment: string) => !options || !options.skipQueryKey?.includes(segment))
93
+ .map((segment: string) => "$" + segment)
94
+ .join(".")
95
+ .split(".")
96
+
97
+ export interface RequestHandlerWithInput<I, A, E, R, Request extends Req, Id extends string> {
98
+ handler: (i: I) => Effect.Effect<A, E, R>
81
99
  id: Id
82
100
  options?: ClientForOptions
83
101
  Request: Request
102
+ queryKeyProjectionHash?: string
103
+ disableQueryInvalidation?: boolean
84
104
  }
85
105
 
86
- export interface RequestHandlerWithInput<I, A, E, R, Request extends Req, Id extends string> {
87
- handler: (i: I) => Effect.Effect<A, E, R>
106
+ /** Type alias: a no-input handler is simply `RequestHandlerWithInput<void, …>`. */
107
+ export type RequestHandler<A, E, R, Request extends Req, Id extends string> = RequestHandlerWithInput<
108
+ void,
109
+ A,
110
+ E,
111
+ R,
112
+ Request,
113
+ Id
114
+ >
115
+
116
+ export interface RequestStreamHandlerWithInput<I, A, E, R, Request extends Req, Id extends string, Final = A> {
117
+ handler: (i: I) => Stream.Stream<A, E, R>
88
118
  id: Id
89
119
  options?: ClientForOptions
90
120
  Request: Request
121
+ /**
122
+ * Phantom type property (never set at runtime) that carries the `Final` type to
123
+ * `StreamMutationWithExtensions`. The tilde prefix follows the Effect convention for
124
+ * phantom/virtual properties and prevents accidental runtime access.
125
+ * Stream failures bubble through the execute effect's typed error channel `E`;
126
+ * the reactive `AsyncResult` ref also mirrors the failure for live progress UI.
127
+ */
128
+ readonly "~final"?: Final
91
129
  }
92
130
 
131
+ /** Type alias: a no-input stream handler is simply `RequestStreamHandlerWithInput<void, …>`. */
132
+ export type RequestStreamHandler<A, E, R, Request extends Req, Id extends string, Final = A> =
133
+ RequestStreamHandlerWithInput<void, A, E, R, Request, Id, Final>
134
+
93
135
  // make sure this is exported or d.ts of apiClientFactory breaks?!
94
- type ReqDecodingServices<M> = M extends { readonly "~decodingServices": infer DS } ? DS : never
136
+ export type RequestInputFromMake<I extends { readonly make: (...args: any[]) => any }> = Parameters<I["make"]> extends
137
+ [] ? void : Parameters<I["make"]>[0]
138
+
139
+ // Has no input only when the request schema declares no payload fields (the auto-added
140
+ // `_tag` field is ignored). Any payload fields (even all-optional) produce a function handler.
141
+ type HasNoFields<I> = I extends { readonly fields: infer F extends S.Struct.Fields }
142
+ ? [Exclude<keyof F, "_tag">] extends [never] ? true : false
143
+ : false
144
+
145
+ type RequestInput<I extends { readonly make: (...args: any[]) => any }> = Parameters<I["make"]>[0]
146
+
147
+ /**
148
+ * Caller-facing input type for a request. `void` when the request schema has no fields;
149
+ * otherwise `make`'s first param type.
150
+ */
151
+ export type HandlerInput<I extends { readonly make: (...args: any[]) => any }> = HasNoFields<I> extends true ? void
152
+ : RequestInput<I>
153
+
154
+ /** Extracts the final-value type from a stream request. Defaults to the success type when no `final` schema is set. */
155
+ type FinalTypeOf<T extends Req> = T extends { readonly final: infer F extends S.Top } ? F["Type"]
156
+ : T["success"]["Type"]
157
+
158
+ // `T["success"]` / `T["error"]` are constrained to `S.Top` via `Req`, so we
159
+ // can read `["DecodingServices"]` directly. Avoids the conditional in
160
+ // `S.Codec.DecodingServices<X> = X extends Top ? X["DecodingServices"] : never`,
161
+ // which tsgo (native) fails to reduce in this generic position and leaves as
162
+ // `unknown`, polluting the `R` channel of every client handler.
163
+ type RequestHandlerFor<R, E, T extends Req, Id extends string> = T["stream"] extends true
164
+ ? RequestStreamHandlerWithInput<
165
+ HandlerInput<T>,
166
+ T["success"]["Type"],
167
+ T["error"]["Type"] | E,
168
+ R | T["success"]["DecodingServices"] | T["error"]["DecodingServices"],
169
+ T,
170
+ Id,
171
+ FinalTypeOf<T>
172
+ >
173
+ : RequestHandlerWithInput<
174
+ HandlerInput<T>,
175
+ T["success"]["Type"],
176
+ T["error"]["Type"] | E,
177
+ R | T["success"]["DecodingServices"] | T["error"]["DecodingServices"],
178
+ T,
179
+ Id
180
+ >
95
181
 
96
182
  export type RequestHandlers<R, E, M extends RequestsAny, ModuleName extends string> = {
97
- [K in keyof M as M[K] extends Req ? K : never]: IsEmpty<Omit<S.Schema.Type<M[K]>, Cruft>> extends true
98
- ? RequestHandler<
99
- S.Schema.Type<M[K]["success"]>,
100
- S.Schema.Type<M[K]["error"]> | E,
101
- R | ReqDecodingServices<M[K]>,
102
- M[K],
103
- `${ModuleName}.${K & string}`
104
- >
105
- : RequestHandlerWithInput<
106
- Omit<S.Schema.Type<M[K]>, Cruft>,
107
- S.Schema.Type<M[K]["success"]>,
108
- S.Schema.Type<M[K]["error"]> | E,
109
- R | ReqDecodingServices<M[K]>,
110
- M[K],
111
- `${ModuleName}.${K & string}`
112
- >
183
+ [K in keyof M as M[K] extends Req ? K : never]: Extract<M[K], Req> extends infer T extends Req
184
+ ? RequestHandlerFor<R, E, T, `${ModuleName}.${K & string}`>
185
+ : never
113
186
  }
@@ -1,19 +1,20 @@
1
1
  /** @effect-diagnostics overriddenSchemaConstructor:skip-file */
2
- import { TaggedError } from "effect-app/Schema"
2
+ import { TaggedErrorClass } from "effect-app/Schema"
3
3
  import * as Cause from "effect/Cause"
4
- import * as S from "../Schema.js"
4
+ import * as S from "../Schema.ts"
5
5
 
6
- export const tryToJson = (error: { toJSON(): unknown; toString(): string }) => {
6
+ export const tryToJson = (error: unknown) => {
7
7
  try {
8
- return error.toJSON()
8
+ const errorJson = (error as any).toJSON()
9
+ return errorJson && typeof errorJson === "object" ? errorJson as Record<string, unknown> : { error }
9
10
  } catch {
10
11
  try {
11
- return error.toString()
12
+ return { error: (error as any).toString() }
12
13
  } catch (err) {
13
14
  try {
14
- return `Failed to convert error: ${err}`
15
+ return { error: `Failed to convert error: ${err}` }
15
16
  } catch {
16
- return `Failed to convert error: unknown failure`
17
+ return { error: `Failed to convert error: unknown failure` }
17
18
  }
18
19
  }
19
20
  }
@@ -21,7 +22,7 @@ export const tryToJson = (error: { toJSON(): unknown; toString(): string }) => {
21
22
 
22
23
  // eslint-disable-next-line unused-imports/no-unused-vars
23
24
  // @ts-expect-error type not used
24
- export class NotFoundError<ItemType = string> extends TaggedError<NotFoundError<ItemType>>()("NotFoundError", {
25
+ export class NotFoundError<ItemType = string> extends TaggedErrorClass<NotFoundError<ItemType>>()("NotFoundError", {
25
26
  type: S.String,
26
27
  id: S.Unknown
27
28
  }) {
@@ -29,70 +30,97 @@ export class NotFoundError<ItemType = string> extends TaggedError<NotFoundError<
29
30
  props: { type: string; id: unknown; cause?: unknown },
30
31
  disableValidation?: boolean
31
32
  ) {
32
- super(props as any, disableValidation as any)
33
+ super(props, disableValidation as any)
33
34
  }
34
35
  override get message() {
35
36
  return `Didn't find ${(this as any).type}#${JSON.stringify((this as any).id)}`
36
37
  }
38
+ override toString() {
39
+ return `NotFoundError: ${this.message}`
40
+ }
37
41
  }
38
42
 
39
43
  const messageFallback = (messageOrObject?: string | { message: string }) =>
40
44
  typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject ?? "" }
41
45
 
42
- export class InvalidStateError extends TaggedError<InvalidStateError>()("InvalidStateError", {
46
+ export class InvalidStateError extends TaggedErrorClass<InvalidStateError>()("InvalidStateError", {
43
47
  message: S.String
44
48
  }) {
45
49
  constructor(messageOrObject: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
46
- super(typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject } as any, disableValidation as any)
50
+ super(
51
+ typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject },
52
+ disableValidation as any
53
+ )
54
+ }
55
+ override toString() {
56
+ return `InvalidStateError: ${this.message}`
47
57
  }
48
58
  }
49
59
 
50
- export class ServiceUnavailableError extends TaggedError<ServiceUnavailableError>()("ServiceUnavailableError", {
60
+ export class ServiceUnavailableError extends TaggedErrorClass<ServiceUnavailableError>()("ServiceUnavailableError", {
51
61
  message: S.String
52
62
  }) {
53
63
  constructor(messageOrObject: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
54
- super(typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject } as any, disableValidation as any)
64
+ super(
65
+ typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject },
66
+ disableValidation as any
67
+ )
68
+ }
69
+ override toString() {
70
+ return `ServiceUnavailableError: ${this.message}`
55
71
  }
56
72
  }
57
73
 
58
- export class ValidationError extends TaggedError<ValidationError>()("ValidationError", {
74
+ export class ValidationError extends TaggedErrorClass<ValidationError>()("ValidationError", {
59
75
  errors: S.Array(S.Unknown)
60
76
  }) {
61
77
  constructor(
62
78
  props: { errors: ReadonlyArray<unknown>; cause?: unknown },
63
79
  disableValidation?: boolean
64
80
  ) {
65
- super(props as any, disableValidation as any)
81
+ super(props, disableValidation as any)
66
82
  }
67
83
  override get message() {
68
84
  return `Validation failed: ${(this as any).errors.map((e: any) => JSON.stringify(e, undefined, 2)).join(",\n")}`
69
85
  }
86
+ override toString() {
87
+ return `ValidationError: ${this.message}`
88
+ }
70
89
  }
71
90
 
72
- export class NotLoggedInError extends TaggedError<NotLoggedInError>()("NotLoggedInError", {
91
+ export class NotLoggedInError extends TaggedErrorClass<NotLoggedInError>()("NotLoggedInError", {
73
92
  message: S.String
74
93
  }) {
75
94
  constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
76
- super(messageFallback(messageOrObject) as any, disableValidation as any)
95
+ super(messageFallback(messageOrObject), disableValidation as any)
96
+ }
97
+ override toString() {
98
+ return `NotLoggedInError: ${this.message}`
77
99
  }
78
100
  }
79
101
 
80
102
  /**
81
103
  * The user carries a valid Userprofile, but there is a problem with the login none the less.
82
104
  */
83
- export class LoginError extends TaggedError<LoginError>()("NotLoggedInError", {
105
+ export class LoginError extends TaggedErrorClass<LoginError>()("NotLoggedInError", {
84
106
  message: S.String
85
107
  }) {
86
108
  constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
87
- super(messageFallback(messageOrObject) as any, disableValidation as any)
109
+ super(messageFallback(messageOrObject), disableValidation as any)
110
+ }
111
+ override toString() {
112
+ return `LoginError: ${this.message}`
88
113
  }
89
114
  }
90
115
 
91
- export class UnauthorizedError extends TaggedError<UnauthorizedError>()("UnauthorizedError", {
116
+ export class UnauthorizedError extends TaggedErrorClass<UnauthorizedError>()("UnauthorizedError", {
92
117
  message: S.String
93
118
  }) {
94
119
  constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
95
- super(messageFallback(messageOrObject) as any, disableValidation as any)
120
+ super(messageFallback(messageOrObject), disableValidation as any)
121
+ }
122
+ override toString() {
123
+ return `UnauthorizedError: ${this.message}`
96
124
  }
97
125
  }
98
126
 
@@ -104,7 +132,7 @@ type OptimisticConcurrencyDetails = {
104
132
  readonly found?: string | undefined
105
133
  }
106
134
 
107
- export class OptimisticConcurrencyException extends TaggedError<OptimisticConcurrencyException>()(
135
+ export class OptimisticConcurrencyException extends TaggedErrorClass<OptimisticConcurrencyException>()(
108
136
  "OptimisticConcurrencyException",
109
137
  { message: S.String }
110
138
  ) {
@@ -116,11 +144,56 @@ export class OptimisticConcurrencyException extends TaggedError<OptimisticConcur
116
144
  | ({ message: string; cause?: unknown; raw?: unknown }),
117
145
  disableValidation?: boolean
118
146
  ) {
119
- super("message" in args ? args : { message: `Existing ${args.type} ${args.id} record changed` } as any, disableValidation as any)
147
+ super(
148
+ "message" in args ? args : { message: `Existing ${args.type} ${args.id} record changed` },
149
+ disableValidation as any
150
+ )
120
151
  if (!("message" in args)) {
121
152
  this.details = args
122
153
  }
123
154
  }
155
+ override toString() {
156
+ return `OptimisticConcurrencyException: ${this.message}`
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Raised by a store adapter when a database operation fails for an
162
+ * infrastructure reason (request timeout, throttle, 5xx, dropped socket, or any
163
+ * non-conflict error). Distinct from `OptimisticConcurrencyException`, which is
164
+ * an expected etag conflict.
165
+ *
166
+ * `transient` is set by the adapter for failures worth retrying (timeout /
167
+ * throttle / 5xx / network). `cause` is the underlying adapter error, carried
168
+ * through a `Defect` schema so it serializes (an `Error` encodes to
169
+ * `{ name, message, cause }`) instead of breaking JSON encoding of the channel.
170
+ *
171
+ * Treated by the api/client/FE machinery like an unexpected (500-class) error.
172
+ */
173
+ export class DatabaseError extends TaggedErrorClass<DatabaseError>()(
174
+ "DatabaseError",
175
+ {
176
+ message: S.String,
177
+ transient: S.Boolean,
178
+ cause: S.optional(S.Defect())
179
+ }
180
+ ) {
181
+ constructor(
182
+ args: { message?: string; transient?: boolean; cause?: unknown },
183
+ disableValidation?: boolean
184
+ ) {
185
+ super(
186
+ {
187
+ message: args.message ?? "Database operation failed",
188
+ transient: args.transient ?? false,
189
+ cause: args.cause
190
+ },
191
+ disableValidation as any
192
+ )
193
+ }
194
+ override toString() {
195
+ return `DatabaseError: ${this.message}`
196
+ }
124
197
  }
125
198
 
126
199
  const MutationOnlyErrors = [
@@ -134,7 +207,8 @@ const GeneralErrors = [
134
207
  LoginError,
135
208
  UnauthorizedError,
136
209
  ValidationError,
137
- ServiceUnavailableError
210
+ ServiceUnavailableError,
211
+ DatabaseError
138
212
  ] as const
139
213
 
140
214
  export const SupportedErrors = S.Union([
@@ -169,11 +243,17 @@ export const silenceError = (e: Record<PropertyKey, any>) => {
169
243
  }
170
244
 
171
245
  export class CauseException<E> extends Error {
172
- constructor(readonly originalCause: Cause.Cause<E>, readonly _tag: string) {
246
+ readonly originalCause: Cause.Cause<E>
247
+ readonly _tag: string
248
+
249
+ constructor(originalCause: Cause.Cause<E>, _tag: string) {
173
250
  const limit = Error.stackTraceLimit
174
251
  Error.stackTraceLimit = 0
175
252
  super()
176
253
  Error.stackTraceLimit = limit
254
+ this.originalCause = originalCause
255
+ this._tag = _tag
256
+ this.cause = Cause.squash(originalCause)
177
257
  // v4: makeFiberFailure removed — use Cause.prettyErrors instead
178
258
  const errors = Cause.prettyErrors(originalCause)
179
259
  const first = errors[0]
@@ -213,17 +293,17 @@ export class CauseException<E> extends Error {
213
293
  }
214
294
  }
215
295
 
216
- export const tryToReport = (error: { toReport(): unknown; toString(): string }) => {
296
+ export const tryToReport = (error: { toReport(): Record<string, unknown>; toString(): string }) => {
217
297
  try {
218
298
  return error.toReport()
219
299
  } catch {
220
300
  try {
221
- return error.toString()
301
+ return { error: error.toString() }
222
302
  } catch (err) {
223
303
  try {
224
- return `Failed to convert error: ${err}`
304
+ return { error: `Failed to convert error: ${err}` }
225
305
  } catch {
226
- return `Failed to convert error: unknown failure`
306
+ return { error: `Failed to convert error: unknown failure` }
227
307
  }
228
308
  }
229
309
  }