@effect-app/infra 4.0.0-beta.23 → 4.0.0-beta.231

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 (339) hide show
  1. package/CHANGELOG.md +1726 -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 +21 -17
  9. package/dist/Emailer/fake.d.ts +1 -1
  10. package/dist/Emailer/fake.js +3 -3
  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 +10 -6
  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 +141 -59
  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 +216 -18
  56. package/dist/Model/query/dsl.d.ts.map +1 -1
  57. package/dist/Model/query/dsl.js +240 -5
  58. package/dist/Model/query/new-kid-interpreter.d.ts +116 -8
  59. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  60. package/dist/Model/query/new-kid-interpreter.js +177 -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 +12 -7
  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 +18 -4
  89. package/dist/Store/Cosmos/query.d.ts +13 -2
  90. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  91. package/dist/Store/Cosmos/query.js +179 -41
  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 +327 -62
  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 +49 -0
  105. package/dist/Store/SQL/query.d.ts.map +1 -0
  106. package/dist/Store/SQL/query.js +527 -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 +32 -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 +6 -4
  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 -9
  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 +11 -7
  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 +15 -7
  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 -38
  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 +19 -11
  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 +65 -57
  227. package/src/Emailer/fake.ts +2 -2
  228. package/src/Emailer/service.ts +13 -3
  229. package/src/MainFiberSet.ts +12 -10
  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 +266 -151
  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 +456 -20
  241. package/src/Model/query/new-kid-interpreter.ts +281 -7
  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 +12 -7
  250. package/src/Store/ContextMapContainer.ts +46 -3
  251. package/src/Store/Cosmos/query.ts +214 -50
  252. package/src/Store/Cosmos.ts +491 -350
  253. package/src/Store/Disk.ts +106 -66
  254. package/src/Store/Memory.ts +365 -91
  255. package/src/Store/SQL/Pg.ts +364 -0
  256. package/src/Store/SQL/query.ts +603 -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 +51 -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 +5 -3
  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 +19 -16
  270. package/src/api/internal/RequestContextMiddleware.ts +17 -6
  271. package/src/api/internal/auth.ts +248 -44
  272. package/src/api/internal/events.ts +19 -10
  273. package/src/api/layerUtils.ts +13 -9
  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 +309 -139
  281. package/src/api/setupRequest.ts +35 -12
  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/cosmos-query.test.ts +159 -0
  295. package/test/dist/auth.test.d.ts.map +1 -0
  296. package/test/dist/contextProvider.test.d.ts.map +1 -1
  297. package/test/dist/controller.test.d.ts.map +1 -1
  298. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  299. package/test/dist/date-query.test.d.ts.map +1 -0
  300. package/test/dist/fixtures.d.ts +30 -12
  301. package/test/dist/fixtures.d.ts.map +1 -1
  302. package/test/dist/fixtures.js +17 -10
  303. package/test/dist/query.test.d.ts.map +1 -1
  304. package/test/dist/rawQuery.test.d.ts.map +1 -1
  305. package/test/dist/repository-ext.test.d.ts.map +1 -0
  306. package/test/dist/requires.test.d.ts.map +1 -1
  307. package/test/dist/router-generator.test.d.ts.map +1 -0
  308. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  309. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  310. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  311. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  312. package/test/dist/sql-store.test.d.ts.map +1 -0
  313. package/test/fixtures.ts +16 -9
  314. package/test/layerUtils.test.ts +1 -1
  315. package/test/query.test.ts +901 -38
  316. package/test/rawQuery.test.ts +338 -20
  317. package/test/repository-ext.test.ts +62 -0
  318. package/test/requires.test.ts +10 -5
  319. package/test/router-generator.test.ts +187 -0
  320. package/test/routing-interruptibility.test.ts +66 -0
  321. package/test/rpc-e2e-invalidation.test.ts +256 -0
  322. package/test/rpc-multi-middleware.test.ts +84 -9
  323. package/test/rpc-stream-fullstack.test.ts +304 -0
  324. package/test/sql-store.test.ts +1711 -0
  325. package/test/validateSample.test.ts +17 -12
  326. package/tsconfig.examples.json +1 -1
  327. package/tsconfig.json +0 -1
  328. package/tsconfig.json.bak +2 -2
  329. package/tsconfig.src.json +35 -35
  330. package/tsconfig.test.json +2 -2
  331. package/dist/Operations.d.ts +0 -55
  332. package/dist/Operations.d.ts.map +0 -1
  333. package/dist/Operations.js +0 -102
  334. package/dist/OperationsRepo.d.ts +0 -41
  335. package/dist/OperationsRepo.d.ts.map +0 -1
  336. package/dist/OperationsRepo.js +0 -14
  337. package/eslint.config.mjs +0 -24
  338. package/src/Operations.ts +0 -235
  339. 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,121 @@ 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
+ readonly _tag: "relation-length"
184
+ readonly path: string
185
+ }
186
+
187
+ /**
188
+ * An expression that aggregates values across documents (for use with {@link aggregate}).
189
+ * `agg-field` references a document field to group by; other tags are aggregate functions.
190
+ */
191
+ export type AggregateExpression =
192
+ | {
193
+ readonly _tag: "agg-field"
194
+ readonly path: string
195
+ }
196
+ | {
197
+ readonly _tag: "agg-count"
198
+ }
199
+ | {
200
+ readonly _tag: "agg-count-when"
201
+ readonly operation: ComputedProjectionOperation
202
+ }
203
+ | {
204
+ readonly _tag: "agg-sum"
205
+ readonly field: string
206
+ }
207
+ | {
208
+ readonly _tag: "agg-min"
209
+ readonly field: string
210
+ }
211
+ | {
212
+ readonly _tag: "agg-max"
213
+ readonly field: string
214
+ }
215
+
216
+ export type AggregateMap = Readonly<Record<string, AggregateExpression>>
217
+
218
+ export type ComputedProjectionMap = Readonly<Record<string, ComputedProjectionExpression>>
100
219
  export type Q<TFieldValues extends FieldValues> =
101
220
  | Initial<TFieldValues>
102
221
  | Where<TFieldValues>
@@ -210,7 +329,9 @@ export class Project<A, TFieldValues extends FieldValues, R, TType extends "one"
210
329
  extends Data.TaggedClass("project")<{
211
330
  current: Query<TFieldValues> | QueryWhere<any, TFieldValues> | QueryEnd<TFieldValues, TType>
212
331
  schema: S.Codec<A, TFieldValues, R>
213
- mode: "collect" | "project" | "transform"
332
+ mode: "collect" | "project" | "transform" | "aggregate"
333
+ computed?: ComputedProjectionMap
334
+ aggregateMap?: AggregateMap
214
335
  }>
215
336
  implements QueryProjection<TFieldValues, A, R>
216
337
  {
@@ -299,6 +420,35 @@ export const count: {
299
420
  ): QueryProjection<ExtractFieldValuesRefined<Q>, NonNegativeInt, never, "count", ExtractExclusiveness<Q>>
300
421
  } = (current) => new Count({ current })
301
422
 
423
+ /**
424
+ * Attach a projection schema to a query.
425
+ *
426
+ * The `select` clause sent to the store is derived from the schema's encoded
427
+ * AST property names (top-level + per-array sub-keys), so a projection always
428
+ * narrows what is read from the store. The repository augments that select
429
+ * with `id` and `_etag` for change tracking. See {@link toFilter} and the
430
+ * dispatch in `Repository/internal/internal.ts`.
431
+ *
432
+ * Modes — pick based on shape of the decoded value and on whether the
433
+ * persistence-model (PM) reverse-mapping is needed:
434
+ *
435
+ * - `"transform"` (default when `mode` omitted): goes through the repo's
436
+ * `parseMany` pipeline. The raw row is reverse-mapped via the
437
+ * etag/PM cache (re-injecting `_etag` and any PM-shape state) before
438
+ * decoding. Decode failures `orDie` (error channel = `never`). Use when
439
+ * the schema operates on the full PM shape (e.g. full-entity reads that
440
+ * must preserve etag tracking).
441
+ *
442
+ * - `"project"`: decodes the raw encoded row directly with the supplied
443
+ * schema. No PM reverse-mapping, no etag cache merge. Decode failures
444
+ * surface as `S.SchemaError`. Use for slim DTOs / aggregations that do not
445
+ * need etag tracking and whose schema input is a plain subset of `Encoded`.
446
+ *
447
+ * - `"collect"`: like `"project"`, but the schema yields `Option<A>` and
448
+ * `None` values are dropped post-decode (`Array.getSomes`). Use to filter
449
+ * rows during decode (e.g. discriminated-union narrowing where some rows
450
+ * should not appear in the result).
451
+ */
302
452
  export const project: {
303
453
  <
304
454
  Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
@@ -356,6 +506,292 @@ export const project: {
356
506
  ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
357
507
  } = (schema: any, mode = "transform") => (current: any) => new Project({ current, schema, mode } as any)
358
508
 
509
+ export const relation = <TFieldValues extends FieldValues>(
510
+ path: FieldPath<TFieldValues>
511
+ ) => ({
512
+ length: (): ComputedProjectionExpression => ({
513
+ _tag: "relation-length",
514
+ path: path as string
515
+ }),
516
+ count: (operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
517
+ operation
518
+ ? {
519
+ _tag: "relation-count",
520
+ path: path as string,
521
+ operation
522
+ }
523
+ : {
524
+ _tag: "relation-count",
525
+ path: path as string
526
+ },
527
+ any: (operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
528
+ operation
529
+ ? {
530
+ _tag: "relation-any",
531
+ path: path as string,
532
+ operation
533
+ }
534
+ : {
535
+ _tag: "relation-any",
536
+ path: path as string
537
+ },
538
+ every: (operation: ComputedProjectionOperation): ComputedProjectionExpression => ({
539
+ _tag: "relation-every",
540
+ path: path as string,
541
+ operation
542
+ }),
543
+ distinctCount: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
544
+ operation
545
+ ? {
546
+ _tag: "relation-distinct-count",
547
+ path: path as string,
548
+ field,
549
+ operation
550
+ }
551
+ : {
552
+ _tag: "relation-distinct-count",
553
+ path: path as string,
554
+ field
555
+ },
556
+ sum: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
557
+ operation
558
+ ? {
559
+ _tag: "relation-sum",
560
+ path: path as string,
561
+ field,
562
+ operation
563
+ }
564
+ : {
565
+ _tag: "relation-sum",
566
+ path: path as string,
567
+ field
568
+ },
569
+ sumExpr: (
570
+ expression: ComputedProjectionMathExpression,
571
+ operation?: ComputedProjectionOperation
572
+ ): ComputedProjectionExpression =>
573
+ operation
574
+ ? {
575
+ _tag: "relation-sum-expr",
576
+ path: path as string,
577
+ expression,
578
+ operation
579
+ }
580
+ : {
581
+ _tag: "relation-sum-expr",
582
+ path: path as string,
583
+ expression
584
+ },
585
+ sumExprBy: (
586
+ expression: ComputedProjectionMathExpression,
587
+ options: { unit: string },
588
+ operation?: ComputedProjectionOperation
589
+ ): ComputedProjectionExpression =>
590
+ operation
591
+ ? {
592
+ _tag: "relation-sum-expr-by",
593
+ path: path as string,
594
+ expression,
595
+ unit: options.unit,
596
+ operation
597
+ }
598
+ : {
599
+ _tag: "relation-sum-expr-by",
600
+ path: path as string,
601
+ expression,
602
+ unit: options.unit
603
+ },
604
+ sumExprNormalized: (
605
+ expression: ComputedProjectionMathExpression,
606
+ options: { unit: string; toBase: string; factors: Readonly<Record<string, number>> },
607
+ operation?: ComputedProjectionOperation
608
+ ): ComputedProjectionExpression =>
609
+ operation
610
+ ? {
611
+ _tag: "relation-sum-expr-normalized",
612
+ path: path as string,
613
+ expression,
614
+ unit: options.unit,
615
+ toBase: options.toBase,
616
+ factors: options.factors,
617
+ operation
618
+ }
619
+ : {
620
+ _tag: "relation-sum-expr-normalized",
621
+ path: path as string,
622
+ expression,
623
+ unit: options.unit,
624
+ toBase: options.toBase,
625
+ factors: options.factors
626
+ },
627
+ collect: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
628
+ operation
629
+ ? {
630
+ _tag: "relation-collect",
631
+ path: path as string,
632
+ field,
633
+ distinct: false,
634
+ operation
635
+ }
636
+ : {
637
+ _tag: "relation-collect",
638
+ path: path as string,
639
+ field,
640
+ distinct: false
641
+ },
642
+ collectDistinct: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
643
+ operation
644
+ ? {
645
+ _tag: "relation-collect",
646
+ path: path as string,
647
+ field,
648
+ distinct: true,
649
+ operation
650
+ }
651
+ : {
652
+ _tag: "relation-collect",
653
+ path: path as string,
654
+ field,
655
+ distinct: true
656
+ },
657
+ collectFields: (fields: readonly string[], operation?: ComputedProjectionOperation): ComputedProjectionExpression =>
658
+ operation
659
+ ? {
660
+ _tag: "relation-collect-fields",
661
+ path: path as string,
662
+ fields,
663
+ distinct: false,
664
+ operation
665
+ }
666
+ : {
667
+ _tag: "relation-collect-fields",
668
+ path: path as string,
669
+ fields,
670
+ distinct: false
671
+ },
672
+ collectDistinctFields: (
673
+ fields: readonly string[],
674
+ operation?: ComputedProjectionOperation
675
+ ): ComputedProjectionExpression =>
676
+ operation
677
+ ? {
678
+ _tag: "relation-collect-fields",
679
+ path: path as string,
680
+ fields,
681
+ distinct: true,
682
+ operation
683
+ }
684
+ : {
685
+ _tag: "relation-collect-fields",
686
+ path: path as string,
687
+ fields,
688
+ distinct: true
689
+ }
690
+ })
691
+
692
+ export const expr = {
693
+ field: (field: string): ComputedProjectionMathExpression => ({ _tag: "field", field }),
694
+ mul: (
695
+ left: ComputedProjectionMathExpression,
696
+ right: ComputedProjectionMathExpression
697
+ ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right })
698
+ } as const
699
+
700
+ export const computed = <T extends ComputedProjectionMap>(value: T): T => value
701
+
702
+ export const projectComputed: {
703
+ <
704
+ Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
705
+ I extends Record<string, unknown>,
706
+ A = ExtractFieldValuesRefined<Q>,
707
+ R = never,
708
+ E extends boolean = ExtractExclusiveness<Q>
709
+ >(
710
+ schema: S.Codec<Option.Option<A>, I, R>,
711
+ computedProjection: ComputedProjectionMap,
712
+ mode: "collect"
713
+ ): (
714
+ current: Q
715
+ ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
716
+
717
+ <
718
+ Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
719
+ I extends Record<string, unknown>,
720
+ A = ExtractFieldValuesRefined<Q>,
721
+ R = never,
722
+ E extends boolean = ExtractExclusiveness<Q>
723
+ >(
724
+ schema: S.Codec<A, I, R>,
725
+ computedProjection: ComputedProjectionMap,
726
+ mode?: "project"
727
+ ): (
728
+ current: Q
729
+ ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
730
+ } = (schema: any, computedProjection: ComputedProjectionMap, mode = "project") => (current: any) =>
731
+ new Project({ current, schema, mode, computed: computedProjection } as any)
732
+
733
+ /**
734
+ * DSL helpers for building aggregate expressions used with {@link aggregate}.
735
+ *
736
+ * - `agg.field(path)` — references a document field for GROUP BY (with optional output alias)
737
+ * - `agg.count()` — COUNT(*) across all rows in the group
738
+ * - `agg.countWhen(op)` — COUNT of rows matching the filter operation
739
+ * - `agg.sum(field)` — SUM of a numeric document field
740
+ * - `agg.min(field)` / `agg.max(field)` — MIN/MAX of a document field
741
+ */
742
+ export const agg = {
743
+ field: (path: string): AggregateExpression => ({ _tag: "agg-field", path }),
744
+ count: (): AggregateExpression => ({ _tag: "agg-count" }),
745
+ countWhen: (operation: ComputedProjectionOperation): AggregateExpression => ({
746
+ _tag: "agg-count-when",
747
+ operation
748
+ }),
749
+ sum: (field: string): AggregateExpression => ({ _tag: "agg-sum", field }),
750
+ min: (field: string): AggregateExpression => ({ _tag: "agg-min", field }),
751
+ max: (field: string): AggregateExpression => ({ _tag: "agg-max", field })
752
+ } as const
753
+
754
+ /**
755
+ * Attach an aggregate projection to a query, performing GROUP BY + aggregate functions at the
756
+ * database level instead of fetching all rows and grouping in memory.
757
+ *
758
+ * The `aggregateMap` maps each output field name to either:
759
+ * - `agg.field(path)` — a group-by field (document path → output alias)
760
+ * - `agg.count()` / `agg.countWhen(op)` / `agg.sum(f)` / `agg.min(f)` / `agg.max(f)` — an aggregate
761
+ *
762
+ * The output is decoded directly with `schema` (no PM reverse-mapping, no etag tracking).
763
+ * Decode failures surface as `S.SchemaError`.
764
+ *
765
+ * @example
766
+ * ```ts
767
+ * repo.query(
768
+ * where("status", "active"),
769
+ * aggregate(
770
+ * S.Struct({ city: S.String, count: S.Number }),
771
+ * {
772
+ * city: agg.field("address.city"),
773
+ * count: agg.countWhen((q) => q.pipe(where("active", true)))
774
+ * }
775
+ * )
776
+ * )
777
+ * ```
778
+ */
779
+ export const aggregate: {
780
+ <
781
+ Q extends Query<any> | QueryWhere<any, any, any> | QueryEnd<any, "one" | "many", any>,
782
+ I extends Record<string, unknown>,
783
+ A = ExtractFieldValuesRefined<Q>,
784
+ R = never,
785
+ E extends boolean = ExtractExclusiveness<Q>
786
+ >(
787
+ schema: S.Codec<A, I, R>,
788
+ aggregateMap: AggregateMap
789
+ ): (
790
+ current: Q
791
+ ) => QueryProjection<ExtractFieldValuesRefined<Q>, A, R, ExtractTType<Q>, E>
792
+ } = (schema: any, aggregateMap: AggregateMap) => (current: any) =>
793
+ new Project({ current, schema, mode: "aggregate", aggregateMap } as any)
794
+
359
795
  type GetArV<T> = T extends readonly (infer R)[] ? R : never
360
796
 
361
797
  export type FilterContinuations<IsCurrentInitial extends boolean = false> = {
@@ -1538,7 +1974,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1538
1974
  fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues, TFieldValuesRefined2, E2>
1539
1975
  ): (
1540
1976
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1541
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2, false>
1977
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2>
1542
1978
 
1543
1979
  <
1544
1980
  TFieldValues extends FieldValues,
@@ -1555,7 +1991,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1555
1991
  ) => QueryWhere<TFieldValues, TFieldValuesRefined3, E3>
1556
1992
  ): (
1557
1993
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1558
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined3, false>
1994
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined3>
1559
1995
 
1560
1996
  <
1561
1997
  TFieldValues extends FieldValues,
@@ -1577,7 +2013,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1577
2013
  ) => QueryWhere<TFieldValues, TFieldValuesRefined4, E4>
1578
2014
  ): (
1579
2015
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1580
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined4, false>
2016
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined4>
1581
2017
 
1582
2018
  <
1583
2019
  TFieldValues extends FieldValues,
@@ -1604,7 +2040,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1604
2040
  ) => QueryWhere<TFieldValues, TFieldValuesRefined5, E5>
1605
2041
  ): (
1606
2042
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1607
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined5, false>
2043
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined5>
1608
2044
 
1609
2045
  <
1610
2046
  TFieldValues extends FieldValues,
@@ -1636,7 +2072,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1636
2072
  ) => QueryWhere<TFieldValues, TFieldValuesRefined6, E6>
1637
2073
  ): (
1638
2074
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1639
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined6, false>
2075
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined6>
1640
2076
 
1641
2077
  <
1642
2078
  TFieldValues extends FieldValues,
@@ -1673,7 +2109,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1673
2109
  ) => QueryWhere<TFieldValues, TFieldValuesRefined7, E7>
1674
2110
  ): (
1675
2111
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1676
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined7, false>
2112
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined7>
1677
2113
 
1678
2114
  <
1679
2115
  TFieldValues extends FieldValues,
@@ -1715,7 +2151,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1715
2151
  ) => QueryWhere<TFieldValues, TFieldValuesRefined8, E8>
1716
2152
  ): (
1717
2153
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1718
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2, false>
2154
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined2>
1719
2155
 
1720
2156
  <
1721
2157
  TFieldValues extends FieldValues,
@@ -1762,7 +2198,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1762
2198
  ) => QueryWhere<TFieldValues, TFieldValuesRefined9, E9>
1763
2199
  ): (
1764
2200
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1765
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined9, false>
2201
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined9>
1766
2202
 
1767
2203
  <
1768
2204
  TFieldValues extends FieldValues,
@@ -1814,7 +2250,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1814
2250
  ) => QueryWhere<TFieldValues, TFieldValuesRefined10, E10>
1815
2251
  ): (
1816
2252
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1817
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined10, false>
2253
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined10>
1818
2254
 
1819
2255
  <
1820
2256
  TFieldValues extends FieldValues,
@@ -1871,7 +2307,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1871
2307
  ) => QueryWhere<TFieldValues, TFieldValuesRefined11, E11>
1872
2308
  ): (
1873
2309
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1874
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined11, false>
2310
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined11>
1875
2311
 
1876
2312
  <
1877
2313
  TFieldValues extends FieldValues,
@@ -1933,7 +2369,7 @@ export type NestedQueriesFreeDisjointRefinement = {
1933
2369
  ) => QueryWhere<TFieldValues, TFieldValuesRefined12, E12>
1934
2370
  ): (
1935
2371
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
1936
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined12, false>
2372
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined12>
1937
2373
 
1938
2374
  <
1939
2375
  TFieldValues extends FieldValues,
@@ -2000,7 +2436,7 @@ export type NestedQueriesFreeDisjointRefinement = {
2000
2436
  ) => QueryWhere<TFieldValues, TFieldValuesRefined13, E13>
2001
2437
  ): (
2002
2438
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
2003
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined13, false>
2439
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined13>
2004
2440
 
2005
2441
  <
2006
2442
  TFieldValues extends FieldValues,
@@ -2072,7 +2508,7 @@ export type NestedQueriesFreeDisjointRefinement = {
2072
2508
  ) => QueryWhere<TFieldValues, TFieldValuesRefined14, E14>
2073
2509
  ): (
2074
2510
  current: QueryWhere<TFieldValues, TFieldValuesRefined, E>
2075
- ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined14, false>
2511
+ ) => QueryWhere<TFieldValues, TFieldValuesRefined | TFieldValuesRefined14>
2076
2512
  }
2077
2513
 
2078
2514
  export type FilterWhere =
@@ -2099,12 +2535,12 @@ export type WhereEveryOrSome =
2099
2535
  subPath: TFieldName,
2100
2536
  dude: (
2101
2537
  current: Query<TFieldValues[TFieldName][number]>
2102
- ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number], false>,
2538
+ ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number]>,
2103
2539
  ...dudes: ((
2104
- current: QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number], false>
2105
- ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number], false>)[]
2540
+ current: QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number]>
2541
+ ) => QueryWhere<TFieldValues[TFieldName][number], TFieldValues[TFieldName][number]>)[]
2106
2542
  ): (
2107
2543
  current: Query<TFieldValues>
2108
- ) => QueryWhere<TFieldValues, TFieldValues, false>
2544
+ ) => QueryWhere<TFieldValues, TFieldValues>
2109
2545
  }
2110
2546
  & FilterContinuationsWithSubpath