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

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