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

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 (505) hide show
  1. package/CHANGELOG.md +1973 -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 +501 -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 +984 -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 +590 -0
  236. package/test/cluster-servicebus.test.ts +180 -0
  237. package/test/cluster-sqlite.test.ts +207 -0
  238. package/test/contextProvider.test.ts +15 -12
  239. package/test/controller.test.ts +28 -32
  240. package/test/cosmos-query.test.ts +159 -0
  241. package/test/dist/_check-agg-infer.test-d.d.ts +2 -0
  242. package/test/dist/_check-agg-infer.test-d.d.ts.map +1 -0
  243. package/test/dist/_check-agg-infer.test-d.js +19 -0
  244. package/test/dist/_check-proj-infer.test-d.d.ts +2 -0
  245. package/test/dist/_check-proj-infer.test-d.d.ts.map +1 -0
  246. package/test/dist/_check-proj-infer.test-d.js +16 -0
  247. package/test/dist/_check-tighten.test-d.d.ts +2 -0
  248. package/test/dist/_check-tighten.test-d.d.ts.map +1 -0
  249. package/test/dist/_check-tighten.test-d.js +21 -0
  250. package/test/dist/auth.test.d.ts.map +1 -0
  251. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  252. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  253. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  254. package/test/dist/contextProvider.test.d.ts.map +1 -1
  255. package/test/dist/controller.test.d.ts.map +1 -1
  256. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  257. package/test/dist/date-query.test.d.ts.map +1 -0
  258. package/test/dist/fixtures.d.ts +30 -12
  259. package/test/dist/fixtures.d.ts.map +1 -1
  260. package/test/dist/fixtures.js +17 -10
  261. package/test/dist/query.test.d.ts.map +1 -1
  262. package/test/dist/rawQuery.test.d.ts.map +1 -1
  263. package/test/dist/repository-ext.test.d.ts.map +1 -0
  264. package/test/dist/requires.test.d.ts.map +1 -1
  265. package/test/dist/router-generator.test.d.ts.map +1 -0
  266. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  267. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  268. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  269. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  270. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  271. package/test/dist/sql-store.test.d.ts.map +1 -0
  272. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  273. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  274. package/test/fixtures.ts +16 -9
  275. package/test/layerUtils.test.ts +2 -2
  276. package/test/query.test.ts +905 -40
  277. package/test/rawQuery.test.ts +340 -22
  278. package/test/repository-ext.test.ts +62 -0
  279. package/test/requires.test.ts +10 -5
  280. package/test/router-generator.test.ts +187 -0
  281. package/test/routing-interruptibility.test.ts +66 -0
  282. package/test/rpc-context-map-streaming.test.ts +262 -0
  283. package/test/rpc-e2e-invalidation.test.ts +256 -0
  284. package/test/rpc-multi-middleware.test.ts +85 -10
  285. package/test/rpc-stream-fullstack.test.ts +304 -0
  286. package/test/sql-store.test.ts +1711 -0
  287. package/test/validateSample.test.ts +26 -14
  288. package/test/workflow-engine-cosmos.test.ts +354 -0
  289. package/test/workflow-engine-sqlite.test.ts +299 -0
  290. package/tsconfig.examples.json +1 -1
  291. package/tsconfig.json +2 -1
  292. package/tsconfig.json.bak +2 -2
  293. package/tsconfig.src.json +35 -35
  294. package/tsconfig.test.json +2 -2
  295. package/dist/Emailer/service.d.ts +0 -55
  296. package/dist/Emailer/service.d.ts.map +0 -1
  297. package/dist/Emailer/service.js +0 -6
  298. package/dist/Emailer.d.ts +0 -2
  299. package/dist/Emailer.d.ts.map +0 -1
  300. package/dist/Emailer.js +0 -2
  301. package/dist/Model/Repository/ext.d.ts +0 -41
  302. package/dist/Model/Repository/ext.d.ts.map +0 -1
  303. package/dist/Model/Repository/ext.js +0 -65
  304. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  305. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  306. package/dist/Model/Repository/internal/internal.js +0 -316
  307. package/dist/Model/Repository/legacy.d.ts +0 -19
  308. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  309. package/dist/Model/Repository/legacy.js +0 -2
  310. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  311. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  312. package/dist/Model/Repository/makeRepo.js +0 -24
  313. package/dist/Model/Repository/service.d.ts +0 -89
  314. package/dist/Model/Repository/service.d.ts.map +0 -1
  315. package/dist/Model/Repository/service.js +0 -2
  316. package/dist/Model/Repository/validation.d.ts +0 -42
  317. package/dist/Model/Repository/validation.d.ts.map +0 -1
  318. package/dist/Model/Repository/validation.js +0 -32
  319. package/dist/Model/Repository.d.ts +0 -6
  320. package/dist/Model/Repository.d.ts.map +0 -1
  321. package/dist/Model/Repository.js +0 -6
  322. package/dist/Model/dsl.d.ts +0 -32
  323. package/dist/Model/dsl.d.ts.map +0 -1
  324. package/dist/Model/dsl.js +0 -44
  325. package/dist/Model/filter/filterApi.d.ts +0 -30
  326. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  327. package/dist/Model/filter/filterApi.js +0 -2
  328. package/dist/Model/filter/types/errors.d.ts +0 -29
  329. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  330. package/dist/Model/filter/types/errors.js +0 -2
  331. package/dist/Model/filter/types/fields.d.ts +0 -15
  332. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  333. package/dist/Model/filter/types/fields.js +0 -2
  334. package/dist/Model/filter/types/path/common.d.ts +0 -316
  335. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  336. package/dist/Model/filter/types/path/common.js +0 -2
  337. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  338. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  339. package/dist/Model/filter/types/path/eager.js +0 -31
  340. package/dist/Model/filter/types/path/index.d.ts +0 -4
  341. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  342. package/dist/Model/filter/types/path/index.js +0 -3
  343. package/dist/Model/filter/types/utils.d.ts +0 -79
  344. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  345. package/dist/Model/filter/types/utils.js +0 -2
  346. package/dist/Model/filter/types/validator.d.ts +0 -30
  347. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  348. package/dist/Model/filter/types/validator.js +0 -2
  349. package/dist/Model/filter/types.d.ts +0 -5
  350. package/dist/Model/filter/types.d.ts.map +0 -1
  351. package/dist/Model/filter/types.js +0 -7
  352. package/dist/Model/query/dsl.d.ts +0 -248
  353. package/dist/Model/query/dsl.d.ts.map +0 -1
  354. package/dist/Model/query/dsl.js +0 -104
  355. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  356. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  357. package/dist/Model/query/new-kid-interpreter.js +0 -165
  358. package/dist/Model/query.d.ts +0 -15
  359. package/dist/Model/query.d.ts.map +0 -1
  360. package/dist/Model/query.js +0 -3
  361. package/dist/Model.d.ts +0 -4
  362. package/dist/Model.d.ts.map +0 -1
  363. package/dist/Model.js +0 -4
  364. package/dist/Operations.d.ts +0 -55
  365. package/dist/Operations.d.ts.map +0 -1
  366. package/dist/Operations.js +0 -102
  367. package/dist/OperationsRepo.d.ts +0 -41
  368. package/dist/OperationsRepo.d.ts.map +0 -1
  369. package/dist/OperationsRepo.js +0 -14
  370. package/dist/QueueMaker/service.d.ts +0 -11
  371. package/dist/QueueMaker/service.d.ts.map +0 -1
  372. package/dist/QueueMaker/service.js +0 -4
  373. package/dist/RequestContext.d.ts +0 -63
  374. package/dist/RequestContext.d.ts.map +0 -1
  375. package/dist/RequestContext.js +0 -49
  376. package/dist/Store/ContextMapContainer.d.ts +0 -14
  377. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  378. package/dist/Store/ContextMapContainer.js +0 -16
  379. package/dist/Store/service.d.ts +0 -108
  380. package/dist/Store/service.d.ts.map +0 -1
  381. package/dist/Store/service.js +0 -71
  382. package/dist/Store.d.ts +0 -2
  383. package/dist/Store.d.ts.map +0 -1
  384. package/dist/Store.js +0 -2
  385. package/dist/adapters/SQL/Model.d.ts +0 -479
  386. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  387. package/dist/adapters/SQL/Model.js +0 -478
  388. package/dist/adapters/SQL.d.ts +0 -2
  389. package/dist/adapters/SQL.d.ts.map +0 -1
  390. package/dist/adapters/ServiceBus.d.ts +0 -58
  391. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  392. package/dist/adapters/ServiceBus.js +0 -99
  393. package/dist/adapters/cosmos-client.d.ts +0 -14
  394. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  395. package/dist/adapters/cosmos-client.js +0 -9
  396. package/dist/adapters/index.d.ts +0 -2
  397. package/dist/adapters/index.d.ts.map +0 -1
  398. package/dist/adapters/index.js +0 -2
  399. package/dist/adapters/logger.d.ts +0 -9
  400. package/dist/adapters/logger.d.ts.map +0 -1
  401. package/dist/adapters/logger.js +0 -3
  402. package/dist/adapters/memQueue.d.ts +0 -13
  403. package/dist/adapters/memQueue.d.ts.map +0 -1
  404. package/dist/adapters/memQueue.js +0 -20
  405. package/dist/adapters/mongo-client.d.ts +0 -10
  406. package/dist/adapters/mongo-client.d.ts.map +0 -1
  407. package/dist/adapters/mongo-client.js +0 -13
  408. package/dist/adapters/redis-client.d.ts +0 -39
  409. package/dist/adapters/redis-client.d.ts.map +0 -1
  410. package/dist/adapters/redis-client.js +0 -94
  411. package/dist/api/ContextProvider.d.ts +0 -31
  412. package/dist/api/ContextProvider.d.ts.map +0 -1
  413. package/dist/api/ContextProvider.js +0 -38
  414. package/dist/api/codec.d.ts +0 -5
  415. package/dist/api/codec.d.ts.map +0 -1
  416. package/dist/api/codec.js +0 -5
  417. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  418. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  419. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  420. package/dist/api/internal/auth.d.ts +0 -15
  421. package/dist/api/internal/auth.d.ts.map +0 -1
  422. package/dist/api/internal/auth.js +0 -47
  423. package/dist/api/internal/events.d.ts +0 -9
  424. package/dist/api/internal/events.d.ts.map +0 -1
  425. package/dist/api/internal/events.js +0 -42
  426. package/dist/api/internal/health.d.ts +0 -3
  427. package/dist/api/internal/health.d.ts.map +0 -1
  428. package/dist/api/internal/health.js +0 -5
  429. package/dist/api/layerUtils.d.ts +0 -24
  430. package/dist/api/layerUtils.d.ts.map +0 -1
  431. package/dist/api/layerUtils.js +0 -16
  432. package/dist/api/middlewares.d.ts +0 -10
  433. package/dist/api/middlewares.d.ts.map +0 -1
  434. package/dist/api/reportError.d.ts +0 -4
  435. package/dist/api/reportError.d.ts.map +0 -1
  436. package/dist/api/reportError.js +0 -27
  437. package/dist/api/routing/middleware/RouterMiddleware.d.ts +0 -15
  438. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  439. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  440. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  441. package/dist/api/routing/middleware/middleware.js +0 -92
  442. package/dist/api/routing/middleware.d.ts +0 -4
  443. package/dist/api/routing/middleware.d.ts.map +0 -1
  444. package/dist/api/routing/schema/jwt.d.ts +0 -4
  445. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  446. package/dist/api/routing/schema/jwt.js +0 -12
  447. package/dist/api/routing/tsort.d.ts +0 -8
  448. package/dist/api/routing/tsort.d.ts.map +0 -1
  449. package/dist/api/routing/tsort.js +0 -51
  450. package/dist/api/routing/utils.d.ts +0 -19
  451. package/dist/api/routing/utils.d.ts.map +0 -1
  452. package/dist/api/routing/utils.js +0 -44
  453. package/dist/api/routing.d.ts +0 -138
  454. package/dist/api/routing.d.ts.map +0 -1
  455. package/dist/api/routing.js +0 -166
  456. package/dist/api/setupRequest.d.ts +0 -12
  457. package/dist/api/setupRequest.d.ts.map +0 -1
  458. package/dist/api/setupRequest.js +0 -44
  459. package/dist/api/util.d.ts +0 -3
  460. package/dist/api/util.d.ts.map +0 -1
  461. package/dist/api/util.js +0 -14
  462. package/eslint.config.mjs +0 -24
  463. package/src/Emailer/service.ts +0 -52
  464. package/src/Emailer.ts +0 -1
  465. package/src/Model/Repository/ext.ts +0 -283
  466. package/src/Model/Repository/internal/internal.ts +0 -577
  467. package/src/Model/Repository/legacy.ts +0 -27
  468. package/src/Model/Repository/makeRepo.ts +0 -139
  469. package/src/Model/Repository/service.ts +0 -627
  470. package/src/Model/Repository/validation.ts +0 -31
  471. package/src/Model/Repository.ts +0 -5
  472. package/src/Model/dsl.ts +0 -128
  473. package/src/Model/filter/filterApi.ts +0 -60
  474. package/src/Model/filter/types/errors.ts +0 -47
  475. package/src/Model/filter/types/fields.ts +0 -50
  476. package/src/Model/filter/types/path/common.ts +0 -404
  477. package/src/Model/filter/types/path/eager.ts +0 -298
  478. package/src/Model/filter/types/path/index.ts +0 -4
  479. package/src/Model/filter/types/utils.ts +0 -128
  480. package/src/Model/filter/types/validator.ts +0 -46
  481. package/src/Model/filter/types.ts +0 -6
  482. package/src/Model/query/dsl.ts +0 -2110
  483. package/src/Model/query/new-kid-interpreter.ts +0 -210
  484. package/src/Model/query.ts +0 -13
  485. package/src/Model.ts +0 -3
  486. package/src/Operations.ts +0 -235
  487. package/src/OperationsRepo.ts +0 -16
  488. package/src/QueueMaker/service.ts +0 -17
  489. package/src/RequestContext.ts +0 -63
  490. package/src/Store/ContextMapContainer.ts +0 -20
  491. package/src/Store/service.ts +0 -184
  492. package/src/Store.ts +0 -1
  493. package/src/adapters/ServiceBus.ts +0 -209
  494. package/src/adapters/index.ts +0 -0
  495. package/src/adapters/logger.ts +0 -3
  496. package/src/api/internal/auth.ts +0 -68
  497. package/src/api/routing/middleware.ts +0 -6
  498. package/src/api/routing.ts +0 -598
  499. package/src/api/setupRequest.ts +0 -84
  500. /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
  501. /package/src/{api/codec.ts → codec.ts} +0 -0
  502. /package/src/{api/internal → internal}/health.ts +0 -0
  503. /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
  504. /package/src/{api/routing → routing}/tsort.ts +0 -0
  505. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,11 +1,25 @@
1
+ import { SqliteClient } from "@effect/sql-sqlite-node"
1
2
  import { describe, expect, it } from "@effect/vitest"
2
- import { Array, Config, Effect, flow, Layer, ManagedRuntime, Redacted, References, Result, S, ServiceMap } from "effect-app"
3
+ import * as Array from "effect-app/Array"
4
+ import * as Config from "effect-app/Config"
5
+ import * as Context from "effect-app/Context"
6
+ import * as Effect from "effect-app/Effect"
7
+ import * as Layer from "effect-app/Layer"
8
+ import { and, computed, or, project, projectComputed, relation, where, whereEvery, whereSome } from "effect-app/Model/query"
9
+ import { makeRepo } from "effect-app/Model/Repository/makeRepo"
10
+ import { RepositoryRegistryLive } from "effect-app/Model/Repository/Registry"
11
+ import * as S from "effect-app/Schema"
12
+ import { setupRequestContextFromCurrent } from "effect-app/setupRequest"
3
13
  import { LogLevels } from "effect-app/utils"
4
- import { setupRequestContextFromCurrent } from "../src/api/setupRequest.js"
5
- import { and, or, project, where, whereEvery, whereSome } from "../src/Model/query.js"
6
- import { makeRepo } from "../src/Model/Repository/makeRepo.js"
14
+ import { flow } from "effect/Function"
15
+ import * as ManagedRuntime from "effect/ManagedRuntime"
16
+ import * as Redacted from "effect/Redacted"
17
+ import * as References from "effect/References"
18
+ import * as Result from "effect/Result"
19
+ import * as Struct from "effect/Struct"
7
20
  import { CosmosStoreLayer } from "../src/Store/Cosmos.js"
8
21
  import { MemoryStoreLive } from "../src/Store/Memory.js"
22
+ import { SQLiteStoreLayer } from "../src/Store/SQL.js"
9
23
 
10
24
  export const rt = ManagedRuntime.make(Layer.mergeAll(
11
25
  Layer.effect(
@@ -24,7 +38,7 @@ class Something extends S.Class<Something>("Something")({
24
38
  id: S.String,
25
39
  name: S.String,
26
40
  description: S.String,
27
- items: S.Array(S.Struct({ id: S.String, value: S.Number, description: S.String }))
41
+ items: S.Array(S.Struct({ id: S.String, value: S.Finite, description: S.String }))
28
42
  }) {}
29
43
 
30
44
  const items = [
@@ -49,7 +63,7 @@ const items = [
49
63
  ]
50
64
 
51
65
  // @effect-diagnostics-next-line missingEffectServiceDependency:off
52
- class SomethingRepo extends ServiceMap.Service<SomethingRepo>()(
66
+ class SomethingRepo extends Context.Service<SomethingRepo>()(
53
67
  "SomethingRepo",
54
68
  {
55
69
  make: Effect.gen(function*() {
@@ -76,28 +90,31 @@ class SomethingRepo extends ServiceMap.Service<SomethingRepo>()(
76
90
  static readonly Test = this
77
91
  .layer
78
92
  .pipe(
79
- Layer.provide(MemoryStoreLive)
93
+ Layer.provide(Layer.merge(MemoryStoreLive, RepositoryRegistryLive))
80
94
  )
81
95
 
82
96
  static readonly TestCosmos = this
83
97
  .layer
84
98
  .pipe(
85
99
  Layer.provide(
86
- Effect.gen(function*() {
87
- const url = yield* Config.redacted("STORAGE_URL").pipe(
88
- Config.withDefault(
89
- Redacted.make(
90
- // the emulator doesn't implement array projections :/ so you need an actual cloud instance!
91
- "AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
100
+ Effect
101
+ .gen(function*() {
102
+ const url = yield* Config.redacted("STORAGE_URL").pipe(
103
+ Config.withDefault(
104
+ Redacted.make(
105
+ // the emulator doesn't implement array projections :/ so you need an actual cloud instance!
106
+ "AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
107
+ )
92
108
  )
93
109
  )
94
- )
95
- return CosmosStoreLayer({
96
- dbName: "test",
97
- prefix: "",
98
- url
110
+ return CosmosStoreLayer({
111
+ dbName: "test",
112
+ prefix: "",
113
+ url
114
+ })
115
+ .pipe(Layer.merge(RepositoryRegistryLive))
99
116
  })
100
- }).pipe(Layer.unwrap)
117
+ .pipe(Layer.unwrap)
101
118
  )
102
119
  )
103
120
  }
@@ -107,7 +124,7 @@ describe("select first-level array fields", () => {
107
124
  .gen(function*() {
108
125
  const repo = yield* SomethingRepo
109
126
 
110
- const projected = S.Struct({ name: S.String, items: S.Array(S.Struct({ id: S.String, value: S.Number })) })
127
+ const projected = S.Struct({ name: S.String, items: S.Array(S.Struct({ id: S.String, value: S.Finite })) })
111
128
 
112
129
  // ok crazy lol, "value" is a reserved word in CosmosDB, so we have to use t["value"] as a field name instead of t.value
113
130
  const items = yield* repo.queryRaw(projected, {
@@ -159,7 +176,7 @@ describe("select first-level array fields", () => {
159
176
  .pipe(Effect.provide(SomethingRepo.Test), rt.runPromise))
160
177
  })
161
178
 
162
- const projected = S.Struct({ name: S.String, items: S.Array(S.Struct({ id: S.String, value: S.Number })) })
179
+ const projected = S.Struct({ name: S.String, items: S.Array(S.Struct({ id: S.String, value: S.Finite })) })
163
180
 
164
181
  const expected = [
165
182
  {
@@ -352,6 +369,67 @@ describe("multi-level", () => {
352
369
  .pipe(Effect.provide(SomethingRepo.Test), rt.runPromise))
353
370
  })
354
371
 
372
+ describe("array length projection", () => {
373
+ const test = Effect
374
+ .gen(function*() {
375
+ const repo = yield* SomethingRepo
376
+ const result = yield* repo.query(
377
+ projectComputed(
378
+ S.Struct({ id: S.String, itemCount: S.NonNegativeInt }),
379
+ computed({ itemCount: relation<S.Codec.Encoded<typeof Something>>("items").length() })
380
+ )
381
+ )
382
+ expect(result).toStrictEqual([
383
+ { id: "1", itemCount: 2 },
384
+ { id: "2", itemCount: 2 }
385
+ ])
386
+ })
387
+ .pipe(setupRequestContextFromCurrent())
388
+
389
+ it.skipIf(!process.env["STORAGE_URL"])("works well in CosmosDB", () =>
390
+ test
391
+ .pipe(Effect.provide(SomethingRepo.TestCosmos), rt.runPromise))
392
+
393
+ it("works well in Memory", () =>
394
+ test
395
+ .pipe(Effect.provide(SomethingRepo.Test), rt.runPromise))
396
+ })
397
+
398
+ describe("computed projections", () => {
399
+ const test = Effect
400
+ .gen(function*() {
401
+ const repo = yield* SomethingRepo
402
+ const output = S.Struct({
403
+ id: S.String,
404
+ pickedCount: S.NonNegativeInt,
405
+ hasPicked: S.Boolean
406
+ })
407
+ const pickedFilter = where("value", "gt", 20)
408
+ const items = yield* repo.query(
409
+ projectComputed(
410
+ output,
411
+ computed({
412
+ pickedCount: relation<S.Codec.Encoded<typeof Something>>("items").count(pickedFilter),
413
+ hasPicked: relation<S.Codec.Encoded<typeof Something>>("items").any(pickedFilter)
414
+ })
415
+ )
416
+ )
417
+ expect(items).toStrictEqual([
418
+ { id: "1", pickedCount: 0, hasPicked: false },
419
+ { id: "2", pickedCount: 2, hasPicked: true }
420
+ ])
421
+ })
422
+ .pipe(setupRequestContextFromCurrent())
423
+
424
+ it.skipIf(!process.env["STORAGE_URL"])("works well in CosmosDB", () =>
425
+ test
426
+ .pipe(Effect.provide(SomethingRepo.TestCosmos), rt.runPromise))
427
+
428
+ it("works well in Memory", () =>
429
+ test
430
+ .pipe(Effect.provide(SomethingRepo.Test), rt.runPromise))
431
+ })
432
+
355
433
  // FUTURE: we need something like this instead:
356
434
  /*
357
435
  const subQuery = <T extends FieldValues>() => <TKey extends keyof T>(key: TKey, type: "some" | "every" = "some") => make<T[TKey][number]>() // todo: mark that this is sub query on field "items"
@@ -369,6 +447,246 @@ describe("multi-level", () => {
369
447
  ))
370
448
  */
371
449
 
450
+ // Mimic scanner MultiPick/EasyLife AllPickList shape:
451
+ // - parent has tagged-state with `at` timestamp
452
+ // - items is NonEmptyArray with state._tag + articleId/articleGTIN
453
+ // - controller filters `state.at gte X` and `state._tag neq closed`
454
+ // then projectComputed with: count, any(initial/picking/packed),
455
+ // every(picked/packed), collectDistinct(articleId)
456
+ const itemStateSchema = S.Union([
457
+ S.TaggedStruct("initial", { at: S.String }),
458
+ S.TaggedStruct("picking", { at: S.String }),
459
+ S.TaggedStruct("picked", { at: S.String }),
460
+ S.TaggedStruct("packed", { at: S.String })
461
+ ])
462
+
463
+ class ArticleLineItem extends S.Class<ArticleLineItem>("ArticleLineItem")({
464
+ articleId: S.String,
465
+ articleGTIN: S.String,
466
+ state: itemStateSchema
467
+ }) {}
468
+
469
+ const stOrderState = S.Union([
470
+ S.TaggedStruct("initial", { at: S.String }),
471
+ S.TaggedStruct("packed", { at: S.String }),
472
+ S.TaggedStruct("closed", { at: S.String })
473
+ ])
474
+
475
+ class Order extends S.Class<Order>("Order")({
476
+ id: S.String,
477
+ state: stOrderState,
478
+ items: S.NonEmptyArray(ArticleLineItem)
479
+ }) {}
480
+
481
+ const orderItems = [
482
+ new Order({
483
+ id: "o-open-1",
484
+ state: { _tag: "initial", at: "2026-05-08T08:00:00Z" },
485
+ items: [
486
+ new ArticleLineItem({
487
+ articleId: "A1",
488
+ articleGTIN: "G1",
489
+ state: { _tag: "picking", at: "2026-05-08T08:01:00Z" }
490
+ }),
491
+ new ArticleLineItem({
492
+ articleId: "A1",
493
+ articleGTIN: "G1",
494
+ state: { _tag: "picked", at: "2026-05-08T08:02:00Z" }
495
+ }),
496
+ new ArticleLineItem({
497
+ articleId: "A2",
498
+ articleGTIN: "G2",
499
+ state: { _tag: "initial", at: "2026-05-08T08:00:00Z" }
500
+ })
501
+ ]
502
+ }),
503
+ new Order({
504
+ id: "o-allpicked-2",
505
+ state: { _tag: "packed", at: "2026-05-07T10:00:00Z" },
506
+ items: [
507
+ new ArticleLineItem({
508
+ articleId: "B1",
509
+ articleGTIN: "GB1",
510
+ state: { _tag: "picked", at: "2026-05-07T09:50:00Z" }
511
+ }),
512
+ new ArticleLineItem({
513
+ articleId: "B2",
514
+ articleGTIN: "GB2",
515
+ state: { _tag: "picked", at: "2026-05-07T09:55:00Z" }
516
+ })
517
+ ]
518
+ }),
519
+ new Order({
520
+ id: "o-closed-3",
521
+ state: { _tag: "closed", at: "2026-05-04T10:00:00Z" },
522
+ items: [
523
+ new ArticleLineItem({
524
+ articleId: "C1",
525
+ articleGTIN: "GC1",
526
+ state: { _tag: "packed", at: "2026-05-04T09:00:00Z" }
527
+ })
528
+ ]
529
+ })
530
+ ]
531
+
532
+ // @effect-diagnostics-next-line missingEffectServiceDependency:off
533
+ class OrderRepo extends Context.Service<OrderRepo>()(
534
+ "OrderRepo",
535
+ {
536
+ make: Effect.gen(function*() {
537
+ const partitionKey = "orders-" + new Date().getTime()
538
+ return yield* makeRepo("Order", Order, { config: { partitionValue: () => partitionKey } })
539
+ })
540
+ }
541
+ ) {
542
+ static readonly layer = Layer
543
+ .effect(
544
+ OrderRepo,
545
+ Effect.gen(function*() {
546
+ const partitionKey = "orders-" + new Date().getTime()
547
+ const repo = OrderRepo.of(
548
+ yield* makeRepo("Order", Order, {
549
+ config: { partitionValue: () => partitionKey }
550
+ })
551
+ )
552
+ yield* repo.saveAndPublish(orderItems).pipe(setupRequestContextFromCurrent("init"))
553
+ return repo
554
+ })
555
+ )
556
+ static readonly Test = this
557
+ .layer
558
+ .pipe(Layer.provide(Layer.merge(MemoryStoreLive, RepositoryRegistryLive)))
559
+
560
+ static readonly TestSqlite = this
561
+ .layer
562
+ .pipe(
563
+ Layer.provide(
564
+ Layer.merge(
565
+ SQLiteStoreLayer({
566
+ url: Redacted.make("sqlite://"),
567
+ prefix: "test_",
568
+ dbName: "test"
569
+ }),
570
+ RepositoryRegistryLive
571
+ )
572
+ ),
573
+ Layer.provide(SqliteClient.layer({ filename: ":memory:" }))
574
+ )
575
+ }
576
+
577
+ describe("scanner-style AllPickList computed projections", () => {
578
+ const test = Effect
579
+ .gen(function*() {
580
+ const repo = yield* OrderRepo
581
+ type OrderEnc = S.Codec.Encoded<typeof Order>
582
+
583
+ const projection = S.Struct({
584
+ id: S.String,
585
+ state: stOrderState,
586
+ articleCount: S.NonNegativeInt,
587
+ hasInitialItem: S.Boolean,
588
+ hasPickingItem: S.Boolean,
589
+ hasPackedItem: S.Boolean,
590
+ allItemsPicked: S.Boolean,
591
+ allItemsPacked: S.Boolean,
592
+ articleIds: S.Array(S.String)
593
+ })
594
+
595
+ const result = yield* repo.query(
596
+ where("state.at", "gte", "2026-05-05T00:00:00Z"),
597
+ and("state._tag", "neq", "closed"),
598
+ projectComputed(
599
+ projection,
600
+ computed({
601
+ articleCount: relation<OrderEnc>("items").count(),
602
+ hasInitialItem: relation<OrderEnc>("items").any(where("state._tag", "initial")),
603
+ hasPickingItem: relation<OrderEnc>("items").any(where("state._tag", "picking")),
604
+ hasPackedItem: relation<OrderEnc>("items").any(where("state._tag", "packed")),
605
+ allItemsPicked: relation<OrderEnc>("items").every(where("state._tag", "picked")),
606
+ allItemsPacked: relation<OrderEnc>("items").every(where("state._tag", "packed")),
607
+ articleIds: relation<OrderEnc>("items").collectDistinct("articleId")
608
+ })
609
+ )
610
+ )
611
+
612
+ const byId = Object.fromEntries(result.map((r) => [r.id, r]))
613
+
614
+ expect(Object.keys(byId).sort()).toEqual(["o-allpicked-2", "o-open-1"])
615
+
616
+ const open = byId["o-open-1"]!
617
+ expect(open.articleCount).toBe(3)
618
+ expect(open.hasInitialItem).toBe(true)
619
+ expect(open.hasPickingItem).toBe(true)
620
+ expect(open.hasPackedItem).toBe(false)
621
+ expect(open.allItemsPicked).toBe(false)
622
+ expect(open.allItemsPacked).toBe(false)
623
+ expect([...open.articleIds].sort()).toEqual(["A1", "A2"])
624
+
625
+ const allp = byId["o-allpicked-2"]!
626
+ expect(allp.articleCount).toBe(2)
627
+ expect(allp.hasInitialItem).toBe(false)
628
+ expect(allp.hasPickingItem).toBe(false)
629
+ expect(allp.hasPackedItem).toBe(false)
630
+ expect(allp.allItemsPicked).toBe(true)
631
+ expect(allp.allItemsPacked).toBe(false)
632
+ expect([...allp.articleIds].sort()).toEqual(["B1", "B2"])
633
+ })
634
+ .pipe(setupRequestContextFromCurrent())
635
+
636
+ it("works well in Memory", () => test.pipe(Effect.provide(OrderRepo.Test), rt.runPromise))
637
+
638
+ it("works well in SQLite", () => test.pipe(Effect.provide(OrderRepo.TestSqlite), rt.runPromise))
639
+ })
640
+
641
+ // Same but mimics the FULL controller projection: includes `items` array
642
+ // (NonEmptyArray) alongside the computed scalars. This tests the
643
+ // memory-side select pipeline that combines subKeys (items) with
644
+ // computedKeys in one Project node.
645
+ describe("scanner-style AllPickList — items + computed combined", () => {
646
+ const test = Effect
647
+ .gen(function*() {
648
+ const repo = yield* OrderRepo
649
+ type OrderEnc = S.Codec.Encoded<typeof Order>
650
+
651
+ const projection = S.Struct({
652
+ id: S.String,
653
+ items: S.NonEmptyArray(ArticleLineItem.mapFields(Struct.pick(["articleId", "articleGTIN"]))),
654
+ articleCount: S.NonNegativeInt,
655
+ allItemsPicked: S.Boolean,
656
+ articleIds: S.Array(S.String)
657
+ })
658
+
659
+ const result = yield* repo.query(
660
+ where("state.at", "gte", "2026-05-05T00:00:00Z"),
661
+ and("state._tag", "neq", "closed"),
662
+ projectComputed(
663
+ projection,
664
+ computed({
665
+ articleCount: relation<OrderEnc>("items").count(),
666
+ allItemsPicked: relation<OrderEnc>("items").every(where("state._tag", "picked")),
667
+ articleIds: relation<OrderEnc>("items").collectDistinct("articleId")
668
+ })
669
+ )
670
+ )
671
+
672
+ expect(result.length).toBe(2)
673
+ const byId = Object.fromEntries(result.map((r) => [r.id, r]))
674
+ const open = byId["o-open-1"]!
675
+ expect(open.items.length).toBe(3)
676
+ expect(open.items[0]).toHaveProperty("articleId")
677
+ expect(open.items[0]).toHaveProperty("articleGTIN")
678
+ expect(open.allItemsPicked).toBe(false)
679
+ const allp = byId["o-allpicked-2"]!
680
+ expect(allp.items.length).toBe(2)
681
+ expect(allp.allItemsPicked).toBe(true)
682
+ })
683
+ .pipe(setupRequestContextFromCurrent())
684
+
685
+ it("works well in Memory", () => test.pipe(Effect.provide(OrderRepo.Test), rt.runPromise))
686
+
687
+ it("works well in SQLite", () => test.pipe(Effect.provide(OrderRepo.TestSqlite), rt.runPromise))
688
+ })
689
+
372
690
  describe("removeByIds", () => {
373
691
  const test = Effect
374
692
  .gen(function*() {
@@ -405,7 +723,7 @@ describe("removeByIds", () => {
405
723
 
406
724
  yield* repo.saveAndPublish(items)
407
725
  const itemsAfterSave = yield* repo.all
408
- yield* repo.removeById(...items.slice(0, 2).map((_) => _.id))
726
+ yield* repo.removeById([items[0]!.id, items[1]!.id])
409
727
 
410
728
  const items2 = yield* repo.all
411
729
 
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it } from "@effect/vitest"
2
+ import * as Effect from "effect-app/Effect"
3
+ import * as Layer from "effect-app/Layer"
4
+ import { makeRepo } from "effect-app/Model/Repository"
5
+ import { RepositoryRegistryLive } from "effect-app/Model/Repository/Registry"
6
+ import * as S from "effect-app/Schema"
7
+ import { setupRequestContextFromCurrent } from "effect-app/setupRequest"
8
+ import { MemoryStoreLive } from "../src/Store/Memory.js"
9
+
10
+ class BatchItem extends S.Class<BatchItem>("BatchItem")({
11
+ id: S.String,
12
+ label: S.String
13
+ }) {}
14
+
15
+ const TestStoreLive = Layer.merge(MemoryStoreLive, RepositoryRegistryLive)
16
+
17
+ describe("repository ext save/remove batching", () => {
18
+ it.effect("supports save batching overload", () =>
19
+ Effect
20
+ .gen(function*() {
21
+ const repo = yield* makeRepo("BatchItem", BatchItem, {})
22
+ const items = [
23
+ new BatchItem({ id: "1", label: "one" }),
24
+ new BatchItem({ id: "2", label: "two" }),
25
+ new BatchItem({ id: "3", label: "three" }),
26
+ new BatchItem({ id: "4", label: "four" })
27
+ ] as const
28
+
29
+ yield* repo.save(items, { batch: 2 })
30
+
31
+ const all = yield* repo.all
32
+ expect(all).toHaveLength(4)
33
+ expect(all.map((_) => _.id).toSorted()).toEqual(["1", "2", "3", "4"])
34
+ })
35
+ .pipe(
36
+ setupRequestContextFromCurrent(),
37
+ Effect.provide(TestStoreLive)
38
+ ))
39
+
40
+ it.effect("supports remove batching overload", () =>
41
+ Effect
42
+ .gen(function*() {
43
+ const repo = yield* makeRepo("BatchItem", BatchItem, {})
44
+ const items = [
45
+ new BatchItem({ id: "1", label: "one" }),
46
+ new BatchItem({ id: "2", label: "two" }),
47
+ new BatchItem({ id: "3", label: "three" }),
48
+ new BatchItem({ id: "4", label: "four" })
49
+ ] as const
50
+
51
+ yield* repo.save(items)
52
+ yield* repo.remove([items[0], items[1], items[2]], { batch: true })
53
+
54
+ const all = yield* repo.all
55
+ expect(all).toHaveLength(1)
56
+ expect(all[0]?.id).toBe("4")
57
+ })
58
+ .pipe(
59
+ setupRequestContextFromCurrent(),
60
+ Effect.provide(TestStoreLive)
61
+ ))
62
+ })
@@ -1,10 +1,14 @@
1
1
  import { describe, expect, expectTypeOf, it } from "@effect/vitest"
2
- import { Effect, Layer, Result, S, ServiceMap } from "effect-app"
3
2
  import { NotLoggedInError, UnauthorizedError } from "effect-app/client"
3
+ import * as Context from "effect-app/Context"
4
+ import * as Effect from "effect-app/Effect"
4
5
  import { HttpHeaders } from "effect-app/http"
6
+ import * as Layer from "effect-app/Layer"
5
7
  import * as RpcX from "effect-app/rpc"
6
8
  import { MiddlewareMaker } from "effect-app/rpc"
9
+ import * as S from "effect-app/Schema"
7
10
  import type { unhandled } from "effect-app/Types"
11
+ import * as Result from "effect/Result"
8
12
  import { Rpc } from "effect/unstable/rpc"
9
13
  import { type SuccessValue } from "effect/unstable/rpc/RpcMiddleware"
10
14
  import { AllowAnonymous, AllowAnonymousLive, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElseMiddleware, SomeElseMiddlewareLive, SomeMiddleware, SomeMiddlewareLive, SomeService, Test, TestLive } from "./fixtures.js"
@@ -63,11 +67,12 @@ const testSuite = (_mw: typeof middleware3) =>
63
67
  "works",
64
68
  Effect.fn(function*() {
65
69
  const defaultOpts = {
70
+ client: null as any, // TODO?
66
71
  headers: HttpHeaders.fromRecordUnsafe({}),
67
72
  payload: { _tag: "Test" },
68
73
  clientId: 0,
69
74
  requestId: "test-id" as any,
70
- rpc: { ...TestRpc, annotations: ServiceMap.make(_mw.requestContext, {}) }
75
+ rpc: { ...TestRpc, annotations: Context.make(_mw.requestContext, {}) }
71
76
  }
72
77
  const next = Effect.void as unknown as Effect.Effect<SuccessValue, unhandled, never>
73
78
  const layer = _mw.layer.pipe(
@@ -89,7 +94,7 @@ const testSuite = (_mw: typeof middleware3) =>
89
94
  headers: HttpHeaders.fromRecordUnsafe({ "x-user": "test-user", "x-is-manager": "true" }),
90
95
  rpc: {
91
96
  ...defaultOpts.rpc,
92
- annotations: ServiceMap.make(_mw.requestContext, { requireRoles: ["manager"] })
97
+ annotations: Context.make(_mw.requestContext, { requireRoles: ["manager"] })
93
98
  }
94
99
  })
95
100
  )
@@ -127,7 +132,7 @@ const testSuite = (_mw: typeof middleware3) =>
127
132
  Object.assign({ ...defaultOpts }, {
128
133
  rpc: {
129
134
  ...defaultOpts.rpc,
130
- annotations: ServiceMap.make(_mw.requestContext, { requireRoles: ["manager"] })
135
+ annotations: Context.make(_mw.requestContext, { requireRoles: ["manager"] })
131
136
  }
132
137
  })
133
138
  )
@@ -153,7 +158,7 @@ const testSuite = (_mw: typeof middleware3) =>
153
158
  {
154
159
  rpc: {
155
160
  ...defaultOpts.rpc,
156
- annotations: ServiceMap.make(_mw.requestContext, { requireRoles: ["manager"] })
161
+ annotations: Context.make(_mw.requestContext, { requireRoles: ["manager"] })
157
162
  }
158
163
  }
159
164
  )