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
@@ -0,0 +1,526 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
+ import { identity, pipe } from "effect/Function"
4
+ import * as Match from "effect/Match"
5
+ import * as Array from "../../Array.ts"
6
+ import { toNonEmptyArray } from "../../Array.ts"
7
+ import * as Option from "../../Option.ts"
8
+ import * as S from "../../Schema.ts"
9
+ import * as SchemaAST from "../../SchemaAST.ts"
10
+ import { dropUndefinedT } from "../../utils.ts"
11
+ import type { FilterResult } from "../filter/filterApi.ts"
12
+ import type { FieldValues } from "../filter/types.ts"
13
+ import type { FieldPath } from "../filter/types/path/eager.ts"
14
+ import { make, type Q, type QAll } from "../query/dsl.ts"
15
+
16
+ export type AggregateIrExpression =
17
+ | { readonly _tag: "agg-count" }
18
+ | { readonly _tag: "agg-count-when"; readonly filter: readonly FilterResult[] }
19
+ | { readonly _tag: "agg-sum"; readonly field: string }
20
+ | { readonly _tag: "agg-min"; readonly field: string }
21
+ | { readonly _tag: "agg-max"; readonly field: string }
22
+
23
+ export type AggregateIrItem =
24
+ | AggregateIrExpression
25
+ | { readonly _tag: "agg-field"; readonly path: string }
26
+
27
+ export type ComputedProjectionMathIrExpression =
28
+ | {
29
+ readonly _tag: "field"
30
+ readonly field: string
31
+ }
32
+ | {
33
+ readonly _tag: "mul"
34
+ readonly left: ComputedProjectionMathIrExpression
35
+ readonly right: ComputedProjectionMathIrExpression
36
+ }
37
+
38
+ export type ComputedProjectionIrExpression =
39
+ | {
40
+ readonly _tag: "relation-count"
41
+ readonly path: string
42
+ readonly filter: readonly FilterResult[]
43
+ }
44
+ | {
45
+ readonly _tag: "relation-any"
46
+ readonly path: string
47
+ readonly filter: readonly FilterResult[]
48
+ }
49
+ | {
50
+ readonly _tag: "relation-every"
51
+ readonly path: string
52
+ readonly filter: readonly FilterResult[]
53
+ }
54
+ | {
55
+ readonly _tag: "relation-distinct-count"
56
+ readonly path: string
57
+ readonly field: string
58
+ readonly filter: readonly FilterResult[]
59
+ }
60
+ | {
61
+ readonly _tag: "relation-sum"
62
+ readonly path: string
63
+ readonly field: string
64
+ readonly filter: readonly FilterResult[]
65
+ }
66
+ | {
67
+ readonly _tag: "relation-sum-expr"
68
+ readonly path: string
69
+ readonly expression: ComputedProjectionMathIrExpression
70
+ readonly filter: readonly FilterResult[]
71
+ }
72
+ | {
73
+ readonly _tag: "relation-sum-expr-by"
74
+ readonly path: string
75
+ readonly expression: ComputedProjectionMathIrExpression
76
+ readonly unit: string
77
+ readonly filter: readonly FilterResult[]
78
+ }
79
+ | {
80
+ readonly _tag: "relation-sum-expr-normalized"
81
+ readonly path: string
82
+ readonly expression: ComputedProjectionMathIrExpression
83
+ readonly unit: string
84
+ readonly toBase: string
85
+ readonly factors: Readonly<Record<string, number>>
86
+ readonly filter: readonly FilterResult[]
87
+ }
88
+ | {
89
+ readonly _tag: "relation-collect"
90
+ readonly path: string
91
+ readonly field: string
92
+ readonly distinct: boolean
93
+ readonly filter: readonly FilterResult[]
94
+ }
95
+ | {
96
+ readonly _tag: "relation-collect-fields"
97
+ readonly path: string
98
+ readonly fields: readonly string[]
99
+ readonly distinct: boolean
100
+ readonly filter: readonly FilterResult[]
101
+ }
102
+ | {
103
+ readonly _tag: "relation-length"
104
+ readonly path: string
105
+ }
106
+
107
+ type SelectItem<TFieldValues extends FieldValues> =
108
+ | keyof TFieldValues
109
+ | { key: string; subKeys: string[] }
110
+ | {
111
+ key: string
112
+ computed: ComputedProjectionIrExpression
113
+ }
114
+
115
+ const isArraySelect = <TFieldValues extends FieldValues>(
116
+ item: SelectItem<TFieldValues>
117
+ ): item is { key: string; subKeys: string[] } => typeof item === "object" && item !== null && "subKeys" in item
118
+
119
+ const mergeArraySelect = <TFieldValues extends FieldValues>(
120
+ select: SelectItem<TFieldValues>[],
121
+ arraySelect: { key: string; subKeys: string[] }
122
+ ) => {
123
+ const subKeys = [...new Set(arraySelect.subKeys)]
124
+ const existing = select.find(
125
+ (item): item is { key: string; subKeys: string[] } => isArraySelect(item) && item.key === arraySelect.key
126
+ )
127
+
128
+ if (existing) {
129
+ const existingIndex = select.indexOf(existing)
130
+ select[existingIndex] = {
131
+ key: arraySelect.key,
132
+ subKeys: [...new Set([...existing.subKeys, ...subKeys])]
133
+ }
134
+ } else {
135
+ select.push({ key: arraySelect.key, subKeys })
136
+ }
137
+
138
+ const scalarIndex = select.findIndex((item) => item === arraySelect.key)
139
+ if (scalarIndex >= 0) {
140
+ select.splice(scalarIndex, 1)
141
+ }
142
+ }
143
+
144
+ type Result<TFieldValues extends FieldValues, A = TFieldValues, R = never> = {
145
+ filter: FilterResult[]
146
+ schema: S.Codec<A, TFieldValues, R> | undefined
147
+ limit: number | undefined
148
+ skip: number | undefined
149
+ order: { key: FieldPath<TFieldValues>; direction: "ASC" | "DESC" }[]
150
+ ttype: "one" | "many" | "count" | undefined
151
+ mode: "collect" | "project" | "transform" | "aggregate" | undefined
152
+ computed: Record<string, ComputedProjectionIrExpression> | undefined
153
+ aggregateMap: Record<string, AggregateIrItem> | undefined
154
+ }
155
+
156
+ const interpret = <
157
+ TFieldValues extends FieldValues,
158
+ TFieldValuesRefined extends TFieldValues = TFieldValues,
159
+ A = TFieldValues,
160
+ R = never
161
+ >(_: QAll<TFieldValues, TFieldValuesRefined, A, R>) => {
162
+ const a = _ as Q<TFieldValues>
163
+
164
+ const data: Result<TFieldValues, any, any> = {
165
+ filter: [],
166
+ schema: undefined,
167
+ limit: undefined,
168
+ skip: undefined,
169
+ order: [],
170
+ ttype: undefined,
171
+ mode: undefined,
172
+ computed: undefined,
173
+ aggregateMap: undefined
174
+ }
175
+
176
+ const upd = (
177
+ v: Result<TFieldValues, any, any>
178
+ ) => {
179
+ data.filter.push(...v.filter)
180
+ data.order.push(...v.order)
181
+ if (v.limit !== undefined) data.limit = v.limit
182
+ if (v.skip !== undefined) data.skip = v.skip
183
+ if (v.ttype !== undefined) data.ttype = v.ttype
184
+ if (v.schema !== undefined) data.schema = v.schema
185
+ if (v.mode !== undefined) data.mode = v.mode
186
+ if (v.computed !== undefined) data.computed = v.computed
187
+ if (v.aggregateMap !== undefined) data.aggregateMap = v.aggregateMap
188
+ }
189
+
190
+ const applyPath = (path: string) => (_: FilterResult): FilterResult =>
191
+ _.t === "where" || _.t === "and" || _.t === "or"
192
+ ? { ..._, path: `${path}.-1.${_.path}` }
193
+ : { ..._, result: _.result.map(applyPath(path)) }
194
+
195
+ pipe(
196
+ a,
197
+ Match.valueTags({
198
+ value: () => {
199
+ // data.filter.push(value)
200
+ },
201
+ where: ({ current, operation, relation, subPath }) => {
202
+ upd(interpret(current))
203
+ if (typeof operation === "function") {
204
+ data.filter.push(
205
+ {
206
+ t: "where-scope",
207
+ result: interpret(operation(make())).filter.map(subPath ? applyPath(subPath) : identity),
208
+ relation
209
+ }
210
+ )
211
+ } else {
212
+ data.filter.push(
213
+ {
214
+ t: "where",
215
+ path: operation[0],
216
+ op: operation.length === 2 ? "eq" : operation[1],
217
+ value: operation.length === 2 ? operation[1] : operation[2]
218
+ }
219
+ )
220
+ }
221
+ },
222
+ and: ({ current, operation, relation }) => {
223
+ upd(interpret(current))
224
+ if (typeof operation === "function") {
225
+ data.filter.push(
226
+ { t: "and-scope", result: interpret(operation(make())).filter, relation }
227
+ )
228
+ } else {
229
+ data.filter.push(
230
+ {
231
+ t: "and",
232
+ path: operation[0],
233
+ op: operation.length === 2 ? "eq" : operation[1],
234
+ value: operation.length === 2 ? operation[1] : operation[2]
235
+ }
236
+ )
237
+ }
238
+ },
239
+ or: ({ current, operation, relation }) => {
240
+ upd(interpret(current))
241
+ if (typeof operation === "function") {
242
+ data.filter.push(
243
+ { t: "or-scope", result: interpret(operation(make())).filter, relation }
244
+ )
245
+ } else {
246
+ data.filter.push(
247
+ {
248
+ t: "or",
249
+ path: operation[0],
250
+ op: operation.length === 2 ? "eq" : operation[1],
251
+ value: operation.length === 2 ? operation[1] : operation[2]
252
+ }
253
+ )
254
+ }
255
+ },
256
+ one: ({ current }) => {
257
+ upd(interpret(current))
258
+ data.limit = 1
259
+ data.ttype = "one"
260
+ },
261
+ count: ({ current }) => {
262
+ upd(interpret(current))
263
+ data.ttype = "count"
264
+ data.schema = S.Struct({ id: S.String }) as any
265
+ },
266
+ order: ({ current, direction, field }) => {
267
+ upd(interpret(current))
268
+ data.order.push({ key: field, direction })
269
+ },
270
+ page: (v) => {
271
+ upd(interpret(v.current))
272
+ data.limit = v.take
273
+ data.skip = v.skip
274
+ },
275
+ project: (v) => {
276
+ upd(interpret(v.current))
277
+ if (v.mode === "aggregate" && v.aggregateMap) {
278
+ data.schema = v.schema
279
+ data.mode = "aggregate"
280
+ data.aggregateMap = Object.fromEntries(
281
+ Object.entries(v.aggregateMap).map(([key, expression]) => {
282
+ switch (expression._tag) {
283
+ case "agg-field":
284
+ return [key, { _tag: "agg-field" as const, path: expression.path }]
285
+ case "agg-count":
286
+ return [key, { _tag: "agg-count" as const }]
287
+ case "agg-count-when": {
288
+ const filter = interpret(expression.operation(make())).filter
289
+ return [key, { _tag: "agg-count-when" as const, filter }]
290
+ }
291
+ case "agg-sum":
292
+ return [key, { _tag: "agg-sum" as const, field: expression.field }]
293
+ case "agg-min":
294
+ return [key, { _tag: "agg-min" as const, field: expression.field }]
295
+ case "agg-max":
296
+ return [key, { _tag: "agg-max" as const, field: expression.field }]
297
+ }
298
+ })
299
+ )
300
+ return
301
+ }
302
+ if (v.computed && v.mode === "transform") {
303
+ throw new Error("Computed projections require mode 'project' or 'collect', not 'transform'")
304
+ }
305
+ data.schema = v.schema
306
+ data.mode = v.computed
307
+ ? v.mode === "collect" ? "collect" : "project"
308
+ : v.mode
309
+ data.computed = v.computed
310
+ ? Object.fromEntries(
311
+ Object.entries(v.computed).map(([key, expression]) => {
312
+ const e = expression
313
+ const op = "operation" in e ? e.operation : undefined
314
+ const filter = op ? interpret(op(make())).filter.map(applyPath(e.path)) : []
315
+ switch (e._tag) {
316
+ case "relation-count":
317
+ case "relation-any":
318
+ case "relation-every":
319
+ return [key, { _tag: e._tag, path: e.path, filter } as ComputedProjectionIrExpression]
320
+ case "relation-distinct-count":
321
+ case "relation-sum":
322
+ return [
323
+ key,
324
+ { _tag: e._tag, path: e.path, field: e.field, filter } as ComputedProjectionIrExpression
325
+ ]
326
+ case "relation-sum-expr":
327
+ return [
328
+ key,
329
+ { _tag: e._tag, path: e.path, expression: e.expression, filter } as ComputedProjectionIrExpression
330
+ ]
331
+ case "relation-sum-expr-by":
332
+ return [
333
+ key,
334
+ {
335
+ _tag: e._tag,
336
+ path: e.path,
337
+ expression: e.expression,
338
+ unit: e.unit,
339
+ filter
340
+ } as ComputedProjectionIrExpression
341
+ ]
342
+ case "relation-sum-expr-normalized":
343
+ return [
344
+ key,
345
+ {
346
+ _tag: e._tag,
347
+ path: e.path,
348
+ expression: e.expression,
349
+ unit: e.unit,
350
+ toBase: e.toBase,
351
+ factors: e.factors,
352
+ filter
353
+ } as ComputedProjectionIrExpression
354
+ ]
355
+ case "relation-collect":
356
+ return [
357
+ key,
358
+ {
359
+ _tag: e._tag,
360
+ path: e.path,
361
+ field: e.field,
362
+ distinct: e.distinct,
363
+ filter
364
+ } as ComputedProjectionIrExpression
365
+ ]
366
+ case "relation-collect-fields":
367
+ return [
368
+ key,
369
+ {
370
+ _tag: e._tag,
371
+ path: e.path,
372
+ fields: e.fields,
373
+ distinct: e.distinct,
374
+ filter
375
+ } as ComputedProjectionIrExpression
376
+ ]
377
+ case "relation-length":
378
+ return [key, { _tag: e._tag, path: e.path } as ComputedProjectionIrExpression]
379
+ }
380
+ })
381
+ )
382
+ : undefined
383
+ }
384
+ })
385
+ )
386
+
387
+ return data
388
+ }
389
+
390
+ const walkTransformation = (t: S.AST.AST): S.AST.AST => {
391
+ if (S.AST.isDeclaration(t) && t.typeParameters.length > 0) {
392
+ return walkTransformation(t.typeParameters[0]!)
393
+ }
394
+ return t
395
+ }
396
+
397
+ const objectAsts = (ast: S.AST.AST): readonly S.AST.Objects[] => {
398
+ const t = walkTransformation(ast)
399
+ if (S.AST.isObjects(t)) {
400
+ return [t]
401
+ }
402
+ if (S.AST.isUnion(t)) {
403
+ return t.types.flatMap(objectAsts)
404
+ }
405
+ return []
406
+ }
407
+
408
+ const objectKeys = (ast: S.AST.AST): readonly string[] => [
409
+ ...new Set(objectAsts(ast).flatMap((object) => object.propertySignatures.map((_) => _.name as string)))
410
+ ]
411
+
412
+ export const toFilter = <
413
+ TFieldValues extends FieldValues,
414
+ A,
415
+ R,
416
+ TFieldValuesRefined extends TFieldValues = TFieldValues
417
+ >(
418
+ q: QAll<TFieldValues, TFieldValuesRefined, A, R>,
419
+ baseSchema?: S.Schema<unknown>
420
+ ) => {
421
+ // TODO: Native interpreter for each db adapter, instead of the intermediate "new-kid" format
422
+ const a = interpret(q)
423
+
424
+ // Aggregate mode: build select entirely from aggregateMap (no schema-driven field list)
425
+ if (a.mode === "aggregate" && a.aggregateMap) {
426
+ const aggSelect = Object.entries(a.aggregateMap).map(([key, item]) => {
427
+ if (item._tag === "agg-field") {
428
+ return { key, path: item.path }
429
+ }
430
+ return { key, aggregate: item }
431
+ })
432
+ return dropUndefinedT({
433
+ t: null as unknown as TFieldValues,
434
+ limit: a.limit,
435
+ skip: a.skip,
436
+ select: Option.getOrUndefined(toNonEmptyArray(aggSelect)) as any,
437
+ schema: a.schema,
438
+ computed: undefined,
439
+ order: Option.getOrUndefined(toNonEmptyArray(a.order)),
440
+ ttype: a.ttype,
441
+ mode: "aggregate" as const,
442
+ filter: a.filter.length ? a.filter : undefined
443
+ })
444
+ }
445
+
446
+ const schema = a.schema
447
+ let select: SelectItem<TFieldValues>[] = []
448
+ // TODO: support more complex (nested) schemas?
449
+ if (schema) {
450
+ const t = walkTransformation(SchemaAST.toEncoded(schema.ast))
451
+ const objects = [...objectAsts(t)]
452
+ if (Array.isArrayNonEmpty(objects)) {
453
+ select = [...objectKeys(t)]
454
+ for (const prop of objects.flatMap((_) => _.propertySignatures)) {
455
+ if (S.AST.isArrays(prop.type)) {
456
+ // make sure we only select when there are actually type literals in the tuple...
457
+ // otherwise we might be dealing with strings etc.
458
+ // TODO; be more strict, can't support arrays with unions that have non TypeLiteral members etc..
459
+ const arraySelect = {
460
+ key: prop.name as string,
461
+ subKeys: Array.flatMap(
462
+ prop.type.rest,
463
+ (x) => {
464
+ return objectKeys(x)
465
+ }
466
+ )
467
+ }
468
+ if (arraySelect.subKeys.length > 0) {
469
+ mergeArraySelect(select, arraySelect)
470
+ }
471
+ }
472
+ }
473
+ }
474
+ }
475
+ const computed = a.computed
476
+ const getSelectKey = (_: (typeof select)[number]) => {
477
+ if (typeof _ === "string") {
478
+ return _
479
+ }
480
+ if (typeof _ === "object" && _ !== null && "key" in _) {
481
+ return _.key
482
+ }
483
+ return String(_)
484
+ }
485
+ const schemaKeys = select.map(getSelectKey)
486
+ const nonEncodedSchemaKeys = (() => {
487
+ if (!baseSchema) {
488
+ return [] as string[]
489
+ }
490
+ const encoded = walkTransformation(SchemaAST.toEncoded(baseSchema.ast))
491
+ const encodedKeys = objectKeys(encoded)
492
+ return schemaKeys.filter((key) => !encodedKeys.includes(key))
493
+ })()
494
+ const missingComputedKeys = nonEncodedSchemaKeys.filter((key) => !(computed && key in computed))
495
+
496
+ if (Array.isArrayNonEmpty(missingComputedKeys)) {
497
+ throw new Error(`Missing computed projections for schema keys: ${missingComputedKeys.join(", ")}`)
498
+ }
499
+
500
+ if (computed) {
501
+ const computedKeys = Object.keys(computed)
502
+ const extraComputedKeys = computedKeys.filter((key) => !schemaKeys.includes(key))
503
+ if (Array.isArrayNonEmpty(extraComputedKeys)) {
504
+ throw new Error(`Computed projection keys must exist in projection schema: ${extraComputedKeys.join(", ")}`)
505
+ }
506
+ select = select.filter((_) => {
507
+ const key = getSelectKey(_)
508
+ return !(key in computed)
509
+ })
510
+ select.push(...Object.entries(computed).map(([key, expression]) => ({ key, computed: expression })))
511
+ }
512
+ return dropUndefinedT({
513
+ t: null as unknown as TFieldValues,
514
+ limit: a.limit,
515
+ skip: a.skip,
516
+ select: Option.getOrUndefined(toNonEmptyArray(select)),
517
+ schema,
518
+ computed,
519
+ order: Option.getOrUndefined(toNonEmptyArray(a.order)),
520
+ ttype: a.ttype,
521
+ mode: a.mode ?? "transform",
522
+ filter: a.filter.length
523
+ ? a.filter
524
+ : undefined
525
+ })
526
+ }
@@ -0,0 +1,13 @@
1
+ export * from "./query/dsl.ts"
2
+ export * from "./query/new-kid-interpreter.ts"
3
+
4
+ export interface RawQuery<Encoded, Out> {
5
+ cosmos: (vals: { name: string }) => {
6
+ query: string
7
+ parameters: {
8
+ name: string
9
+ value: any
10
+ }[]
11
+ }
12
+ memory: (t: readonly Encoded[]) => readonly Out[]
13
+ }
package/src/Model.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./Model/dsl.ts"
2
+ export * as Q from "./Model/query.ts"
3
+ export { makeRepo } from "./Model/Repository.ts"
4
+ export { type RegisteredRepository, RepositoryRegistry, RepositoryRegistryLive } from "./Model/Repository.ts"
@@ -1,7 +1,9 @@
1
- import { type Equivalence, Option, type Order } from "effect"
2
1
  import type { NonEmptyReadonlyArray } from "effect/Array"
3
- import { flow, pipe } from "./Function.js"
4
- import { filter_, filterMap, filterMap_, fromArray as fromArrayOriginal, insert as insertOriginal, insert_ as insert_Original, map, map_, reduce, reduce_, remove, remove_, type Set, toArray as toArrayOriginal } from "./Set.js"
2
+ import type * as Equivalence from "effect/Equivalence"
3
+ import * as Option from "effect/Option"
4
+ import type * as Order from "effect/Order"
5
+ import { flow, pipe } from "./Function.ts"
6
+ import { filter_, filterMap, filterMap_, fromArray as fromArrayOriginal, insert as insertOriginal, insert_ as insert_Original, map, map_, reduce, reduce_, remove, remove_, type Set, toArray as toArrayOriginal } from "./Set.ts"
5
7
 
6
8
  export interface NonEmptyBrand {
7
9
  readonly NonEmpty: unique symbol
@@ -87,4 +89,4 @@ export function fromSet<A>(set: Set<A>) {
87
89
  }
88
90
 
89
91
  // TODO
90
- export * from "./Set.js"
92
+ export * from "./Set.ts"
package/src/Option.ts CHANGED
@@ -2,6 +2,8 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
3
  /* eslint-disable @typescript-eslint/no-unsafe-return */
4
4
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
+ // eslint-disable-next-line import/no-unassigned-import
6
+ import "./builtin.ts"
5
7
  import { getOrUndefined as value, type Some } from "effect/Option"
6
8
  import * as Option from "effect/Option"
7
9
 
package/src/Pure.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Chunk, Effect, Layer, Result } from "effect"
3
- import { tuple } from "./Function.js"
4
- import * as ServiceMap from "./ServiceMap.js"
2
+ import * as Chunk from "effect/Chunk"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
5
+ import * as Result from "effect/Result"
6
+ import * as Context from "./Context.ts"
7
+ import { tuple } from "./Function.ts"
5
8
 
6
9
  const S1 = Symbol()
7
10
  const S2 = Symbol()
@@ -86,9 +89,9 @@ export function GMU<W, S, S2, GA, MR, ME>(modify: (i: GA) => Pure<W, S, S2, MR,
86
89
  ) => GMU_(get, modify, update)
87
90
  }
88
91
 
89
- const tagg = ServiceMap.Service<{ env: PureEnv<never, unknown, never> }>("PureEnv")
92
+ const tagg = Context.Service<{ env: PureEnv<never, unknown, never> }>("PureEnv")
90
93
  function castTag<W, S, S2>() {
91
- return tagg as any as ServiceMap.Service<PureEnvEnv<W, S, S2>, PureEnvEnv<W, S, S2>>
94
+ return tagg as any as Context.Service<PureEnvEnv<W, S, S2>, PureEnvEnv<W, S, S2>>
92
95
  }
93
96
 
94
97
  export const ServiceTag = Symbol()
@@ -100,9 +103,9 @@ export abstract class PhantomTypeParameter<Identifier extends keyof any, Instant
100
103
  }
101
104
  }
102
105
 
103
- export type ServiceShape<T extends ServiceMap.ServiceClass.Shape<any, any>> = Omit<
106
+ export type ServiceShape<T extends Context.ServiceClass.Shape<any, any>> = Omit<
104
107
  T,
105
- keyof ServiceMap.ServiceClass.Shape<any, any>
108
+ keyof Context.ServiceClass.Shape<any, any>
106
109
  >
107
110
 
108
111
  export abstract class ServiceTagged<ServiceKey> extends PhantomTypeParameter<string, ServiceKey> {}
@@ -0,0 +1,11 @@
1
+ import { RequestContext } from "./RequestContext.ts"
2
+
3
+ /**
4
+ * Per-message context envelope (tenant/store id, request metadata) carried
5
+ * alongside message-schema payloads. Alias of {@link RequestContext}.
6
+ *
7
+ * All that remains of the former queue machinery (SB/SQLite/mem `QueueMaker`
8
+ * implementations and the `QueueBase` interface) after the move to cluster
9
+ * entities — the message schemas that embed it still reference this envelope.
10
+ */
11
+ export const QueueMeta = RequestContext
@@ -0,0 +1,48 @@
1
+ import * as Context from "./Context.ts"
2
+ import { UserProfileId } from "./ids.ts"
3
+ import * as S from "./Schema.ts"
4
+ import { NonEmptyString255 } from "./Schema.ts"
5
+
6
+ export const Locale = S.Literals(["en", "de"])
7
+ export type Locale = typeof Locale.Type
8
+
9
+ export class LocaleRef extends Context.Reference("Locale", { defaultValue: (): Locale => "en" }) {}
10
+
11
+ export class RequestContext extends S.Opaque<RequestContext>()(S.Struct({
12
+ span: S.Struct({
13
+ traceId: S.String,
14
+ spanId: S.String,
15
+ sampled: S.Boolean
16
+ }),
17
+ name: NonEmptyString255,
18
+ locale: Locale,
19
+ sourceId: S.optional(NonEmptyString255), // TODO?
20
+ namespace: NonEmptyString255,
21
+ /** @deprecated */
22
+ userProfile: S.optional(S.Struct({ sub: UserProfileId })) //
23
+ })) {
24
+ static toMonitoring(this: void, self: RequestContext) {
25
+ return {
26
+ operationName: self.name,
27
+ locale: self.locale
28
+ }
29
+ }
30
+ }
31
+
32
+ export const spanAttributes = (ctx: Pick<RequestContext, "locale" | "namespace"> & Partial<RequestContext>) => ({
33
+ "code.function.name": ctx.name,
34
+ "app.locale": ctx.locale,
35
+ "app.tenant.id": ctx.namespace,
36
+ ...ctx.sourceId ? { "client.id": ctx.sourceId } : {},
37
+ ...(ctx.userProfile?.sub
38
+ ? {
39
+ "user.id": ctx
40
+ .userProfile
41
+ .sub,
42
+ "user.roles": "roles" in ctx
43
+ .userProfile
44
+ ? ctx.userProfile.roles
45
+ : undefined
46
+ }
47
+ : {})
48
+ })