@effect-app/infra 4.0.0-beta.25 → 4.0.0-beta.250

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 (472) hide show
  1. package/CHANGELOG.md +1892 -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/ContextProvider.d.ts +34 -0
  7. package/dist/ContextProvider.d.ts.map +1 -0
  8. package/dist/ContextProvider.js +40 -0
  9. package/dist/Emailer/Sendgrid.d.ts +111 -147
  10. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  11. package/dist/Emailer/Sendgrid.js +24 -19
  12. package/dist/Emailer/fake.d.ts +2 -2
  13. package/dist/Emailer/fake.d.ts.map +1 -1
  14. package/dist/Emailer/fake.js +4 -4
  15. package/dist/MainFiberSet.d.ts +12 -9
  16. package/dist/MainFiberSet.d.ts.map +1 -1
  17. package/dist/MainFiberSet.js +10 -6
  18. package/dist/QueueMaker/SQLQueue.d.ts +8 -9
  19. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  20. package/dist/QueueMaker/SQLQueue.js +138 -120
  21. package/dist/QueueMaker/errors.d.ts +5 -3
  22. package/dist/QueueMaker/errors.d.ts.map +1 -1
  23. package/dist/QueueMaker/errors.js +4 -2
  24. package/dist/QueueMaker/memQueue.d.ts +10 -6
  25. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  26. package/dist/QueueMaker/memQueue.js +84 -68
  27. package/dist/QueueMaker/sbqueue.d.ts +9 -5
  28. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  29. package/dist/QueueMaker/sbqueue.js +60 -58
  30. package/dist/RequestFiberSet.d.ts +10 -7
  31. package/dist/RequestFiberSet.d.ts.map +1 -1
  32. package/dist/RequestFiberSet.js +13 -8
  33. package/dist/SQL/Model.d.ts +468 -0
  34. package/dist/SQL/Model.d.ts.map +1 -0
  35. package/dist/SQL/Model.js +469 -0
  36. package/dist/SQL.d.ts +2 -0
  37. package/dist/SQL.d.ts.map +1 -0
  38. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  39. package/dist/ServiceBus.d.ts +61 -0
  40. package/dist/ServiceBus.d.ts.map +1 -0
  41. package/dist/ServiceBus.js +108 -0
  42. package/dist/Store/Cosmos/query.d.ts +15 -4
  43. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  44. package/dist/Store/Cosmos/query.js +179 -41
  45. package/dist/Store/Cosmos.d.ts +3 -3
  46. package/dist/Store/Cosmos.d.ts.map +1 -1
  47. package/dist/Store/Cosmos.js +345 -246
  48. package/dist/Store/Disk.d.ts +5 -5
  49. package/dist/Store/Disk.d.ts.map +1 -1
  50. package/dist/Store/Disk.js +77 -37
  51. package/dist/Store/Memory.d.ts +9 -6
  52. package/dist/Store/Memory.d.ts.map +1 -1
  53. package/dist/Store/Memory.js +328 -63
  54. package/dist/Store/SQL/Pg.d.ts +4 -0
  55. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  56. package/dist/Store/SQL/Pg.js +233 -0
  57. package/dist/Store/SQL/query.d.ts +49 -0
  58. package/dist/Store/SQL/query.d.ts.map +1 -0
  59. package/dist/Store/SQL/query.js +527 -0
  60. package/dist/Store/SQL.d.ts +21 -0
  61. package/dist/Store/SQL.d.ts.map +1 -0
  62. package/dist/Store/SQL.js +450 -0
  63. package/dist/Store/codeFilter.d.ts +5 -5
  64. package/dist/Store/codeFilter.d.ts.map +1 -1
  65. package/dist/Store/codeFilter.js +6 -3
  66. package/dist/Store/index.d.ts +7 -5
  67. package/dist/Store/index.d.ts.map +1 -1
  68. package/dist/Store/index.js +18 -5
  69. package/dist/Store/utils.d.ts +4 -3
  70. package/dist/Store/utils.d.ts.map +1 -1
  71. package/dist/Store/utils.js +5 -5
  72. package/dist/arbs.d.ts +2 -2
  73. package/dist/arbs.d.ts.map +1 -1
  74. package/dist/arbs.js +5 -3
  75. package/dist/codec.d.ts +5 -0
  76. package/dist/codec.d.ts.map +1 -0
  77. package/dist/codec.js +5 -0
  78. package/dist/cosmos-client.d.ts +16 -0
  79. package/dist/cosmos-client.d.ts.map +1 -0
  80. package/dist/cosmos-client.js +11 -0
  81. package/dist/errorReporter.d.ts +7 -5
  82. package/dist/errorReporter.d.ts.map +1 -1
  83. package/dist/errorReporter.js +23 -27
  84. package/dist/errors.d.ts +1 -1
  85. package/dist/fileUtil.d.ts +2 -2
  86. package/dist/fileUtil.d.ts.map +1 -1
  87. package/dist/fileUtil.js +2 -2
  88. package/dist/index.d.ts +3 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +3 -2
  91. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  92. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  93. package/dist/internal/RequestContextMiddleware.js +46 -0
  94. package/dist/internal/auth.d.ts +53 -0
  95. package/dist/internal/auth.d.ts.map +1 -0
  96. package/dist/internal/auth.js +180 -0
  97. package/dist/internal/events.d.ts +11 -0
  98. package/dist/internal/events.d.ts.map +1 -0
  99. package/dist/internal/events.js +49 -0
  100. package/dist/internal/health.d.ts +3 -0
  101. package/dist/internal/health.d.ts.map +1 -0
  102. package/dist/internal/health.js +5 -0
  103. package/dist/layerUtils.d.ts +32 -0
  104. package/dist/layerUtils.d.ts.map +1 -0
  105. package/dist/layerUtils.js +17 -0
  106. package/dist/logger/jsonLogger.d.ts +2 -2
  107. package/dist/logger/jsonLogger.d.ts.map +1 -1
  108. package/dist/logger/jsonLogger.js +5 -3
  109. package/dist/logger/logFmtLogger.d.ts +2 -2
  110. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  111. package/dist/logger/logFmtLogger.js +3 -3
  112. package/dist/logger/shared.d.ts +3 -3
  113. package/dist/logger/shared.d.ts.map +1 -1
  114. package/dist/logger/shared.js +4 -4
  115. package/dist/logger.d.ts +1 -1
  116. package/dist/logger.d.ts.map +1 -1
  117. package/dist/memQueue.d.ts +15 -0
  118. package/dist/memQueue.d.ts.map +1 -0
  119. package/dist/memQueue.js +21 -0
  120. package/dist/middlewares.d.ts +10 -0
  121. package/dist/middlewares.d.ts.map +1 -0
  122. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  123. package/dist/mongo-client.d.ts +11 -0
  124. package/dist/mongo-client.d.ts.map +1 -0
  125. package/dist/mongo-client.js +15 -0
  126. package/dist/otel.d.ts +75 -0
  127. package/dist/otel.d.ts.map +1 -0
  128. package/dist/otel.js +65 -0
  129. package/dist/rateLimit.d.ts +12 -4
  130. package/dist/rateLimit.d.ts.map +1 -1
  131. package/dist/rateLimit.js +7 -12
  132. package/dist/redis-client.d.ts +42 -0
  133. package/dist/redis-client.d.ts.map +1 -0
  134. package/dist/redis-client.js +98 -0
  135. package/dist/reportError.d.ts +4 -0
  136. package/dist/reportError.d.ts.map +1 -0
  137. package/dist/reportError.js +28 -0
  138. package/dist/routing/middleware/RouterMiddleware.d.ts +16 -0
  139. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  140. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  141. package/dist/routing/middleware/middleware.d.ts +48 -0
  142. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  143. package/dist/routing/middleware/middleware.js +128 -0
  144. package/dist/routing/middleware.d.ts +3 -0
  145. package/dist/routing/middleware.d.ts.map +1 -0
  146. package/dist/{api/routing → routing}/middleware.js +1 -2
  147. package/dist/routing/schema/jwt.d.ts +4 -0
  148. package/dist/routing/schema/jwt.d.ts.map +1 -0
  149. package/dist/routing/schema/jwt.js +13 -0
  150. package/dist/routing/tsort.d.ts +8 -0
  151. package/dist/routing/tsort.d.ts.map +1 -0
  152. package/dist/routing/tsort.js +51 -0
  153. package/dist/routing/utils.d.ts +19 -0
  154. package/dist/routing/utils.d.ts.map +1 -0
  155. package/dist/routing/utils.js +45 -0
  156. package/dist/routing.d.ts +184 -0
  157. package/dist/routing.d.ts.map +1 -0
  158. package/dist/routing.js +236 -0
  159. package/dist/setupRequest.d.ts +19 -0
  160. package/dist/setupRequest.d.ts.map +1 -0
  161. package/dist/setupRequest.js +70 -0
  162. package/dist/test.d.ts +3 -3
  163. package/dist/test.d.ts.map +1 -1
  164. package/dist/test.js +2 -2
  165. package/dist/util.d.ts +3 -0
  166. package/dist/util.d.ts.map +1 -0
  167. package/dist/util.js +14 -0
  168. package/dist/vitest.d.ts +1 -1
  169. package/examples/query.ts +47 -39
  170. package/package.json +123 -234
  171. package/src/CUPS.ts +52 -13
  172. package/src/{api/ContextProvider.ts → ContextProvider.ts} +19 -16
  173. package/src/Emailer/Sendgrid.ts +82 -59
  174. package/src/Emailer/fake.ts +3 -3
  175. package/src/MainFiberSet.ts +12 -10
  176. package/src/QueueMaker/SQLQueue.ts +153 -156
  177. package/src/QueueMaker/errors.ts +3 -1
  178. package/src/QueueMaker/memQueue.ts +113 -107
  179. package/src/QueueMaker/sbqueue.ts +78 -90
  180. package/src/RequestFiberSet.ts +13 -8
  181. package/src/{adapters/SQL → SQL}/Model.ts +42 -41
  182. package/src/ServiceBus.ts +219 -0
  183. package/src/Store/Cosmos/query.ts +216 -52
  184. package/src/Store/Cosmos.ts +494 -353
  185. package/src/Store/Disk.ts +108 -68
  186. package/src/Store/Memory.ts +367 -93
  187. package/src/Store/SQL/Pg.ts +364 -0
  188. package/src/Store/SQL/query.ts +603 -0
  189. package/src/Store/SQL.ts +736 -0
  190. package/src/Store/codeFilter.ts +8 -5
  191. package/src/Store/index.ts +21 -6
  192. package/src/Store/utils.ts +26 -24
  193. package/src/arbs.ts +5 -3
  194. package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +5 -3
  195. package/src/errorReporter.ts +66 -76
  196. package/src/fileUtil.ts +1 -1
  197. package/src/index.ts +2 -1
  198. package/src/internal/RequestContextMiddleware.ts +60 -0
  199. package/src/internal/auth.ts +272 -0
  200. package/src/{api/internal → internal}/events.ts +22 -13
  201. package/src/{api/layerUtils.ts → layerUtils.ts} +14 -10
  202. package/src/logger/jsonLogger.ts +4 -2
  203. package/src/logger/logFmtLogger.ts +2 -2
  204. package/src/logger/shared.ts +4 -3
  205. package/src/{adapters/memQueue.ts → memQueue.ts} +5 -4
  206. package/src/{adapters/mongo-client.ts → mongo-client.ts} +4 -2
  207. package/src/otel.ts +152 -0
  208. package/src/rateLimit.ts +34 -23
  209. package/src/{adapters/redis-client.ts → redis-client.ts} +7 -3
  210. package/src/{api/reportError.ts → reportError.ts} +3 -2
  211. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +5 -4
  212. package/src/{api/routing → routing}/middleware/middleware.ts +62 -17
  213. package/src/routing/middleware.ts +4 -0
  214. package/src/{api/routing → routing}/schema/jwt.ts +2 -1
  215. package/src/{api/routing → routing}/utils.ts +2 -1
  216. package/src/routing.ts +768 -0
  217. package/src/setupRequest.ts +135 -0
  218. package/src/test.ts +2 -2
  219. package/test/auth.test.ts +101 -0
  220. package/test/contextProvider.test.ts +15 -12
  221. package/test/controller.test.ts +28 -32
  222. package/test/cosmos-query.test.ts +159 -0
  223. package/test/dist/auth.test.d.ts.map +1 -0
  224. package/test/dist/contextProvider.test.d.ts.map +1 -1
  225. package/test/dist/controller.test.d.ts.map +1 -1
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/date-query.test.d.ts.map +1 -0
  228. package/test/dist/fixtures.d.ts +30 -12
  229. package/test/dist/fixtures.d.ts.map +1 -1
  230. package/test/dist/fixtures.js +17 -10
  231. package/test/dist/query.test.d.ts.map +1 -1
  232. package/test/dist/rawQuery.test.d.ts.map +1 -1
  233. package/test/dist/repository-ext.test.d.ts.map +1 -0
  234. package/test/dist/requires.test.d.ts.map +1 -1
  235. package/test/dist/router-generator.test.d.ts.map +1 -0
  236. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  237. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  238. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  239. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  240. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  241. package/test/dist/sql-store.test.d.ts.map +1 -0
  242. package/test/fixtures.ts +16 -9
  243. package/test/layerUtils.test.ts +2 -2
  244. package/test/query.test.ts +903 -40
  245. package/test/rawQuery.test.ts +340 -22
  246. package/test/repository-ext.test.ts +62 -0
  247. package/test/requires.test.ts +10 -5
  248. package/test/router-generator.test.ts +187 -0
  249. package/test/routing-interruptibility.test.ts +66 -0
  250. package/test/rpc-context-map-streaming.test.ts +262 -0
  251. package/test/rpc-e2e-invalidation.test.ts +256 -0
  252. package/test/rpc-multi-middleware.test.ts +85 -10
  253. package/test/rpc-stream-fullstack.test.ts +304 -0
  254. package/test/sql-store.test.ts +1711 -0
  255. package/test/validateSample.test.ts +19 -14
  256. package/tsconfig.examples.json +1 -1
  257. package/tsconfig.json +2 -1
  258. package/tsconfig.json.bak +2 -2
  259. package/tsconfig.src.json +35 -35
  260. package/tsconfig.test.json +2 -2
  261. package/dist/Emailer/service.d.ts +0 -55
  262. package/dist/Emailer/service.d.ts.map +0 -1
  263. package/dist/Emailer/service.js +0 -6
  264. package/dist/Emailer.d.ts +0 -2
  265. package/dist/Emailer.d.ts.map +0 -1
  266. package/dist/Emailer.js +0 -2
  267. package/dist/Model/Repository/ext.d.ts +0 -41
  268. package/dist/Model/Repository/ext.d.ts.map +0 -1
  269. package/dist/Model/Repository/ext.js +0 -65
  270. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  271. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  272. package/dist/Model/Repository/internal/internal.js +0 -316
  273. package/dist/Model/Repository/legacy.d.ts +0 -19
  274. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  275. package/dist/Model/Repository/legacy.js +0 -2
  276. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  277. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  278. package/dist/Model/Repository/makeRepo.js +0 -24
  279. package/dist/Model/Repository/service.d.ts +0 -89
  280. package/dist/Model/Repository/service.d.ts.map +0 -1
  281. package/dist/Model/Repository/service.js +0 -2
  282. package/dist/Model/Repository/validation.d.ts +0 -42
  283. package/dist/Model/Repository/validation.d.ts.map +0 -1
  284. package/dist/Model/Repository/validation.js +0 -32
  285. package/dist/Model/Repository.d.ts +0 -6
  286. package/dist/Model/Repository.d.ts.map +0 -1
  287. package/dist/Model/Repository.js +0 -6
  288. package/dist/Model/dsl.d.ts +0 -32
  289. package/dist/Model/dsl.d.ts.map +0 -1
  290. package/dist/Model/dsl.js +0 -44
  291. package/dist/Model/filter/filterApi.d.ts +0 -30
  292. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  293. package/dist/Model/filter/filterApi.js +0 -2
  294. package/dist/Model/filter/types/errors.d.ts +0 -29
  295. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  296. package/dist/Model/filter/types/errors.js +0 -2
  297. package/dist/Model/filter/types/fields.d.ts +0 -15
  298. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  299. package/dist/Model/filter/types/fields.js +0 -2
  300. package/dist/Model/filter/types/path/common.d.ts +0 -316
  301. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  302. package/dist/Model/filter/types/path/common.js +0 -2
  303. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  304. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  305. package/dist/Model/filter/types/path/eager.js +0 -31
  306. package/dist/Model/filter/types/path/index.d.ts +0 -4
  307. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  308. package/dist/Model/filter/types/path/index.js +0 -3
  309. package/dist/Model/filter/types/utils.d.ts +0 -79
  310. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  311. package/dist/Model/filter/types/utils.js +0 -2
  312. package/dist/Model/filter/types/validator.d.ts +0 -30
  313. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  314. package/dist/Model/filter/types/validator.js +0 -2
  315. package/dist/Model/filter/types.d.ts +0 -5
  316. package/dist/Model/filter/types.d.ts.map +0 -1
  317. package/dist/Model/filter/types.js +0 -7
  318. package/dist/Model/query/dsl.d.ts +0 -248
  319. package/dist/Model/query/dsl.d.ts.map +0 -1
  320. package/dist/Model/query/dsl.js +0 -104
  321. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  322. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  323. package/dist/Model/query/new-kid-interpreter.js +0 -165
  324. package/dist/Model/query.d.ts +0 -15
  325. package/dist/Model/query.d.ts.map +0 -1
  326. package/dist/Model/query.js +0 -3
  327. package/dist/Model.d.ts +0 -4
  328. package/dist/Model.d.ts.map +0 -1
  329. package/dist/Model.js +0 -4
  330. package/dist/Operations.d.ts +0 -55
  331. package/dist/Operations.d.ts.map +0 -1
  332. package/dist/Operations.js +0 -102
  333. package/dist/OperationsRepo.d.ts +0 -41
  334. package/dist/OperationsRepo.d.ts.map +0 -1
  335. package/dist/OperationsRepo.js +0 -14
  336. package/dist/QueueMaker/service.d.ts +0 -11
  337. package/dist/QueueMaker/service.d.ts.map +0 -1
  338. package/dist/QueueMaker/service.js +0 -4
  339. package/dist/RequestContext.d.ts +0 -63
  340. package/dist/RequestContext.d.ts.map +0 -1
  341. package/dist/RequestContext.js +0 -49
  342. package/dist/Store/ContextMapContainer.d.ts +0 -14
  343. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  344. package/dist/Store/ContextMapContainer.js +0 -16
  345. package/dist/Store/service.d.ts +0 -108
  346. package/dist/Store/service.d.ts.map +0 -1
  347. package/dist/Store/service.js +0 -71
  348. package/dist/Store.d.ts +0 -2
  349. package/dist/Store.d.ts.map +0 -1
  350. package/dist/Store.js +0 -2
  351. package/dist/adapters/SQL/Model.d.ts +0 -479
  352. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  353. package/dist/adapters/SQL/Model.js +0 -478
  354. package/dist/adapters/SQL.d.ts +0 -2
  355. package/dist/adapters/SQL.d.ts.map +0 -1
  356. package/dist/adapters/ServiceBus.d.ts +0 -58
  357. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  358. package/dist/adapters/ServiceBus.js +0 -99
  359. package/dist/adapters/cosmos-client.d.ts +0 -14
  360. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  361. package/dist/adapters/cosmos-client.js +0 -9
  362. package/dist/adapters/index.d.ts +0 -2
  363. package/dist/adapters/index.d.ts.map +0 -1
  364. package/dist/adapters/index.js +0 -2
  365. package/dist/adapters/logger.d.ts +0 -9
  366. package/dist/adapters/logger.d.ts.map +0 -1
  367. package/dist/adapters/logger.js +0 -3
  368. package/dist/adapters/memQueue.d.ts +0 -13
  369. package/dist/adapters/memQueue.d.ts.map +0 -1
  370. package/dist/adapters/memQueue.js +0 -20
  371. package/dist/adapters/mongo-client.d.ts +0 -10
  372. package/dist/adapters/mongo-client.d.ts.map +0 -1
  373. package/dist/adapters/mongo-client.js +0 -13
  374. package/dist/adapters/redis-client.d.ts +0 -39
  375. package/dist/adapters/redis-client.d.ts.map +0 -1
  376. package/dist/adapters/redis-client.js +0 -94
  377. package/dist/api/ContextProvider.d.ts +0 -31
  378. package/dist/api/ContextProvider.d.ts.map +0 -1
  379. package/dist/api/ContextProvider.js +0 -38
  380. package/dist/api/codec.d.ts +0 -5
  381. package/dist/api/codec.d.ts.map +0 -1
  382. package/dist/api/codec.js +0 -5
  383. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  384. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  385. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  386. package/dist/api/internal/auth.d.ts +0 -15
  387. package/dist/api/internal/auth.d.ts.map +0 -1
  388. package/dist/api/internal/auth.js +0 -47
  389. package/dist/api/internal/events.d.ts +0 -9
  390. package/dist/api/internal/events.d.ts.map +0 -1
  391. package/dist/api/internal/events.js +0 -42
  392. package/dist/api/internal/health.d.ts +0 -3
  393. package/dist/api/internal/health.d.ts.map +0 -1
  394. package/dist/api/internal/health.js +0 -5
  395. package/dist/api/layerUtils.d.ts +0 -24
  396. package/dist/api/layerUtils.d.ts.map +0 -1
  397. package/dist/api/layerUtils.js +0 -16
  398. package/dist/api/middlewares.d.ts +0 -10
  399. package/dist/api/middlewares.d.ts.map +0 -1
  400. package/dist/api/reportError.d.ts +0 -4
  401. package/dist/api/reportError.d.ts.map +0 -1
  402. package/dist/api/reportError.js +0 -27
  403. package/dist/api/routing/middleware/RouterMiddleware.d.ts +0 -15
  404. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  405. package/dist/api/routing/middleware/middleware.d.ts +0 -9
  406. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  407. package/dist/api/routing/middleware/middleware.js +0 -92
  408. package/dist/api/routing/middleware.d.ts +0 -4
  409. package/dist/api/routing/middleware.d.ts.map +0 -1
  410. package/dist/api/routing/schema/jwt.d.ts +0 -4
  411. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  412. package/dist/api/routing/schema/jwt.js +0 -12
  413. package/dist/api/routing/tsort.d.ts +0 -8
  414. package/dist/api/routing/tsort.d.ts.map +0 -1
  415. package/dist/api/routing/tsort.js +0 -51
  416. package/dist/api/routing/utils.d.ts +0 -19
  417. package/dist/api/routing/utils.d.ts.map +0 -1
  418. package/dist/api/routing/utils.js +0 -44
  419. package/dist/api/routing.d.ts +0 -138
  420. package/dist/api/routing.d.ts.map +0 -1
  421. package/dist/api/routing.js +0 -166
  422. package/dist/api/setupRequest.d.ts +0 -12
  423. package/dist/api/setupRequest.d.ts.map +0 -1
  424. package/dist/api/setupRequest.js +0 -44
  425. package/dist/api/util.d.ts +0 -3
  426. package/dist/api/util.d.ts.map +0 -1
  427. package/dist/api/util.js +0 -14
  428. package/eslint.config.mjs +0 -24
  429. package/src/Emailer/service.ts +0 -52
  430. package/src/Emailer.ts +0 -1
  431. package/src/Model/Repository/ext.ts +0 -283
  432. package/src/Model/Repository/internal/internal.ts +0 -577
  433. package/src/Model/Repository/legacy.ts +0 -27
  434. package/src/Model/Repository/makeRepo.ts +0 -139
  435. package/src/Model/Repository/service.ts +0 -627
  436. package/src/Model/Repository/validation.ts +0 -31
  437. package/src/Model/Repository.ts +0 -5
  438. package/src/Model/dsl.ts +0 -128
  439. package/src/Model/filter/filterApi.ts +0 -60
  440. package/src/Model/filter/types/errors.ts +0 -47
  441. package/src/Model/filter/types/fields.ts +0 -50
  442. package/src/Model/filter/types/path/common.ts +0 -404
  443. package/src/Model/filter/types/path/eager.ts +0 -298
  444. package/src/Model/filter/types/path/index.ts +0 -4
  445. package/src/Model/filter/types/utils.ts +0 -128
  446. package/src/Model/filter/types/validator.ts +0 -46
  447. package/src/Model/filter/types.ts +0 -6
  448. package/src/Model/query/dsl.ts +0 -2110
  449. package/src/Model/query/new-kid-interpreter.ts +0 -210
  450. package/src/Model/query.ts +0 -13
  451. package/src/Model.ts +0 -3
  452. package/src/Operations.ts +0 -235
  453. package/src/OperationsRepo.ts +0 -16
  454. package/src/QueueMaker/service.ts +0 -17
  455. package/src/RequestContext.ts +0 -63
  456. package/src/Store/ContextMapContainer.ts +0 -20
  457. package/src/Store/service.ts +0 -184
  458. package/src/Store.ts +0 -1
  459. package/src/adapters/ServiceBus.ts +0 -209
  460. package/src/adapters/index.ts +0 -0
  461. package/src/adapters/logger.ts +0 -3
  462. package/src/api/internal/RequestContextMiddleware.ts +0 -42
  463. package/src/api/internal/auth.ts +0 -68
  464. package/src/api/routing/middleware.ts +0 -6
  465. package/src/api/routing.ts +0 -598
  466. package/src/api/setupRequest.ts +0 -84
  467. /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
  468. /package/src/{api/codec.ts → codec.ts} +0 -0
  469. /package/src/{api/internal → internal}/health.ts +0 -0
  470. /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
  471. /package/src/{api/routing → routing}/tsort.ts +0 -0
  472. /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"
3
12
  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"
13
+ import { flow } from "effect/Function"
14
+ import * as ManagedRuntime from "effect/ManagedRuntime"
15
+ import * as Redacted from "effect/Redacted"
16
+ import * as References from "effect/References"
17
+ import * as Result from "effect/Result"
18
+ import * as Struct from "effect/Struct"
19
+ import { setupRequestContextFromCurrent } from "../src/setupRequest.js"
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 "../src/setupRequest.js"
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
  )