@effect-app/infra 4.0.0-beta.99 → 4.0.1

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 (486) hide show
  1. package/CHANGELOG.md +2901 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +28 -9
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +35 -14
  6. package/dist/ClusterCosmos.d.ts +67 -0
  7. package/dist/ClusterCosmos.d.ts.map +1 -0
  8. package/dist/ClusterCosmos.js +588 -0
  9. package/dist/ClusterServiceBus.d.ts +67 -0
  10. package/dist/ClusterServiceBus.d.ts.map +1 -0
  11. package/dist/ClusterServiceBus.js +84 -0
  12. package/dist/{api/ContextProvider.d.ts → ContextProvider.d.ts} +7 -4
  13. package/dist/ContextProvider.d.ts.map +1 -0
  14. package/dist/ContextProvider.js +40 -0
  15. package/dist/Emailer/Sendgrid.d.ts +110 -146
  16. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  17. package/dist/Emailer/Sendgrid.js +24 -19
  18. package/dist/Emailer/fake.d.ts +1 -1
  19. package/dist/Emailer/fake.d.ts.map +1 -1
  20. package/dist/Emailer/fake.js +4 -4
  21. package/dist/MainFiberSet.d.ts +11 -7
  22. package/dist/MainFiberSet.d.ts.map +1 -1
  23. package/dist/MainFiberSet.js +22 -6
  24. package/dist/QueueMaker/errors.d.ts +3 -1
  25. package/dist/QueueMaker/errors.d.ts.map +1 -1
  26. package/dist/QueueMaker/errors.js +4 -2
  27. package/dist/{adapters/SQL → SQL}/Model.d.ts +34 -45
  28. package/dist/SQL/Model.d.ts.map +1 -0
  29. package/dist/SQL/Model.js +469 -0
  30. package/dist/SQL.d.ts.map +1 -0
  31. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  32. package/dist/Store/Cosmos/query.d.ts +16 -4
  33. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  34. package/dist/Store/Cosmos/query.js +240 -44
  35. package/dist/Store/Cosmos.d.ts +2 -2
  36. package/dist/Store/Cosmos.d.ts.map +1 -1
  37. package/dist/Store/Cosmos.js +394 -320
  38. package/dist/Store/Disk.d.ts +4 -4
  39. package/dist/Store/Disk.d.ts.map +1 -1
  40. package/dist/Store/Disk.js +91 -39
  41. package/dist/Store/Memory.d.ts +7 -10
  42. package/dist/Store/Memory.d.ts.map +1 -1
  43. package/dist/Store/Memory.js +347 -78
  44. package/dist/Store/SQL/Pg.d.ts +2 -2
  45. package/dist/Store/SQL/Pg.d.ts.map +1 -1
  46. package/dist/Store/SQL/Pg.js +230 -155
  47. package/dist/Store/SQL/query.d.ts +19 -3
  48. package/dist/Store/SQL/query.d.ts.map +1 -1
  49. package/dist/Store/SQL/query.js +308 -14
  50. package/dist/Store/SQL.d.ts +22 -5
  51. package/dist/Store/SQL.d.ts.map +1 -1
  52. package/dist/Store/SQL.js +370 -99
  53. package/dist/Store/codeFilter.d.ts +5 -5
  54. package/dist/Store/codeFilter.d.ts.map +1 -1
  55. package/dist/Store/codeFilter.js +72 -23
  56. package/dist/Store/index.d.ts +6 -4
  57. package/dist/Store/index.d.ts.map +1 -1
  58. package/dist/Store/index.js +9 -6
  59. package/dist/Store/jsonDocument.d.ts +67 -0
  60. package/dist/Store/jsonDocument.d.ts.map +1 -0
  61. package/dist/Store/jsonDocument.js +107 -0
  62. package/dist/Store/utils.d.ts +21 -2
  63. package/dist/Store/utils.d.ts.map +1 -1
  64. package/dist/Store/utils.js +253 -10
  65. package/dist/WorkflowEngineCosmos.d.ts +30 -0
  66. package/dist/WorkflowEngineCosmos.d.ts.map +1 -0
  67. package/dist/WorkflowEngineCosmos.js +542 -0
  68. package/dist/WorkflowEngineSqlite.d.ts +24 -0
  69. package/dist/WorkflowEngineSqlite.d.ts.map +1 -0
  70. package/dist/WorkflowEngineSqlite.js +550 -0
  71. package/dist/arbs.d.ts +6 -3
  72. package/dist/arbs.d.ts.map +1 -1
  73. package/dist/arbs.js +20 -4
  74. package/dist/codec.d.ts.map +1 -0
  75. package/dist/codec.js +5 -0
  76. package/dist/cosmos-client.d.ts +40 -0
  77. package/dist/cosmos-client.d.ts.map +1 -0
  78. package/dist/cosmos-client.js +41 -0
  79. package/dist/errorReporter.d.ts +6 -4
  80. package/dist/errorReporter.d.ts.map +1 -1
  81. package/dist/errorReporter.js +23 -27
  82. package/dist/fileUtil.d.ts +1 -1
  83. package/dist/fileUtil.d.ts.map +1 -1
  84. package/dist/fileUtil.js +2 -2
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -2
  88. package/dist/internal/RequestContextMiddleware.d.ts +5 -0
  89. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  90. package/dist/internal/RequestContextMiddleware.js +45 -0
  91. package/dist/internal/auth.d.ts +53 -0
  92. package/dist/internal/auth.d.ts.map +1 -0
  93. package/dist/internal/auth.js +180 -0
  94. package/dist/internal/events.d.ts +11 -0
  95. package/dist/internal/events.d.ts.map +1 -0
  96. package/dist/internal/events.js +49 -0
  97. package/dist/{api/internal → internal}/health.d.ts +1 -1
  98. package/dist/internal/health.d.ts.map +1 -0
  99. package/dist/internal/health.js +5 -0
  100. package/dist/{api/layerUtils.d.ts → layerUtils.d.ts} +10 -2
  101. package/dist/layerUtils.d.ts.map +1 -0
  102. package/dist/layerUtils.js +17 -0
  103. package/dist/logger/jsonLogger.d.ts +1 -1
  104. package/dist/logger/jsonLogger.d.ts.map +1 -1
  105. package/dist/logger/jsonLogger.js +5 -3
  106. package/dist/logger/logFmtLogger.d.ts +1 -1
  107. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  108. package/dist/logger/logFmtLogger.js +3 -3
  109. package/dist/logger/shared.d.ts +2 -2
  110. package/dist/logger/shared.d.ts.map +1 -1
  111. package/dist/logger/shared.js +6 -6
  112. package/dist/logger.d.ts.map +1 -1
  113. package/dist/middlewares.d.ts.map +1 -0
  114. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  115. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +2 -1
  116. package/dist/mongo-client.d.ts.map +1 -0
  117. package/dist/mongo-client.js +15 -0
  118. package/dist/otel.d.ts +75 -0
  119. package/dist/otel.d.ts.map +1 -0
  120. package/dist/otel.js +84 -0
  121. package/dist/rateLimit.d.ts +11 -3
  122. package/dist/rateLimit.d.ts.map +1 -1
  123. package/dist/rateLimit.js +7 -12
  124. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +4 -1
  125. package/dist/redis-client.d.ts.map +1 -0
  126. package/dist/redis-client.js +98 -0
  127. package/dist/{api/reportError.d.ts → reportError.d.ts} +1 -1
  128. package/dist/reportError.d.ts.map +1 -0
  129. package/dist/reportError.js +28 -0
  130. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +2 -1
  131. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  132. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  133. package/dist/{api/routing → routing}/middleware/middleware.d.ts +11 -6
  134. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  135. package/dist/routing/middleware/middleware.js +152 -0
  136. package/dist/{api/routing → routing}/middleware.d.ts +0 -1
  137. package/dist/routing/middleware.d.ts.map +1 -0
  138. package/dist/{api/routing → routing}/middleware.js +1 -2
  139. package/dist/routing/schema/jwt.d.ts.map +1 -0
  140. package/dist/routing/schema/jwt.js +12 -0
  141. package/dist/routing/tsort.d.ts.map +1 -0
  142. package/dist/routing/tsort.js +51 -0
  143. package/dist/{api/routing → routing}/utils.d.ts +3 -3
  144. package/dist/routing/utils.d.ts.map +1 -0
  145. package/dist/routing/utils.js +45 -0
  146. package/dist/routing.d.ts +182 -0
  147. package/dist/routing.d.ts.map +1 -0
  148. package/dist/routing.js +257 -0
  149. package/dist/test.d.ts +2 -2
  150. package/dist/test.d.ts.map +1 -1
  151. package/dist/test.js +5 -5
  152. package/dist/util.d.ts.map +1 -0
  153. package/dist/util.js +14 -0
  154. package/docs/cluster-storage.md +26 -0
  155. package/docs/workflow-engine.md +262 -0
  156. package/examples/query.ts +23 -19
  157. package/package.json +36 -364
  158. package/src/CUPS.ts +53 -14
  159. package/src/ClusterCosmos.ts +1170 -0
  160. package/src/ClusterServiceBus.ts +244 -0
  161. package/src/{api/ContextProvider.ts → ContextProvider.ts} +10 -7
  162. package/src/Emailer/Sendgrid.ts +83 -60
  163. package/src/Emailer/fake.ts +4 -4
  164. package/src/MainFiberSet.ts +31 -12
  165. package/src/QueueMaker/errors.ts +3 -1
  166. package/src/{adapters/SQL → SQL}/Model.ts +48 -47
  167. package/src/SQL.ts +1 -0
  168. package/src/Store/Cosmos/query.ts +277 -57
  169. package/src/Store/Cosmos.ts +597 -512
  170. package/src/Store/Disk.ts +145 -71
  171. package/src/Store/Memory.ts +419 -115
  172. package/src/Store/SQL/Pg.ts +352 -269
  173. package/src/Store/SQL/query.ts +368 -22
  174. package/src/Store/SQL.ts +742 -294
  175. package/src/Store/codeFilter.ts +79 -29
  176. package/src/Store/index.ts +18 -13
  177. package/src/Store/jsonDocument.ts +143 -0
  178. package/src/Store/utils.ts +307 -30
  179. package/src/WorkflowEngineCosmos.ts +749 -0
  180. package/src/WorkflowEngineSqlite.ts +813 -0
  181. package/src/arbs.ts +25 -5
  182. package/src/cosmos-client.ts +72 -0
  183. package/src/errorReporter.ts +70 -78
  184. package/src/fileUtil.ts +1 -1
  185. package/src/index.ts +2 -1
  186. package/src/{api/internal → internal}/RequestContextMiddleware.ts +23 -6
  187. package/src/internal/auth.ts +272 -0
  188. package/src/{api/internal → internal}/events.ts +18 -9
  189. package/src/{api/layerUtils.ts → layerUtils.ts} +7 -3
  190. package/src/logger/jsonLogger.ts +5 -3
  191. package/src/logger/logFmtLogger.ts +3 -3
  192. package/src/logger/shared.ts +6 -5
  193. package/src/middlewares.ts +10 -0
  194. package/src/{adapters/mongo-client.ts → mongo-client.ts} +3 -1
  195. package/src/otel.ts +177 -0
  196. package/src/rateLimit.ts +35 -24
  197. package/src/{adapters/redis-client.ts → redis-client.ts} +6 -2
  198. package/src/{api/reportError.ts → reportError.ts} +3 -2
  199. package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +2 -1
  200. package/src/{api/routing → routing}/middleware/middleware.ts +75 -50
  201. package/src/routing/middleware.ts +4 -0
  202. package/src/{api/routing → routing}/schema/jwt.ts +2 -2
  203. package/src/{api/routing → routing}/utils.ts +2 -1
  204. package/src/routing.ts +827 -0
  205. package/src/test.ts +6 -6
  206. package/src/vitest.ts +1 -1
  207. package/test/arbs-magnitude.test.ts +33 -0
  208. package/test/arbs.test.ts +41 -0
  209. package/test/auth.test.ts +101 -0
  210. package/test/cluster-cosmos.test.ts +634 -0
  211. package/test/cluster-servicebus.test.ts +180 -0
  212. package/test/cluster-sqlite.test.ts +207 -0
  213. package/test/contextProvider.test.ts +11 -8
  214. package/test/controller.test.ts +23 -28
  215. package/test/cosmos-container-throughput.test.ts +80 -0
  216. package/test/cosmos-query.test.ts +368 -0
  217. package/test/dist/arbs-magnitude.test.d.ts.map +1 -0
  218. package/test/dist/arbs.test.d.ts.map +1 -0
  219. package/test/dist/auth.test.d.ts.map +1 -0
  220. package/test/dist/cluster-cosmos.test.d.ts.map +1 -0
  221. package/test/dist/cluster-servicebus.test.d.ts.map +1 -0
  222. package/test/dist/cluster-sqlite.test.d.ts.map +1 -0
  223. package/test/dist/contextProvider.test.d.ts.map +1 -1
  224. package/test/dist/controller.test.d.ts.map +1 -1
  225. package/test/dist/cosmos-container-throughput.test.d.ts.map +1 -0
  226. package/test/dist/cosmos-query.test.d.ts.map +1 -0
  227. package/test/dist/fixtures.d.ts +17 -9
  228. package/test/dist/fixtures.d.ts.map +1 -1
  229. package/test/dist/fixtures.js +8 -3
  230. package/test/dist/json-lower.test.d.ts.map +1 -0
  231. package/test/dist/query.test.d.ts.map +1 -1
  232. package/test/dist/rawQuery.test.d.ts.map +1 -1
  233. package/test/dist/repository-ext.test.d.ts.map +1 -0
  234. package/test/dist/repository-legacy-document.test.d.ts.map +1 -0
  235. package/test/dist/requires.test.d.ts.map +1 -1
  236. package/test/dist/router-generator.test.d.ts.map +1 -0
  237. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  238. package/test/dist/rpc-context-map-streaming.test.d.ts.map +1 -0
  239. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  240. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  241. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  242. package/test/dist/workflow-engine-cosmos.test.d.ts.map +1 -0
  243. package/test/dist/workflow-engine-sqlite.test.d.ts.map +1 -0
  244. package/test/fixtures.ts +7 -2
  245. package/test/json-lower.test.ts +129 -0
  246. package/test/layerUtils.test.ts +2 -2
  247. package/test/query.test.ts +1232 -42
  248. package/test/rawQuery.test.ts +432 -7
  249. package/test/repository-ext.test.ts +456 -0
  250. package/test/repository-legacy-document.test.ts +394 -0
  251. package/test/requires.test.ts +7 -3
  252. package/test/router-generator.test.ts +187 -0
  253. package/test/routing-interruptibility.test.ts +66 -0
  254. package/test/rpc-context-map-streaming.test.ts +265 -0
  255. package/test/rpc-e2e-invalidation.test.ts +421 -0
  256. package/test/rpc-multi-middleware.test.ts +17 -11
  257. package/test/rpc-stream-fullstack.test.ts +307 -0
  258. package/test/sql-store.test.ts +1202 -47
  259. package/test/validateSample.test.ts +70 -42
  260. package/test/workflow-engine-cosmos.test.ts +345 -0
  261. package/test/workflow-engine-sqlite.test.ts +297 -0
  262. package/tsconfig.examples.json +1 -1
  263. package/tsconfig.json +9 -1
  264. package/tsconfig.src.json +35 -35
  265. package/tsconfig.test.json +2 -2
  266. package/dist/Emailer/service.d.ts +0 -55
  267. package/dist/Emailer/service.d.ts.map +0 -1
  268. package/dist/Emailer/service.js +0 -6
  269. package/dist/Emailer.d.ts +0 -2
  270. package/dist/Emailer.d.ts.map +0 -1
  271. package/dist/Emailer.js +0 -2
  272. package/dist/Model/Repository/ext.d.ts +0 -41
  273. package/dist/Model/Repository/ext.d.ts.map +0 -1
  274. package/dist/Model/Repository/ext.js +0 -65
  275. package/dist/Model/Repository/internal/internal.d.ts +0 -59
  276. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  277. package/dist/Model/Repository/internal/internal.js +0 -320
  278. package/dist/Model/Repository/legacy.d.ts +0 -19
  279. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  280. package/dist/Model/Repository/legacy.js +0 -2
  281. package/dist/Model/Repository/makeRepo.d.ts +0 -49
  282. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  283. package/dist/Model/Repository/makeRepo.js +0 -24
  284. package/dist/Model/Repository/service.d.ts +0 -89
  285. package/dist/Model/Repository/service.d.ts.map +0 -1
  286. package/dist/Model/Repository/service.js +0 -2
  287. package/dist/Model/Repository/validation.d.ts +0 -43
  288. package/dist/Model/Repository/validation.d.ts.map +0 -1
  289. package/dist/Model/Repository/validation.js +0 -32
  290. package/dist/Model/Repository.d.ts +0 -6
  291. package/dist/Model/Repository.d.ts.map +0 -1
  292. package/dist/Model/Repository.js +0 -6
  293. package/dist/Model/dsl.d.ts +0 -32
  294. package/dist/Model/dsl.d.ts.map +0 -1
  295. package/dist/Model/dsl.js +0 -44
  296. package/dist/Model/filter/filterApi.d.ts +0 -30
  297. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  298. package/dist/Model/filter/filterApi.js +0 -2
  299. package/dist/Model/filter/types/errors.d.ts +0 -29
  300. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  301. package/dist/Model/filter/types/errors.js +0 -2
  302. package/dist/Model/filter/types/fields.d.ts +0 -15
  303. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  304. package/dist/Model/filter/types/fields.js +0 -2
  305. package/dist/Model/filter/types/path/common.d.ts +0 -316
  306. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  307. package/dist/Model/filter/types/path/common.js +0 -2
  308. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  309. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  310. package/dist/Model/filter/types/path/eager.js +0 -31
  311. package/dist/Model/filter/types/path/index.d.ts +0 -4
  312. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  313. package/dist/Model/filter/types/path/index.js +0 -3
  314. package/dist/Model/filter/types/utils.d.ts +0 -79
  315. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  316. package/dist/Model/filter/types/utils.js +0 -2
  317. package/dist/Model/filter/types/validator.d.ts +0 -30
  318. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  319. package/dist/Model/filter/types/validator.js +0 -2
  320. package/dist/Model/filter/types.d.ts +0 -5
  321. package/dist/Model/filter/types.d.ts.map +0 -1
  322. package/dist/Model/filter/types.js +0 -7
  323. package/dist/Model/query/dsl.d.ts +0 -248
  324. package/dist/Model/query/dsl.d.ts.map +0 -1
  325. package/dist/Model/query/dsl.js +0 -104
  326. package/dist/Model/query/new-kid-interpreter.d.ts +0 -28
  327. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  328. package/dist/Model/query/new-kid-interpreter.js +0 -165
  329. package/dist/Model/query.d.ts +0 -15
  330. package/dist/Model/query.d.ts.map +0 -1
  331. package/dist/Model/query.js +0 -3
  332. package/dist/Model.d.ts +0 -4
  333. package/dist/Model.d.ts.map +0 -1
  334. package/dist/Model.js +0 -4
  335. package/dist/Operations.d.ts +0 -55
  336. package/dist/Operations.d.ts.map +0 -1
  337. package/dist/Operations.js +0 -102
  338. package/dist/OperationsRepo.d.ts +0 -41
  339. package/dist/OperationsRepo.d.ts.map +0 -1
  340. package/dist/OperationsRepo.js +0 -14
  341. package/dist/QueueMaker/SQLQueue.d.ts +0 -14
  342. package/dist/QueueMaker/SQLQueue.d.ts.map +0 -1
  343. package/dist/QueueMaker/SQLQueue.js +0 -132
  344. package/dist/QueueMaker/memQueue.d.ts +0 -11
  345. package/dist/QueueMaker/memQueue.d.ts.map +0 -1
  346. package/dist/QueueMaker/memQueue.js +0 -76
  347. package/dist/QueueMaker/sbqueue.d.ts +0 -12
  348. package/dist/QueueMaker/sbqueue.d.ts.map +0 -1
  349. package/dist/QueueMaker/sbqueue.js +0 -91
  350. package/dist/QueueMaker/service.d.ts +0 -11
  351. package/dist/QueueMaker/service.d.ts.map +0 -1
  352. package/dist/QueueMaker/service.js +0 -4
  353. package/dist/RequestContext.d.ts +0 -68
  354. package/dist/RequestContext.d.ts.map +0 -1
  355. package/dist/RequestContext.js +0 -49
  356. package/dist/RequestFiberSet.d.ts +0 -36
  357. package/dist/RequestFiberSet.d.ts.map +0 -1
  358. package/dist/RequestFiberSet.js +0 -78
  359. package/dist/Store/ContextMapContainer.d.ts +0 -25
  360. package/dist/Store/ContextMapContainer.d.ts.map +0 -1
  361. package/dist/Store/ContextMapContainer.js +0 -77
  362. package/dist/Store/service.d.ts +0 -111
  363. package/dist/Store/service.d.ts.map +0 -1
  364. package/dist/Store/service.js +0 -79
  365. package/dist/Store.d.ts +0 -2
  366. package/dist/Store.d.ts.map +0 -1
  367. package/dist/Store.js +0 -2
  368. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  369. package/dist/adapters/SQL/Model.js +0 -478
  370. package/dist/adapters/SQL.d.ts.map +0 -1
  371. package/dist/adapters/ServiceBus.d.ts +0 -58
  372. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  373. package/dist/adapters/ServiceBus.js +0 -99
  374. package/dist/adapters/cosmos-client.d.ts +0 -14
  375. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  376. package/dist/adapters/cosmos-client.js +0 -9
  377. package/dist/adapters/index.d.ts +0 -2
  378. package/dist/adapters/index.d.ts.map +0 -1
  379. package/dist/adapters/index.js +0 -2
  380. package/dist/adapters/logger.d.ts +0 -9
  381. package/dist/adapters/logger.d.ts.map +0 -1
  382. package/dist/adapters/logger.js +0 -3
  383. package/dist/adapters/memQueue.d.ts +0 -13
  384. package/dist/adapters/memQueue.d.ts.map +0 -1
  385. package/dist/adapters/memQueue.js +0 -20
  386. package/dist/adapters/mongo-client.d.ts.map +0 -1
  387. package/dist/adapters/mongo-client.js +0 -13
  388. package/dist/adapters/redis-client.d.ts.map +0 -1
  389. package/dist/adapters/redis-client.js +0 -94
  390. package/dist/api/ContextProvider.d.ts.map +0 -1
  391. package/dist/api/ContextProvider.js +0 -38
  392. package/dist/api/codec.d.ts.map +0 -1
  393. package/dist/api/codec.js +0 -5
  394. package/dist/api/internal/RequestContextMiddleware.d.ts +0 -5
  395. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  396. package/dist/api/internal/RequestContextMiddleware.js +0 -35
  397. package/dist/api/internal/auth.d.ts +0 -15
  398. package/dist/api/internal/auth.d.ts.map +0 -1
  399. package/dist/api/internal/auth.js +0 -47
  400. package/dist/api/internal/events.d.ts +0 -9
  401. package/dist/api/internal/events.d.ts.map +0 -1
  402. package/dist/api/internal/events.js +0 -42
  403. package/dist/api/internal/health.d.ts.map +0 -1
  404. package/dist/api/internal/health.js +0 -5
  405. package/dist/api/layerUtils.d.ts.map +0 -1
  406. package/dist/api/layerUtils.js +0 -16
  407. package/dist/api/middlewares.d.ts.map +0 -1
  408. package/dist/api/reportError.d.ts.map +0 -1
  409. package/dist/api/reportError.js +0 -27
  410. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  411. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  412. package/dist/api/routing/middleware/middleware.js +0 -130
  413. package/dist/api/routing/middleware.d.ts.map +0 -1
  414. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  415. package/dist/api/routing/schema/jwt.js +0 -12
  416. package/dist/api/routing/tsort.d.ts.map +0 -1
  417. package/dist/api/routing/tsort.js +0 -51
  418. package/dist/api/routing/utils.d.ts.map +0 -1
  419. package/dist/api/routing/utils.js +0 -44
  420. package/dist/api/routing.d.ts +0 -134
  421. package/dist/api/routing.d.ts.map +0 -1
  422. package/dist/api/routing.js +0 -167
  423. package/dist/api/setupRequest.d.ts +0 -15
  424. package/dist/api/setupRequest.d.ts.map +0 -1
  425. package/dist/api/setupRequest.js +0 -49
  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 -580
  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/SQLQueue.ts +0 -190
  455. package/src/QueueMaker/memQueue.ts +0 -130
  456. package/src/QueueMaker/sbqueue.ts +0 -137
  457. package/src/QueueMaker/service.ts +0 -17
  458. package/src/RequestContext.ts +0 -63
  459. package/src/RequestFiberSet.ts +0 -105
  460. package/src/Store/ContextMapContainer.ts +0 -116
  461. package/src/Store/index.test.ts.bak +0 -112
  462. package/src/Store/service.ts +0 -193
  463. package/src/Store.ts +0 -1
  464. package/src/adapters/SQL.ts +0 -1
  465. package/src/adapters/ServiceBus.ts +0 -209
  466. package/src/adapters/cosmos-client.ts +0 -16
  467. package/src/adapters/index.ts +0 -0
  468. package/src/adapters/logger.ts +0 -3
  469. package/src/adapters/memQueue.ts +0 -21
  470. package/src/api/internal/auth.ts +0 -68
  471. package/src/api/middlewares.ts +0 -10
  472. package/src/api/routing/middleware.ts +0 -6
  473. package/src/api/routing.ts +0 -598
  474. package/src/api/setupRequest.ts +0 -104
  475. package/test/dist/date-query.test.d.ts.map +0 -1
  476. package/tsconfig.json.bak +0 -12
  477. /package/dist/{adapters/SQL.d.ts → SQL.d.ts} +0 -0
  478. /package/dist/{api/codec.d.ts → codec.d.ts} +0 -0
  479. /package/dist/{api/middlewares.d.ts → middlewares.d.ts} +0 -0
  480. /package/dist/{api/routing → routing}/schema/jwt.d.ts +0 -0
  481. /package/dist/{api/routing → routing}/tsort.d.ts +0 -0
  482. /package/dist/{api/util.d.ts → util.d.ts} +0 -0
  483. /package/src/{api/codec.ts → codec.ts} +0 -0
  484. /package/src/{api/internal → internal}/health.ts +0 -0
  485. /package/src/{api/routing → routing}/tsort.ts +0 -0
  486. /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, Context } 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(
@@ -76,7 +90,7 @@ class SomethingRepo extends Context.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
@@ -85,7 +99,7 @@ class SomethingRepo extends Context.Service<SomethingRepo>()(
85
99
  Layer.provide(
86
100
  Effect
87
101
  .gen(function*() {
88
- const url = yield* Config.redacted("STORAGE_URL").pipe(
102
+ const url = yield* Config.Redacted("STORAGE_URL").pipe(
89
103
  Config.withDefault(
90
104
  Redacted.make(
91
105
  // the emulator doesn't implement array projections :/ so you need an actual cloud instance!
@@ -98,6 +112,7 @@ class SomethingRepo extends Context.Service<SomethingRepo>()(
98
112
  prefix: "",
99
113
  url
100
114
  })
115
+ .pipe(Layer.merge(RepositoryRegistryLive))
101
116
  })
102
117
  .pipe(Layer.unwrap)
103
118
  )
@@ -354,6 +369,67 @@ describe("multi-level", () => {
354
369
  .pipe(Effect.provide(SomethingRepo.Test), rt.runPromise))
355
370
  })
356
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
+
357
433
  // FUTURE: we need something like this instead:
358
434
  /*
359
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"
@@ -371,6 +447,246 @@ describe("multi-level", () => {
371
447
  ))
372
448
  */
373
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
+
374
690
  describe("removeByIds", () => {
375
691
  const test = Effect
376
692
  .gen(function*() {
@@ -407,7 +723,7 @@ describe("removeByIds", () => {
407
723
 
408
724
  yield* repo.saveAndPublish(items)
409
725
  const itemsAfterSave = yield* repo.all
410
- yield* repo.removeById(...items.slice(0, 2).map((_) => _.id))
726
+ yield* repo.removeById([items[0]!.id, items[1]!.id])
411
727
 
412
728
  const items2 = yield* repo.all
413
729
 
@@ -424,3 +740,112 @@ describe("removeByIds", () => {
424
740
  test
425
741
  .pipe(Effect.provide(SomethingRepo.Test), rt.runPromise))
426
742
  })
743
+
744
+ describe("queryRaw reads stored JSON, not Encoded", () => {
745
+ class Dated extends S.Class<Dated>("Dated")({
746
+ id: S.String,
747
+ at: S.Date,
748
+ name: S.String
749
+ }) {}
750
+
751
+ const dated = new Dated({
752
+ id: "d1",
753
+ at: new Date("2024-06-01T00:00:00.000Z"),
754
+ name: "one"
755
+ })
756
+
757
+ // @effect-diagnostics-next-line missingEffectServiceDependency:off
758
+ class DatedRepo extends Context.Service<DatedRepo>()(
759
+ "DatedRepo",
760
+ {
761
+ make: Effect.gen(function*() {
762
+ return yield* makeRepo("Dated", Dated, { config: { partitionValue: () => "dated-" + new Date().getTime() } })
763
+ })
764
+ }
765
+ ) {
766
+ static readonly layer = Layer
767
+ .effect(
768
+ DatedRepo,
769
+ Effect.gen(function*() {
770
+ const repo = DatedRepo.of(
771
+ yield* makeRepo("Dated", Dated, { config: { partitionValue: () => "dated-" + new Date().getTime() } })
772
+ )
773
+ yield* repo.saveAndPublish([dated]).pipe(setupRequestContextFromCurrent("init"))
774
+ return repo
775
+ })
776
+ )
777
+ static readonly Test = this
778
+ .layer
779
+ .pipe(Layer.provide(Layer.merge(MemoryStoreLive, RepositoryRegistryLive)))
780
+ static readonly TestSqlite = this
781
+ .layer
782
+ .pipe(
783
+ Layer.provide(
784
+ Layer.merge(
785
+ SQLiteStoreLayer({
786
+ url: Redacted.make("sqlite://"),
787
+ prefix: "test_",
788
+ dbName: "test"
789
+ }),
790
+ RepositoryRegistryLive
791
+ )
792
+ ),
793
+ Layer.provide(SqliteClient.layer({ filename: ":memory:" }))
794
+ )
795
+ static readonly TestCosmos = this
796
+ .layer
797
+ .pipe(
798
+ Layer.provide(
799
+ Effect
800
+ .gen(function*() {
801
+ const url = yield* Config.Redacted("STORAGE_URL").pipe(
802
+ Config.withDefault(
803
+ Redacted.make(
804
+ "AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
805
+ )
806
+ )
807
+ )
808
+ return CosmosStoreLayer({
809
+ dbName: "test",
810
+ prefix: "",
811
+ url
812
+ })
813
+ .pipe(Layer.merge(RepositoryRegistryLive))
814
+ })
815
+ .pipe(Layer.unwrap)
816
+ )
817
+ )
818
+ }
819
+
820
+ const test = Effect
821
+ .gen(function*() {
822
+ const repo = yield* DatedRepo
823
+ const rows = yield* repo.queryRaw(S.Unknown, {
824
+ cosmos: ({ name }) => ({
825
+ query: `SELECT c.id, c AS raw FROM ${name} c`,
826
+ parameters: []
827
+ }),
828
+ memory: (items) => items.map((row) => ({ id: String(row.id), raw: row }))
829
+ })
830
+ expect(rows).toEqual([{
831
+ id: "d1",
832
+ raw: expect.objectContaining({
833
+ id: "d1",
834
+ at: "2024-06-01T00:00:00.000Z",
835
+ name: "one"
836
+ })
837
+ }])
838
+ const loaded = yield* repo.all
839
+ expect(loaded[0]!.at).toEqual(dated.at)
840
+ })
841
+ .pipe(setupRequestContextFromCurrent())
842
+
843
+ it.skipIf(!process.env["STORAGE_URL"])(
844
+ "works well in CosmosDB",
845
+ () => test.pipe(Effect.provide(DatedRepo.TestCosmos), rt.runPromise)
846
+ )
847
+
848
+ it("works well in Memory", () => test.pipe(Effect.provide(DatedRepo.Test), rt.runPromise))
849
+
850
+ it("works well in SQLite", () => test.pipe(Effect.provide(DatedRepo.TestSqlite), rt.runPromise))
851
+ })