@effect-app/infra 4.0.0-beta.22 → 4.0.0-beta.221

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 (337) hide show
  1. package/CHANGELOG.md +1648 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +12 -7
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +16 -12
  6. package/dist/Emailer/Sendgrid.d.ts +15 -15
  7. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  8. package/dist/Emailer/Sendgrid.js +20 -16
  9. package/dist/Emailer/fake.d.ts +1 -1
  10. package/dist/Emailer/fake.js +2 -2
  11. package/dist/Emailer/service.d.ts +13 -4
  12. package/dist/Emailer/service.d.ts.map +1 -1
  13. package/dist/Emailer/service.js +4 -3
  14. package/dist/Emailer.d.ts +1 -1
  15. package/dist/MainFiberSet.d.ts +12 -9
  16. package/dist/MainFiberSet.d.ts.map +1 -1
  17. package/dist/MainFiberSet.js +7 -3
  18. package/dist/Model/Repository/Registry.d.ts +21 -0
  19. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  20. package/dist/Model/Repository/Registry.js +18 -0
  21. package/dist/Model/Repository/ext.d.ts +35 -16
  22. package/dist/Model/Repository/ext.d.ts.map +1 -1
  23. package/dist/Model/Repository/ext.js +60 -3
  24. package/dist/Model/Repository/internal/internal.d.ts +9 -6
  25. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  26. package/dist/Model/Repository/internal/internal.js +115 -51
  27. package/dist/Model/Repository/legacy.d.ts +4 -2
  28. package/dist/Model/Repository/legacy.d.ts.map +1 -1
  29. package/dist/Model/Repository/makeRepo.d.ts +10 -6
  30. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  31. package/dist/Model/Repository/makeRepo.js +5 -2
  32. package/dist/Model/Repository/service.d.ts +32 -24
  33. package/dist/Model/Repository/service.d.ts.map +1 -1
  34. package/dist/Model/Repository/validation.d.ts +47 -18
  35. package/dist/Model/Repository/validation.d.ts.map +1 -1
  36. package/dist/Model/Repository/validation.js +6 -6
  37. package/dist/Model/Repository.d.ts +2 -1
  38. package/dist/Model/Repository.d.ts.map +1 -1
  39. package/dist/Model/Repository.js +2 -1
  40. package/dist/Model/dsl.d.ts +6 -5
  41. package/dist/Model/dsl.d.ts.map +1 -1
  42. package/dist/Model/dsl.js +2 -3
  43. package/dist/Model/filter/filterApi.d.ts +5 -5
  44. package/dist/Model/filter/filterApi.d.ts.map +1 -1
  45. package/dist/Model/filter/types/errors.d.ts +1 -1
  46. package/dist/Model/filter/types/fields.d.ts +1 -1
  47. package/dist/Model/filter/types/path/common.d.ts +1 -1
  48. package/dist/Model/filter/types/path/eager.d.ts +1 -1
  49. package/dist/Model/filter/types/path/eager.d.ts.map +1 -1
  50. package/dist/Model/filter/types/path/eager.js +1 -1
  51. package/dist/Model/filter/types/path/index.d.ts +1 -1
  52. package/dist/Model/filter/types/utils.d.ts +1 -1
  53. package/dist/Model/filter/types/validator.d.ts +1 -1
  54. package/dist/Model/filter/types.d.ts +1 -1
  55. package/dist/Model/query/dsl.d.ts +142 -17
  56. package/dist/Model/query/dsl.d.ts.map +1 -1
  57. package/dist/Model/query/dsl.js +190 -5
  58. package/dist/Model/query/new-kid-interpreter.d.ts +77 -8
  59. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  60. package/dist/Model/query/new-kid-interpreter.js +127 -6
  61. package/dist/Model/query.d.ts +1 -1
  62. package/dist/Model.d.ts +2 -1
  63. package/dist/Model.d.ts.map +1 -1
  64. package/dist/Model.js +2 -1
  65. package/dist/QueueMaker/SQLQueue.d.ts +7 -8
  66. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  67. package/dist/QueueMaker/SQLQueue.js +135 -117
  68. package/dist/QueueMaker/errors.d.ts +5 -3
  69. package/dist/QueueMaker/errors.d.ts.map +1 -1
  70. package/dist/QueueMaker/errors.js +4 -2
  71. package/dist/QueueMaker/memQueue.d.ts +9 -5
  72. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  73. package/dist/QueueMaker/memQueue.js +81 -65
  74. package/dist/QueueMaker/sbqueue.d.ts +8 -4
  75. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  76. package/dist/QueueMaker/sbqueue.js +57 -55
  77. package/dist/QueueMaker/service.d.ts +4 -2
  78. package/dist/QueueMaker/service.d.ts.map +1 -1
  79. package/dist/QueueMaker/service.js +1 -1
  80. package/dist/RequestContext.d.ts +75 -35
  81. package/dist/RequestContext.d.ts.map +1 -1
  82. package/dist/RequestContext.js +14 -14
  83. package/dist/RequestFiberSet.d.ts +10 -7
  84. package/dist/RequestFiberSet.d.ts.map +1 -1
  85. package/dist/RequestFiberSet.js +8 -3
  86. package/dist/Store/ContextMapContainer.d.ts +22 -3
  87. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  88. package/dist/Store/ContextMapContainer.js +17 -3
  89. package/dist/Store/Cosmos/query.d.ts +7 -2
  90. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  91. package/dist/Store/Cosmos/query.js +115 -35
  92. package/dist/Store/Cosmos.d.ts +2 -2
  93. package/dist/Store/Cosmos.d.ts.map +1 -1
  94. package/dist/Store/Cosmos.js +343 -244
  95. package/dist/Store/Disk.d.ts +3 -3
  96. package/dist/Store/Disk.d.ts.map +1 -1
  97. package/dist/Store/Disk.js +76 -36
  98. package/dist/Store/Memory.d.ts +7 -4
  99. package/dist/Store/Memory.d.ts.map +1 -1
  100. package/dist/Store/Memory.js +251 -58
  101. package/dist/Store/SQL/Pg.d.ts +4 -0
  102. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  103. package/dist/Store/SQL/Pg.js +233 -0
  104. package/dist/Store/SQL/query.d.ts +43 -0
  105. package/dist/Store/SQL/query.d.ts.map +1 -0
  106. package/dist/Store/SQL/query.js +478 -0
  107. package/dist/Store/SQL.d.ts +21 -0
  108. package/dist/Store/SQL.d.ts.map +1 -0
  109. package/dist/Store/SQL.js +450 -0
  110. package/dist/Store/codeFilter.d.ts +2 -2
  111. package/dist/Store/codeFilter.d.ts.map +1 -1
  112. package/dist/Store/codeFilter.js +6 -3
  113. package/dist/Store/index.d.ts +6 -3
  114. package/dist/Store/index.d.ts.map +1 -1
  115. package/dist/Store/index.js +18 -4
  116. package/dist/Store/service.d.ts +26 -8
  117. package/dist/Store/service.d.ts.map +1 -1
  118. package/dist/Store/service.js +25 -6
  119. package/dist/Store/utils.d.ts +3 -2
  120. package/dist/Store/utils.d.ts.map +1 -1
  121. package/dist/Store/utils.js +5 -5
  122. package/dist/Store.d.ts +1 -1
  123. package/dist/adapters/SQL/Model.d.ts +32 -43
  124. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  125. package/dist/adapters/SQL/Model.js +30 -39
  126. package/dist/adapters/SQL.d.ts +1 -1
  127. package/dist/adapters/ServiceBus.d.ts +14 -11
  128. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  129. package/dist/adapters/ServiceBus.js +30 -21
  130. package/dist/adapters/cosmos-client.d.ts +5 -3
  131. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  132. package/dist/adapters/cosmos-client.js +5 -3
  133. package/dist/adapters/index.d.ts +8 -2
  134. package/dist/adapters/index.d.ts.map +1 -1
  135. package/dist/adapters/index.js +8 -2
  136. package/dist/adapters/logger.d.ts +2 -2
  137. package/dist/adapters/logger.d.ts.map +1 -1
  138. package/dist/adapters/memQueue.d.ts +5 -3
  139. package/dist/adapters/memQueue.d.ts.map +1 -1
  140. package/dist/adapters/memQueue.js +6 -5
  141. package/dist/adapters/mongo-client.d.ts +4 -3
  142. package/dist/adapters/mongo-client.d.ts.map +1 -1
  143. package/dist/adapters/mongo-client.js +5 -3
  144. package/dist/adapters/redis-client.d.ts +6 -3
  145. package/dist/adapters/redis-client.d.ts.map +1 -1
  146. package/dist/adapters/redis-client.js +7 -3
  147. package/dist/api/ContextProvider.d.ts +12 -8
  148. package/dist/api/ContextProvider.d.ts.map +1 -1
  149. package/dist/api/ContextProvider.js +9 -7
  150. package/dist/api/codec.d.ts +1 -1
  151. package/dist/api/internal/RequestContextMiddleware.d.ts +3 -3
  152. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  153. package/dist/api/internal/RequestContextMiddleware.js +10 -6
  154. package/dist/api/internal/auth.d.ts +45 -7
  155. package/dist/api/internal/auth.d.ts.map +1 -1
  156. package/dist/api/internal/auth.js +162 -29
  157. package/dist/api/internal/events.d.ts +6 -4
  158. package/dist/api/internal/events.d.ts.map +1 -1
  159. package/dist/api/internal/events.js +16 -9
  160. package/dist/api/internal/health.d.ts +1 -1
  161. package/dist/api/layerUtils.d.ts +10 -6
  162. package/dist/api/layerUtils.d.ts.map +1 -1
  163. package/dist/api/layerUtils.js +7 -6
  164. package/dist/api/middlewares.d.ts +1 -1
  165. package/dist/api/reportError.d.ts +2 -2
  166. package/dist/api/reportError.d.ts.map +1 -1
  167. package/dist/api/reportError.js +3 -2
  168. package/dist/api/routing/middleware/RouterMiddleware.d.ts +5 -4
  169. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  170. package/dist/api/routing/middleware/middleware.d.ts +42 -3
  171. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  172. package/dist/api/routing/middleware/middleware.js +53 -17
  173. package/dist/api/routing/middleware.d.ts +1 -2
  174. package/dist/api/routing/middleware.d.ts.map +1 -1
  175. package/dist/api/routing/middleware.js +1 -2
  176. package/dist/api/routing/schema/jwt.d.ts +1 -1
  177. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  178. package/dist/api/routing/schema/jwt.js +3 -2
  179. package/dist/api/routing/tsort.d.ts +1 -1
  180. package/dist/api/routing/tsort.d.ts.map +1 -1
  181. package/dist/api/routing/utils.d.ts +4 -4
  182. package/dist/api/routing/utils.d.ts.map +1 -1
  183. package/dist/api/routing/utils.js +3 -2
  184. package/dist/api/routing.d.ts +84 -37
  185. package/dist/api/routing.d.ts.map +1 -1
  186. package/dist/api/routing.js +115 -45
  187. package/dist/api/setupRequest.d.ts +10 -6
  188. package/dist/api/setupRequest.d.ts.map +1 -1
  189. package/dist/api/setupRequest.js +15 -7
  190. package/dist/api/util.d.ts +1 -1
  191. package/dist/arbs.d.ts +2 -2
  192. package/dist/arbs.d.ts.map +1 -1
  193. package/dist/arbs.js +5 -3
  194. package/dist/errorReporter.d.ts +7 -5
  195. package/dist/errorReporter.d.ts.map +1 -1
  196. package/dist/errorReporter.js +22 -26
  197. package/dist/errors.d.ts +1 -1
  198. package/dist/fileUtil.d.ts +2 -2
  199. package/dist/fileUtil.d.ts.map +1 -1
  200. package/dist/fileUtil.js +2 -2
  201. package/dist/index.d.ts +1 -1
  202. package/dist/logger/jsonLogger.d.ts +2 -2
  203. package/dist/logger/jsonLogger.d.ts.map +1 -1
  204. package/dist/logger/jsonLogger.js +4 -2
  205. package/dist/logger/logFmtLogger.d.ts +2 -2
  206. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  207. package/dist/logger/logFmtLogger.js +2 -2
  208. package/dist/logger/shared.d.ts +2 -2
  209. package/dist/logger/shared.d.ts.map +1 -1
  210. package/dist/logger/shared.js +3 -3
  211. package/dist/logger.d.ts +1 -1
  212. package/dist/logger.d.ts.map +1 -1
  213. package/dist/otel.d.ts +75 -0
  214. package/dist/otel.d.ts.map +1 -0
  215. package/dist/otel.js +65 -0
  216. package/dist/rateLimit.d.ts +12 -4
  217. package/dist/rateLimit.d.ts.map +1 -1
  218. package/dist/rateLimit.js +7 -12
  219. package/dist/test.d.ts +3 -3
  220. package/dist/test.d.ts.map +1 -1
  221. package/dist/test.js +2 -2
  222. package/dist/vitest.d.ts +1 -1
  223. package/examples/query.ts +46 -38
  224. package/package.json +46 -37
  225. package/src/CUPS.ts +15 -11
  226. package/src/Emailer/Sendgrid.ts +21 -15
  227. package/src/Emailer/fake.ts +1 -1
  228. package/src/Emailer/service.ts +13 -3
  229. package/src/MainFiberSet.ts +9 -6
  230. package/src/Model/Repository/Registry.ts +34 -0
  231. package/src/Model/Repository/ext.ts +103 -11
  232. package/src/Model/Repository/internal/internal.ts +231 -149
  233. package/src/Model/Repository/legacy.ts +3 -1
  234. package/src/Model/Repository/makeRepo.ts +15 -10
  235. package/src/Model/Repository/service.ts +35 -23
  236. package/src/Model/Repository/validation.ts +5 -5
  237. package/src/Model/Repository.ts +1 -0
  238. package/src/Model/dsl.ts +5 -4
  239. package/src/Model/filter/types/path/eager.ts +1 -2
  240. package/src/Model/query/dsl.ts +353 -19
  241. package/src/Model/query/new-kid-interpreter.ts +211 -6
  242. package/src/Model.ts +1 -0
  243. package/src/QueueMaker/SQLQueue.ts +150 -153
  244. package/src/QueueMaker/errors.ts +3 -1
  245. package/src/QueueMaker/memQueue.ts +111 -105
  246. package/src/QueueMaker/sbqueue.ts +76 -88
  247. package/src/QueueMaker/service.ts +3 -1
  248. package/src/RequestContext.ts +15 -16
  249. package/src/RequestFiberSet.ts +8 -2
  250. package/src/Store/ContextMapContainer.ts +45 -2
  251. package/src/Store/Cosmos/query.ts +143 -44
  252. package/src/Store/Cosmos.ts +491 -350
  253. package/src/Store/Disk.ts +106 -66
  254. package/src/Store/Memory.ts +285 -87
  255. package/src/Store/SQL/Pg.ts +364 -0
  256. package/src/Store/SQL/query.ts +540 -0
  257. package/src/Store/SQL.ts +736 -0
  258. package/src/Store/codeFilter.ts +5 -2
  259. package/src/Store/index.ts +20 -3
  260. package/src/Store/service.ts +45 -10
  261. package/src/Store/utils.ts +25 -23
  262. package/src/adapters/SQL/Model.ts +42 -41
  263. package/src/adapters/ServiceBus.ts +131 -121
  264. package/src/adapters/cosmos-client.ts +4 -2
  265. package/src/adapters/index.ts +7 -0
  266. package/src/adapters/memQueue.ts +5 -4
  267. package/src/adapters/mongo-client.ts +4 -2
  268. package/src/adapters/redis-client.ts +6 -2
  269. package/src/api/ContextProvider.ts +17 -13
  270. package/src/api/internal/RequestContextMiddleware.ts +16 -5
  271. package/src/api/internal/auth.ts +248 -44
  272. package/src/api/internal/events.ts +19 -10
  273. package/src/api/layerUtils.ts +12 -8
  274. package/src/api/reportError.ts +2 -1
  275. package/src/api/routing/middleware/RouterMiddleware.ts +5 -4
  276. package/src/api/routing/middleware/middleware.ts +60 -15
  277. package/src/api/routing/middleware.ts +0 -2
  278. package/src/api/routing/schema/jwt.ts +2 -1
  279. package/src/api/routing/utils.ts +2 -1
  280. package/src/api/routing.ts +304 -131
  281. package/src/api/setupRequest.ts +31 -8
  282. package/src/arbs.ts +5 -3
  283. package/src/errorReporter.ts +65 -75
  284. package/src/fileUtil.ts +1 -1
  285. package/src/logger/jsonLogger.ts +3 -1
  286. package/src/logger/logFmtLogger.ts +1 -1
  287. package/src/logger/shared.ts +3 -2
  288. package/src/otel.ts +152 -0
  289. package/src/rateLimit.ts +34 -23
  290. package/src/test.ts +2 -2
  291. package/test/auth.test.ts +101 -0
  292. package/test/contextProvider.test.ts +14 -11
  293. package/test/controller.test.ts +25 -29
  294. package/test/dist/auth.test.d.ts.map +1 -0
  295. package/test/dist/contextProvider.test.d.ts.map +1 -1
  296. package/test/dist/controller.test.d.ts.map +1 -1
  297. package/test/dist/date-query.test.d.ts.map +1 -0
  298. package/test/dist/fixtures.d.ts +30 -12
  299. package/test/dist/fixtures.d.ts.map +1 -1
  300. package/test/dist/fixtures.js +17 -10
  301. package/test/dist/query.test.d.ts.map +1 -1
  302. package/test/dist/rawQuery.test.d.ts.map +1 -1
  303. package/test/dist/repository-ext.test.d.ts.map +1 -0
  304. package/test/dist/requires.test.d.ts.map +1 -1
  305. package/test/dist/router-generator.test.d.ts.map +1 -0
  306. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  307. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  308. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  309. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  310. package/test/dist/sql-store.test.d.ts.map +1 -0
  311. package/test/fixtures.ts +16 -9
  312. package/test/layerUtils.test.ts +1 -1
  313. package/test/query.test.ts +819 -38
  314. package/test/rawQuery.test.ts +312 -20
  315. package/test/repository-ext.test.ts +62 -0
  316. package/test/requires.test.ts +10 -5
  317. package/test/router-generator.test.ts +187 -0
  318. package/test/routing-interruptibility.test.ts +66 -0
  319. package/test/rpc-e2e-invalidation.test.ts +256 -0
  320. package/test/rpc-multi-middleware.test.ts +84 -9
  321. package/test/rpc-stream-fullstack.test.ts +304 -0
  322. package/test/sql-store.test.ts +1592 -0
  323. package/test/validateSample.test.ts +17 -12
  324. package/tsconfig.examples.json +1 -1
  325. package/tsconfig.json +0 -1
  326. package/tsconfig.json.bak +2 -2
  327. package/tsconfig.src.json +35 -35
  328. package/tsconfig.test.json +2 -2
  329. package/dist/Operations.d.ts +0 -55
  330. package/dist/Operations.d.ts.map +0 -1
  331. package/dist/Operations.js +0 -102
  332. package/dist/OperationsRepo.d.ts +0 -41
  333. package/dist/OperationsRepo.d.ts.map +0 -1
  334. package/dist/OperationsRepo.js +0 -14
  335. package/eslint.config.mjs +0 -24
  336. package/src/Operations.ts +0 -235
  337. package/src/OperationsRepo.ts +0 -16
@@ -1,8 +1,12 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
3
3
  /* eslint-disable @typescript-eslint/no-explicit-any */
4
- import { Data, flow, type Option, Pipeable, type S } from "effect-app"
4
+ import type * as Option from "effect-app/Option"
5
+ import type * as S from "effect-app/Schema"
5
6
  import type { NonNegativeInt } from "effect-app/Schema"
7
+ import * as Data from "effect/Data"
8
+ import { flow } from "effect/Function"
9
+ import * as Pipeable from "effect/Pipeable"
6
10
  import type { Covariant } from "effect/Types"
7
11
  import type { Ops } from "../filter/filterApi.js"
8
12
  import type { FieldValues } from "../filter/types.js"
@@ -54,7 +58,7 @@ type ExtractFieldValuesRefined<T> = T extends QueryTogether<any, infer TFieldVal
54
58
 
55
59
  export type RelationDirection = "some" | "every"
56
60
  export type Relation = { relation: RelationDirection }
57
- export type Query<TFieldValues extends FieldValues> = QueryTogether<TFieldValues, TFieldValues, false, "initial">
61
+ export type Query<TFieldValues extends FieldValues> = QueryTogether<TFieldValues, TFieldValues>
58
62
  export type QueryWhere<
59
63
  TFieldValues extends FieldValues,
60
64
  TFieldValuesRefined extends TFieldValues = TFieldValues,
@@ -97,6 +101,86 @@ export type QueryProjection<
97
101
  R,
98
102
  TType
99
103
  >
104
+
105
+ export type ComputedProjectionOperation = (q: Query<any>) => QueryWhere<any, any, any>
106
+
107
+ export type ComputedProjectionMathExpression =
108
+ | {
109
+ readonly _tag: "field"
110
+ readonly field: string
111
+ }
112
+ | {
113
+ readonly _tag: "mul"
114
+ readonly left: ComputedProjectionMathExpression
115
+ readonly right: ComputedProjectionMathExpression
116
+ }
117
+
118
+ export type ComputedProjectionExpression =
119
+ | {
120
+ readonly _tag: "relation-count"
121
+ readonly path: string
122
+ readonly operation?: ComputedProjectionOperation
123
+ }
124
+ | {
125
+ readonly _tag: "relation-any"
126
+ readonly path: string
127
+ readonly operation?: ComputedProjectionOperation
128
+ }
129
+ | {
130
+ readonly _tag: "relation-every"
131
+ readonly path: string
132
+ readonly operation: ComputedProjectionOperation
133
+ }
134
+ | {
135
+ readonly _tag: "relation-distinct-count"
136
+ readonly path: string
137
+ readonly field: string
138
+ readonly operation?: ComputedProjectionOperation
139
+ }
140
+ | {
141
+ readonly _tag: "relation-sum"
142
+ readonly path: string
143
+ readonly field: string
144
+ readonly operation?: ComputedProjectionOperation
145
+ }
146
+ | {
147
+ readonly _tag: "relation-sum-expr"
148
+ readonly path: string
149
+ readonly expression: ComputedProjectionMathExpression
150
+ readonly operation?: ComputedProjectionOperation
151
+ }
152
+ | {
153
+ readonly _tag: "relation-sum-expr-by"
154
+ readonly path: string
155
+ readonly expression: ComputedProjectionMathExpression
156
+ readonly unit: string
157
+ readonly operation?: ComputedProjectionOperation
158
+ }
159
+ | {
160
+ readonly _tag: "relation-sum-expr-normalized"
161
+ readonly path: string
162
+ readonly expression: ComputedProjectionMathExpression
163
+ readonly unit: string
164
+ readonly toBase: string
165
+ readonly factors: Readonly<Record<string, number>>
166
+ readonly operation?: ComputedProjectionOperation
167
+ }
168
+ | {
169
+ readonly _tag: "relation-collect"
170
+ readonly path: string
171
+ readonly field: string
172
+ readonly distinct: boolean
173
+ readonly operation?: ComputedProjectionOperation
174
+ }
175
+ | {
176
+ readonly _tag: "relation-collect-fields"
177
+ readonly path: string
178
+ readonly fields: readonly string[]
179
+ readonly distinct: boolean
180
+ readonly operation?: ComputedProjectionOperation
181
+ }
182
+
183
+ export type ComputedProjectionMap = Readonly<Record<string, ComputedProjectionExpression>>
100
184
  export type Q<TFieldValues extends FieldValues> =
101
185
  | Initial<TFieldValues>
102
186
  | Where<TFieldValues>
@@ -211,6 +295,7 @@ export class Project<A, TFieldValues extends FieldValues, R, TType extends "one"
211
295
  current: Query<TFieldValues> | QueryWhere<any, TFieldValues> | QueryEnd<TFieldValues, TType>
212
296
  schema: S.Codec<A, TFieldValues, R>
213
297
  mode: "collect" | "project" | "transform"
298
+ computed?: ComputedProjectionMap
214
299
  }>
215
300
  implements QueryProjection<TFieldValues, A, R>
216
301
  {
@@ -299,6 +384,35 @@ export const count: {
299
384
  ): QueryProjection<ExtractFieldValuesRefined<Q>, NonNegativeInt, never, "count", ExtractExclusiveness<Q>>
300
385
  } = (current) => new Count({ current })
301
386
 
387
+ /**
388
+ * Attach a projection schema to a query.
389
+ *
390
+ * The `select` clause sent to the store is derived from the schema's encoded
391
+ * AST property names (top-level + per-array sub-keys), so a projection always
392
+ * narrows what is read from the store. The repository augments that select
393
+ * with `id` and `_etag` for change tracking. See {@link toFilter} and the
394
+ * dispatch in `Repository/internal/internal.ts`.
395
+ *
396
+ * Modes — pick based on shape of the decoded value and on whether the
397
+ * persistence-model (PM) reverse-mapping is needed:
398
+ *
399
+ * - `"transform"` (default when `mode` omitted): goes through the repo's
400
+ * `parseMany`/`parseMany2` pipeline. The raw row is reverse-mapped via the
401
+ * etag/PM cache (re-injecting `_etag` and any PM-shape state) before
402
+ * decoding. Decode failures `orDie` (error channel = `never`). Use when
403
+ * the schema operates on the full PM shape (e.g. full-entity reads that
404
+ * must preserve etag tracking).
405
+ *
406
+ * - `"project"`: decodes the raw encoded row directly with the supplied
407
+ * schema. No PM reverse-mapping, no etag cache merge. Decode failures
408
+ * surface as `S.SchemaError`. Use for slim DTOs / aggregations that do not
409
+ * need etag tracking and whose schema input is a plain subset of `Encoded`.
410
+ *
411
+ * - `"collect"`: like `"project"`, but the schema yields `Option<A>` and
412
+ * `None` values are dropped post-decode (`Array.getSomes`). Use to filter
413
+ * rows during decode (e.g. discriminated-union narrowing where some rows
414
+ * should not appear in the result).
415
+ */
302
416
  export const project: {
303
417
  <
304
418
  Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
@@ -356,6 +470,226 @@ export const project: {
356
470
  ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
357
471
  } = (schema: any, mode = "transform") => (current: any) => new Project({ current, schema, mode } as any)
358
472
 
473
+ export const relation = <TFieldValues extends FieldValues>(
474
+ path: FieldPath<TFieldValues>
475
+ ) => ({
476
+ count: (operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
477
+ operation
478
+ ? {
479
+ _tag: "relation-count",
480
+ path: path as string,
481
+ operation
482
+ }
483
+ : {
484
+ _tag: "relation-count",
485
+ path: path as string
486
+ },
487
+ any: (operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
488
+ operation
489
+ ? {
490
+ _tag: "relation-any",
491
+ path: path as string,
492
+ operation
493
+ }
494
+ : {
495
+ _tag: "relation-any",
496
+ path: path as string
497
+ },
498
+ every: (operation: ComputedProjectionOperation): ComputedProjectionExpression => ({
499
+ _tag: "relation-every",
500
+ path: path as string,
501
+ operation
502
+ }),
503
+ distinctCount: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
504
+ operation
505
+ ? {
506
+ _tag: "relation-distinct-count",
507
+ path: path as string,
508
+ field,
509
+ operation
510
+ }
511
+ : {
512
+ _tag: "relation-distinct-count",
513
+ path: path as string,
514
+ field
515
+ },
516
+ sum: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
517
+ operation
518
+ ? {
519
+ _tag: "relation-sum",
520
+ path: path as string,
521
+ field,
522
+ operation
523
+ }
524
+ : {
525
+ _tag: "relation-sum",
526
+ path: path as string,
527
+ field
528
+ },
529
+ sumExpr: (
530
+ expression: ComputedProjectionMathExpression,
531
+ operation?: ComputedProjectionOperation
532
+ ): ComputedProjectionExpression =>
533
+ operation
534
+ ? {
535
+ _tag: "relation-sum-expr",
536
+ path: path as string,
537
+ expression,
538
+ operation
539
+ }
540
+ : {
541
+ _tag: "relation-sum-expr",
542
+ path: path as string,
543
+ expression
544
+ },
545
+ sumExprBy: (
546
+ expression: ComputedProjectionMathExpression,
547
+ options: { unit: string },
548
+ operation?: ComputedProjectionOperation
549
+ ): ComputedProjectionExpression =>
550
+ operation
551
+ ? {
552
+ _tag: "relation-sum-expr-by",
553
+ path: path as string,
554
+ expression,
555
+ unit: options.unit,
556
+ operation
557
+ }
558
+ : {
559
+ _tag: "relation-sum-expr-by",
560
+ path: path as string,
561
+ expression,
562
+ unit: options.unit
563
+ },
564
+ sumExprNormalized: (
565
+ expression: ComputedProjectionMathExpression,
566
+ options: { unit: string; toBase: string; factors: Readonly<Record<string, number>> },
567
+ operation?: ComputedProjectionOperation
568
+ ): ComputedProjectionExpression =>
569
+ operation
570
+ ? {
571
+ _tag: "relation-sum-expr-normalized",
572
+ path: path as string,
573
+ expression,
574
+ unit: options.unit,
575
+ toBase: options.toBase,
576
+ factors: options.factors,
577
+ operation
578
+ }
579
+ : {
580
+ _tag: "relation-sum-expr-normalized",
581
+ path: path as string,
582
+ expression,
583
+ unit: options.unit,
584
+ toBase: options.toBase,
585
+ factors: options.factors
586
+ },
587
+ collect: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
588
+ operation
589
+ ? {
590
+ _tag: "relation-collect",
591
+ path: path as string,
592
+ field,
593
+ distinct: false,
594
+ operation
595
+ }
596
+ : {
597
+ _tag: "relation-collect",
598
+ path: path as string,
599
+ field,
600
+ distinct: false
601
+ },
602
+ collectDistinct: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
603
+ operation
604
+ ? {
605
+ _tag: "relation-collect",
606
+ path: path as string,
607
+ field,
608
+ distinct: true,
609
+ operation
610
+ }
611
+ : {
612
+ _tag: "relation-collect",
613
+ path: path as string,
614
+ field,
615
+ distinct: true
616
+ },
617
+ collectFields: (fields: readonly string[], operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
618
+ operation
619
+ ? {
620
+ _tag: "relation-collect-fields",
621
+ path: path as string,
622
+ fields,
623
+ distinct: false,
624
+ operation
625
+ }
626
+ : {
627
+ _tag: "relation-collect-fields",
628
+ path: path as string,
629
+ fields,
630
+ distinct: false
631
+ },
632
+ collectDistinctFields: (
633
+ fields: readonly string[],
634
+ operation?: ComputedProjectionOperation
635
+ ): ComputedProjectionExpression =>
636
+ operation
637
+ ? {
638
+ _tag: "relation-collect-fields",
639
+ path: path as string,
640
+ fields,
641
+ distinct: true,
642
+ operation
643
+ }
644
+ : {
645
+ _tag: "relation-collect-fields",
646
+ path: path as string,
647
+ fields,
648
+ distinct: true
649
+ }
650
+ })
651
+
652
+ export const expr = {
653
+ field: (field: string): ComputedProjectionMathExpression => ({ _tag: "field", field }),
654
+ mul: (
655
+ left: ComputedProjectionMathExpression,
656
+ right: ComputedProjectionMathExpression
657
+ ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right })
658
+ } as const
659
+
660
+ export const computed = <T extends ComputedProjectionMap>(value: T): T => value
661
+
662
+ export const projectComputed: {
663
+ <
664
+ Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
665
+ I extends Record<string, unknown>,
666
+ A = ExtractFieldValuesRefined<Q>,
667
+ R = never,
668
+ E extends boolean = ExtractExclusiveness<Q>
669
+ >(
670
+ schema: S.Codec<Option.Option<A>, I, R>,
671
+ computedProjection: ComputedProjectionMap,
672
+ mode: "collect"
673
+ ): (
674
+ current: Q
675
+ ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
676
+
677
+ <
678
+ Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
679
+ I extends Record<string, unknown>,
680
+ A = ExtractFieldValuesRefined<Q>,
681
+ R = never,
682
+ E extends boolean = ExtractExclusiveness<Q>
683
+ >(
684
+ schema: S.Codec<A, I, R>,
685
+ computedProjection: ComputedProjectionMap,
686
+ mode?: "project"
687
+ ): (
688
+ current: Q
689
+ ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
690
+ } = (schema: any, computedProjection: ComputedProjectionMap, mode = "project") => (current: any) =>
691
+ new Project({ current, schema, mode, computed: computedProjection } as any)
692
+
359
693
  type GetArV<T> = T extends readonly (infer R)[] ? R : never
360
694
 
361
695
  export type FilterContinuations<IsCurrentInitial extends boolean = false> = {
@@ -1538,7 +1872,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1538
1872
  fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues, TFieldValuesRefined2, E2>
1539
1873
  ): (
1540
1874
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1541
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2, false>
1875
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2>
1542
1876
 
1543
1877
  <
1544
1878
  TFieldValues extends FieldValues,
@@ -1555,7 +1889,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1555
1889
  ) => QueryWhere<TFieldValues, TFieldValuesRefined3, E3>
1556
1890
  ): (
1557
1891
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1558
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined3, false>
1892
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined3>
1559
1893
 
1560
1894
  <
1561
1895
  TFieldValues extends FieldValues,
@@ -1577,7 +1911,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1577
1911
  ) => QueryWhere<TFieldValues, TFieldValuesRefined4, E4>
1578
1912
  ): (
1579
1913
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1580
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined4, false>
1914
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined4>
1581
1915
 
1582
1916
  <
1583
1917
  TFieldValues extends FieldValues,
@@ -1604,7 +1938,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1604
1938
  ) => QueryWhere<TFieldValues, TFieldValuesRefined5, E5>
1605
1939
  ): (
1606
1940
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1607
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined5, false>
1941
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined5>
1608
1942
 
1609
1943
  <
1610
1944
  TFieldValues extends FieldValues,
@@ -1636,7 +1970,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1636
1970
  ) => QueryWhere<TFieldValues, TFieldValuesRefined6, E6>
1637
1971
  ): (
1638
1972
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1639
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined6, false>
1973
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined6>
1640
1974
 
1641
1975
  <
1642
1976
  TFieldValues extends FieldValues,
@@ -1673,7 +2007,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1673
2007
  ) => QueryWhere<TFieldValues, TFieldValuesRefined7, E7>
1674
2008
  ): (
1675
2009
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1676
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined7, false>
2010
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined7>
1677
2011
 
1678
2012
  <
1679
2013
  TFieldValues extends FieldValues,
@@ -1715,7 +2049,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1715
2049
  ) => QueryWhere<TFieldValues, TFieldValuesRefined8, E8>
1716
2050
  ): (
1717
2051
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1718
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2, false>
2052
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2>
1719
2053
 
1720
2054
  <
1721
2055
  TFieldValues extends FieldValues,
@@ -1762,7 +2096,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1762
2096
  ) => QueryWhere<TFieldValues, TFieldValuesRefined9, E9>
1763
2097
  ): (
1764
2098
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1765
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined9, false>
2099
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined9>
1766
2100
 
1767
2101
  <
1768
2102
  TFieldValues extends FieldValues,
@@ -1814,7 +2148,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1814
2148
  ) => QueryWhere<TFieldValues, TFieldValuesRefined10, E10>
1815
2149
  ): (
1816
2150
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1817
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined10, false>
2151
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined10>
1818
2152
 
1819
2153
  <
1820
2154
  TFieldValues extends FieldValues,
@@ -1871,7 +2205,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1871
2205
  ) => QueryWhere<TFieldValues, TFieldValuesRefined11, E11>
1872
2206
  ): (
1873
2207
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1874
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined11, false>
2208
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined11>
1875
2209
 
1876
2210
  <
1877
2211
  TFieldValues extends FieldValues,
@@ -1933,7 +2267,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1933
2267
  ) => QueryWhere<TFieldValues, TFieldValuesRefined12, E12>
1934
2268
  ): (
1935
2269
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1936
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined12, false>
2270
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined12>
1937
2271
 
1938
2272
  <
1939
2273
  TFieldValues extends FieldValues,
@@ -2000,7 +2334,7 @@ export type NestedQueriesFreeDisjointRefinement = {
2000
2334
  ) => QueryWhere<TFieldValues, TFieldValuesRefined13, E13>
2001
2335
  ): (
2002
2336
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
2003
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined13, false>
2337
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined13>
2004
2338
 
2005
2339
  <
2006
2340
  TFieldValues extends FieldValues,
@@ -2072,7 +2406,7 @@ export type NestedQueriesFreeDisjointRefinement = {
2072
2406
  ) => QueryWhere<TFieldValues, TFieldValuesRefined14, E14>
2073
2407
  ): (
2074
2408
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
2075
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined14, false>
2409
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined14>
2076
2410
  }
2077
2411
 
2078
2412
  export type FilterWhere =
@@ -2099,12 +2433,12 @@ export type WhereEveryOrSome =
2099
2433
  subPath: TFieldName,
2100
2434
  dude: (
2101
2435
  current: Query<TFieldValues[TFieldName][number]>
2102
- ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number], false>,
2436
+ ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number]>,
2103
2437
  ...dudes: ((
2104
- current: QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number], false>
2105
- ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number], false>)[]
2438
+ current: QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number]>
2439
+ ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number]>)[]
2106
2440
  ): (
2107
2441
  current: Query<TFieldValues>
2108
- ) => QueryWhere<TFieldValues, TFieldValues, false>
2442
+ ) => QueryWhere<TFieldValues, TFieldValues>
2109
2443
  }
2110
2444
  & FilterContinuationsWithSubpath