@effect-app/infra 4.0.0-beta.26 → 4.0.0-beta.260

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 (503) hide show
  1. package/CHANGELOG.md +1966 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +30 -11
  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 +487 -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 +111 -147
  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 +2 -2
  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 -9
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +10 -6
  24. package/dist/QueueMaker/SQLQueue.d.ts +8 -9
  25. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  26. package/dist/QueueMaker/SQLQueue.js +138 -120
  27. package/dist/QueueMaker/errors.d.ts +5 -3
  28. package/dist/QueueMaker/errors.d.ts.map +1 -1
  29. package/dist/QueueMaker/errors.js +4 -2
  30. package/dist/QueueMaker/memQueue.d.ts +10 -6
  31. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  32. package/dist/QueueMaker/memQueue.js +84 -68
  33. package/dist/QueueMaker/sbqueue.d.ts +9 -5
  34. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  35. package/dist/QueueMaker/sbqueue.js +60 -58
  36. package/dist/RequestFiberSet.d.ts +10 -7
  37. package/dist/RequestFiberSet.d.ts.map +1 -1
  38. package/dist/RequestFiberSet.js +13 -8
  39. package/dist/SQL/Model.d.ts +468 -0
  40. package/dist/SQL/Model.d.ts.map +1 -0
  41. package/dist/SQL/Model.js +469 -0
  42. package/dist/SQL.d.ts +2 -0
  43. package/dist/SQL.d.ts.map +1 -0
  44. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  45. package/dist/ServiceBus.d.ts +61 -0
  46. package/dist/ServiceBus.d.ts.map +1 -0
  47. package/dist/ServiceBus.js +108 -0
  48. package/dist/Store/Cosmos/query.d.ts +15 -4
  49. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  50. package/dist/Store/Cosmos/query.js +179 -41
  51. package/dist/Store/Cosmos.d.ts +3 -3
  52. package/dist/Store/Cosmos.d.ts.map +1 -1
  53. package/dist/Store/Cosmos.js +344 -246
  54. package/dist/Store/Disk.d.ts +5 -5
  55. package/dist/Store/Disk.d.ts.map +1 -1
  56. package/dist/Store/Disk.js +78 -38
  57. package/dist/Store/Memory.d.ts +7 -10
  58. package/dist/Store/Memory.d.ts.map +1 -1
  59. package/dist/Store/Memory.js +326 -66
  60. package/dist/Store/SQL/Pg.d.ts +4 -0
  61. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  62. package/dist/Store/SQL/Pg.js +232 -0
  63. package/dist/Store/SQL/query.d.ts +49 -0
  64. package/dist/Store/SQL/query.d.ts.map +1 -0
  65. package/dist/Store/SQL/query.js +527 -0
  66. package/dist/Store/SQL.d.ts +21 -0
  67. package/dist/Store/SQL.d.ts.map +1 -0
  68. package/dist/Store/SQL.js +449 -0
  69. package/dist/Store/codeFilter.d.ts +5 -5
  70. package/dist/Store/codeFilter.d.ts.map +1 -1
  71. package/dist/Store/codeFilter.js +6 -3
  72. package/dist/Store/index.d.ts +7 -5
  73. package/dist/Store/index.d.ts.map +1 -1
  74. package/dist/Store/index.js +18 -5
  75. package/dist/Store/utils.d.ts +4 -3
  76. package/dist/Store/utils.d.ts.map +1 -1
  77. package/dist/Store/utils.js +5 -5
  78. package/dist/WorkflowEngineCosmos.d.ts +29 -0
  79. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  80. package/dist/WorkflowEngineCosmos.js +521 -0
  81. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  82. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  83. package/dist/WorkflowEngineSqlite.js +550 -0
  84. package/dist/arbs.d.ts +2 -2
  85. package/dist/arbs.d.ts.map +1 -1
  86. package/dist/arbs.js +5 -3
  87. package/dist/codec.d.ts +5 -0
  88. package/dist/codec.d.ts.map +1 -0
  89. package/dist/codec.js +5 -0
  90. package/dist/cosmos-client.d.ts +16 -0
  91. package/dist/cosmos-client.d.ts.map +1 -0
  92. package/dist/cosmos-client.js +11 -0
  93. package/dist/errorReporter.d.ts +7 -5
  94. package/dist/errorReporter.d.ts.map +1 -1
  95. package/dist/errorReporter.js +23 -27
  96. package/dist/errors.d.ts +1 -1
  97. package/dist/fileUtil.d.ts +2 -2
  98. package/dist/fileUtil.d.ts.map +1 -1
  99. package/dist/fileUtil.js +2 -2
  100. package/dist/index.d.ts +3 -2
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +3 -2
  103. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  104. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  105. package/dist/internal/RequestContextMiddleware.js +45 -0
  106. package/dist/internal/auth.d.ts +53 -0
  107. package/dist/internal/auth.d.ts.map +1 -0
  108. package/dist/internal/auth.js +180 -0
  109. package/dist/internal/events.d.ts +11 -0
  110. package/dist/internal/events.d.ts.map +1 -0
  111. package/dist/internal/events.js +49 -0
  112. package/dist/internal/health.d.ts +3 -0
  113. package/dist/internal/health.d.ts.map +1 -0
  114. package/dist/internal/health.js +5 -0
  115. package/dist/layerUtils.d.ts +32 -0
  116. package/dist/layerUtils.d.ts.map +1 -0
  117. package/dist/layerUtils.js +17 -0
  118. package/dist/logger/jsonLogger.d.ts +2 -2
  119. package/dist/logger/jsonLogger.d.ts.map +1 -1
  120. package/dist/logger/jsonLogger.js +5 -3
  121. package/dist/logger/logFmtLogger.d.ts +2 -2
  122. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  123. package/dist/logger/logFmtLogger.js +3 -3
  124. package/dist/logger/shared.d.ts +3 -3
  125. package/dist/logger/shared.d.ts.map +1 -1
  126. package/dist/logger/shared.js +5 -5
  127. package/dist/logger.d.ts +1 -1
  128. package/dist/logger.d.ts.map +1 -1
  129. package/dist/memQueue.d.ts +15 -0
  130. package/dist/memQueue.d.ts.map +1 -0
  131. package/dist/memQueue.js +21 -0
  132. package/dist/middlewares.d.ts +10 -0
  133. package/dist/middlewares.d.ts.map +1 -0
  134. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  135. package/dist/mongo-client.d.ts +11 -0
  136. package/dist/mongo-client.d.ts.map +1 -0
  137. package/dist/mongo-client.js +15 -0
  138. package/dist/otel.d.ts +75 -0
  139. package/dist/otel.d.ts.map +1 -0
  140. package/dist/otel.js +65 -0
  141. package/dist/rateLimit.d.ts +12 -4
  142. package/dist/rateLimit.d.ts.map +1 -1
  143. package/dist/rateLimit.js +7 -12
  144. package/dist/redis-client.d.ts +42 -0
  145. package/dist/redis-client.d.ts.map +1 -0
  146. package/dist/redis-client.js +98 -0
  147. package/dist/reportError.d.ts +4 -0
  148. package/dist/reportError.d.ts.map +1 -0
  149. package/dist/reportError.js +28 -0
  150. package/dist/routing/middleware/RouterMiddleware.d.ts +16 -0
  151. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  152. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  153. package/dist/routing/middleware/middleware.d.ts +48 -0
  154. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  155. package/dist/routing/middleware/middleware.js +128 -0
  156. package/dist/routing/middleware.d.ts +3 -0
  157. package/dist/routing/middleware.d.ts.map +1 -0
  158. package/dist/{api/routing → routing}/middleware.js +1 -2
  159. package/dist/routing/schema/jwt.d.ts +4 -0
  160. package/dist/routing/schema/jwt.d.ts.map +1 -0
  161. package/dist/routing/schema/jwt.js +13 -0
  162. package/dist/routing/tsort.d.ts +8 -0
  163. package/dist/routing/tsort.d.ts.map +1 -0
  164. package/dist/routing/tsort.js +51 -0
  165. package/dist/routing/utils.d.ts +19 -0
  166. package/dist/routing/utils.d.ts.map +1 -0
  167. package/dist/routing/utils.js +45 -0
  168. package/dist/routing.d.ts +184 -0
  169. package/dist/routing.d.ts.map +1 -0
  170. package/dist/routing.js +236 -0
  171. package/dist/test.d.ts +3 -3
  172. package/dist/test.d.ts.map +1 -1
  173. package/dist/test.js +2 -2
  174. package/dist/util.d.ts +3 -0
  175. package/dist/util.d.ts.map +1 -0
  176. package/dist/util.js +14 -0
  177. package/dist/vitest.d.ts +1 -1
  178. package/docs/cluster-storage.md +26 -0
  179. package/docs/workflow-engine.md +262 -0
  180. package/examples/query.ts +47 -39
  181. package/package.json +31 -345
  182. package/run.sh +1 -0
  183. package/src/CUPS.ts +52 -13
  184. package/src/ClusterCosmos.ts +954 -0
  185. package/src/ClusterServiceBus.ts +242 -0
  186. package/src/{api/ContextProvider.ts → ContextProvider.ts} +19 -16
  187. package/src/Emailer/Sendgrid.ts +82 -59
  188. package/src/Emailer/fake.ts +3 -3
  189. package/src/MainFiberSet.ts +12 -10
  190. package/src/QueueMaker/SQLQueue.ts +153 -156
  191. package/src/QueueMaker/errors.ts +3 -1
  192. package/src/QueueMaker/memQueue.ts +113 -107
  193. package/src/QueueMaker/sbqueue.ts +78 -90
  194. package/src/RequestFiberSet.ts +13 -8
  195. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  196. package/src/ServiceBus.ts +219 -0
  197. package/src/Store/Cosmos/query.ts +216 -52
  198. package/src/Store/Cosmos.ts +493 -353
  199. package/src/Store/Disk.ts +109 -69
  200. package/src/Store/Memory.ts +365 -96
  201. package/src/Store/SQL/Pg.ts +363 -0
  202. package/src/Store/SQL/query.ts +603 -0
  203. package/src/Store/SQL.ts +735 -0
  204. package/src/Store/codeFilter.ts +8 -5
  205. package/src/Store/index.ts +21 -6
  206. package/src/Store/utils.ts +26 -24
  207. package/src/WorkflowEngineCosmos.ts +719 -0
  208. package/src/WorkflowEngineSqlite.ts +813 -0
  209. package/src/arbs.ts +5 -3
  210. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  211. package/src/errorReporter.ts +66 -76
  212. package/src/fileUtil.ts +1 -1
  213. package/src/index.ts +2 -1
  214. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  215. package/src/internal/auth.ts +272 -0
  216. package/src/{api/internal → internal}/events.ts +22 -13
  217. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  218. package/src/logger/jsonLogger.ts +4 -2
  219. package/src/logger/logFmtLogger.ts +2 -2
  220. package/src/logger/shared.ts +5 -4
  221. package/src/{adapters/memQueue.ts → memQueue.ts} +5 -4
  222. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  223. package/src/otel.ts +152 -0
  224. package/src/rateLimit.ts +34 -23
  225. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  226. package/src/{api/reportError.ts → reportError.ts} +3 -2
  227. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  228. package/src/{api/routing → routing}/middleware/middleware.ts +62 -17
  229. package/src/routing/middleware.ts +4 -0
  230. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  231. package/src/{api/routing → routing}/utils.ts +2 -1
  232. package/src/routing.ts +768 -0
  233. package/src/test.ts +2 -2
  234. package/test/auth.test.ts +101 -0
  235. package/test/cluster-cosmos.test.ts +503 -0
  236. package/test/cluster-servicebus.test.ts +180 -0
  237. package/test/contextProvider.test.ts +15 -12
  238. package/test/controller.test.ts +28 -32
  239. package/test/cosmos-query.test.ts +159 -0
  240. package/test/dist/_check-agg-infer.test-d.d.ts +2 -0
  241. package/test/dist/_check-agg-infer.test-d.d.ts.map +1 -0
  242. package/test/dist/_check-agg-infer.test-d.js +19 -0
  243. package/test/dist/_check-proj-infer.test-d.d.ts +2 -0
  244. package/test/dist/_check-proj-infer.test-d.d.ts.map +1 -0
  245. package/test/dist/_check-proj-infer.test-d.js +16 -0
  246. package/test/dist/_check-tighten.test-d.d.ts +2 -0
  247. package/test/dist/_check-tighten.test-d.d.ts.map +1 -0
  248. package/test/dist/_check-tighten.test-d.js +21 -0
  249. package/test/dist/auth.test.d.ts.map +1 -0
  250. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  251. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  252. package/test/dist/contextProvider.test.d.ts.map +1 -1
  253. package/test/dist/controller.test.d.ts.map +1 -1
  254. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  255. package/test/dist/date-query.test.d.ts.map +1 -0
  256. package/test/dist/fixtures.d.ts +30 -12
  257. package/test/dist/fixtures.d.ts.map +1 -1
  258. package/test/dist/fixtures.js +17 -10
  259. package/test/dist/query.test.d.ts.map +1 -1
  260. package/test/dist/rawQuery.test.d.ts.map +1 -1
  261. package/test/dist/repository-ext.test.d.ts.map +1 -0
  262. package/test/dist/requires.test.d.ts.map +1 -1
  263. package/test/dist/router-generator.test.d.ts.map +1 -0
  264. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  265. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  266. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  267. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  268. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  269. package/test/dist/sql-store.test.d.ts.map +1 -0
  270. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  271. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  272. package/test/fixtures.ts +16 -9
  273. package/test/layerUtils.test.ts +2 -2
  274. package/test/query.test.ts +905 -40
  275. package/test/rawQuery.test.ts +340 -22
  276. package/test/repository-ext.test.ts +62 -0
  277. package/test/requires.test.ts +10 -5
  278. package/test/router-generator.test.ts +187 -0
  279. package/test/routing-interruptibility.test.ts +66 -0
  280. package/test/rpc-context-map-streaming.test.ts +262 -0
  281. package/test/rpc-e2e-invalidation.test.ts +256 -0
  282. package/test/rpc-multi-middleware.test.ts +85 -10
  283. package/test/rpc-stream-fullstack.test.ts +304 -0
  284. package/test/sql-store.test.ts +1711 -0
  285. package/test/validateSample.test.ts +26 -14
  286. package/test/workflow-engine-cosmos.test.ts +354 -0
  287. package/test/workflow-engine-sqlite.test.ts +299 -0
  288. package/tsconfig.examples.json +1 -1
  289. package/tsconfig.json +2 -1
  290. package/tsconfig.json.bak +2 -2
  291. package/tsconfig.src.json +35 -35
  292. package/tsconfig.test.json +2 -2
  293. package/dist/Emailer/service.d.ts +0 -55
  294. package/dist/Emailer/service.d.ts.map +0 -1
  295. package/dist/Emailer/service.js +0 -6
  296. package/dist/Emailer.d.ts +0 -2
  297. package/dist/Emailer.d.ts.map +0 -1
  298. package/dist/Emailer.js +0 -2
  299. package/dist/Model/Repository/ext.d.ts +0 -41
  300. package/dist/Model/Repository/ext.d.ts.map +0 -1
  301. package/dist/Model/Repository/ext.js +0 -65
  302. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  303. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  304. package/dist/Model/Repository/internal/internal.js +0 -316
  305. package/dist/Model/Repository/legacy.d.ts +0 -19
  306. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  307. package/dist/Model/Repository/legacy.js +0 -2
  308. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  309. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  310. package/dist/Model/Repository/makeRepo.js +0 -24
  311. package/dist/Model/Repository/service.d.ts +0 -89
  312. package/dist/Model/Repository/service.d.ts.map +0 -1
  313. package/dist/Model/Repository/service.js +0 -2
  314. package/dist/Model/Repository/validation.d.ts +0 -42
  315. package/dist/Model/Repository/validation.d.ts.map +0 -1
  316. package/dist/Model/Repository/validation.js +0 -32
  317. package/dist/Model/Repository.d.ts +0 -6
  318. package/dist/Model/Repository.d.ts.map +0 -1
  319. package/dist/Model/Repository.js +0 -6
  320. package/dist/Model/dsl.d.ts +0 -32
  321. package/dist/Model/dsl.d.ts.map +0 -1
  322. package/dist/Model/dsl.js +0 -44
  323. package/dist/Model/filter/filterApi.d.ts +0 -30
  324. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  325. package/dist/Model/filter/filterApi.js +0 -2
  326. package/dist/Model/filter/types/errors.d.ts +0 -29
  327. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  328. package/dist/Model/filter/types/errors.js +0 -2
  329. package/dist/Model/filter/types/fields.d.ts +0 -15
  330. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  331. package/dist/Model/filter/types/fields.js +0 -2
  332. package/dist/Model/filter/types/path/common.d.ts +0 -316
  333. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  334. package/dist/Model/filter/types/path/common.js +0 -2
  335. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  336. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  337. package/dist/Model/filter/types/path/eager.js +0 -31
  338. package/dist/Model/filter/types/path/index.d.ts +0 -4
  339. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  340. package/dist/Model/filter/types/path/index.js +0 -3
  341. package/dist/Model/filter/types/utils.d.ts +0 -79
  342. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  343. package/dist/Model/filter/types/utils.js +0 -2
  344. package/dist/Model/filter/types/validator.d.ts +0 -30
  345. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  346. package/dist/Model/filter/types/validator.js +0 -2
  347. package/dist/Model/filter/types.d.ts +0 -5
  348. package/dist/Model/filter/types.d.ts.map +0 -1
  349. package/dist/Model/filter/types.js +0 -7
  350. package/dist/Model/query/dsl.d.ts +0 -248
  351. package/dist/Model/query/dsl.d.ts.map +0 -1
  352. package/dist/Model/query/dsl.js +0 -104
  353. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  354. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  355. package/dist/Model/query/new-kid-interpreter.js +0 -165
  356. package/dist/Model/query.d.ts +0 -15
  357. package/dist/Model/query.d.ts.map +0 -1
  358. package/dist/Model/query.js +0 -3
  359. package/dist/Model.d.ts +0 -4
  360. package/dist/Model.d.ts.map +0 -1
  361. package/dist/Model.js +0 -4
  362. package/dist/Operations.d.ts +0 -55
  363. package/dist/Operations.d.ts.map +0 -1
  364. package/dist/Operations.js +0 -102
  365. package/dist/OperationsRepo.d.ts +0 -41
  366. package/dist/OperationsRepo.d.ts.map +0 -1
  367. package/dist/OperationsRepo.js +0 -14
  368. package/dist/QueueMaker/service.d.ts +0 -11
  369. package/dist/QueueMaker/service.d.ts.map +0 -1
  370. package/dist/QueueMaker/service.js +0 -4
  371. package/dist/RequestContext.d.ts +0 -63
  372. package/dist/RequestContext.d.ts.map +0 -1
  373. package/dist/RequestContext.js +0 -49
  374. package/dist/Store/ContextMapContainer.d.ts +0 -14
  375. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  376. package/dist/Store/ContextMapContainer.js +0 -16
  377. package/dist/Store/service.d.ts +0 -108
  378. package/dist/Store/service.d.ts.map +0 -1
  379. package/dist/Store/service.js +0 -71
  380. package/dist/Store.d.ts +0 -2
  381. package/dist/Store.d.ts.map +0 -1
  382. package/dist/Store.js +0 -2
  383. package/dist/adapters/SQL/Model.d.ts +0 -479
  384. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  385. package/dist/adapters/SQL/Model.js +0 -478
  386. package/dist/adapters/SQL.d.ts +0 -2
  387. package/dist/adapters/SQL.d.ts.map +0 -1
  388. package/dist/adapters/ServiceBus.d.ts +0 -58
  389. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  390. package/dist/adapters/ServiceBus.js +0 -99
  391. package/dist/adapters/cosmos-client.d.ts +0 -14
  392. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  393. package/dist/adapters/cosmos-client.js +0 -9
  394. package/dist/adapters/index.d.ts +0 -2
  395. package/dist/adapters/index.d.ts.map +0 -1
  396. package/dist/adapters/index.js +0 -2
  397. package/dist/adapters/logger.d.ts +0 -9
  398. package/dist/adapters/logger.d.ts.map +0 -1
  399. package/dist/adapters/logger.js +0 -3
  400. package/dist/adapters/memQueue.d.ts +0 -13
  401. package/dist/adapters/memQueue.d.ts.map +0 -1
  402. package/dist/adapters/memQueue.js +0 -20
  403. package/dist/adapters/mongo-client.d.ts +0 -10
  404. package/dist/adapters/mongo-client.d.ts.map +0 -1
  405. package/dist/adapters/mongo-client.js +0 -13
  406. package/dist/adapters/redis-client.d.ts +0 -39
  407. package/dist/adapters/redis-client.d.ts.map +0 -1
  408. package/dist/adapters/redis-client.js +0 -94
  409. package/dist/api/ContextProvider.d.ts +0 -31
  410. package/dist/api/ContextProvider.d.ts.map +0 -1
  411. package/dist/api/ContextProvider.js +0 -38
  412. package/dist/api/codec.d.ts +0 -5
  413. package/dist/api/codec.d.ts.map +0 -1
  414. package/dist/api/codec.js +0 -5
  415. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  416. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  417. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  418. package/dist/api/internal/auth.d.ts +0 -15
  419. package/dist/api/internal/auth.d.ts.map +0 -1
  420. package/dist/api/internal/auth.js +0 -47
  421. package/dist/api/internal/events.d.ts +0 -9
  422. package/dist/api/internal/events.d.ts.map +0 -1
  423. package/dist/api/internal/events.js +0 -42
  424. package/dist/api/internal/health.d.ts +0 -3
  425. package/dist/api/internal/health.d.ts.map +0 -1
  426. package/dist/api/internal/health.js +0 -5
  427. package/dist/api/layerUtils.d.ts +0 -24
  428. package/dist/api/layerUtils.d.ts.map +0 -1
  429. package/dist/api/layerUtils.js +0 -16
  430. package/dist/api/middlewares.d.ts +0 -10
  431. package/dist/api/middlewares.d.ts.map +0 -1
  432. package/dist/api/reportError.d.ts +0 -4
  433. package/dist/api/reportError.d.ts.map +0 -1
  434. package/dist/api/reportError.js +0 -27
  435. package/dist/api/routing/middleware/RouterMiddleware.d.ts +0 -15
  436. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  437. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  438. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  439. package/dist/api/routing/middleware/middleware.js +0 -92
  440. package/dist/api/routing/middleware.d.ts +0 -4
  441. package/dist/api/routing/middleware.d.ts.map +0 -1
  442. package/dist/api/routing/schema/jwt.d.ts +0 -4
  443. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  444. package/dist/api/routing/schema/jwt.js +0 -12
  445. package/dist/api/routing/tsort.d.ts +0 -8
  446. package/dist/api/routing/tsort.d.ts.map +0 -1
  447. package/dist/api/routing/tsort.js +0 -51
  448. package/dist/api/routing/utils.d.ts +0 -19
  449. package/dist/api/routing/utils.d.ts.map +0 -1
  450. package/dist/api/routing/utils.js +0 -44
  451. package/dist/api/routing.d.ts +0 -138
  452. package/dist/api/routing.d.ts.map +0 -1
  453. package/dist/api/routing.js +0 -166
  454. package/dist/api/setupRequest.d.ts +0 -12
  455. package/dist/api/setupRequest.d.ts.map +0 -1
  456. package/dist/api/setupRequest.js +0 -44
  457. package/dist/api/util.d.ts +0 -3
  458. package/dist/api/util.d.ts.map +0 -1
  459. package/dist/api/util.js +0 -14
  460. package/eslint.config.mjs +0 -24
  461. package/src/Emailer/service.ts +0 -52
  462. package/src/Emailer.ts +0 -1
  463. package/src/Model/Repository/ext.ts +0 -283
  464. package/src/Model/Repository/internal/internal.ts +0 -577
  465. package/src/Model/Repository/legacy.ts +0 -27
  466. package/src/Model/Repository/makeRepo.ts +0 -139
  467. package/src/Model/Repository/service.ts +0 -627
  468. package/src/Model/Repository/validation.ts +0 -31
  469. package/src/Model/Repository.ts +0 -5
  470. package/src/Model/dsl.ts +0 -128
  471. package/src/Model/filter/filterApi.ts +0 -60
  472. package/src/Model/filter/types/errors.ts +0 -47
  473. package/src/Model/filter/types/fields.ts +0 -50
  474. package/src/Model/filter/types/path/common.ts +0 -404
  475. package/src/Model/filter/types/path/eager.ts +0 -298
  476. package/src/Model/filter/types/path/index.ts +0 -4
  477. package/src/Model/filter/types/utils.ts +0 -128
  478. package/src/Model/filter/types/validator.ts +0 -46
  479. package/src/Model/filter/types.ts +0 -6
  480. package/src/Model/query/dsl.ts +0 -2110
  481. package/src/Model/query/new-kid-interpreter.ts +0 -210
  482. package/src/Model/query.ts +0 -13
  483. package/src/Model.ts +0 -3
  484. package/src/Operations.ts +0 -235
  485. package/src/OperationsRepo.ts +0 -16
  486. package/src/QueueMaker/service.ts +0 -17
  487. package/src/RequestContext.ts +0 -63
  488. package/src/Store/ContextMapContainer.ts +0 -20
  489. package/src/Store/service.ts +0 -184
  490. package/src/Store.ts +0 -1
  491. package/src/adapters/ServiceBus.ts +0 -209
  492. package/src/adapters/index.ts +0 -0
  493. package/src/adapters/logger.ts +0 -3
  494. package/src/api/internal/auth.ts +0 -68
  495. package/src/api/routing/middleware.ts +0 -6
  496. package/src/api/routing.ts +0 -598
  497. package/src/api/setupRequest.ts +0 -84
  498. /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
  499. /package/src/{api/codec.ts → codec.ts} +0 -0
  500. /package/src/{api/internal → internal}/health.ts +0 -0
  501. /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
  502. /package/src/{api/routing → routing}/tsort.ts +0 -0
  503. /package/src/{api/util.ts → util.ts} +0 -0
@@ -0,0 +1,180 @@
1
+ import type { ServiceBusMessage, ServiceBusReceiverOptions } from "@azure/service-bus"
2
+ import { assert, describe, it } from "@effect/vitest"
3
+ import { Context, Effect, Layer, Option, Schema, Stream } from "effect"
4
+ import { ClusterSchema, EntityAddress, EntityId, EntityType, Envelope, Message, MessageStorage, Runners, ShardId, Sharding, ShardingConfig, Snowflake } from "effect/unstable/cluster"
5
+ import { Headers } from "effect/unstable/http"
6
+ import { Rpc } from "effect/unstable/rpc"
7
+ import { type ClusterServiceBusClient, layerClientFrom, layerRunners, makeStoragePoller } from "../src/ClusterServiceBus.js"
8
+
9
+ describe("ClusterServiceBus", () => {
10
+ it.effect("wakes storage polling from topic notifications", () =>
11
+ Effect.gen(function*() {
12
+ let processMessage: (() => Promise<void>) | undefined
13
+ let polls = 0
14
+ let receiverClosed = false
15
+ let subscriptionClosed = false
16
+
17
+ const client: ClusterServiceBusClient = {
18
+ createSender() {
19
+ throw new Error("unused")
20
+ },
21
+ createReceiver(topicName: string, subscriptionName: string, options?: ServiceBusReceiverOptions) {
22
+ assert.strictEqual(topicName, "cluster-notifications")
23
+ assert.strictEqual(subscriptionName, "runner-a")
24
+ assert.strictEqual(options?.receiveMode, "receiveAndDelete")
25
+ return {
26
+ subscribe(handlers) {
27
+ processMessage = handlers.processMessage
28
+ return {
29
+ close() {
30
+ subscriptionClosed = true
31
+ return Promise.resolve()
32
+ }
33
+ }
34
+ },
35
+ close() {
36
+ receiverClosed = true
37
+ return Promise.resolve()
38
+ }
39
+ }
40
+ },
41
+ close() {
42
+ return Promise.resolve()
43
+ }
44
+ }
45
+
46
+ const sharding = Sharding.Sharding.of({
47
+ activeEntityCount: Effect.succeed(0),
48
+ getRegistrationEvents: Stream.empty,
49
+ getShardId: () => ShardId.make("cluster-servicebus", 0),
50
+ getSnowflake: Effect.succeed(Snowflake.Snowflake(1n)),
51
+ hasShardId: () => false,
52
+ isShutdown: Effect.succeed(false),
53
+ makeClient: () => Effect.die("unused"),
54
+ notify: () => Effect.void,
55
+ pollStorage: Effect.sync(() => {
56
+ polls++
57
+ }),
58
+ registerEntity: () => Effect.void,
59
+ registerSingleton: () => Effect.void,
60
+ reset: () => Effect.succeed(false),
61
+ send: () => Effect.void,
62
+ sendOutgoing: () => Effect.void
63
+ })
64
+
65
+ yield* Effect
66
+ .scoped(
67
+ makeStoragePoller({
68
+ topicName: "cluster-notifications",
69
+ subscriptionName: "runner-a"
70
+ })
71
+ .pipe(
72
+ Effect.andThen(
73
+ Effect.gen(function*() {
74
+ if (processMessage === undefined) {
75
+ return yield* Effect.die("missing Service Bus subscription")
76
+ }
77
+ const runProcessMessage = processMessage
78
+ yield* Effect.promise(() => runProcessMessage())
79
+ assert.strictEqual(polls, 1)
80
+ })
81
+ )
82
+ )
83
+ )
84
+ .pipe(
85
+ Effect.provide(layerClientFrom(client)),
86
+ Effect.provide(Layer.succeed(Sharding.Sharding)(sharding))
87
+ )
88
+
89
+ assert.strictEqual(subscriptionClosed, true)
90
+ assert.strictEqual(receiverClosed, true)
91
+ }))
92
+
93
+ it.effect("publishes persisted storage notifications", () =>
94
+ Effect.gen(function*() {
95
+ const sent: Array<ServiceBusMessage> = []
96
+ let senderClosed = false
97
+
98
+ const client: ClusterServiceBusClient = {
99
+ createSender(topicName) {
100
+ assert.strictEqual(topicName, "cluster-notifications")
101
+ return {
102
+ sendMessages(message) {
103
+ sent.push(message)
104
+ return Promise.resolve()
105
+ },
106
+ close() {
107
+ senderClosed = true
108
+ return Promise.resolve()
109
+ }
110
+ }
111
+ },
112
+ createReceiver() {
113
+ throw new Error("unused")
114
+ },
115
+ close() {
116
+ return Promise.resolve()
117
+ }
118
+ }
119
+
120
+ yield* Effect.scoped(
121
+ Effect
122
+ .gen(function*() {
123
+ const runners = yield* Runners.Runners
124
+ yield* runners.notify({
125
+ address: Option.none(),
126
+ discard: true,
127
+ message: yield* makeOutgoingRequest
128
+ })
129
+ })
130
+ .pipe(
131
+ Effect.provide(layerRunners({ topicName: "cluster-notifications" })),
132
+ Effect.provide(layerClientFrom(client)),
133
+ Effect.provide(MessageStorage.layerNoop),
134
+ Effect.provide(ShardingConfig.layerDefaults)
135
+ )
136
+ )
137
+
138
+ assert.strictEqual(senderClosed, true)
139
+ assert.strictEqual(sent.length, 1)
140
+ assert.deepStrictEqual(sent[0]?.body, {
141
+ _tag: "EffectClusterStorageNotification",
142
+ envelopeId: "1",
143
+ requestId: "1",
144
+ shardId: "cluster-servicebus:1",
145
+ entityType: "TestEntity",
146
+ entityId: "entity-1"
147
+ })
148
+ assert.strictEqual(sent[0]?.contentType, "application/json")
149
+ assert.strictEqual(sent[0]?.correlationId, "1")
150
+ assert.strictEqual(sent[0]?.messageId, "1")
151
+ assert.strictEqual(sent[0]?.subject, "EffectClusterStorageNotification")
152
+ }))
153
+ })
154
+
155
+ const TestRpc = Rpc
156
+ .make("TestRpc", {
157
+ payload: { id: Schema.Number }
158
+ })
159
+ .annotate(ClusterSchema.Persisted, true)
160
+
161
+ const makeOutgoingRequest = Effect.sync(() =>
162
+ new Message.OutgoingRequest({
163
+ annotations: TestRpc.annotations,
164
+ context: Context.empty(),
165
+ envelope: Envelope.makeRequest<typeof TestRpc>({
166
+ address: EntityAddress.make({
167
+ entityId: EntityId.make("entity-1"),
168
+ entityType: EntityType.make("TestEntity"),
169
+ shardId: ShardId.make("cluster-servicebus", 1)
170
+ }),
171
+ headers: Headers.empty,
172
+ payload: { id: 1 },
173
+ requestId: Snowflake.Snowflake(1n),
174
+ tag: TestRpc._tag
175
+ }),
176
+ lastReceivedReply: Option.none(),
177
+ respond: () => Effect.void,
178
+ rpc: TestRpc
179
+ })
180
+ )
@@ -1,12 +1,15 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
3
  import { expectTypeOf, it } from "@effect/vitest"
4
- import { Effect, Layer, Scope, ServiceMap } from "effect-app"
5
- import { ContextProvider, mergeContextProviders, MergedContextProvider } from "../src/api/ContextProvider.js"
4
+ import * as Context from "effect-app/Context"
5
+ import * as Effect from "effect-app/Effect"
6
+ import * as Layer from "effect-app/Layer"
7
+ import * as Scope from "effect/Scope"
8
+ import { ContextProvider, mergeContextProviders, MergedContextProvider } from "../src/ContextProvider.js"
6
9
  import { CustomError1, Some, SomeElse, SomeService } from "./fixtures.js"
7
10
 
8
11
  // @effect-diagnostics-next-line missingEffectServiceDependency:off
9
- class MyContextProvider extends ServiceMap.Service<MyContextProvider>()(
12
+ class MyContextProvider extends Context.Service<MyContextProvider>()(
10
13
  "MyContextProvider",
11
14
  {
12
15
  make: Effect.gen(function*() {
@@ -20,7 +23,7 @@ class MyContextProvider extends ServiceMap.Service<MyContextProvider>()(
20
23
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
21
24
  yield* Effect.succeed("this is a generator")
22
25
 
23
- return Some.serviceMap({ a: 1 })
26
+ return Some.context({ a: 1 })
24
27
  })
25
28
  })
26
29
  }
@@ -28,7 +31,7 @@ class MyContextProvider extends ServiceMap.Service<MyContextProvider>()(
28
31
  static readonly Default = Layer.effect(this, this.make)
29
32
  }
30
33
 
31
- class MyContextProvider2 extends ServiceMap.Service<MyContextProvider2>()(
34
+ class MyContextProvider2 extends Context.Service<MyContextProvider2>()(
32
35
  "MyContextProvider2",
33
36
  {
34
37
  make: Effect.gen(function*() {
@@ -37,7 +40,7 @@ class MyContextProvider2 extends ServiceMap.Service<MyContextProvider2>()(
37
40
  return Effect.gen(function*() {
38
41
  // we test without dependencies, so that we end up with an R of never.
39
42
 
40
- return SomeElse.serviceMap({ b: 2 })
43
+ return SomeElse.context({ b: 2 })
41
44
  })
42
45
  })
43
46
  }
@@ -45,7 +48,7 @@ class MyContextProvider2 extends ServiceMap.Service<MyContextProvider2>()(
45
48
  static readonly Default = Layer.effect(this, this.make)
46
49
  }
47
50
 
48
- class MyContextProvider2Gen extends ServiceMap.Service<MyContextProvider2Gen>()(
51
+ class MyContextProvider2Gen extends Context.Service<MyContextProvider2Gen>()(
49
52
  "MyContextProvider2Gen",
50
53
  {
51
54
  make: Effect.gen(function*() {
@@ -54,7 +57,7 @@ class MyContextProvider2Gen extends ServiceMap.Service<MyContextProvider2Gen>()(
54
57
  return function*() {
55
58
  // we test without dependencies, so that we end up with an R of never
56
59
 
57
- return SomeElse.serviceMap({ b: 2 })
60
+ return SomeElse.context({ b: 2 })
58
61
  }
59
62
  })
60
63
  }
@@ -63,7 +66,7 @@ class MyContextProvider2Gen extends ServiceMap.Service<MyContextProvider2Gen>()(
63
66
  }
64
67
 
65
68
  // @effect-diagnostics-next-line missingEffectServiceDependency:off
66
- class MyContextProviderGen extends ServiceMap.Service<MyContextProviderGen>()(
69
+ class MyContextProviderGen extends Context.Service<MyContextProviderGen>()(
67
70
  "MyContextProviderGen",
68
71
  {
69
72
  make: Effect.gen(function*() {
@@ -77,7 +80,7 @@ class MyContextProviderGen extends ServiceMap.Service<MyContextProviderGen>()(
77
80
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
78
81
  yield* Effect.succeed("this is a generator")
79
82
 
80
- return Some.serviceMap({ a: 1 })
83
+ return Some.context({ a: 1 })
81
84
  }
82
85
  })
83
86
  }
@@ -100,7 +103,7 @@ export const someContextProvider = ContextProvider({
100
103
  // currently the effectful context provider cannot trigger an error when building the per request context
101
104
  // if (Math.random() > 0.5) return yield* new CustomError2()
102
105
 
103
- return Some.serviceMap({ a: 1 })
106
+ return Some.context({ a: 1 })
104
107
  })
105
108
  })
106
109
  })
@@ -119,7 +122,7 @@ export const someContextProviderGen = ContextProvider({
119
122
  // currently the effectful context provider cannot trigger an error when building the per request context
120
123
  // if (Math.random() > 0.5) return yield* new CustomError2()
121
124
 
122
- return Some.serviceMap({ a: 1 })
125
+ return Some.context({ a: 1 })
123
126
  }
124
127
  })
125
128
  })
@@ -1,16 +1,20 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
- import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/api/routing"
3
+ import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/routing"
4
4
  import { expect, expectTypeOf, it } from "@effect/vitest"
5
- import { Effect, Layer, S, Scope, ServiceMap } from "effect-app"
6
5
  import { InvalidStateError, makeRpcClient, UnauthorizedError } from "effect-app/client"
6
+ import * as Context from "effect-app/Context"
7
+ import * as Effect from "effect-app/Effect"
8
+ import * as Layer from "effect-app/Layer"
7
9
  import { DefaultGenericMiddlewares } from "effect-app/middleware"
8
10
  import * as RpcX from "effect-app/rpc"
9
11
  import { MiddlewareMaker } from "effect-app/rpc"
12
+ import * as S from "effect-app/Schema"
10
13
  import { TypeTestId } from "effect-app/TypeTest"
14
+ import * as Scope from "effect/Scope"
11
15
  import { type RpcSerialization } from "effect/unstable/rpc"
12
- import { DefaultGenericMiddlewaresLive, DevModeMiddlewareLive } from "../src/api/routing/middleware.js"
13
- import { sort } from "../src/api/routing/tsort.js"
16
+ import { DefaultGenericMiddlewaresLive, DevModeMiddlewareLive } from "../src/routing/middleware.js"
17
+ import { sort } from "../src/routing/tsort.js"
14
18
  import { AllowAnonymous, AllowAnonymousLive, CustomError1, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElse, SomeService, Test, TestLive } from "./fixtures.js"
15
19
 
16
20
  class MyContextProvider extends RpcX.RpcMiddleware.Tag<MyContextProvider, {
@@ -99,7 +103,7 @@ class MyContextProvider2
99
103
 
100
104
  //
101
105
 
102
- class Str extends ServiceMap.Service<Str, "str">()("str") {}
106
+ class Str extends Context.Service<Str, "str">()("str") {}
103
107
 
104
108
  export class BogusMiddleware extends RpcX.RpcMiddleware.Tag<BogusMiddleware>()("BogusMiddleware") {
105
109
  static Default = Layer.make(this, {
@@ -188,13 +192,6 @@ const middlewareQuater = MiddlewareMaker
188
192
 
189
193
  expectTypeOf(middleware["Service"]).toEqualTypeOf<typeof middlewareQuater["Service"]>()
190
194
 
191
- const middleware2 = MiddlewareMaker
192
- .Tag()("middleware", RequestContextMap)
193
- .middleware(MyContextProvider)
194
- .middleware(RequireRoles, Test)
195
- .middleware(AllowAnonymous)
196
- .middleware(...DefaultGenericMiddlewares, BogusMiddleware, MyContextProvider2)
197
-
198
195
  export const middleware3 = MiddlewareMaker
199
196
  .Tag()("middleware", RequestContextMap)
200
197
  .middleware(...genericMiddlewares)
@@ -202,14 +199,17 @@ export const middleware3 = MiddlewareMaker
202
199
  .middleware(Test)
203
200
  .middleware(BogusMiddleware)
204
201
 
205
- export const { TaggedRequest: Req } = makeRpcClient(RequestContextMap)
202
+ export const { TaggedRequestFor } = makeRpcClient(middleware)
203
+ const Req = TaggedRequestFor("Something")
204
+ const Command = Req.Command
205
+ const Query = Req.Query
206
206
 
207
- export class Eff extends Req<Eff>()("Eff", {}, { success: S.Void }) {}
208
- export class Gen extends Req<Gen>()("Gen", {}) {}
207
+ export class Eff extends Command<Eff>()("Eff", {}, { success: S.Void }) {}
208
+ export class Gen extends Command<Gen>()("Gen", {}) {}
209
209
 
210
210
  expectTypeOf(Eff.error).toEqualTypeOf<typeof Gen.error>()
211
211
 
212
- export class DoSomething extends Req<DoSomething>()("DoSomething", {
212
+ export class DoSomething extends Command<DoSomething>()("DoSomething", {
213
213
  id: S.String
214
214
  }, { success: S.Void }) {}
215
215
 
@@ -227,20 +227,20 @@ export class DoSomething extends Req<DoSomething>()("DoSomething", {
227
227
  // )
228
228
  // )
229
229
 
230
- export class GetSomething extends Req<GetSomething>()("GetSomething", {
230
+ export class GetSomething extends Query<GetSomething>()("GetSomething", {
231
231
  id: S.String
232
- }, { success: S.String }) {}
232
+ }, { success: S.String, error: UnauthorizedError }) {}
233
233
 
234
- export class GetSomething2 extends Req<GetSomething2>()("GetSomething2", {
234
+ export class GetSomething2 extends Query<GetSomething2>()("GetSomething2", {
235
235
  id: S.String
236
- }, { success: S.NumberFromString }) {}
236
+ }, { success: S.FiniteFromString }) {}
237
237
 
238
- const Something = { Eff, Gen, DoSomething, GetSomething, GetSomething2, meta: { moduleName: "Something" as const } }
238
+ const Something = { Eff, Gen, DoSomething, GetSomething, GetSomething2 }
239
239
 
240
240
  // const client = ApiClientFactory.makeFor(Layer.empty)(Something)
241
241
  // client.pipe(Effect.map(c => c.DoSomething.name))
242
242
 
243
- export class SomethingService extends ServiceMap.Service<SomethingService>()(
243
+ export class SomethingService extends Context.Service<SomethingService>()(
244
244
  "SomethingService",
245
245
  {
246
246
  make: Effect.gen(function*() {
@@ -260,7 +260,7 @@ declare const a: {
260
260
  (opt: { b: 3 }): void
261
261
  }
262
262
 
263
- export class SomethingRepo extends ServiceMap.Service<SomethingRepo>()(
263
+ export class SomethingRepo extends Context.Service<SomethingRepo>()(
264
264
  "SomethingRepo",
265
265
  {
266
266
  make: Effect.gen(function*() {
@@ -273,7 +273,7 @@ export class SomethingRepo extends ServiceMap.Service<SomethingRepo>()(
273
273
  static Default = Layer.effect(this, this.make).pipe(Layer.provide(SomethingService.Default))
274
274
  }
275
275
 
276
- export class SomethingService2 extends ServiceMap.Service<SomethingService2>()(
276
+ export class SomethingService2 extends Context.Service<SomethingService2>()(
277
277
  "SomethingService2",
278
278
  {
279
279
  make: Effect.gen(function*() {
@@ -284,13 +284,9 @@ export class SomethingService2 extends ServiceMap.Service<SomethingService2>()(
284
284
  static Default = Layer.effect(this, this.make)
285
285
  }
286
286
 
287
- export const { Router, matchAll } = makeRouter(
288
- middleware
289
- )
287
+ export const { Router, matchAll } = makeRouter(middleware.Default)
290
288
 
291
- export const r2 = makeRouter(
292
- Object.assign(middleware2, { Default: middleware2.layer.pipe(Layer.provide([...MiddlewaresLive])) })
293
- )
289
+ export const r2 = makeRouter(middleware.Default)
294
290
 
295
291
  const router = Router(Something)({
296
292
  dependencies: [
@@ -348,7 +344,7 @@ const router = Router(Something)({
348
344
  }
349
345
  },
350
346
  GetSomething2: {
351
- raw: Some.use(() => Effect.succeed("12"))
347
+ raw: () => Some.use(() => Effect.succeed("12"))
352
348
  }
353
349
  })
354
350
  }
@@ -413,7 +409,7 @@ const router2 = r2.Router(Something)({
413
409
  }
414
410
  },
415
411
  GetSomething2: {
416
- raw: Some.use(() => Effect.succeed("12"))
412
+ raw: () => Some.use(() => Effect.succeed("12"))
417
413
  }
418
414
  })
419
415
  }
@@ -0,0 +1,159 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { and, computed, make, projectComputed, relation, toFilter, where } from "effect-app/Model/query"
3
+ import * as S from "effect-app/Schema"
4
+ import { describe, expect, it } from "vitest"
5
+ import { buildWhereCosmosQuery3 } from "../src/Store/Cosmos/query.js"
6
+
7
+ class Order extends S.Class<Order>("Order")({
8
+ id: S.String,
9
+ packages: S.Array(S.Struct({ id: S.String, weight: S.Finite }))
10
+ }) {}
11
+
12
+ type OrderEnc = S.Codec.Encoded<typeof Order>
13
+
14
+ // Length projection via `relation(...).length()` should emit a scalar
15
+ // ARRAY_LENGTH expression rather than pulling (or reshaping) the array.
16
+ describe("cosmos query projection: array length", () => {
17
+ it("projects packages length via ARRAY_LENGTH", () => {
18
+ const q = make<OrderEnc>().pipe(
19
+ projectComputed(
20
+ S.Struct({ id: S.String, packageCount: S.NonNegativeInt }),
21
+ computed({ packageCount: relation<OrderEnc>("packages").length() })
22
+ )
23
+ )
24
+
25
+ const ir = toFilter(q as any, Order as any)
26
+
27
+ const result = buildWhereCosmosQuery3(
28
+ "id",
29
+ ir.filter ?? [],
30
+ "Orders",
31
+ {},
32
+ ir.select as any
33
+ )
34
+
35
+ expect(result.query).toMatch(/ARRAY_LENGTH\(f(?:\.packages|\["packages"\])\)/)
36
+ expect(result.query).toContain("AS packageCount")
37
+ // Must not pull the full array nor reshape via subquery
38
+ expect(result.query).not.toMatch(/ARRAY\s*\(\s*SELECT[^)]*FROM\s+t\s+in\s+f[\.\["]/i)
39
+ expect(result.query).not.toMatch(/SELECT VALUE COUNT/)
40
+ })
41
+ })
42
+
43
+ // Regression: `relation-every` previously walked its filter twice (once for the
44
+ // shared `where` variable, once for the NOT-EXISTS branch), double-bumping the
45
+ // shared `i` counter and shifting every subsequent @v index against the bound
46
+ // params array. Verify each filter element binds exactly one parameter and that
47
+ // @v indices in the emitted SQL line up with the bindings.
48
+ describe("cosmos query projection: relation-every parameter binding", () => {
49
+ class Item extends S.Class<Item>("Item")({
50
+ state: S.Struct({ _tag: S.Literals(["initial", "picking", "picked", "packed"]) })
51
+ }) {}
52
+ class DN extends S.Class<DN>("DN")({
53
+ id: S.String,
54
+ state: S.Struct({
55
+ _tag: S.Literals(["initial", "valid", "packed", "closed"]),
56
+ at: S.String
57
+ }),
58
+ items: S.Array(Item)
59
+ }) {}
60
+ type DNEnc = S.Codec.Encoded<typeof DN>
61
+
62
+ it("binds @v indices contiguously across every + main filter", () => {
63
+ const q = make<DNEnc>().pipe(
64
+ where("state.at", "gte", "2026-05-01T00:00:00.000Z"),
65
+ and("state._tag", "neq", "closed"),
66
+ projectComputed(
67
+ S.Struct({
68
+ id: S.String,
69
+ allItemsPicked: S.Boolean,
70
+ allItemsPacked: S.Boolean
71
+ }),
72
+ computed({
73
+ allItemsPicked: relation<DNEnc>("items").every(where("state._tag", "picked")),
74
+ allItemsPacked: relation<DNEnc>("items").every(where("state._tag", "packed"))
75
+ })
76
+ )
77
+ )
78
+
79
+ const ir = toFilter(q as any, DN as any)
80
+ const result = buildWhereCosmosQuery3("id", ir.filter ?? [], "DN", {}, ir.select as any)
81
+
82
+ // Each filter element binds exactly one parameter: 2 every filters + 2 main filter = 4.
83
+ expect(result.parameters).toHaveLength(4)
84
+ expect(result.parameters.map((_) => _.value)).toEqual([
85
+ "picked",
86
+ "packed",
87
+ "2026-05-01T00:00:00.000Z",
88
+ "closed"
89
+ ])
90
+
91
+ // SQL must reference exactly @v0..@v3 in order, no gaps, no overruns.
92
+ const refs = [...result.query.matchAll(/@v\d+/g)].map((m) => m[0])
93
+ expect(refs).toEqual(["@v0", "@v1", "@v2", "@v3"])
94
+ })
95
+ })
96
+
97
+ describe("cosmos query: aggregate (GROUP BY + agg functions)", () => {
98
+ it("generates GROUP BY and SUM(IIF(...)) for agg-count-when", () => {
99
+ const result = buildWhereCosmosQuery3(
100
+ "id",
101
+ [],
102
+ "Orders",
103
+ {},
104
+ [
105
+ { key: "city", path: "address.city" },
106
+ {
107
+ key: "activeCount",
108
+ aggregate: {
109
+ _tag: "agg-count-when",
110
+ filter: [{ t: "where", path: "status", op: "eq", value: "active" }]
111
+ }
112
+ },
113
+ { key: "total", aggregate: { _tag: "agg-count" } }
114
+ ] as any
115
+ )
116
+
117
+ expect(result.query).toContain("GROUP BY")
118
+ expect(result.query).toContain("SUM(IIF(")
119
+ expect(result.query).toContain("COUNT(1) AS total")
120
+ expect(result.query).toContain("AS city")
121
+ expect(result.parameters[0]!.value).toBe("active")
122
+ })
123
+
124
+ it("generates agg-sum / agg-min / agg-max expressions", () => {
125
+ const result = buildWhereCosmosQuery3(
126
+ "id",
127
+ [],
128
+ "Orders",
129
+ {},
130
+ [
131
+ { key: "dept", path: "dept" },
132
+ { key: "totalSalary", aggregate: { _tag: "agg-sum", field: "salary" } },
133
+ { key: "minSalary", aggregate: { _tag: "agg-min", field: "salary" } },
134
+ { key: "maxSalary", aggregate: { _tag: "agg-max", field: "salary" } }
135
+ ] as any
136
+ )
137
+
138
+ expect(result.query).toContain(`SUM(f["salary"]) AS totalSalary`)
139
+ expect(result.query).toContain(`MIN(f["salary"]) AS minSalary`)
140
+ expect(result.query).toContain(`MAX(f["salary"]) AS maxSalary`)
141
+ expect(result.query).toMatch(/GROUP BY f(?:\.dept|\["dept"\])/)
142
+ })
143
+
144
+ it("generates correct GROUP BY for nested path field", () => {
145
+ const result = buildWhereCosmosQuery3(
146
+ "id",
147
+ [],
148
+ "Orders",
149
+ {},
150
+ [
151
+ { key: "city", path: "address.city" },
152
+ { key: "count", aggregate: { _tag: "agg-count" } }
153
+ ] as any
154
+ )
155
+
156
+ // Must GROUP BY the nested path in Cosmos access notation
157
+ expect(result.query).toMatch(/GROUP BY f(?:\.address\.city|\["address"\]\["city"\])/)
158
+ })
159
+ })
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NoZWNrLWFnZy1pbmZlci50ZXN0LWQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL19jaGVjay1hZ2ctaW5mZXIudGVzdC1kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_check-agg-infer.test-d.d.ts","sourceRoot":"","sources":["../_check-agg-infer.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import * as S from "effect-app/Schema";
2
+ import { aggregate, make, where } from "effect-app/Model/query";
3
+ const baseSchema = S.Struct({
4
+ id: S.String,
5
+ address: S.Struct({ city: S.String }),
6
+ active: S.Boolean,
7
+ qty: S.Number
8
+ });
9
+ // Should compile — Row inferred from pipe
10
+ const _ok = make().pipe(aggregate(S.Struct({ city: S.String, count: S.NonNegativeInt, total: S.Number }), ($) => ({
11
+ city: $.field("address.city"),
12
+ count: $.countWhen((q) => q.pipe(where("active", true))),
13
+ total: $.sum("qty")
14
+ })));
15
+ // Should ERROR — bad path
16
+ const _bad = make().pipe(aggregate(S.Struct({ a: S.String }), ($) => ({
17
+ a: $.field("nonexistent")
18
+ })));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NoZWNrLWFnZy1pbmZlci50ZXN0LWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9fY2hlY2stYWdnLWluZmVyLnRlc3QtZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssQ0FBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBRS9ELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ1osT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3JDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTztJQUNqQixHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDZCxDQUFDLENBQUE7QUFHRiwwQ0FBMEM7QUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFPLENBQUMsSUFBSSxDQUMxQixTQUFTLENBQ1AsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFDdEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDTixJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7SUFDN0IsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hELEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztDQUNwQixDQUFDLENBQ0gsQ0FDRixDQUFBO0FBRUQsMEJBQTBCO0FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBTyxDQUFDLElBQUksQ0FDM0IsU0FBUyxDQUNQLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQ3pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO0NBQzFCLENBQUMsQ0FDSCxDQUNGLENBQUEifQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NoZWNrLXByb2otaW5mZXIudGVzdC1kLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9fY2hlY2stcHJvai1pbmZlci50ZXN0LWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_check-proj-infer.test-d.d.ts","sourceRoot":"","sources":["../_check-proj-infer.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import * as S from "effect-app/Schema";
2
+ import { make, projectComputed, where } from "effect-app/Model/query";
3
+ const baseSchema = S.Struct({
4
+ id: S.String,
5
+ items: S.Array(S.Struct({ articleId: S.String, qty: S.Number, note: S.String }))
6
+ });
7
+ // Should compile — Row inferred from pipe
8
+ const _ok = make().pipe(projectComputed(S.Struct({ id: S.String, total: S.Number, distinctArticles: S.NonNegativeInt }), ({ relation }) => ({
9
+ total: relation("items").sum("qty"),
10
+ distinctArticles: relation("items").distinctCount("articleId", where("qty", "gte", 0))
11
+ })));
12
+ // Should ERROR — bad path on relation element
13
+ const _bad = make().pipe(projectComputed(S.Struct({ a: S.Number }), ({ relation }) => ({
14
+ a: relation("items").sum("nonexistent")
15
+ })));
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NoZWNrLXByb2otaW5mZXIudGVzdC1kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vX2NoZWNrLXByb2otaW5mZXIudGVzdC1kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFFckUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDWixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0NBQ2pGLENBQUMsQ0FBQTtBQUdGLDBDQUEwQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEVBQU8sQ0FBQyxJQUFJLENBQzFCLGVBQWUsQ0FDYixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQy9FLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQixLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDbkMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDdkYsQ0FBQyxDQUNILENBQ0YsQ0FBQTtBQUVELDhDQUE4QztBQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLEVBQU8sQ0FBQyxJQUFJLENBQzNCLGVBQWUsQ0FDYixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUN6QixDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO0NBQ3hDLENBQUMsQ0FDSCxDQUNGLENBQUEifQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NoZWNrLXRpZ2h0ZW4udGVzdC1kLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9fY2hlY2stdGlnaHRlbi50ZXN0LWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_check-tighten.test-d.d.ts","sourceRoot":"","sources":["../_check-tighten.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import * as S from "effect-app/Schema";
2
+ import { computed, relation } from "effect-app/Model/query";
3
+ const baseSchema = S.Struct({
4
+ id: S.String,
5
+ items: S.Array(S.Struct({ articleId: S.String, qty: S.Number }))
6
+ });
7
+ // Should compile:
8
+ const _ok = computed({
9
+ a: relation("items").sum("qty"),
10
+ b: relation("items").distinctCount("articleId"),
11
+ c: relation("items").collect("articleId"),
12
+ d: relation("items").collectFields(["articleId", "qty"])
13
+ });
14
+ // Should ERROR — invalid field paths
15
+ const _bad = computed({
16
+ a: relation("items").sum("nonexistent"),
17
+ b: relation("items").distinctCount("not_a_field"),
18
+ c: relation("items").collect("zzz"),
19
+ d: relation("items").collectFields(["zzz"])
20
+ });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NoZWNrLXRpZ2h0ZW4udGVzdC1kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vX2NoZWNrLXRpZ2h0ZW4udGVzdC1kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUUzRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFCLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Q0FDakUsQ0FBQyxDQUFBO0FBR0Ysa0JBQWtCO0FBQ2xCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQztJQUNuQixDQUFDLEVBQUUsUUFBUSxDQUFNLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQyxFQUFFLFFBQVEsQ0FBTSxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3BELENBQUMsRUFBRSxRQUFRLENBQU0sT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUM5QyxDQUFDLEVBQUUsUUFBUSxDQUFNLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztDQUM5RCxDQUFDLENBQUE7QUFFRixxQ0FBcUM7QUFDckMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLENBQUMsRUFBRSxRQUFRLENBQU0sT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUM1QyxDQUFDLEVBQUUsUUFBUSxDQUFNLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7SUFDdEQsQ0FBQyxFQUFFLFFBQVEsQ0FBTSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxRQUFRLENBQU0sT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDakQsQ0FBQyxDQUFBIn0=