@effect-app/infra 4.0.0-beta.31 → 4.0.0-beta.310

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 (473) hide show
  1. package/CHANGELOG.md +2361 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +29 -10
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +64 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +547 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +82 -0
  12. package/dist/ContextProvider.d.ts +34 -0
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +12 -8
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +23 -7
  24. package/dist/QueueMaker/errors.d.ts +4 -2
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +31 -42
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +14 -3
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +179 -41
  35. package/dist/Store/Cosmos.d.ts +2 -2
  36. package/dist/Store/Cosmos.d.ts.map +1 -1
  37. package/dist/Store/Cosmos.js +385 -254
  38. package/dist/Store/Disk.d.ts +4 -4
  39. package/dist/Store/Disk.d.ts.map +1 -1
  40. package/dist/Store/Disk.js +79 -39
  41. package/dist/Store/Memory.d.ts +5 -9
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +324 -67
  44. package/dist/Store/SQL/Pg.d.ts +4 -0
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  46. package/dist/Store/SQL/Pg.js +253 -0
  47. package/dist/Store/SQL/query.d.ts +49 -0
  48. package/dist/Store/SQL/query.d.ts.map +1 -0
  49. package/dist/Store/SQL/query.js +527 -0
  50. package/dist/Store/SQL.d.ts +21 -0
  51. package/dist/Store/SQL.d.ts.map +1 -0
  52. package/dist/Store/SQL.js +472 -0
  53. package/dist/Store/codeFilter.d.ts +4 -4
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +6 -4
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +18 -5
  59. package/dist/Store/utils.d.ts +5 -2
  60. package/dist/Store/utils.d.ts.map +1 -1
  61. package/dist/Store/utils.js +9 -5
  62. package/dist/WorkflowEngineCosmos.d.ts +29 -0
  63. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  64. package/dist/WorkflowEngineCosmos.js +542 -0
  65. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  66. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  67. package/dist/WorkflowEngineSqlite.js +550 -0
  68. package/dist/arbs.d.ts +1 -1
  69. package/dist/arbs.d.ts.map +1 -1
  70. package/dist/arbs.js +5 -3
  71. package/dist/codec.d.ts.map +1 -0
  72. package/dist/codec.js +5 -0
  73. package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +4 -2
  74. package/dist/cosmos-client.d.ts.map +1 -0
  75. package/dist/cosmos-client.js +11 -0
  76. package/dist/errorReporter.d.ts +6 -4
  77. package/dist/errorReporter.d.ts.map +1 -1
  78. package/dist/errorReporter.js +23 -27
  79. package/dist/fileUtil.d.ts +1 -1
  80. package/dist/fileUtil.d.ts.map +1 -1
  81. package/dist/fileUtil.js +2 -2
  82. package/dist/index.d.ts +2 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -2
  85. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  86. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  87. package/dist/internal/RequestContextMiddleware.js +45 -0
  88. package/dist/internal/auth.d.ts +53 -0
  89. package/dist/internal/auth.d.ts.map +1 -0
  90. package/dist/internal/auth.js +180 -0
  91. package/dist/internal/events.d.ts +11 -0
  92. package/dist/internal/events.d.ts.map +1 -0
  93. package/dist/internal/events.js +49 -0
  94. package/dist/internal/health.d.ts.map +1 -0
  95. package/dist/internal/health.js +5 -0
  96. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
  97. package/dist/layerUtils.d.ts.map +1 -0
  98. package/dist/layerUtils.js +17 -0
  99. package/dist/logger/jsonLogger.d.ts +1 -1
  100. package/dist/logger/jsonLogger.d.ts.map +1 -1
  101. package/dist/logger/jsonLogger.js +5 -3
  102. package/dist/logger/logFmtLogger.d.ts +1 -1
  103. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  104. package/dist/logger/logFmtLogger.js +3 -3
  105. package/dist/logger/shared.d.ts +2 -2
  106. package/dist/logger/shared.d.ts.map +1 -1
  107. package/dist/logger/shared.js +5 -5
  108. package/dist/logger.d.ts.map +1 -1
  109. package/dist/middlewares.d.ts.map +1 -0
  110. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  111. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
  112. package/dist/mongo-client.d.ts.map +1 -0
  113. package/dist/mongo-client.js +15 -0
  114. package/dist/otel.d.ts +75 -0
  115. package/dist/otel.d.ts.map +1 -0
  116. package/dist/otel.js +84 -0
  117. package/dist/rateLimit.d.ts +11 -3
  118. package/dist/rateLimit.d.ts.map +1 -1
  119. package/dist/rateLimit.js +7 -12
  120. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
  121. package/dist/redis-client.d.ts.map +1 -0
  122. package/dist/redis-client.js +98 -0
  123. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  124. package/dist/reportError.d.ts.map +1 -0
  125. package/dist/reportError.js +28 -0
  126. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
  127. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  128. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  129. package/dist/routing/middleware/middleware.d.ts +48 -0
  130. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  131. package/dist/routing/middleware/middleware.js +152 -0
  132. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  133. package/dist/routing/middleware.d.ts.map +1 -0
  134. package/dist/{api/routing → routing}/middleware.js +1 -2
  135. package/dist/routing/schema/jwt.d.ts.map +1 -0
  136. package/dist/routing/schema/jwt.js +13 -0
  137. package/dist/routing/tsort.d.ts.map +1 -0
  138. package/dist/routing/tsort.js +51 -0
  139. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  140. package/dist/routing/utils.d.ts.map +1 -0
  141. package/dist/routing/utils.js +45 -0
  142. package/dist/routing.d.ts +182 -0
  143. package/dist/routing.d.ts.map +1 -0
  144. package/dist/routing.js +256 -0
  145. package/dist/test.d.ts +2 -2
  146. package/dist/test.d.ts.map +1 -1
  147. package/dist/test.js +2 -2
  148. package/dist/util.d.ts.map +1 -0
  149. package/dist/util.js +14 -0
  150. package/docs/cluster-storage.md +26 -0
  151. package/docs/workflow-engine.md +262 -0
  152. package/examples/query.ts +47 -39
  153. package/package.json +38 -352
  154. package/src/CUPS.ts +53 -14
  155. package/src/ClusterCosmos.ts +1118 -0
  156. package/src/ClusterServiceBus.ts +242 -0
  157. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  158. package/src/Emailer/Sendgrid.ts +83 -60
  159. package/src/Emailer/fake.ts +4 -4
  160. package/src/MainFiberSet.ts +32 -13
  161. package/src/QueueMaker/errors.ts +3 -1
  162. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  163. package/src/SQL.ts +1 -0
  164. package/src/Store/Cosmos/query.ts +218 -54
  165. package/src/Store/Cosmos.ts +529 -365
  166. package/src/Store/Disk.ts +112 -70
  167. package/src/Store/Memory.ts +365 -99
  168. package/src/Store/SQL/Pg.ts +389 -0
  169. package/src/Store/SQL/query.ts +603 -0
  170. package/src/Store/SQL.ts +766 -0
  171. package/src/Store/codeFilter.ts +8 -6
  172. package/src/Store/index.ts +25 -10
  173. package/src/Store/utils.ts +32 -25
  174. package/src/WorkflowEngineCosmos.ts +749 -0
  175. package/src/WorkflowEngineSqlite.ts +813 -0
  176. package/src/arbs.ts +5 -3
  177. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  178. package/src/errorReporter.ts +68 -78
  179. package/src/fileUtil.ts +1 -1
  180. package/src/index.ts +2 -1
  181. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  182. package/src/internal/auth.ts +272 -0
  183. package/src/{api/internal → internal}/events.ts +22 -13
  184. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  185. package/src/logger/jsonLogger.ts +5 -3
  186. package/src/logger/logFmtLogger.ts +3 -3
  187. package/src/logger/shared.ts +5 -4
  188. package/src/middlewares.ts +10 -0
  189. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  190. package/src/otel.ts +177 -0
  191. package/src/rateLimit.ts +34 -23
  192. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  193. package/src/{api/reportError.ts → reportError.ts} +3 -2
  194. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  195. package/src/routing/middleware/middleware.ts +196 -0
  196. package/src/routing/middleware.ts +4 -0
  197. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  198. package/src/{api/routing → routing}/utils.ts +2 -1
  199. package/src/routing.ts +823 -0
  200. package/src/test.ts +4 -4
  201. package/src/vitest.ts +1 -1
  202. package/test/auth.test.ts +101 -0
  203. package/test/cluster-cosmos.test.ts +612 -0
  204. package/test/cluster-servicebus.test.ts +180 -0
  205. package/test/cluster-sqlite.test.ts +205 -0
  206. package/test/contextProvider.test.ts +15 -12
  207. package/test/controller.test.ts +28 -32
  208. package/test/cosmos-query.test.ts +228 -0
  209. package/test/dist/auth.test.d.ts.map +1 -0
  210. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  211. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  212. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  213. package/test/dist/contextProvider.test.d.ts.map +1 -1
  214. package/test/dist/controller.test.d.ts.map +1 -1
  215. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  216. package/test/dist/fixtures.d.ts +29 -11
  217. package/test/dist/fixtures.d.ts.map +1 -1
  218. package/test/dist/fixtures.js +17 -10
  219. package/test/dist/query.test.d.ts.map +1 -1
  220. package/test/dist/rawQuery.test.d.ts.map +1 -1
  221. package/test/dist/repository-ext.test.d.ts.map +1 -0
  222. package/test/dist/requires.test.d.ts.map +1 -1
  223. package/test/dist/router-generator.test.d.ts.map +1 -0
  224. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  225. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  226. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  227. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  228. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  229. package/test/dist/sql-store.test.d.ts.map +1 -0
  230. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  231. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  232. package/test/fixtures.ts +16 -9
  233. package/test/layerUtils.test.ts +2 -2
  234. package/test/query.test.ts +1130 -41
  235. package/test/rawQuery.test.ts +340 -22
  236. package/test/repository-ext.test.ts +426 -0
  237. package/test/requires.test.ts +10 -5
  238. package/test/router-generator.test.ts +187 -0
  239. package/test/routing-interruptibility.test.ts +66 -0
  240. package/test/rpc-context-map-streaming.test.ts +262 -0
  241. package/test/rpc-e2e-invalidation.test.ts +418 -0
  242. package/test/rpc-multi-middleware.test.ts +85 -10
  243. package/test/rpc-stream-fullstack.test.ts +304 -0
  244. package/test/sql-store.test.ts +1711 -0
  245. package/test/validateSample.test.ts +26 -14
  246. package/test/workflow-engine-cosmos.test.ts +345 -0
  247. package/test/workflow-engine-sqlite.test.ts +297 -0
  248. package/tsconfig.examples.json +1 -1
  249. package/tsconfig.json +9 -2
  250. package/tsconfig.src.json +35 -35
  251. package/tsconfig.test.json +2 -2
  252. package/dist/Emailer/service.d.ts +0 -55
  253. package/dist/Emailer/service.d.ts.map +0 -1
  254. package/dist/Emailer/service.js +0 -6
  255. package/dist/Emailer.d.ts +0 -2
  256. package/dist/Emailer.d.ts.map +0 -1
  257. package/dist/Emailer.js +0 -2
  258. package/dist/Model/Repository/ext.d.ts +0 -41
  259. package/dist/Model/Repository/ext.d.ts.map +0 -1
  260. package/dist/Model/Repository/ext.js +0 -65
  261. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  262. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  263. package/dist/Model/Repository/internal/internal.js +0 -316
  264. package/dist/Model/Repository/legacy.d.ts +0 -19
  265. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  266. package/dist/Model/Repository/legacy.js +0 -2
  267. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  268. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  269. package/dist/Model/Repository/makeRepo.js +0 -24
  270. package/dist/Model/Repository/service.d.ts +0 -89
  271. package/dist/Model/Repository/service.d.ts.map +0 -1
  272. package/dist/Model/Repository/service.js +0 -2
  273. package/dist/Model/Repository/validation.d.ts +0 -42
  274. package/dist/Model/Repository/validation.d.ts.map +0 -1
  275. package/dist/Model/Repository/validation.js +0 -32
  276. package/dist/Model/Repository.d.ts +0 -6
  277. package/dist/Model/Repository.d.ts.map +0 -1
  278. package/dist/Model/Repository.js +0 -6
  279. package/dist/Model/dsl.d.ts +0 -32
  280. package/dist/Model/dsl.d.ts.map +0 -1
  281. package/dist/Model/dsl.js +0 -44
  282. package/dist/Model/filter/filterApi.d.ts +0 -30
  283. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  284. package/dist/Model/filter/filterApi.js +0 -2
  285. package/dist/Model/filter/types/errors.d.ts +0 -29
  286. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  287. package/dist/Model/filter/types/errors.js +0 -2
  288. package/dist/Model/filter/types/fields.d.ts +0 -15
  289. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  290. package/dist/Model/filter/types/fields.js +0 -2
  291. package/dist/Model/filter/types/path/common.d.ts +0 -316
  292. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  293. package/dist/Model/filter/types/path/common.js +0 -2
  294. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  295. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  296. package/dist/Model/filter/types/path/eager.js +0 -31
  297. package/dist/Model/filter/types/path/index.d.ts +0 -4
  298. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  299. package/dist/Model/filter/types/path/index.js +0 -3
  300. package/dist/Model/filter/types/utils.d.ts +0 -79
  301. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  302. package/dist/Model/filter/types/utils.js +0 -2
  303. package/dist/Model/filter/types/validator.d.ts +0 -30
  304. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  305. package/dist/Model/filter/types/validator.js +0 -2
  306. package/dist/Model/filter/types.d.ts +0 -5
  307. package/dist/Model/filter/types.d.ts.map +0 -1
  308. package/dist/Model/filter/types.js +0 -7
  309. package/dist/Model/query/dsl.d.ts +0 -248
  310. package/dist/Model/query/dsl.d.ts.map +0 -1
  311. package/dist/Model/query/dsl.js +0 -104
  312. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  313. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  314. package/dist/Model/query/new-kid-interpreter.js +0 -165
  315. package/dist/Model/query.d.ts +0 -15
  316. package/dist/Model/query.d.ts.map +0 -1
  317. package/dist/Model/query.js +0 -3
  318. package/dist/Model.d.ts +0 -4
  319. package/dist/Model.d.ts.map +0 -1
  320. package/dist/Model.js +0 -4
  321. package/dist/Operations.d.ts +0 -55
  322. package/dist/Operations.d.ts.map +0 -1
  323. package/dist/Operations.js +0 -102
  324. package/dist/OperationsRepo.d.ts +0 -41
  325. package/dist/OperationsRepo.d.ts.map +0 -1
  326. package/dist/OperationsRepo.js +0 -14
  327. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  328. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  329. package/dist/QueueMaker/SQLQueue.js +0 -130
  330. package/dist/QueueMaker/memQueue.d.ts +0 -11
  331. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  332. package/dist/QueueMaker/memQueue.js +0 -76
  333. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  334. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  335. package/dist/QueueMaker/sbqueue.js +0 -91
  336. package/dist/QueueMaker/service.d.ts +0 -11
  337. package/dist/QueueMaker/service.d.ts.map +0 -1
  338. package/dist/QueueMaker/service.js +0 -4
  339. package/dist/RequestContext.d.ts +0 -63
  340. package/dist/RequestContext.d.ts.map +0 -1
  341. package/dist/RequestContext.js +0 -49
  342. package/dist/RequestFiberSet.d.ts +0 -36
  343. package/dist/RequestFiberSet.d.ts.map +0 -1
  344. package/dist/RequestFiberSet.js +0 -78
  345. package/dist/Store/ContextMapContainer.d.ts +0 -14
  346. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  347. package/dist/Store/ContextMapContainer.js +0 -16
  348. package/dist/Store/service.d.ts +0 -108
  349. package/dist/Store/service.d.ts.map +0 -1
  350. package/dist/Store/service.js +0 -71
  351. package/dist/Store.d.ts +0 -2
  352. package/dist/Store.d.ts.map +0 -1
  353. package/dist/Store.js +0 -2
  354. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  355. package/dist/adapters/SQL/Model.js +0 -478
  356. package/dist/adapters/SQL.d.ts.map +0 -1
  357. package/dist/adapters/ServiceBus.d.ts +0 -58
  358. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  359. package/dist/adapters/ServiceBus.js +0 -99
  360. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  361. package/dist/adapters/cosmos-client.js +0 -9
  362. package/dist/adapters/index.d.ts +0 -2
  363. package/dist/adapters/index.d.ts.map +0 -1
  364. package/dist/adapters/index.js +0 -2
  365. package/dist/adapters/logger.d.ts +0 -9
  366. package/dist/adapters/logger.d.ts.map +0 -1
  367. package/dist/adapters/logger.js +0 -3
  368. package/dist/adapters/memQueue.d.ts +0 -13
  369. package/dist/adapters/memQueue.d.ts.map +0 -1
  370. package/dist/adapters/memQueue.js +0 -20
  371. package/dist/adapters/mongo-client.d.ts.map +0 -1
  372. package/dist/adapters/mongo-client.js +0 -13
  373. package/dist/adapters/redis-client.d.ts.map +0 -1
  374. package/dist/adapters/redis-client.js +0 -94
  375. package/dist/api/ContextProvider.d.ts +0 -31
  376. package/dist/api/ContextProvider.d.ts.map +0 -1
  377. package/dist/api/ContextProvider.js +0 -38
  378. package/dist/api/codec.d.ts.map +0 -1
  379. package/dist/api/codec.js +0 -5
  380. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  381. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  382. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  383. package/dist/api/internal/auth.d.ts +0 -15
  384. package/dist/api/internal/auth.d.ts.map +0 -1
  385. package/dist/api/internal/auth.js +0 -47
  386. package/dist/api/internal/events.d.ts +0 -9
  387. package/dist/api/internal/events.d.ts.map +0 -1
  388. package/dist/api/internal/events.js +0 -42
  389. package/dist/api/internal/health.d.ts.map +0 -1
  390. package/dist/api/internal/health.js +0 -5
  391. package/dist/api/layerUtils.d.ts.map +0 -1
  392. package/dist/api/layerUtils.js +0 -16
  393. package/dist/api/middlewares.d.ts.map +0 -1
  394. package/dist/api/reportError.d.ts.map +0 -1
  395. package/dist/api/reportError.js +0 -27
  396. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  397. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  398. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  399. package/dist/api/routing/middleware/middleware.js +0 -92
  400. package/dist/api/routing/middleware.d.ts.map +0 -1
  401. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  402. package/dist/api/routing/schema/jwt.js +0 -12
  403. package/dist/api/routing/tsort.d.ts.map +0 -1
  404. package/dist/api/routing/tsort.js +0 -51
  405. package/dist/api/routing/utils.d.ts.map +0 -1
  406. package/dist/api/routing/utils.js +0 -44
  407. package/dist/api/routing.d.ts +0 -138
  408. package/dist/api/routing.d.ts.map +0 -1
  409. package/dist/api/routing.js +0 -166
  410. package/dist/api/setupRequest.d.ts +0 -12
  411. package/dist/api/setupRequest.d.ts.map +0 -1
  412. package/dist/api/setupRequest.js +0 -44
  413. package/dist/api/util.d.ts.map +0 -1
  414. package/dist/api/util.js +0 -14
  415. package/eslint.config.mjs +0 -24
  416. package/src/Emailer/service.ts +0 -52
  417. package/src/Emailer.ts +0 -1
  418. package/src/Model/Repository/ext.ts +0 -283
  419. package/src/Model/Repository/internal/internal.ts +0 -577
  420. package/src/Model/Repository/legacy.ts +0 -27
  421. package/src/Model/Repository/makeRepo.ts +0 -139
  422. package/src/Model/Repository/service.ts +0 -627
  423. package/src/Model/Repository/validation.ts +0 -31
  424. package/src/Model/Repository.ts +0 -5
  425. package/src/Model/dsl.ts +0 -128
  426. package/src/Model/filter/filterApi.ts +0 -60
  427. package/src/Model/filter/types/errors.ts +0 -47
  428. package/src/Model/filter/types/fields.ts +0 -50
  429. package/src/Model/filter/types/path/common.ts +0 -404
  430. package/src/Model/filter/types/path/eager.ts +0 -298
  431. package/src/Model/filter/types/path/index.ts +0 -4
  432. package/src/Model/filter/types/utils.ts +0 -128
  433. package/src/Model/filter/types/validator.ts +0 -46
  434. package/src/Model/filter/types.ts +0 -6
  435. package/src/Model/query/dsl.ts +0 -2110
  436. package/src/Model/query/new-kid-interpreter.ts +0 -210
  437. package/src/Model/query.ts +0 -13
  438. package/src/Model.ts +0 -3
  439. package/src/Operations.ts +0 -235
  440. package/src/OperationsRepo.ts +0 -16
  441. package/src/QueueMaker/SQLQueue.ts +0 -189
  442. package/src/QueueMaker/memQueue.ts +0 -130
  443. package/src/QueueMaker/sbqueue.ts +0 -137
  444. package/src/QueueMaker/service.ts +0 -17
  445. package/src/RequestContext.ts +0 -63
  446. package/src/RequestFiberSet.ts +0 -105
  447. package/src/Store/ContextMapContainer.ts +0 -20
  448. package/src/Store/index.test.ts.bak +0 -112
  449. package/src/Store/service.ts +0 -184
  450. package/src/Store.ts +0 -1
  451. package/src/adapters/SQL.ts +0 -1
  452. package/src/adapters/ServiceBus.ts +0 -209
  453. package/src/adapters/index.ts +0 -0
  454. package/src/adapters/logger.ts +0 -3
  455. package/src/adapters/memQueue.ts +0 -21
  456. package/src/api/internal/auth.ts +0 -68
  457. package/src/api/middlewares.ts +0 -10
  458. package/src/api/routing/middleware/middleware.ts +0 -128
  459. package/src/api/routing/middleware.ts +0 -6
  460. package/src/api/routing.ts +0 -598
  461. package/src/api/setupRequest.ts +0 -84
  462. package/tsconfig.json.bak +0 -12
  463. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  464. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  465. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  466. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  467. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  468. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  469. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  470. /package/src/{api/codec.ts → codec.ts} +0 -0
  471. /package/src/{api/internal → internal}/health.ts +0 -0
  472. /package/src/{api/routing → routing}/tsort.ts +0 -0
  473. /package/src/{api/util.ts → util.ts} +0 -0
@@ -24,6 +24,7 @@ import * as VariantSchema from "effect/unstable/schema/VariantSchema"
24
24
  import { SqlClient } from "effect/unstable/sql/SqlClient"
25
25
  import * as SqlResolver from "effect/unstable/sql/SqlResolver"
26
26
  import * as SqlSchema from "effect/unstable/sql/SqlSchema"
27
+ import { type DbSystem, withDbSpan } from "../otel.ts"
27
28
 
28
29
  const {
29
30
  Class,
@@ -73,7 +74,7 @@ export {
73
74
  * @since 1.0.0
74
75
  * @category constructors
75
76
  * @example
76
- * import { Schema } from "effect"
77
+ * import * as Schema from "effect/Schema"
77
78
  * import { Model } from "effect/unstable/schema"
78
79
  *
79
80
  * export const GroupId = Schema.Number.pipe(Schema.brand("GroupId"))
@@ -545,9 +546,15 @@ export const DateTimeUpdateFromNumber: DateTimeUpdateFromNumber = Field({
545
546
  */
546
547
  export interface JsonFromString<S extends Schema.Top> extends
547
548
  VariantSchema.Field<{
548
- readonly select: Schema.fromJsonString<S>
549
- readonly insert: Schema.fromJsonString<S>
550
- readonly update: Schema.fromJsonString<S>
549
+ readonly select: Schema.fromJsonString<
550
+ Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
551
+ >
552
+ readonly insert: Schema.fromJsonString<
553
+ Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
554
+ >
555
+ readonly update: Schema.fromJsonString<
556
+ Schema.Codec<S["Type"], Schema.Json, S["DecodingServices"], S["EncodingServices"]>
557
+ >
551
558
  readonly json: S
552
559
  readonly jsonCreate: S
553
560
  readonly jsonUpdate: S
@@ -565,7 +572,7 @@ export interface JsonFromString<S extends Schema.Top> extends
565
572
  export const JsonFromString = <S extends Schema.Top>(
566
573
  schema: S
567
574
  ): JsonFromString<S> => {
568
- const parsed = Schema.fromJsonString(schema)
575
+ const parsed = Schema.fromJsonString(Schema.toCodecJson(schema))
569
576
  return Field({
570
577
  select: parsed,
571
578
  insert: parsed,
@@ -590,6 +597,7 @@ export const makeRepository = <
590
597
  readonly spanPrefix: string
591
598
  readonly idColumn: Id
592
599
  readonly versionColumn?: string | undefined
600
+ readonly dbSystem?: DbSystem | undefined
593
601
  }): Effect.Effect<
594
602
  {
595
603
  readonly insert: (
@@ -623,6 +631,15 @@ export const makeRepository = <
623
631
  const idSchema = Model.fields[options.idColumn] as Schema.Top
624
632
  const idColumn = options.idColumn as string
625
633
  const versionColumn = options.versionColumn
634
+ const system: DbSystem = options.dbSystem ?? "other_sql"
635
+ const opSpan = (operation: string, idValue?: unknown) =>
636
+ withDbSpan({
637
+ operation,
638
+ system,
639
+ collection: options.tableName,
640
+ entity: options.spanPrefix,
641
+ ...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
642
+ })
626
643
 
627
644
  const insertSchema = SqlSchema.findOne({
628
645
  Request: Model.insert,
@@ -644,9 +661,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
644
661
  ): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["insert"]["EncodingServices"]> =>
645
662
  insertSchema(insert).pipe(
646
663
  Effect.catchTag("NoSuchElementError", Effect.die),
647
- Effect.withSpan(`${options.spanPrefix}.insert`, {}, {
648
- captureStackTrace: false
649
- })
664
+ opSpan("insert")
650
665
  ) as any
651
666
 
652
667
  const insertVoidSchema = SqlSchema.void({
@@ -657,9 +672,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
657
672
  insert: S["insert"]["Type"]
658
673
  ): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
659
674
  insertVoidSchema(insert).pipe(
660
- Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {
661
- captureStackTrace: false
662
- })
675
+ opSpan("insertVoid")
663
676
  ) as any
664
677
 
665
678
  const updateSchema = SqlSchema.findOne({
@@ -706,11 +719,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
706
719
  ): Effect.Effect<S["Type"], Schema.SchemaError, S["DecodingServices"] | S["update"]["EncodingServices"]> =>
707
720
  updateSchema(update).pipe(
708
721
  Effect.catchTag("NoSuchElementError", Effect.die),
709
- Effect.withSpan(`${options.spanPrefix}.update`, {
710
- attributes: { id: (update as any)[idColumn] }
711
- }, {
712
- captureStackTrace: false
713
- })
722
+ opSpan("update", (update as any)[idColumn])
714
723
  ) as any
715
724
 
716
725
  const updateVoidSchema = SqlSchema.void({
@@ -729,11 +738,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
729
738
  update: S["update"]["Type"]
730
739
  ): Effect.Effect<void, Schema.SchemaError, S["update"]["EncodingServices"]> =>
731
740
  updateVoidSchema(update).pipe(
732
- Effect.withSpan(`${options.spanPrefix}.updateVoid`, {
733
- attributes: { id: (update as any)[idColumn] }
734
- }, {
735
- captureStackTrace: false
736
- })
741
+ opSpan("updateVoid", (update as any)[idColumn])
737
742
  ) as any
738
743
 
739
744
  const findByIdSchema = SqlSchema.findOneOption({
@@ -749,9 +754,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
749
754
  S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
750
755
  > =>
751
756
  findByIdSchema(id).pipe(
752
- Effect.withSpan(`${options.spanPrefix}.findById`, { attributes: { id } }, {
753
- captureStackTrace: false
754
- })
757
+ opSpan("findById", id)
755
758
  ) as any
756
759
 
757
760
  const deleteSchema = SqlSchema.void({
@@ -762,11 +765,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
762
765
  id: S["fields"][Id]["Type"]
763
766
  ): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
764
767
  deleteSchema(id).pipe(
765
- Effect.withSpan(`${options.spanPrefix}.delete`, {
766
- attributes: { id }
767
- }, {
768
- captureStackTrace: false
769
- })
768
+ opSpan("delete", id)
770
769
  ) as any
771
770
 
772
771
  return { insert, insertVoid, update, updateVoid, findById, delete: delete_ } as const
@@ -789,6 +788,7 @@ export const makeDataLoaders = <
789
788
  readonly idColumn: Id
790
789
  readonly window: Input
791
790
  readonly maxBatchSize?: number | undefined
791
+ readonly dbSystem?: DbSystem | undefined
792
792
  }
793
793
  ): Effect.Effect<
794
794
  {
@@ -821,6 +821,15 @@ export const makeDataLoaders = <
821
821
  const idSchema = Model.fields[options.idColumn] as Schema.Top
822
822
  const idColumn = options.idColumn as string
823
823
  const setMaxBatchSize = options.maxBatchSize ? RequestResolver.batchN(options.maxBatchSize) : identity
824
+ const system: DbSystem = options.dbSystem ?? "other_sql"
825
+ const opSpan = (operation: string, idValue?: unknown) =>
826
+ withDbSpan({
827
+ operation,
828
+ system,
829
+ collection: options.tableName,
830
+ entity: options.spanPrefix,
831
+ ...(idValue !== undefined && { extra: { "app.entity.id": idValue } })
832
+ })
824
833
 
825
834
  const insertResolver = SqlResolver
826
835
  .ordered({
@@ -854,9 +863,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
854
863
  > =>
855
864
  insertExecute(insert).pipe(
856
865
  Effect.catchTag("ResultLengthMismatch", Effect.die),
857
- Effect.withSpan(`${options.spanPrefix}.insert`, {}, {
858
- captureStackTrace: false
859
- })
866
+ opSpan("insert")
860
867
  ) as any
861
868
 
862
869
  const insertVoidResolver = SqlResolver
@@ -874,9 +881,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
874
881
  insert: S["insert"]["Type"]
875
882
  ): Effect.Effect<void, Schema.SchemaError, S["insert"]["EncodingServices"]> =>
876
883
  insertVoidExecute(insert).pipe(
877
- Effect.withSpan(`${options.spanPrefix}.insertVoid`, {}, {
878
- captureStackTrace: false
879
- })
884
+ opSpan("insertVoid")
880
885
  ) as any
881
886
 
882
887
  const findByIdResolver = SqlResolver
@@ -902,9 +907,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
902
907
  S["DecodingServices"] | S["fields"][Id]["EncodingServices"]
903
908
  > =>
904
909
  findByIdExecute(id).pipe(
905
- Effect.withSpan(`${options.spanPrefix}.findById`, { attributes: { id } }, {
906
- captureStackTrace: false
907
- })
910
+ opSpan("findById", id)
908
911
  ) as any
909
912
 
910
913
  const deleteResolver = SqlResolver
@@ -922,9 +925,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
922
925
  id: S["fields"][Id]["Type"]
923
926
  ): Effect.Effect<void, Schema.SchemaError, S["fields"][Id]["EncodingServices"]> =>
924
927
  deleteExecute(id).pipe(
925
- Effect.withSpan(`${options.spanPrefix}.delete`, { attributes: { id } }, {
926
- captureStackTrace: false
927
- })
928
+ opSpan("delete", id)
928
929
  ) as any
929
930
 
930
931
  return { insert, insertVoid, findById, delete: delete_ } as const
package/src/SQL.ts ADDED
@@ -0,0 +1 @@
1
+ export * as SQLModel from "./SQL/Model.ts"
@@ -1,11 +1,14 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-return */
3
- import { Array, Effect, type NonEmptyReadonlyArray } from "effect-app"
3
+ import * as Array from "effect-app/Array"
4
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
5
+ import * as Effect from "effect-app/Effect"
6
+ import type { FilterR, FilterResult, Ops } from "effect-app/Model/filter/filterApi"
7
+ import type { AggregateIrExpression, ComputedProjectionIrExpression, ComputedProjectionMathIrExpression } from "effect-app/Model/query"
8
+ import type { SupportedValues } from "effect-app/Store"
4
9
  import { assertUnreachable } from "effect-app/utils"
5
- import { InfraLogger } from "../../logger.js"
6
- import type { FilterR, FilterResult, Ops } from "../../Model/filter/filterApi.js"
7
- import { isRelationCheck } from "../codeFilter.js"
8
- import type { SupportedValues } from "../service.js"
10
+ import { InfraLogger } from "../../logger.ts"
11
+ import { isRelationCheck } from "../codeFilter.ts"
9
12
 
10
13
  export function logQuery(q: {
11
14
  query: string
@@ -40,12 +43,26 @@ export function buildWhereCosmosQuery3(
40
43
  filter: readonly FilterResult[],
41
44
  name: string,
42
45
  defaultValues: Record<string, unknown>,
43
- select?: NonEmptyReadonlyArray<string | { key: string; subKeys: readonly string[] }>,
46
+ select?: NonEmptyReadonlyArray<
47
+ string | {
48
+ key: string
49
+ subKeys: readonly string[]
50
+ } | {
51
+ key: string
52
+ computed: ComputedProjectionIrExpression
53
+ } | {
54
+ key: string
55
+ path: string
56
+ } | {
57
+ key: string
58
+ aggregate: AggregateIrExpression
59
+ }
60
+ >,
44
61
  order?: NonEmptyReadonlyArray<{ key: string; direction: "ASC" | "DESC" }>,
45
62
  skip?: number,
46
63
  limit?: number
47
64
  ) {
48
- const statement = (x: FilterR, i: number, values: any[]) => {
65
+ const statement = (x: FilterR, i: number) => {
49
66
  if (x.path === idKey) {
50
67
  x = { ...x, path: "id" }
51
68
  }
@@ -60,8 +77,6 @@ export function buildWhereCosmosQuery3(
60
77
 
61
78
  const v = "@v" + i
62
79
 
63
- const realValue = values[i]
64
-
65
80
  switch (x.op) {
66
81
  case "in":
67
82
  return `ARRAY_CONTAINS(${v}, ${k})`
@@ -74,14 +89,22 @@ export function buildWhereCosmosQuery3(
74
89
  return `(NOT ARRAY_CONTAINS(${k}, ${v}))`
75
90
 
76
91
  case "includes-any":
77
- return `ARRAY_CONTAINS_ANY(${k}, ${(realValue as any[]).map((_, i) => `${v}__${i}`).join(", ")})`
92
+ return `ARRAY_CONTAINS_ANY(${k}, ${
93
+ (x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
94
+ })`
78
95
  case "notIncludes-any":
79
- return `(NOT ARRAY_CONTAINS_ANY(${k}, ${(realValue as any[]).map((_, i) => `${v}__${i}`).join(", ")}))`
96
+ return `(NOT ARRAY_CONTAINS_ANY(${k}, ${
97
+ (x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
98
+ }))`
80
99
 
81
100
  case "includes-all":
82
- return `ARRAY_CONTAINS_ALL(${k}, ${(realValue as any[]).map((_, i) => `${v}__${i}`).join(", ")})`
101
+ return `ARRAY_CONTAINS_ALL(${k}, ${
102
+ (x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
103
+ })`
83
104
  case "notIncludes-all":
84
- return `(NOT ARRAY_CONTAINS_ALL(${k}, ${(realValue as any[]).map((_, i) => `${v}__${i}`).join(", ")}))`
105
+ return `(NOT ARRAY_CONTAINS_ALL(${k}, ${
106
+ (x.value as unknown as readonly unknown[]).map((_, i) => `${v}__${i}`).join(", ")
107
+ }))`
85
108
 
86
109
  case "contains":
87
110
  return `CONTAINS(${k}, ${v}, true)`
@@ -165,7 +188,7 @@ export function buildWhereCosmosQuery3(
165
188
  : _
166
189
  : _
167
190
 
168
- const print = (state: readonly FilterResult[], values: any[], isRelation: string | null, every: boolean) => {
191
+ const print = (state: readonly FilterResult[], isRelation: string | null, every: boolean) => {
169
192
  let s = ""
170
193
  let l = 0
171
194
  const printN = (n: number) => {
@@ -174,13 +197,13 @@ export function buildWhereCosmosQuery3(
174
197
  for (const e of state) {
175
198
  switch (e.t) {
176
199
  case "where":
177
- s += statement(e, i++, values)
200
+ s += statement(e, i++)
178
201
  break
179
202
  case "or":
180
- s += ` OR ${statement(e, i++, values)}`
203
+ s += ` OR ${statement(e, i++)}`
181
204
  break
182
205
  case "and":
183
- s += ` AND ${statement(e, i++, values)}`
206
+ s += ` AND ${statement(e, i++)}`
184
207
  break
185
208
  case "or-scope": {
186
209
  ++l
@@ -189,7 +212,7 @@ export function buildWhereCosmosQuery3(
189
212
  if (rel) {
190
213
  const rel = (e.result[0]! as { path: string }).path.split(".-1.")[0]
191
214
  s += isRelation
192
- ? ` OR (\n${printN(l + 1)}${print(e.result, values, rel, every)}\n${printN(l)})`
215
+ ? ` OR (\n${printN(l + 1)}${print(e.result, rel, every)}\n${printN(l)})`
193
216
  : ` OR (\n${printN(l + 1)}${
194
217
  every ? "NOT " : ""
195
218
  }EXISTS(SELECT VALUE ${rel} FROM ${rel} IN f.${rel} WHERE ${
@@ -197,13 +220,12 @@ export function buildWhereCosmosQuery3(
197
220
  e
198
221
  .result
199
222
  .map(flip(every)),
200
- values,
201
223
  rel,
202
224
  every
203
225
  )
204
226
  }))`
205
227
  } else {
206
- s += ` OR (\n${printN(l + 1)}${print(e.result, values, null, every)}\n${printN(l)})`
228
+ s += ` OR (\n${printN(l + 1)}${print(e.result, null, every)}\n${printN(l)})`
207
229
  }
208
230
  --l
209
231
  break
@@ -215,14 +237,14 @@ export function buildWhereCosmosQuery3(
215
237
  if (rel) {
216
238
  const rel = (e.result[0]! as { path: string }).path.split(".-1.")[0]
217
239
  s += isRelation
218
- ? ` AND (\n${printN(l + 1)}${print(e.result, values, rel, every)}\n${printN(l)})`
240
+ ? ` AND (\n${printN(l + 1)}${print(e.result, rel, every)}\n${printN(l)})`
219
241
  : ` AND (\n${printN(l + 1)}${
220
242
  every ? "NOT " : ""
221
243
  }EXISTS(SELECT VALUE ${rel} FROM ${rel} IN f.${rel} WHERE ${
222
- print(e.result.map(flip(every)), values, rel, every)
244
+ print(e.result.map(flip(every)), rel, every)
223
245
  }))`
224
246
  } else {
225
- s += ` AND (\n${printN(l + 1)}${print(e.result, values, null, every)}\n${printN(l)})`
247
+ s += ` AND (\n${printN(l + 1)}${print(e.result, null, every)}\n${printN(l)})`
226
248
  }
227
249
  --l
228
250
  break
@@ -234,12 +256,12 @@ export function buildWhereCosmosQuery3(
234
256
  if (rel) {
235
257
  const rel = (e.result[0]! as { path: string }).path.split(".-1.")[0]
236
258
  s += isRelation
237
- ? `(\n${printN(l + 1)}${print(e.result, values, rel, every)}\n${printN(l)})`
259
+ ? `(\n${printN(l + 1)}${print(e.result, rel, every)}\n${printN(l)})`
238
260
  : `(\n${printN(l + 1)}${every ? "NOT " : ""}EXISTS(SELECT VALUE ${rel} FROM ${rel} IN f.${rel} WHERE ${
239
- print(e.result.map(flip(every)), values, rel, every)
261
+ print(e.result.map(flip(every)), rel, every)
240
262
  }))`
241
263
  } else {
242
- s += `(\n${printN(l + 1)}${print(e.result, values, null, every)}\n${printN(l)})`
264
+ s += `(\n${printN(l + 1)}${print(e.result, null, every)}\n${printN(l)})`
243
265
  }
244
266
  // ;--l
245
267
  break
@@ -272,40 +294,182 @@ export function buildWhereCosmosQuery3(
272
294
  ? getValues(_.result)
273
295
  : [_]
274
296
  )
275
- const values = getValues(filter)
297
+ const computedFilters = select
298
+ ? select.flatMap((_) =>
299
+ typeof _ === "object" && "computed" in _ && "filter" in _.computed ? getValues(_.computed.filter) : []
300
+ )
301
+ : []
302
+ const aggregateFilters = select
303
+ ? select.flatMap((_) =>
304
+ typeof _ === "object" && "aggregate" in _ && "filter" in _.aggregate ? getValues(_.aggregate.filter) : []
305
+ )
306
+ : []
307
+ const values = [...computedFilters, ...aggregateFilters, ...getValues(filter)]
308
+
309
+ const hasAggregates = select
310
+ ? select.some((s) => typeof s === "object" && s !== null && "aggregate" in s)
311
+ : false
312
+
313
+ const aggregateSelectExpr = (key: string, agg: AggregateIrExpression): string => {
314
+ switch (agg._tag) {
315
+ case "agg-count":
316
+ return `COUNT(1) AS ${key}`
317
+ case "agg-count-when": {
318
+ if (agg.filter.length === 0) return `COUNT(1) AS ${key}`
319
+ const cond = print(agg.filter, null, false)
320
+ // Cosmos supports SUM(IIF(cond, 1, 0)) as a conditional count
321
+ return `SUM(IIF(${cond}, 1, 0)) AS ${key}`
322
+ }
323
+ case "agg-sum": {
324
+ const fieldRef = dottedToAccess(`f.${agg.field}`)
325
+ return `SUM(${fieldRef}) AS ${key}`
326
+ }
327
+ case "agg-min": {
328
+ const fieldRef = dottedToAccess(`f.${agg.field}`)
329
+ return `MIN(${fieldRef}) AS ${key}`
330
+ }
331
+ case "agg-max": {
332
+ const fieldRef = dottedToAccess(`f.${agg.field}`)
333
+ return `MAX(${fieldRef}) AS ${key}`
334
+ }
335
+ default:
336
+ return assertUnreachable(agg)
337
+ }
338
+ }
339
+
340
+ const computedSelectExpr = (key: string, computed: ComputedProjectionIrExpression) => {
341
+ const relationPath = computed.path
342
+ const relationAlias = relationPath
343
+ const relationSource = dottedToAccess(`f.${relationPath}`)
344
+ const compileExpr = (expression: ComputedProjectionMathIrExpression): string => {
345
+ switch (expression._tag) {
346
+ case "field":
347
+ return dottedToAccess(`${relationAlias}.${expression.field}`)
348
+ case "mul":
349
+ return `(${compileExpr(expression.left)} * ${compileExpr(expression.right)})`
350
+ default:
351
+ return assertUnreachable(expression)
352
+ }
353
+ }
354
+ const factorExpr = (unitExpr: string, toBase: string, factors: Readonly<Record<string, number>>) => {
355
+ const entries = Object.entries(factors).filter(([, factor]) => Number.isFinite(factor))
356
+ return entries.reduceRight<string>(
357
+ (acc, [unit, factor]) => `IIF(${unitExpr} = ${JSON.stringify(unit)}, ${factor}, ${acc})`,
358
+ `IIF(${unitExpr} = ${JSON.stringify(toBase)}, 1, 0)`
359
+ )
360
+ }
361
+ const filter = "filter" in computed ? computed.filter : []
362
+ // Print filter once — `print` mutates the outer `i` parameter counter, so
363
+ // re-walking the same filter would double-bump it and desync @v indices.
364
+ const filterSql = filter.length > 0 ? print(filter, relationPath, false) : ""
365
+ const where = filterSql ? ` WHERE ${filterSql}` : ""
366
+ switch (computed._tag) {
367
+ case "relation-count":
368
+ return `(SELECT VALUE COUNT(1) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
369
+ case "relation-any":
370
+ return `EXISTS(SELECT VALUE ${relationAlias} FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
371
+ case "relation-every": {
372
+ // ∀x.P(x) ≡ ¬∃x.¬P(x). Cosmos has no NOT(...) on EXISTS subqueries directly,
373
+ // but we can flip via NOT EXISTS(... WHERE NOT (filter)).
374
+ if (filter.length === 0) return `true AS ${key}`
375
+ return `NOT EXISTS(SELECT VALUE ${relationAlias} FROM ${relationAlias} IN ${relationSource} WHERE NOT (${filterSql})) AS ${key}`
376
+ }
377
+ case "relation-distinct-count": {
378
+ const fieldRef = dottedToAccess(`${relationAlias}.${computed.field}`)
379
+ return `(SELECT VALUE COUNT(1) FROM (SELECT DISTINCT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where})) AS ${key}`
380
+ }
381
+ case "relation-sum": {
382
+ const fieldRef = dottedToAccess(`${relationAlias}.${computed.field}`)
383
+ return `(SELECT VALUE SUM(${fieldRef}) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
384
+ }
385
+ case "relation-sum-expr": {
386
+ const expression = compileExpr(computed.expression)
387
+ return `(SELECT VALUE SUM(${expression}) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
388
+ }
389
+ case "relation-sum-expr-by": {
390
+ const unitRef = dottedToAccess(`${relationAlias}.${computed.unit}`)
391
+ const expression = compileExpr(computed.expression)
392
+ return `ARRAY(SELECT VALUE { "unit": ${unitRef}, "total": SUM(${expression}) } FROM ${relationAlias} IN ${relationSource}${where} GROUP BY ${unitRef}) AS ${key}`
393
+ }
394
+ case "relation-sum-expr-normalized": {
395
+ const unitRef = dottedToAccess(`${relationAlias}.${computed.unit}`)
396
+ const expression = compileExpr(computed.expression)
397
+ const factor = factorExpr(unitRef, computed.toBase, computed.factors)
398
+ return `(SELECT VALUE SUM((${expression}) * (${factor})) FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
399
+ }
400
+ case "relation-collect": {
401
+ const fieldRef = dottedToAccess(`${relationAlias}.${computed.field}`)
402
+ if (computed.distinct) {
403
+ return `ARRAY(SELECT DISTINCT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
404
+ }
405
+ return `ARRAY(SELECT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where}) AS ${key}`
406
+ }
407
+ case "relation-length":
408
+ return `ARRAY_LENGTH(${relationSource}) AS ${key}`
409
+ case "relation-collect-fields": {
410
+ const subqueries = computed.fields.map((field) => {
411
+ const fieldRef = dottedToAccess(`${relationAlias}.${field}`)
412
+ return computed.distinct
413
+ ? `ARRAY(SELECT DISTINCT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where})`
414
+ : `ARRAY(SELECT VALUE ${fieldRef} FROM ${relationAlias} IN ${relationSource}${where})`
415
+ })
416
+ const combined = computed.distinct
417
+ ? subqueries.reduce((acc, sq) => `SetUnion(${acc}, ${sq})`)
418
+ : subqueries.reduce((acc, sq) => `ARRAY_CONCAT(${acc}, ${sq})`)
419
+ return `${combined} AS ${key}`
420
+ }
421
+ }
422
+ }
423
+
424
+ const buildSelectList = (): string => {
425
+ if (!select) return "f"
426
+ return select
427
+ .map((s) => {
428
+ if (typeof s === "string") {
429
+ return dottedToAccess(s === idKey ? "f.id" : `f.${s}`)
430
+ }
431
+ if ("computed" in s) return computedSelectExpr(s.key, s.computed)
432
+ if ("aggregate" in s) return aggregateSelectExpr(s.key, s.aggregate)
433
+ if ("path" in s) return `${dottedToAccess(`f.${s.path}`)} AS ${s.key}`
434
+ // subKeys
435
+ return `ARRAY (SELECT ${s.subKeys.map((_) => dottedToAccess(`t.${_}`)).join(",")}
436
+ FROM t in ${dottedToAccess(`f.${s.key}`)}) AS ${s.key}`
437
+ })
438
+ .join(", ")
439
+ }
440
+
441
+ const groupByClause = hasAggregates && select
442
+ ? (() => {
443
+ const groupByExprs = select
444
+ .filter((s): s is { key: string; path: string } =>
445
+ typeof s === "object" && s !== null && "path" in s && !("aggregate" in s)
446
+ )
447
+ .map((s) => dottedToAccess(`f.${s.path}`))
448
+ return groupByExprs.length > 0 ? `GROUP BY ${groupByExprs.join(", ")}` : ""
449
+ })()
450
+ : ""
451
+
452
+ const orderExpr = (key: string) => hasAggregates ? key : dottedToAccess(`f.${key}`)
453
+
276
454
  // with joins, you should use DISTINCT
277
455
  // or you can end up with duplicates
278
456
  return {
279
457
  query: `
280
- SELECT ${
281
- select
282
- ? `${
283
- select
284
- .map((s) =>
285
- typeof s === "string"
286
- ? dottedToAccess(s === idKey ? "f.id" : `f.${s}`) // x["y"} vs x.y, helps with reserved keywords like "value"
287
- : `ARRAY (SELECT ${s.subKeys.map((_) => dottedToAccess(`t.${_}`)).join(",")}
288
- FROM t in ${dottedToAccess(`f.${s.key}`)}) AS ${s.key}`
289
- )
290
- .join(", ")
291
- }`
292
- : "f"
293
- }
458
+ SELECT ${buildSelectList()}
294
459
  FROM ${name} f
295
460
 
296
- ${filter.length ? `WHERE (${print(filter, values.map((_) => _.value), null, false)})` : ""}
297
- ${order ? `ORDER BY ${order.map((_) => `${dottedToAccess(`f.${_.key}`)} ${_.direction}`).join(", ")}` : ""}
461
+ ${filter.length ? `WHERE (${print(filter, null, false)})` : ""}
462
+ ${groupByClause}
463
+ ${order ? `ORDER BY ${order.map((_) => `${orderExpr(_.key)} ${_.direction}`).join(", ")}` : ""}
298
464
  ${skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : ""}`,
299
- parameters: [
300
- ...values
301
- .flatMap((x, i) =>
302
- [{
303
- name: `@v${i}`,
304
- value: x.value as any
305
- }]
306
- // TODO: only for arrays that are used with _ANY or _ALL
307
- .concat(Array.isArray(x.value) ? x.value.map((_, i2) => ({ name: `@v${i}__${i2}`, value: _ as any })) : [])
308
- )
309
- ]
465
+ parameters: values
466
+ .flatMap((x, i) =>
467
+ [{
468
+ name: `@v${i}`,
469
+ value: x.value as any
470
+ }]
471
+ // TODO: only for arrays that are used with _ANY or _ALL
472
+ .concat(Array.isArray(x.value) ? x.value.map((_, i2) => ({ name: `@v${i}__${i2}`, value: _ as any })) : [])
473
+ )
310
474
  }
311
475
  }