@effect-app/infra 4.0.0-beta.33 → 4.0.0-beta.330

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 (490) hide show
  1. package/CHANGELOG.md +2555 -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 +36 -15
  6. package/dist/ClusterCosmos.d.ts +64 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +576 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +84 -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 +16 -4
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +238 -42
  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 +395 -256
  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 +93 -42
  41. package/dist/Store/Memory.d.ts +7 -10
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +349 -79
  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 +261 -0
  47. package/dist/Store/SQL/query.d.ts +53 -0
  48. package/dist/Store/SQL/query.d.ts.map +1 -0
  49. package/dist/Store/SQL/query.js +656 -0
  50. package/dist/Store/SQL.d.ts +28 -0
  51. package/dist/Store/SQL.d.ts.map +1 -0
  52. package/dist/Store/SQL.js +483 -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 +71 -22
  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/jsonDocument.d.ts +67 -0
  60. package/dist/Store/jsonDocument.d.ts.map +1 -0
  61. package/dist/Store/jsonDocument.js +107 -0
  62. package/dist/Store/utils.d.ts +21 -2
  63. package/dist/Store/utils.d.ts.map +1 -1
  64. package/dist/Store/utils.js +253 -10
  65. package/dist/WorkflowEngineCosmos.d.ts +30 -0
  66. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  67. package/dist/WorkflowEngineCosmos.js +542 -0
  68. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  69. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  70. package/dist/WorkflowEngineSqlite.js +550 -0
  71. package/dist/arbs.d.ts +6 -3
  72. package/dist/arbs.d.ts.map +1 -1
  73. package/dist/arbs.js +20 -4
  74. package/dist/codec.d.ts.map +1 -0
  75. package/dist/codec.js +5 -0
  76. package/dist/cosmos-client.d.ts +40 -0
  77. package/dist/cosmos-client.d.ts.map +1 -0
  78. package/dist/cosmos-client.js +24 -0
  79. package/dist/errorReporter.d.ts +6 -4
  80. package/dist/errorReporter.d.ts.map +1 -1
  81. package/dist/errorReporter.js +23 -27
  82. package/dist/fileUtil.d.ts +1 -1
  83. package/dist/fileUtil.d.ts.map +1 -1
  84. package/dist/fileUtil.js +2 -2
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -2
  88. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  89. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  90. package/dist/internal/RequestContextMiddleware.js +45 -0
  91. package/dist/internal/auth.d.ts +53 -0
  92. package/dist/internal/auth.d.ts.map +1 -0
  93. package/dist/internal/auth.js +180 -0
  94. package/dist/internal/events.d.ts +11 -0
  95. package/dist/internal/events.d.ts.map +1 -0
  96. package/dist/internal/events.js +49 -0
  97. package/dist/internal/health.d.ts.map +1 -0
  98. package/dist/internal/health.js +5 -0
  99. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +14 -6
  100. package/dist/layerUtils.d.ts.map +1 -0
  101. package/dist/layerUtils.js +17 -0
  102. package/dist/logger/jsonLogger.d.ts +1 -1
  103. package/dist/logger/jsonLogger.d.ts.map +1 -1
  104. package/dist/logger/jsonLogger.js +5 -3
  105. package/dist/logger/logFmtLogger.d.ts +1 -1
  106. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  107. package/dist/logger/logFmtLogger.js +3 -3
  108. package/dist/logger/shared.d.ts +2 -2
  109. package/dist/logger/shared.d.ts.map +1 -1
  110. package/dist/logger/shared.js +6 -6
  111. package/dist/logger.d.ts +4 -4
  112. package/dist/logger.d.ts.map +1 -1
  113. package/dist/middlewares.d.ts.map +1 -0
  114. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  115. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +3 -2
  116. package/dist/mongo-client.d.ts.map +1 -0
  117. package/dist/mongo-client.js +15 -0
  118. package/dist/otel.d.ts +75 -0
  119. package/dist/otel.d.ts.map +1 -0
  120. package/dist/otel.js +84 -0
  121. package/dist/rateLimit.d.ts +11 -3
  122. package/dist/rateLimit.d.ts.map +1 -1
  123. package/dist/rateLimit.js +7 -12
  124. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +5 -2
  125. package/dist/redis-client.d.ts.map +1 -0
  126. package/dist/redis-client.js +98 -0
  127. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  128. package/dist/reportError.d.ts.map +1 -0
  129. package/dist/reportError.js +28 -0
  130. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +4 -3
  131. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  132. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  133. package/dist/routing/middleware/middleware.d.ts +48 -0
  134. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  135. package/dist/routing/middleware/middleware.js +152 -0
  136. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  137. package/dist/routing/middleware.d.ts.map +1 -0
  138. package/dist/{api/routing → routing}/middleware.js +1 -2
  139. package/dist/routing/schema/jwt.d.ts.map +1 -0
  140. package/dist/routing/schema/jwt.js +12 -0
  141. package/dist/routing/tsort.d.ts.map +1 -0
  142. package/dist/routing/tsort.js +51 -0
  143. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  144. package/dist/routing/utils.d.ts.map +1 -0
  145. package/dist/routing/utils.js +45 -0
  146. package/dist/routing.d.ts +182 -0
  147. package/dist/routing.d.ts.map +1 -0
  148. package/dist/routing.js +256 -0
  149. package/dist/test.d.ts +2 -2
  150. package/dist/test.d.ts.map +1 -1
  151. package/dist/test.js +5 -5
  152. package/dist/util.d.ts.map +1 -0
  153. package/dist/util.js +14 -0
  154. package/docs/cluster-storage.md +26 -0
  155. package/docs/workflow-engine.md +262 -0
  156. package/examples/query.ts +25 -21
  157. package/package.json +38 -352
  158. package/src/CUPS.ts +54 -15
  159. package/src/ClusterCosmos.ts +1150 -0
  160. package/src/ClusterServiceBus.ts +244 -0
  161. package/src/{api/ContextProvider.ts → ContextProvider.ts} +20 -17
  162. package/src/Emailer/Sendgrid.ts +83 -60
  163. package/src/Emailer/fake.ts +4 -4
  164. package/src/MainFiberSet.ts +32 -13
  165. package/src/QueueMaker/errors.ts +3 -1
  166. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  167. package/src/SQL.ts +1 -0
  168. package/src/Store/Cosmos/query.ts +275 -55
  169. package/src/Store/Cosmos.ts +547 -366
  170. package/src/Store/Disk.ts +146 -73
  171. package/src/Store/Memory.ts +420 -115
  172. package/src/Store/SQL/Pg.ts +412 -0
  173. package/src/Store/SQL/query.ts +748 -0
  174. package/src/Store/SQL.ts +806 -0
  175. package/src/Store/codeFilter.ts +78 -28
  176. package/src/Store/index.ts +25 -10
  177. package/src/Store/jsonDocument.ts +143 -0
  178. package/src/Store/utils.ts +307 -30
  179. package/src/WorkflowEngineCosmos.ts +749 -0
  180. package/src/WorkflowEngineSqlite.ts +813 -0
  181. package/src/arbs.ts +25 -5
  182. package/src/cosmos-client.ts +56 -0
  183. package/src/errorReporter.ts +68 -78
  184. package/src/fileUtil.ts +1 -1
  185. package/src/index.ts +2 -1
  186. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  187. package/src/internal/auth.ts +272 -0
  188. package/src/{api/internal → internal}/events.ts +22 -13
  189. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  190. package/src/logger/jsonLogger.ts +5 -3
  191. package/src/logger/logFmtLogger.ts +3 -3
  192. package/src/logger/shared.ts +6 -5
  193. package/src/middlewares.ts +10 -0
  194. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  195. package/src/otel.ts +177 -0
  196. package/src/rateLimit.ts +35 -24
  197. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  198. package/src/{api/reportError.ts → reportError.ts} +3 -2
  199. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  200. package/src/routing/middleware/middleware.ts +196 -0
  201. package/src/routing/middleware.ts +4 -0
  202. package/src/{api/routing → routing}/schema/jwt.ts +2 -2
  203. package/src/{api/routing → routing}/utils.ts +2 -1
  204. package/src/routing.ts +823 -0
  205. package/src/test.ts +6 -6
  206. package/src/vitest.ts +1 -1
  207. package/test/arbs-magnitude.test.ts +33 -0
  208. package/test/arbs.test.ts +41 -0
  209. package/test/auth.test.ts +101 -0
  210. package/test/cluster-cosmos.test.ts +612 -0
  211. package/test/cluster-servicebus.test.ts +180 -0
  212. package/test/cluster-sqlite.test.ts +207 -0
  213. package/test/contextProvider.test.ts +15 -12
  214. package/test/controller.test.ts +27 -31
  215. package/test/cosmos-container-throughput.test.ts +61 -0
  216. package/test/cosmos-query.test.ts +368 -0
  217. package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
  218. package/test/dist/arbs.test.d.ts.map +1 -0
  219. package/test/dist/auth.test.d.ts.map +1 -0
  220. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  221. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  222. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  223. package/test/dist/contextProvider.test.d.ts.map +1 -1
  224. package/test/dist/controller.test.d.ts.map +1 -1
  225. package/test/dist/cosmos-container-throughput.test.d.ts.map +1 -0
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/fixtures.d.ts +29 -11
  228. package/test/dist/fixtures.d.ts.map +1 -1
  229. package/test/dist/fixtures.js +17 -10
  230. package/test/dist/json-lower.test.d.ts.map +1 -0
  231. package/test/dist/query.test.d.ts.map +1 -1
  232. package/test/dist/rawQuery.test.d.ts.map +1 -1
  233. package/test/dist/repository-ext.test.d.ts.map +1 -0
  234. package/test/dist/repository-legacy-document.test.d.ts.map +1 -0
  235. package/test/dist/requires.test.d.ts.map +1 -1
  236. package/test/dist/router-generator.test.d.ts.map +1 -0
  237. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  238. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  239. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  240. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  241. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  242. package/test/dist/sql-store.test.d.ts.map +1 -0
  243. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  244. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  245. package/test/fixtures.ts +16 -9
  246. package/test/json-lower.test.ts +129 -0
  247. package/test/layerUtils.test.ts +2 -2
  248. package/test/query.test.ts +1382 -44
  249. package/test/rawQuery.test.ts +433 -8
  250. package/test/repository-ext.test.ts +456 -0
  251. package/test/repository-legacy-document.test.ts +394 -0
  252. package/test/requires.test.ts +10 -5
  253. package/test/router-generator.test.ts +187 -0
  254. package/test/routing-interruptibility.test.ts +66 -0
  255. package/test/rpc-context-map-streaming.test.ts +265 -0
  256. package/test/rpc-e2e-invalidation.test.ts +421 -0
  257. package/test/rpc-multi-middleware.test.ts +85 -10
  258. package/test/rpc-stream-fullstack.test.ts +307 -0
  259. package/test/sql-store.test.ts +1931 -0
  260. package/test/validateSample.test.ts +71 -43
  261. package/test/workflow-engine-cosmos.test.ts +345 -0
  262. package/test/workflow-engine-sqlite.test.ts +297 -0
  263. package/tsconfig.examples.json +1 -1
  264. package/tsconfig.json +9 -2
  265. package/tsconfig.src.json +35 -35
  266. package/tsconfig.test.json +2 -2
  267. package/dist/Emailer/service.d.ts +0 -55
  268. package/dist/Emailer/service.d.ts.map +0 -1
  269. package/dist/Emailer/service.js +0 -6
  270. package/dist/Emailer.d.ts +0 -2
  271. package/dist/Emailer.d.ts.map +0 -1
  272. package/dist/Emailer.js +0 -2
  273. package/dist/Model/Repository/ext.d.ts +0 -41
  274. package/dist/Model/Repository/ext.d.ts.map +0 -1
  275. package/dist/Model/Repository/ext.js +0 -65
  276. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  277. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  278. package/dist/Model/Repository/internal/internal.js +0 -316
  279. package/dist/Model/Repository/legacy.d.ts +0 -19
  280. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  281. package/dist/Model/Repository/legacy.js +0 -2
  282. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  283. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  284. package/dist/Model/Repository/makeRepo.js +0 -24
  285. package/dist/Model/Repository/service.d.ts +0 -89
  286. package/dist/Model/Repository/service.d.ts.map +0 -1
  287. package/dist/Model/Repository/service.js +0 -2
  288. package/dist/Model/Repository/validation.d.ts +0 -42
  289. package/dist/Model/Repository/validation.d.ts.map +0 -1
  290. package/dist/Model/Repository/validation.js +0 -32
  291. package/dist/Model/Repository.d.ts +0 -6
  292. package/dist/Model/Repository.d.ts.map +0 -1
  293. package/dist/Model/Repository.js +0 -6
  294. package/dist/Model/dsl.d.ts +0 -32
  295. package/dist/Model/dsl.d.ts.map +0 -1
  296. package/dist/Model/dsl.js +0 -44
  297. package/dist/Model/filter/filterApi.d.ts +0 -30
  298. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  299. package/dist/Model/filter/filterApi.js +0 -2
  300. package/dist/Model/filter/types/errors.d.ts +0 -29
  301. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  302. package/dist/Model/filter/types/errors.js +0 -2
  303. package/dist/Model/filter/types/fields.d.ts +0 -15
  304. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  305. package/dist/Model/filter/types/fields.js +0 -2
  306. package/dist/Model/filter/types/path/common.d.ts +0 -316
  307. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  308. package/dist/Model/filter/types/path/common.js +0 -2
  309. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  310. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  311. package/dist/Model/filter/types/path/eager.js +0 -31
  312. package/dist/Model/filter/types/path/index.d.ts +0 -4
  313. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  314. package/dist/Model/filter/types/path/index.js +0 -3
  315. package/dist/Model/filter/types/utils.d.ts +0 -79
  316. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  317. package/dist/Model/filter/types/utils.js +0 -2
  318. package/dist/Model/filter/types/validator.d.ts +0 -30
  319. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  320. package/dist/Model/filter/types/validator.js +0 -2
  321. package/dist/Model/filter/types.d.ts +0 -5
  322. package/dist/Model/filter/types.d.ts.map +0 -1
  323. package/dist/Model/filter/types.js +0 -7
  324. package/dist/Model/query/dsl.d.ts +0 -248
  325. package/dist/Model/query/dsl.d.ts.map +0 -1
  326. package/dist/Model/query/dsl.js +0 -104
  327. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  328. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  329. package/dist/Model/query/new-kid-interpreter.js +0 -165
  330. package/dist/Model/query.d.ts +0 -15
  331. package/dist/Model/query.d.ts.map +0 -1
  332. package/dist/Model/query.js +0 -3
  333. package/dist/Model.d.ts +0 -4
  334. package/dist/Model.d.ts.map +0 -1
  335. package/dist/Model.js +0 -4
  336. package/dist/Operations.d.ts +0 -55
  337. package/dist/Operations.d.ts.map +0 -1
  338. package/dist/Operations.js +0 -102
  339. package/dist/OperationsRepo.d.ts +0 -41
  340. package/dist/OperationsRepo.d.ts.map +0 -1
  341. package/dist/OperationsRepo.js +0 -14
  342. package/dist/QueueMaker/SQLQueue.d.ts +0 -16
  343. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  344. package/dist/QueueMaker/SQLQueue.js +0 -130
  345. package/dist/QueueMaker/memQueue.d.ts +0 -11
  346. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  347. package/dist/QueueMaker/memQueue.js +0 -76
  348. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  349. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  350. package/dist/QueueMaker/sbqueue.js +0 -91
  351. package/dist/QueueMaker/service.d.ts +0 -11
  352. package/dist/QueueMaker/service.d.ts.map +0 -1
  353. package/dist/QueueMaker/service.js +0 -4
  354. package/dist/RequestContext.d.ts +0 -63
  355. package/dist/RequestContext.d.ts.map +0 -1
  356. package/dist/RequestContext.js +0 -49
  357. package/dist/RequestFiberSet.d.ts +0 -36
  358. package/dist/RequestFiberSet.d.ts.map +0 -1
  359. package/dist/RequestFiberSet.js +0 -78
  360. package/dist/Store/ContextMapContainer.d.ts +0 -14
  361. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  362. package/dist/Store/ContextMapContainer.js +0 -16
  363. package/dist/Store/service.d.ts +0 -108
  364. package/dist/Store/service.d.ts.map +0 -1
  365. package/dist/Store/service.js +0 -71
  366. package/dist/Store.d.ts +0 -2
  367. package/dist/Store.d.ts.map +0 -1
  368. package/dist/Store.js +0 -2
  369. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  370. package/dist/adapters/SQL/Model.js +0 -478
  371. package/dist/adapters/SQL.d.ts.map +0 -1
  372. package/dist/adapters/ServiceBus.d.ts +0 -58
  373. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  374. package/dist/adapters/ServiceBus.js +0 -99
  375. package/dist/adapters/cosmos-client.d.ts +0 -14
  376. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  377. package/dist/adapters/cosmos-client.js +0 -9
  378. package/dist/adapters/index.d.ts +0 -2
  379. package/dist/adapters/index.d.ts.map +0 -1
  380. package/dist/adapters/index.js +0 -2
  381. package/dist/adapters/logger.d.ts +0 -9
  382. package/dist/adapters/logger.d.ts.map +0 -1
  383. package/dist/adapters/logger.js +0 -3
  384. package/dist/adapters/memQueue.d.ts +0 -13
  385. package/dist/adapters/memQueue.d.ts.map +0 -1
  386. package/dist/adapters/memQueue.js +0 -20
  387. package/dist/adapters/mongo-client.d.ts.map +0 -1
  388. package/dist/adapters/mongo-client.js +0 -13
  389. package/dist/adapters/redis-client.d.ts.map +0 -1
  390. package/dist/adapters/redis-client.js +0 -94
  391. package/dist/api/ContextProvider.d.ts +0 -31
  392. package/dist/api/ContextProvider.d.ts.map +0 -1
  393. package/dist/api/ContextProvider.js +0 -38
  394. package/dist/api/codec.d.ts.map +0 -1
  395. package/dist/api/codec.js +0 -5
  396. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  397. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  398. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  399. package/dist/api/internal/auth.d.ts +0 -15
  400. package/dist/api/internal/auth.d.ts.map +0 -1
  401. package/dist/api/internal/auth.js +0 -47
  402. package/dist/api/internal/events.d.ts +0 -9
  403. package/dist/api/internal/events.d.ts.map +0 -1
  404. package/dist/api/internal/events.js +0 -42
  405. package/dist/api/internal/health.d.ts.map +0 -1
  406. package/dist/api/internal/health.js +0 -5
  407. package/dist/api/layerUtils.d.ts.map +0 -1
  408. package/dist/api/layerUtils.js +0 -16
  409. package/dist/api/middlewares.d.ts.map +0 -1
  410. package/dist/api/reportError.d.ts.map +0 -1
  411. package/dist/api/reportError.js +0 -27
  412. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  413. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  414. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  415. package/dist/api/routing/middleware/middleware.js +0 -92
  416. package/dist/api/routing/middleware.d.ts.map +0 -1
  417. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  418. package/dist/api/routing/schema/jwt.js +0 -12
  419. package/dist/api/routing/tsort.d.ts.map +0 -1
  420. package/dist/api/routing/tsort.js +0 -51
  421. package/dist/api/routing/utils.d.ts.map +0 -1
  422. package/dist/api/routing/utils.js +0 -44
  423. package/dist/api/routing.d.ts +0 -138
  424. package/dist/api/routing.d.ts.map +0 -1
  425. package/dist/api/routing.js +0 -166
  426. package/dist/api/setupRequest.d.ts +0 -12
  427. package/dist/api/setupRequest.d.ts.map +0 -1
  428. package/dist/api/setupRequest.js +0 -44
  429. package/dist/api/util.d.ts.map +0 -1
  430. package/dist/api/util.js +0 -14
  431. package/eslint.config.mjs +0 -24
  432. package/src/Emailer/service.ts +0 -52
  433. package/src/Emailer.ts +0 -1
  434. package/src/Model/Repository/ext.ts +0 -283
  435. package/src/Model/Repository/internal/internal.ts +0 -577
  436. package/src/Model/Repository/legacy.ts +0 -27
  437. package/src/Model/Repository/makeRepo.ts +0 -139
  438. package/src/Model/Repository/service.ts +0 -627
  439. package/src/Model/Repository/validation.ts +0 -31
  440. package/src/Model/Repository.ts +0 -5
  441. package/src/Model/dsl.ts +0 -128
  442. package/src/Model/filter/filterApi.ts +0 -60
  443. package/src/Model/filter/types/errors.ts +0 -47
  444. package/src/Model/filter/types/fields.ts +0 -50
  445. package/src/Model/filter/types/path/common.ts +0 -404
  446. package/src/Model/filter/types/path/eager.ts +0 -298
  447. package/src/Model/filter/types/path/index.ts +0 -4
  448. package/src/Model/filter/types/utils.ts +0 -128
  449. package/src/Model/filter/types/validator.ts +0 -46
  450. package/src/Model/filter/types.ts +0 -6
  451. package/src/Model/query/dsl.ts +0 -2110
  452. package/src/Model/query/new-kid-interpreter.ts +0 -210
  453. package/src/Model/query.ts +0 -13
  454. package/src/Model.ts +0 -3
  455. package/src/Operations.ts +0 -235
  456. package/src/OperationsRepo.ts +0 -16
  457. package/src/QueueMaker/SQLQueue.ts +0 -189
  458. package/src/QueueMaker/memQueue.ts +0 -130
  459. package/src/QueueMaker/sbqueue.ts +0 -137
  460. package/src/QueueMaker/service.ts +0 -17
  461. package/src/RequestContext.ts +0 -63
  462. package/src/RequestFiberSet.ts +0 -105
  463. package/src/Store/ContextMapContainer.ts +0 -20
  464. package/src/Store/index.test.ts.bak +0 -112
  465. package/src/Store/service.ts +0 -184
  466. package/src/Store.ts +0 -1
  467. package/src/adapters/SQL.ts +0 -1
  468. package/src/adapters/ServiceBus.ts +0 -209
  469. package/src/adapters/cosmos-client.ts +0 -16
  470. package/src/adapters/index.ts +0 -0
  471. package/src/adapters/logger.ts +0 -3
  472. package/src/adapters/memQueue.ts +0 -21
  473. package/src/api/internal/auth.ts +0 -68
  474. package/src/api/middlewares.ts +0 -10
  475. package/src/api/routing/middleware/middleware.ts +0 -128
  476. package/src/api/routing/middleware.ts +0 -6
  477. package/src/api/routing.ts +0 -598
  478. package/src/api/setupRequest.ts +0 -84
  479. package/tsconfig.json.bak +0 -12
  480. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  481. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  482. /package/dist/{api/internal → internal}/health.d.ts +0 -0
  483. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  484. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  485. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  486. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  487. /package/src/{api/codec.ts → codec.ts} +0 -0
  488. /package/src/{api/internal → internal}/health.ts +0 -0
  489. /package/src/{api/routing → routing}/tsort.ts +0 -0
  490. /package/src/{api/util.ts → util.ts} +0 -0
@@ -0,0 +1,656 @@
1
+ import * as Effect from "effect-app/Effect";
2
+ import { assertUnreachable } from "effect-app/utils";
3
+ import { InfraLogger } from "../../logger.js";
4
+ import { isRelationCheck } from "../codeFilter.js";
5
+ import { jsonifyFilter } from "../utils.js";
6
+ export const sqliteDialect = {
7
+ jsonExtract: (path) => `json_extract(data, '$.${path}')`,
8
+ jsonExtractJson: (path) => `CASE json_type(data, '$.${path}') WHEN 'true' THEN 'true' WHEN 'false' THEN 'false' ELSE json_quote(json_extract(data, '$.${path}')) END`,
9
+ placeholder: (_index) => "?",
10
+ jsonArrayContains: (arrPath, val) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value = ${val})`,
11
+ jsonArrayNotContains: (arrPath, val) => `NOT EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value = ${val})`,
12
+ jsonArrayContainsAny: (arrPath, vals) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value IN (${vals.join(", ")}))`,
13
+ jsonArrayNotContainsAny: (arrPath, vals) => `NOT EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value IN (${vals.join(", ")}))`,
14
+ jsonArrayContainsAll: (arrPath, vals) => vals.map((v) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value = ${v})`).join(" AND "),
15
+ jsonArrayNotContainsAll: (arrPath, vals) => `NOT (${vals.map((v) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value = ${v})`).join(" AND ")})`,
16
+ jsonMapHasKey: (arrPath, val) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE json_extract(value, '$[0]') = ${val})`,
17
+ jsonMapHasValue: (arrPath, val) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE json_extract(value, '$[1]') = ${val})`,
18
+ jsonMapHasPair: (arrPath, val) => `EXISTS(SELECT 1 FROM json_each(data, '$.${arrPath}') WHERE value = ${val})`,
19
+ caseInsensitiveLike: (expr, val) => `LOWER(${expr}) LIKE LOWER(${val})`,
20
+ caseInsensitiveNotLike: (expr, val) => `LOWER(${expr}) NOT LIKE LOWER(${val})`,
21
+ jsonColumnType: "JSON",
22
+ arrayLength: (path) => `json_array_length(data, '$.${path}')`,
23
+ jsonEachFrom: (arrPath, alias) => `json_each(data, '$.${arrPath}') AS ${alias}`,
24
+ jsonExtractElement: (alias, subPath) => `json_extract(${alias}.value, '$.${subPath}')`,
25
+ serializeJsonValue: (v) => v,
26
+ // SQLite stores JSON booleans as integers (0/1) and better-sqlite3 refuses
27
+ // to bind JS booleans, so coerce them to integers for WHERE params.
28
+ serializeScalar: (v) => typeof v === "boolean" ? (v ? 1 : 0) : v
29
+ };
30
+ export const pgDialect = {
31
+ jsonExtract: (path) => {
32
+ const parts = path.split(".");
33
+ if (parts.length === 1)
34
+ return `data->>'${parts[0]}'`;
35
+ const last = parts.pop();
36
+ return `data${parts.map((p) => `->'${p}'`).join("")}->>'${last}'`;
37
+ },
38
+ jsonExtractJson: (path) => {
39
+ const parts = path.split(".");
40
+ if (parts.length === 1)
41
+ return `data->'${parts[0]}'`;
42
+ return `data${parts.map((p) => `->'${p}'`).join("")}`;
43
+ },
44
+ placeholder: (index) => `$${index}`,
45
+ jsonArrayContains: (arrPath, val) => {
46
+ const parts = arrPath.split(".");
47
+ const jsonPath = parts.length === 1
48
+ ? `data->'${parts[0]}'`
49
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
50
+ return `${jsonPath} @> ${val}::jsonb`;
51
+ },
52
+ jsonArrayNotContains: (arrPath, val) => {
53
+ const parts = arrPath.split(".");
54
+ const jsonPath = parts.length === 1
55
+ ? `data->'${parts[0]}'`
56
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
57
+ return `NOT (${jsonPath} @> ${val}::jsonb)`;
58
+ },
59
+ jsonArrayContainsAny: (arrPath, vals) => {
60
+ const parts = arrPath.split(".");
61
+ const jsonPath = parts.length === 1
62
+ ? `data->'${parts[0]}'`
63
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
64
+ return `(${vals.map((v) => `${jsonPath} @> ${v}::jsonb`).join(" OR ")})`;
65
+ },
66
+ jsonArrayNotContainsAny: (arrPath, vals) => {
67
+ const parts = arrPath.split(".");
68
+ const jsonPath = parts.length === 1
69
+ ? `data->'${parts[0]}'`
70
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
71
+ return `NOT (${vals.map((v) => `${jsonPath} @> ${v}::jsonb`).join(" OR ")})`;
72
+ },
73
+ jsonArrayContainsAll: (arrPath, vals) => {
74
+ const parts = arrPath.split(".");
75
+ const jsonPath = parts.length === 1
76
+ ? `data->'${parts[0]}'`
77
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
78
+ return vals.map((v) => `${jsonPath} @> ${v}::jsonb`).join(" AND ");
79
+ },
80
+ jsonArrayNotContainsAll: (arrPath, vals) => {
81
+ const parts = arrPath.split(".");
82
+ const jsonPath = parts.length === 1
83
+ ? `data->'${parts[0]}'`
84
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
85
+ return `NOT (${vals.map((v) => `${jsonPath} @> ${v}::jsonb`).join(" AND ")})`;
86
+ },
87
+ jsonMapHasKey: (arrPath, val) => {
88
+ const parts = arrPath.split(".");
89
+ const jsonPath = parts.length === 1
90
+ ? `data->'${parts[0]}'`
91
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
92
+ return `EXISTS(SELECT 1 FROM jsonb_array_elements(${jsonPath}) e WHERE e->0 = ${val}::jsonb)`;
93
+ },
94
+ jsonMapHasValue: (arrPath, val) => {
95
+ const parts = arrPath.split(".");
96
+ const jsonPath = parts.length === 1
97
+ ? `data->'${parts[0]}'`
98
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
99
+ return `EXISTS(SELECT 1 FROM jsonb_array_elements(${jsonPath}) e WHERE e->1 = ${val}::jsonb)`;
100
+ },
101
+ jsonMapHasPair: (arrPath, val) => {
102
+ const parts = arrPath.split(".");
103
+ const jsonPath = parts.length === 1
104
+ ? `data->'${parts[0]}'`
105
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
106
+ return `${jsonPath} @> jsonb_build_array(${val}::jsonb)`;
107
+ },
108
+ caseInsensitiveLike: (expr, val) => `${expr} ILIKE ${val}`,
109
+ caseInsensitiveNotLike: (expr, val) => `${expr} NOT ILIKE ${val}`,
110
+ jsonColumnType: "JSONB",
111
+ arrayLength: (path) => `jsonb_array_length(data->'${path}')`,
112
+ jsonEachFrom: (arrPath, alias) => {
113
+ const parts = arrPath.split(".");
114
+ const jsonPath = parts.length === 1
115
+ ? `data->'${parts[0]}'`
116
+ : `data${parts.map((p) => `->'${p}'`).join("")}`;
117
+ return `jsonb_array_elements(${jsonPath}) AS ${alias}`;
118
+ },
119
+ jsonExtractElement: (alias, subPath) => {
120
+ const parts = subPath.split(".");
121
+ if (parts.length === 1)
122
+ return `${alias}->>'${parts[0]}'`;
123
+ const last = parts.pop();
124
+ return `${alias}${parts.map((p) => `->'${p}'`).join("")}->>'${last}'`;
125
+ },
126
+ serializeJsonValue: (v) => JSON.stringify(v),
127
+ // PG's ->> operator yields text, so compare booleans as 'true'/'false' text.
128
+ serializeScalar: (v) => typeof v === "boolean" ? (v ? "true" : "false") : v
129
+ };
130
+ export function logQuery(q) {
131
+ return InfraLogger
132
+ .logDebug("sql query")
133
+ .pipe(Effect.annotateLogs({
134
+ query: q.sql,
135
+ parameters: JSON.stringify(q.params, undefined, 2)
136
+ }));
137
+ }
138
+ const dottedToJsonPath = (path) => path
139
+ .split(".")
140
+ .filter((p) => p !== "-1")
141
+ .join(".");
142
+ const mapItemParam = (dialect, value) => dialect.jsonColumnType === "JSONB" ? dialect.serializeJsonValue(value) : value;
143
+ const mapPairParam = (dialect, value) => {
144
+ const encoded = dialect.serializeJsonValue(value);
145
+ return typeof encoded === "string" ? encoded : JSON.stringify(value);
146
+ };
147
+ const sqlStringLiteral = (value) => `'${value.replaceAll("'", "''")}'`;
148
+ export function buildWhereSQLQuery(dialect, idKey, filter, tableName, defaultValues, select, order, skip, limit, namespace, json) {
149
+ // defaultValues are already JSON-lowered at store construction; a second
150
+ // schema encode of an ISO Date string throws "Expected a valid Date".
151
+ filter = (json?.jsonifyFilter ?? jsonifyFilter)(filter);
152
+ const params = [];
153
+ let paramIndex = 1;
154
+ const addParam = (value) => {
155
+ params.push(dialect.serializeScalar(value));
156
+ return dialect.placeholder(paramIndex++);
157
+ };
158
+ const fieldExpr = (path, relation) => {
159
+ if (path === idKey || path === "id")
160
+ return "id";
161
+ if (relation && path.includes(".-1.")) {
162
+ const subPath = path.split(".-1.")[1];
163
+ if (subPath.endsWith(".length")) {
164
+ // TODO: array length inside relation element
165
+ return dialect.jsonExtractElement(`_${relation}`, subPath.slice(0, -".length".length));
166
+ }
167
+ return dialect.jsonExtractElement(`_${relation}`, subPath);
168
+ }
169
+ if (path.endsWith(".length")) {
170
+ const arrPath = dottedToJsonPath(path.slice(0, -".length".length));
171
+ return dialect.arrayLength(arrPath);
172
+ }
173
+ const jsonPath = dottedToJsonPath(path);
174
+ const expr = dialect.jsonExtract(jsonPath);
175
+ const topKey = path.split(".")[0];
176
+ if (topKey in defaultValues) {
177
+ return `COALESCE(${expr}, ${addParam(defaultValues[topKey])})`;
178
+ }
179
+ return expr;
180
+ };
181
+ const statement = (x, relation) => {
182
+ const resolvedPath = x.path === idKey ? "id" : x.path;
183
+ const k = fieldExpr(resolvedPath, relation);
184
+ switch (x.op) {
185
+ case "in": {
186
+ const vals = x.value;
187
+ const hasNull = vals.some((v) => v == null);
188
+ const nonNullVals = vals.filter((v) => v != null);
189
+ const parts = [];
190
+ if (nonNullVals.length > 0) {
191
+ const placeholders = nonNullVals.map((v) => addParam(v));
192
+ parts.push(`${k} IN (${placeholders.join(", ")})`);
193
+ }
194
+ if (hasNull)
195
+ parts.push(`${k} IS NULL`);
196
+ return parts.length > 1 ? `(${parts.join(" OR ")})` : parts[0] ?? "1=0";
197
+ }
198
+ case "notIn": {
199
+ const vals = x.value;
200
+ const hasNull = vals.some((v) => v == null);
201
+ const nonNullVals = vals.filter((v) => v != null);
202
+ const parts = [];
203
+ if (nonNullVals.length > 0) {
204
+ const placeholders = nonNullVals.map((v) => addParam(v));
205
+ parts.push(`${k} NOT IN (${placeholders.join(", ")})`);
206
+ }
207
+ if (hasNull)
208
+ parts.push(`${k} IS NOT NULL`);
209
+ return parts.length > 1 ? `(${parts.join(" AND ")})` : parts[0] ?? "1=1";
210
+ }
211
+ case "includes": {
212
+ const arrPath = dottedToJsonPath(resolvedPath);
213
+ const v = addParam(x.value);
214
+ return dialect.jsonArrayContains(arrPath, v);
215
+ }
216
+ case "notIncludes": {
217
+ const arrPath = dottedToJsonPath(resolvedPath);
218
+ const v = addParam(x.value);
219
+ return dialect.jsonArrayNotContains(arrPath, v);
220
+ }
221
+ case "includes-any": {
222
+ const arrPath = dottedToJsonPath(resolvedPath);
223
+ const vals = x.value;
224
+ const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v)));
225
+ return dialect.jsonArrayContainsAny(arrPath, placeholders);
226
+ }
227
+ case "notIncludes-any": {
228
+ const arrPath = dottedToJsonPath(resolvedPath);
229
+ const vals = x.value;
230
+ const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v)));
231
+ return dialect.jsonArrayNotContainsAny(arrPath, placeholders);
232
+ }
233
+ case "includes-all": {
234
+ const arrPath = dottedToJsonPath(resolvedPath);
235
+ const vals = x.value;
236
+ const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v)));
237
+ return dialect.jsonArrayContainsAll(arrPath, placeholders);
238
+ }
239
+ case "notIncludes-all": {
240
+ const arrPath = dottedToJsonPath(resolvedPath);
241
+ const vals = x.value;
242
+ const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v)));
243
+ return dialect.jsonArrayNotContainsAll(arrPath, placeholders);
244
+ }
245
+ case "hasKey": {
246
+ const arrPath = dottedToJsonPath(resolvedPath);
247
+ const v = addParam(mapItemParam(dialect, x.value));
248
+ return dialect.jsonMapHasKey(arrPath, v);
249
+ }
250
+ case "notHasKey": {
251
+ const arrPath = dottedToJsonPath(resolvedPath);
252
+ const v = addParam(mapItemParam(dialect, x.value));
253
+ return `NOT (${dialect.jsonMapHasKey(arrPath, v)})`;
254
+ }
255
+ case "hasValue": {
256
+ const arrPath = dottedToJsonPath(resolvedPath);
257
+ const v = addParam(mapItemParam(dialect, x.value));
258
+ return dialect.jsonMapHasValue(arrPath, v);
259
+ }
260
+ case "notHasValue": {
261
+ const arrPath = dottedToJsonPath(resolvedPath);
262
+ const v = addParam(mapItemParam(dialect, x.value));
263
+ return `NOT (${dialect.jsonMapHasValue(arrPath, v)})`;
264
+ }
265
+ case "hasKeyValue": {
266
+ const arrPath = dottedToJsonPath(resolvedPath);
267
+ const v = addParam(mapPairParam(dialect, x.value));
268
+ return dialect.jsonMapHasPair(arrPath, v);
269
+ }
270
+ case "notHasKeyValue": {
271
+ const arrPath = dottedToJsonPath(resolvedPath);
272
+ const v = addParam(mapPairParam(dialect, x.value));
273
+ return `NOT (${dialect.jsonMapHasPair(arrPath, v)})`;
274
+ }
275
+ case "hasKey-any": {
276
+ const arrPath = dottedToJsonPath(resolvedPath);
277
+ const vals = x.value;
278
+ const parts = vals.map((val) => dialect.jsonMapHasKey(arrPath, addParam(mapItemParam(dialect, val))));
279
+ return `(${parts.join(" OR ")})`;
280
+ }
281
+ case "notHasKey-any": {
282
+ const arrPath = dottedToJsonPath(resolvedPath);
283
+ const vals = x.value;
284
+ const parts = vals.map((val) => dialect.jsonMapHasKey(arrPath, addParam(mapItemParam(dialect, val))));
285
+ return `NOT (${parts.join(" OR ")})`;
286
+ }
287
+ case "hasKey-all": {
288
+ const arrPath = dottedToJsonPath(resolvedPath);
289
+ const vals = x.value;
290
+ return vals.map((val) => dialect.jsonMapHasKey(arrPath, addParam(mapItemParam(dialect, val)))).join(" AND ");
291
+ }
292
+ case "notHasKey-all": {
293
+ const arrPath = dottedToJsonPath(resolvedPath);
294
+ const vals = x.value;
295
+ return `NOT (${vals.map((val) => dialect.jsonMapHasKey(arrPath, addParam(mapItemParam(dialect, val)))).join(" AND ")})`;
296
+ }
297
+ case "hasValue-any": {
298
+ const arrPath = dottedToJsonPath(resolvedPath);
299
+ const vals = x.value;
300
+ const parts = vals.map((val) => dialect.jsonMapHasValue(arrPath, addParam(mapItemParam(dialect, val))));
301
+ return `(${parts.join(" OR ")})`;
302
+ }
303
+ case "notHasValue-any": {
304
+ const arrPath = dottedToJsonPath(resolvedPath);
305
+ const vals = x.value;
306
+ const parts = vals.map((val) => dialect.jsonMapHasValue(arrPath, addParam(mapItemParam(dialect, val))));
307
+ return `NOT (${parts.join(" OR ")})`;
308
+ }
309
+ case "hasValue-all": {
310
+ const arrPath = dottedToJsonPath(resolvedPath);
311
+ const vals = x.value;
312
+ return vals.map((val) => dialect.jsonMapHasValue(arrPath, addParam(mapItemParam(dialect, val)))).join(" AND ");
313
+ }
314
+ case "notHasValue-all": {
315
+ const arrPath = dottedToJsonPath(resolvedPath);
316
+ const vals = x.value;
317
+ return `NOT (${vals.map((val) => dialect.jsonMapHasValue(arrPath, addParam(mapItemParam(dialect, val)))).join(" AND ")})`;
318
+ }
319
+ case "hasKeyValue-any": {
320
+ const arrPath = dottedToJsonPath(resolvedPath);
321
+ const vals = x.value;
322
+ const parts = vals.map((val) => dialect.jsonMapHasPair(arrPath, addParam(mapPairParam(dialect, val))));
323
+ return `(${parts.join(" OR ")})`;
324
+ }
325
+ case "notHasKeyValue-any": {
326
+ const arrPath = dottedToJsonPath(resolvedPath);
327
+ const vals = x.value;
328
+ const parts = vals.map((val) => dialect.jsonMapHasPair(arrPath, addParam(mapPairParam(dialect, val))));
329
+ return `NOT (${parts.join(" OR ")})`;
330
+ }
331
+ case "hasKeyValue-all": {
332
+ const arrPath = dottedToJsonPath(resolvedPath);
333
+ const vals = x.value;
334
+ return vals.map((val) => dialect.jsonMapHasPair(arrPath, addParam(mapPairParam(dialect, val)))).join(" AND ");
335
+ }
336
+ case "notHasKeyValue-all": {
337
+ const arrPath = dottedToJsonPath(resolvedPath);
338
+ const vals = x.value;
339
+ return `NOT (${vals.map((val) => dialect.jsonMapHasPair(arrPath, addParam(mapPairParam(dialect, val)))).join(" AND ")})`;
340
+ }
341
+ case "contains": {
342
+ const v = addParam(`%${x.value}%`);
343
+ return dialect.caseInsensitiveLike(k, v);
344
+ }
345
+ case "notContains": {
346
+ const v = addParam(`%${x.value}%`);
347
+ return dialect.caseInsensitiveNotLike(k, v);
348
+ }
349
+ case "startsWith": {
350
+ const v = addParam(`${x.value}%`);
351
+ return dialect.caseInsensitiveLike(k, v);
352
+ }
353
+ case "notStartsWith": {
354
+ const v = addParam(`${x.value}%`);
355
+ return dialect.caseInsensitiveNotLike(k, v);
356
+ }
357
+ case "endsWith": {
358
+ const v = addParam(`%${x.value}`);
359
+ return dialect.caseInsensitiveLike(k, v);
360
+ }
361
+ case "notEndsWith": {
362
+ const v = addParam(`%${x.value}`);
363
+ return dialect.caseInsensitiveNotLike(k, v);
364
+ }
365
+ case "lt": {
366
+ const v = addParam(x.value);
367
+ return `${k} < ${v}`;
368
+ }
369
+ case "lte": {
370
+ const v = addParam(x.value);
371
+ return `${k} <= ${v}`;
372
+ }
373
+ case "gt": {
374
+ const v = addParam(x.value);
375
+ return `${k} > ${v}`;
376
+ }
377
+ case "gte": {
378
+ const v = addParam(x.value);
379
+ return `${k} >= ${v}`;
380
+ }
381
+ case "neq": {
382
+ if (x.value === null)
383
+ return `${k} IS NOT NULL`;
384
+ const v = addParam(x.value);
385
+ return `${k} <> ${v}`;
386
+ }
387
+ case undefined:
388
+ case "eq": {
389
+ if (x.value === null)
390
+ return `${k} IS NULL`;
391
+ const v = addParam(x.value);
392
+ return `${k} = ${v}`;
393
+ }
394
+ default:
395
+ return assertUnreachable(x.op);
396
+ }
397
+ };
398
+ const wrapRelation = (rel, inner, every) => {
399
+ // Optimize tautological/contradictory conditions
400
+ if (every && inner === "1=1")
401
+ return "1=1";
402
+ if (!every && inner === "1=0")
403
+ return "1=0";
404
+ const from = dialect.jsonEachFrom(rel, `_${rel}`);
405
+ // ∀x.P(x) ≡ ¬∃x.¬P(x), i.e. NOT EXISTS(... WHERE NOT P)
406
+ return every
407
+ ? `NOT EXISTS(SELECT 1 FROM ${from} WHERE NOT (${inner}))`
408
+ : `EXISTS(SELECT 1 FROM ${from} WHERE ${inner})`;
409
+ };
410
+ const print = (state, isRelation, every) => {
411
+ let s = "";
412
+ for (const e of state) {
413
+ switch (e.t) {
414
+ case "where":
415
+ s += statement(e, isRelation ?? undefined);
416
+ break;
417
+ case "or":
418
+ s += ` OR ${statement(e, isRelation ?? undefined)}`;
419
+ break;
420
+ case "and":
421
+ s += ` AND ${statement(e, isRelation ?? undefined)}`;
422
+ break;
423
+ case "or-scope": {
424
+ if (!every)
425
+ every = e.relation === "every";
426
+ const rel = isRelationCheck(e.result, isRelation);
427
+ if (rel) {
428
+ s += isRelation
429
+ ? ` OR (${print(e.result, rel, every)})`
430
+ : ` OR ${wrapRelation(rel, print(e.result, rel, every), every)}`;
431
+ }
432
+ else {
433
+ s += ` OR (${print(e.result, null, every)})`;
434
+ }
435
+ break;
436
+ }
437
+ case "and-scope": {
438
+ if (!every)
439
+ every = e.relation === "every";
440
+ const rel = isRelationCheck(e.result, isRelation);
441
+ if (rel) {
442
+ s += isRelation
443
+ ? ` AND (${print(e.result, rel, every)})`
444
+ : ` AND ${wrapRelation(rel, print(e.result, rel, every), every)}`;
445
+ }
446
+ else {
447
+ s += ` AND (${print(e.result, null, every)})`;
448
+ }
449
+ break;
450
+ }
451
+ case "where-scope": {
452
+ if (!every)
453
+ every = e.relation === "every";
454
+ const rel = isRelationCheck(e.result, isRelation);
455
+ if (rel) {
456
+ s += isRelation
457
+ ? `(${print(e.result, rel, every)})`
458
+ : wrapRelation(rel, print(e.result, rel, every), every);
459
+ }
460
+ else {
461
+ s += `(${print(e.result, null, every)})`;
462
+ }
463
+ break;
464
+ }
465
+ }
466
+ }
467
+ return s;
468
+ };
469
+ const computedSelectExpr = (key, computed) => {
470
+ const relationPath = dottedToJsonPath(computed.path);
471
+ const relationAlias = `_${computed.path}`;
472
+ const relationFrom = dialect.jsonEachFrom(relationPath, relationAlias);
473
+ const toNumber = (expr) => dialect.jsonColumnType === "JSON" ? `CAST(${expr} AS REAL)` : `(${expr})::numeric`;
474
+ const compileExpr = (expression) => {
475
+ switch (expression._tag) {
476
+ case "field":
477
+ return toNumber(dialect.jsonExtractElement(relationAlias, expression.field));
478
+ case "mul":
479
+ return `(${compileExpr(expression.left)} * ${compileExpr(expression.right)})`;
480
+ default:
481
+ return assertUnreachable(expression);
482
+ }
483
+ };
484
+ const factorCaseExpr = (unitExpr, toBase, factors) => {
485
+ const entries = Object.entries(factors).filter(([, factor]) => Number.isFinite(factor));
486
+ const cases = entries.map(([unit, factor]) => ` WHEN ${sqlStringLiteral(unit)} THEN ${factor}`).join("");
487
+ return `CASE ${unitExpr} WHEN ${sqlStringLiteral(toBase)} THEN 1${cases} ELSE NULL END`;
488
+ };
489
+ const filter = "filter" in computed ? computed.filter : [];
490
+ const whereClause = () => filter.length > 0
491
+ ? ` WHERE ${print(filter, computed.path, false)}`
492
+ : "";
493
+ const boolExpr = (sqlExpr) => dialect.jsonColumnType === "JSON"
494
+ ? `CASE WHEN ${sqlExpr} THEN 'true' ELSE 'false' END AS "${key}"`
495
+ : `${sqlExpr} AS "${key}"`;
496
+ switch (computed._tag) {
497
+ case "relation-count":
498
+ return `(SELECT COUNT(1) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
499
+ case "relation-any":
500
+ return boolExpr(`EXISTS(SELECT 1 FROM ${relationFrom}${whereClause()})`);
501
+ case "relation-every":
502
+ // ∀x.P(x) ≡ ¬∃x.¬P(x). When no filter, no element exists that violates ⊤ → true.
503
+ return boolExpr(filter.length === 0
504
+ ? `1=1`
505
+ : `NOT EXISTS(SELECT 1 FROM ${relationFrom} WHERE NOT (${print(filter, computed.path, false)}))`);
506
+ case "relation-distinct-count": {
507
+ const fieldExtract = dialect.jsonExtractElement(relationAlias, computed.field);
508
+ return `(SELECT COUNT(DISTINCT ${fieldExtract}) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
509
+ }
510
+ case "relation-sum": {
511
+ const fieldExtract = dialect.jsonExtractElement(relationAlias, computed.field);
512
+ return `(SELECT COALESCE(SUM(${toNumber(fieldExtract)}), 0) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
513
+ }
514
+ case "relation-sum-expr": {
515
+ const expression = compileExpr(computed.expression);
516
+ return `(SELECT COALESCE(SUM(${expression}), 0) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
517
+ }
518
+ case "relation-sum-expr-by": {
519
+ const expression = compileExpr(computed.expression);
520
+ const unitExpr = dialect.jsonExtractElement(relationAlias, computed.unit);
521
+ if (dialect.jsonColumnType === "JSON") {
522
+ return `(SELECT COALESCE(json_group_array(json_object('unit', __unit, 'total', __total)), json_array()) FROM (SELECT ${unitExpr} AS __unit, COALESCE(SUM(${expression}), 0) AS __total FROM ${relationFrom}${whereClause()} GROUP BY ${unitExpr})) AS "${key}"`;
523
+ }
524
+ return `(SELECT COALESCE(jsonb_agg(jsonb_build_object('unit', __unit, 'total', __total)), '[]'::jsonb) FROM (SELECT ${unitExpr} AS __unit, COALESCE(SUM(${expression}), 0) AS __total FROM ${relationFrom}${whereClause()} GROUP BY ${unitExpr}) __grouped) AS "${key}"`;
525
+ }
526
+ case "relation-sum-expr-normalized": {
527
+ const expression = compileExpr(computed.expression);
528
+ const unitExpr = dialect.jsonExtractElement(relationAlias, computed.unit);
529
+ const factorExpr = factorCaseExpr(unitExpr, computed.toBase, computed.factors);
530
+ return `(SELECT COALESCE(SUM((${expression}) * (${factorExpr})), 0) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
531
+ }
532
+ case "relation-collect": {
533
+ const fieldExtract = dialect.jsonExtractElement(relationAlias, computed.field);
534
+ if (dialect.jsonColumnType === "JSON") {
535
+ // sqlite: json_group_array does not accept DISTINCT; emulate via inner DISTINCT subquery
536
+ if (computed.distinct) {
537
+ return `(SELECT COALESCE(json_group_array(__v), json_array()) FROM (SELECT DISTINCT ${fieldExtract} AS __v FROM ${relationFrom}${whereClause()})) AS "${key}"`;
538
+ }
539
+ return `(SELECT COALESCE(json_group_array(${fieldExtract}), json_array()) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
540
+ }
541
+ const aggArg = computed.distinct ? `DISTINCT ${fieldExtract}` : fieldExtract;
542
+ return `(SELECT COALESCE(jsonb_agg(${aggArg}), '[]'::jsonb) FROM ${relationFrom}${whereClause()}) AS "${key}"`;
543
+ }
544
+ case "relation-length": {
545
+ const arrPath = dottedToJsonPath(computed.path);
546
+ return `${dialect.arrayLength(arrPath)} AS "${key}"`;
547
+ }
548
+ case "relation-collect-fields": {
549
+ const branches = computed.fields.map((field) => {
550
+ const fieldExtract = dialect.jsonExtractElement(relationAlias, field);
551
+ return `SELECT ${fieldExtract} AS __v FROM ${relationFrom}${whereClause()}`;
552
+ });
553
+ const unionQuery = branches.join(" UNION ALL ");
554
+ if (dialect.jsonColumnType === "JSON") {
555
+ if (computed.distinct) {
556
+ return `(SELECT COALESCE(json_group_array(__v), json_array()) FROM (SELECT DISTINCT __v FROM (${unionQuery}))) AS "${key}"`;
557
+ }
558
+ return `(SELECT COALESCE(json_group_array(__v), json_array()) FROM (${unionQuery})) AS "${key}"`;
559
+ }
560
+ if (computed.distinct) {
561
+ return `(SELECT COALESCE(jsonb_agg(__v), '[]'::jsonb) FROM (SELECT DISTINCT __v FROM (${unionQuery}) inner_q) outer_q) AS "${key}"`;
562
+ }
563
+ return `(SELECT COALESCE(jsonb_agg(__v), '[]'::jsonb) FROM (${unionQuery}) t) AS "${key}"`;
564
+ }
565
+ default:
566
+ return assertUnreachable(computed);
567
+ }
568
+ };
569
+ const aggregateSelectExpr = (key, agg) => {
570
+ switch (agg._tag) {
571
+ case "agg-count":
572
+ return `COUNT(1) AS "${key}"`;
573
+ case "agg-count-when": {
574
+ if (agg.filter.length === 0)
575
+ return `COUNT(1) AS "${key}"`;
576
+ const cond = print([{ t: "where-scope", result: agg.filter, relation: "some" }], null, false);
577
+ return `COUNT(CASE WHEN ${cond} THEN 1 END) AS "${key}"`;
578
+ }
579
+ case "agg-sum":
580
+ return `COALESCE(SUM(${fieldExpr(agg.field)}), 0) AS "${key}"`;
581
+ case "agg-min":
582
+ return `MIN(${fieldExpr(agg.field)}) AS "${key}"`;
583
+ case "agg-max":
584
+ return `MAX(${fieldExpr(agg.field)}) AS "${key}"`;
585
+ default:
586
+ return assertUnreachable(agg);
587
+ }
588
+ };
589
+ const hasAggregates = select
590
+ ? select.some((s) => typeof s === "object" && s !== null && "aggregate" in s)
591
+ : false;
592
+ const getSelectExpr = () => {
593
+ if (!select)
594
+ return "id, _etag, data";
595
+ const fields = select.map((s) => {
596
+ if (typeof s === "string") {
597
+ if (s === idKey || s === "id")
598
+ return `id`;
599
+ if (s === "_etag")
600
+ return `_etag`;
601
+ return `${dialect.jsonExtractJson(s)} AS "${s}"`;
602
+ }
603
+ if ("computed" in s) {
604
+ return computedSelectExpr(s.key, s.computed);
605
+ }
606
+ if ("aggregate" in s) {
607
+ return aggregateSelectExpr(s.key, s.aggregate);
608
+ }
609
+ if ("path" in s) {
610
+ // Group-by fields: extract as scalar (not JSON-encoded) so grouping works and values compare as plain strings/numbers
611
+ return `${fieldExpr(dottedToJsonPath(s.path))} AS "${s.key}"`;
612
+ }
613
+ return `${dialect.jsonExtractJson(s.key)} AS "${s.key}"`;
614
+ });
615
+ return fields.join(", ");
616
+ };
617
+ // Order matters: projection params must be emitted BEFORE user-filter
618
+ // params so positional `?` placeholders in SQLite match `params[]` order.
619
+ const selectExpr = getSelectExpr();
620
+ const namespaceClause = namespace !== undefined
621
+ ? `_namespace = ${addParam(namespace)}`
622
+ : "";
623
+ const userWhere = filter.length
624
+ ? print([{ t: "where-scope", result: filter, relation: "some" }], null, false)
625
+ : "";
626
+ const whereClause = namespaceClause && userWhere
627
+ ? `WHERE ${namespaceClause} AND ${userWhere}`
628
+ : namespaceClause
629
+ ? `WHERE ${namespaceClause}`
630
+ : userWhere
631
+ ? `WHERE ${userWhere}`
632
+ : "";
633
+ const groupByClause = hasAggregates && select
634
+ ? (() => {
635
+ const groupByExprs = select
636
+ .filter((s) => typeof s === "string" || (typeof s === "object" && s !== null && "path" in s))
637
+ .map((s) => typeof s === "string" ? fieldExpr(s) : fieldExpr(dottedToJsonPath(s.path)));
638
+ return groupByExprs.length > 0 ? `GROUP BY ${groupByExprs.join(", ")}` : "";
639
+ })()
640
+ : "";
641
+ const orderClause = order
642
+ ? `ORDER BY ${order
643
+ .map((_) => hasAggregates
644
+ ? `"${_.key}" ${_.direction}`
645
+ : `${fieldExpr(_.key)} ${_.direction}`)
646
+ .join(", ")}`
647
+ : "";
648
+ const limitClause = limit !== undefined || skip !== undefined
649
+ ? `LIMIT ${addParam(limit ?? 999999)} OFFSET ${addParam(skip ?? 0)}`
650
+ : "";
651
+ const sql = `SELECT ${selectExpr} FROM "${tableName}" ${whereClause} ${groupByClause} ${orderClause} ${limitClause}`
652
+ .replace(/\s+/g, " ")
653
+ .trim();
654
+ return { sql, params };
655
+ }
656
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU3RvcmUvU1FML3F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFHM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFrQixNQUFNLGFBQWEsQ0FBQTtBQXlCM0QsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMseUJBQXlCLElBQUksSUFBSTtJQUN4RCxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN4QiwyQkFBMkIsSUFBSSw4RkFBOEYsSUFBSSxTQUFTO0lBQzVJLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRztJQUM1QixpQkFBaUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLDJDQUEyQyxPQUFPLG9CQUFvQixHQUFHLEdBQUc7SUFDakgsb0JBQW9CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDckMsK0NBQStDLE9BQU8sb0JBQW9CLEdBQUcsR0FBRztJQUNsRixvQkFBb0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUN0QywyQ0FBMkMsT0FBTyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtJQUM3Rix1QkFBdUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUN6QywrQ0FBK0MsT0FBTyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJ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QW9CLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDakMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQ3ZCLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQTtRQUNsRCxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxRQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQTtJQUMxRSxDQUFDO0lBQ0QsdUJBQXVCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDekMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDakMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQ3ZCLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQTtRQUNsRCxPQUFPLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxRQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQTtJQUM5RSxDQUFDO0lB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QUFLLEdBQUcsQ0FBQyxDQUFBO2dCQUNsQyxPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDMUMsQ0FBQztZQUNELEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO2dCQUNsQyxPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDN0MsQ0FBQztZQUNELEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO2dCQUNqQyxPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDMUMsQ0FBQztZQUNELEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO2dCQUNqQyxPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDN0MsQ0FBQztZQUNELEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUNqQyxPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDMUMsQ0FBQztZQUNELEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUNqQyxPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDN0MsQ0FBQztZ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