@effect-app/infra 4.0.0-beta.248 → 4.0.0-beta.249

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 (377) hide show
  1. package/CHANGELOG.md +14 -1
  2. package/dist/ContextProvider.d.ts +34 -0
  3. package/dist/ContextProvider.d.ts.map +1 -0
  4. package/dist/ContextProvider.js +40 -0
  5. package/dist/Emailer/Sendgrid.d.ts +109 -145
  6. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  7. package/dist/Emailer/Sendgrid.js +4 -3
  8. package/dist/Emailer/fake.d.ts +2 -2
  9. package/dist/Emailer/fake.d.ts.map +1 -1
  10. package/dist/Emailer/fake.js +2 -2
  11. package/dist/QueueMaker/SQLQueue.d.ts +2 -2
  12. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  13. package/dist/QueueMaker/SQLQueue.js +4 -4
  14. package/dist/QueueMaker/memQueue.d.ts +2 -2
  15. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  16. package/dist/QueueMaker/memQueue.js +4 -4
  17. package/dist/QueueMaker/sbqueue.d.ts +2 -2
  18. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  19. package/dist/QueueMaker/sbqueue.js +4 -4
  20. package/dist/RequestFiberSet.js +2 -2
  21. package/dist/{adapters/SQL → SQL}/Model.d.ts +2 -2
  22. package/dist/SQL/Model.d.ts.map +1 -0
  23. package/dist/SQL/Model.js +469 -0
  24. package/dist/{adapters/SQL.d.ts → SQL.d.ts} +1 -1
  25. package/dist/SQL.d.ts.map +1 -0
  26. package/dist/{adapters/SQL.js → SQL.js} +1 -1
  27. package/dist/{adapters/ServiceBus.d.ts → ServiceBus.d.ts} +1 -1
  28. package/dist/ServiceBus.d.ts.map +1 -0
  29. package/dist/ServiceBus.js +108 -0
  30. package/dist/Store/ContextMapContainer.d.ts +2 -2
  31. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  32. package/dist/Store/ContextMapContainer.js +2 -2
  33. package/dist/Store/Cosmos/query.d.ts +4 -4
  34. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  35. package/dist/Store/Cosmos/query.js +1 -1
  36. package/dist/Store/Cosmos.d.ts +2 -2
  37. package/dist/Store/Cosmos.d.ts.map +1 -1
  38. package/dist/Store/Cosmos.js +3 -3
  39. package/dist/Store/Disk.d.ts +3 -3
  40. package/dist/Store/Disk.d.ts.map +1 -1
  41. package/dist/Store/Disk.js +2 -2
  42. package/dist/Store/Memory.d.ts +3 -3
  43. package/dist/Store/Memory.d.ts.map +1 -1
  44. package/dist/Store/Memory.js +2 -2
  45. package/dist/Store/SQL/Pg.d.ts +2 -2
  46. package/dist/Store/SQL/Pg.d.ts.map +1 -1
  47. package/dist/Store/SQL/Pg.js +2 -2
  48. package/dist/Store/SQL/query.d.ts +3 -3
  49. package/dist/Store/SQL/query.d.ts.map +1 -1
  50. package/dist/Store/SQL/query.js +1 -1
  51. package/dist/Store/SQL.d.ts +3 -3
  52. package/dist/Store/SQL.d.ts.map +1 -1
  53. package/dist/Store/SQL.js +2 -2
  54. package/dist/Store/codeFilter.d.ts +4 -4
  55. package/dist/Store/codeFilter.d.ts.map +1 -1
  56. package/dist/Store/codeFilter.js +1 -1
  57. package/dist/Store/index.d.ts +3 -4
  58. package/dist/Store/index.d.ts.map +1 -1
  59. package/dist/Store/index.js +2 -3
  60. package/dist/Store/utils.d.ts +2 -2
  61. package/dist/Store/utils.d.ts.map +1 -1
  62. package/dist/Store/utils.js +1 -1
  63. package/dist/{api/codec.d.ts → codec.d.ts} +1 -1
  64. package/dist/codec.d.ts.map +1 -0
  65. package/dist/codec.js +5 -0
  66. package/dist/{adapters/cosmos-client.d.ts → cosmos-client.d.ts} +1 -1
  67. package/dist/cosmos-client.d.ts.map +1 -0
  68. package/dist/cosmos-client.js +11 -0
  69. package/dist/errorReporter.d.ts +1 -1
  70. package/dist/errorReporter.d.ts.map +1 -1
  71. package/dist/errorReporter.js +2 -2
  72. package/dist/index.d.ts +3 -2
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +3 -2
  75. package/dist/{api/internal → internal}/RequestContextMiddleware.d.ts +2 -2
  76. package/dist/internal/RequestContextMiddleware.d.ts.map +1 -0
  77. package/dist/internal/RequestContextMiddleware.js +46 -0
  78. package/dist/{api/internal → internal}/auth.d.ts +1 -1
  79. package/dist/internal/auth.d.ts.map +1 -0
  80. package/dist/internal/auth.js +180 -0
  81. package/dist/{api/internal → internal}/events.d.ts +1 -1
  82. package/dist/internal/events.d.ts.map +1 -0
  83. package/dist/internal/events.js +49 -0
  84. package/dist/{api/internal → internal}/health.d.ts +1 -1
  85. package/dist/internal/health.d.ts.map +1 -0
  86. package/dist/internal/health.js +5 -0
  87. package/dist/layerUtils.d.ts +32 -0
  88. package/dist/layerUtils.d.ts.map +1 -0
  89. package/dist/layerUtils.js +17 -0
  90. package/dist/logger/jsonLogger.d.ts +1 -1
  91. package/dist/logger/jsonLogger.d.ts.map +1 -1
  92. package/dist/logger/jsonLogger.js +2 -2
  93. package/dist/logger/logFmtLogger.d.ts +1 -1
  94. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  95. package/dist/logger/logFmtLogger.js +2 -2
  96. package/dist/logger/shared.d.ts +2 -2
  97. package/dist/logger/shared.d.ts.map +1 -1
  98. package/dist/logger/shared.js +2 -2
  99. package/dist/{adapters/memQueue.d.ts → memQueue.d.ts} +1 -1
  100. package/dist/memQueue.d.ts.map +1 -0
  101. package/dist/memQueue.js +21 -0
  102. package/dist/{api/middlewares.d.ts → middlewares.d.ts} +1 -1
  103. package/dist/middlewares.d.ts.map +1 -0
  104. package/dist/{api/middlewares.js → middlewares.js} +1 -1
  105. package/dist/{adapters/mongo-client.d.ts → mongo-client.d.ts} +1 -1
  106. package/dist/mongo-client.d.ts.map +1 -0
  107. package/dist/mongo-client.js +15 -0
  108. package/dist/{adapters/redis-client.d.ts → redis-client.d.ts} +1 -1
  109. package/dist/redis-client.d.ts.map +1 -0
  110. package/dist/redis-client.js +98 -0
  111. package/dist/reportError.d.ts +4 -0
  112. package/dist/reportError.d.ts.map +1 -0
  113. package/dist/reportError.js +28 -0
  114. package/dist/{api/routing → routing}/middleware/RouterMiddleware.d.ts +1 -1
  115. package/dist/routing/middleware/RouterMiddleware.d.ts.map +1 -0
  116. package/dist/{api/routing → routing}/middleware/RouterMiddleware.js +1 -1
  117. package/dist/{api/routing → routing}/middleware/middleware.d.ts +2 -2
  118. package/dist/routing/middleware/middleware.d.ts.map +1 -0
  119. package/dist/routing/middleware/middleware.js +128 -0
  120. package/dist/{api/routing → routing}/middleware.d.ts +1 -1
  121. package/dist/routing/middleware.d.ts.map +1 -0
  122. package/dist/{api/routing → routing}/middleware.js +1 -1
  123. package/dist/{api/routing → routing}/schema/jwt.d.ts +1 -1
  124. package/dist/routing/schema/jwt.d.ts.map +1 -0
  125. package/dist/routing/schema/jwt.js +13 -0
  126. package/dist/routing/tsort.d.ts +8 -0
  127. package/dist/routing/tsort.d.ts.map +1 -0
  128. package/dist/routing/tsort.js +51 -0
  129. package/dist/{api/routing → routing}/utils.d.ts +1 -1
  130. package/dist/routing/utils.d.ts.map +1 -0
  131. package/dist/routing/utils.js +45 -0
  132. package/dist/routing.d.ts +184 -0
  133. package/dist/routing.d.ts.map +1 -0
  134. package/dist/{api/routing.js → routing.js} +1 -1
  135. package/dist/{api/setupRequest.d.ts → setupRequest.d.ts} +2 -2
  136. package/dist/setupRequest.d.ts.map +1 -0
  137. package/dist/setupRequest.js +70 -0
  138. package/dist/{api/util.d.ts → util.d.ts} +1 -1
  139. package/dist/util.d.ts.map +1 -0
  140. package/dist/util.js +14 -0
  141. package/examples/query.ts +2 -2
  142. package/package.json +84 -200
  143. package/src/Emailer/Sendgrid.ts +20 -5
  144. package/src/Emailer/fake.ts +1 -1
  145. package/src/QueueMaker/SQLQueue.ts +3 -3
  146. package/src/QueueMaker/memQueue.ts +3 -3
  147. package/src/QueueMaker/sbqueue.ts +3 -3
  148. package/src/RequestFiberSet.ts +1 -1
  149. package/src/{adapters/SQL → SQL}/Model.ts +1 -1
  150. package/src/{adapters/ServiceBus.ts → ServiceBus.ts} +1 -1
  151. package/src/Store/ContextMapContainer.ts +1 -1
  152. package/src/Store/Cosmos/query.ts +3 -3
  153. package/src/Store/Cosmos.ts +4 -4
  154. package/src/Store/Disk.ts +2 -2
  155. package/src/Store/Memory.ts +4 -4
  156. package/src/Store/SQL/Pg.ts +3 -3
  157. package/src/Store/SQL/query.ts +2 -2
  158. package/src/Store/SQL.ts +3 -3
  159. package/src/Store/codeFilter.ts +3 -3
  160. package/src/Store/index.ts +2 -4
  161. package/src/Store/utils.ts +1 -1
  162. package/src/errorReporter.ts +1 -1
  163. package/src/index.ts +2 -1
  164. package/src/{api/internal → internal}/RequestContextMiddleware.ts +3 -3
  165. package/src/{api/internal → internal}/events.ts +2 -2
  166. package/src/{api/layerUtils.ts → layerUtils.ts} +1 -1
  167. package/src/logger/jsonLogger.ts +1 -1
  168. package/src/logger/logFmtLogger.ts +1 -1
  169. package/src/logger/shared.ts +1 -1
  170. package/src/{adapters/redis-client.ts → redis-client.ts} +1 -1
  171. package/src/{api/reportError.ts → reportError.ts} +1 -1
  172. package/src/{api/routing → routing}/middleware/middleware.ts +4 -4
  173. package/src/{api/setupRequest.ts → setupRequest.ts} +3 -3
  174. package/test/auth.test.ts +1 -1
  175. package/test/contextProvider.test.ts +1 -1
  176. package/test/controller.test.ts +3 -3
  177. package/test/cosmos-query.test.ts +1 -1
  178. package/test/dist/controller.test.d.ts.map +1 -1
  179. package/test/dist/query.test.d.ts.map +1 -1
  180. package/test/dist/rawQuery.test.d.ts.map +1 -1
  181. package/test/layerUtils.test.ts +1 -1
  182. package/test/query.test.ts +4 -4
  183. package/test/rawQuery.test.ts +4 -4
  184. package/test/repository-ext.test.ts +3 -3
  185. package/test/router-generator.test.ts +3 -3
  186. package/test/routing-interruptibility.test.ts +2 -2
  187. package/test/rpc-context-map-streaming.test.ts +3 -3
  188. package/test/rpc-e2e-invalidation.test.ts +2 -2
  189. package/test/rpc-multi-middleware.test.ts +1 -1
  190. package/test/rpc-stream-fullstack.test.ts +2 -2
  191. package/test/validateSample.test.ts +3 -3
  192. package/dist/Emailer/service.d.ts +0 -64
  193. package/dist/Emailer/service.d.ts.map +0 -1
  194. package/dist/Emailer/service.js +0 -7
  195. package/dist/Emailer.d.ts +0 -2
  196. package/dist/Emailer.d.ts.map +0 -1
  197. package/dist/Emailer.js +0 -2
  198. package/dist/Model/Repository/Registry.d.ts +0 -21
  199. package/dist/Model/Repository/Registry.d.ts.map +0 -1
  200. package/dist/Model/Repository/Registry.js +0 -18
  201. package/dist/Model/Repository/ext.d.ts +0 -60
  202. package/dist/Model/Repository/ext.d.ts.map +0 -1
  203. package/dist/Model/Repository/ext.js +0 -122
  204. package/dist/Model/Repository/internal/internal.d.ts +0 -62
  205. package/dist/Model/Repository/internal/internal.d.ts.map +0 -1
  206. package/dist/Model/Repository/internal/internal.js +0 -398
  207. package/dist/Model/Repository/legacy.d.ts +0 -21
  208. package/dist/Model/Repository/legacy.d.ts.map +0 -1
  209. package/dist/Model/Repository/legacy.js +0 -2
  210. package/dist/Model/Repository/makeRepo.d.ts +0 -53
  211. package/dist/Model/Repository/makeRepo.d.ts.map +0 -1
  212. package/dist/Model/Repository/makeRepo.js +0 -27
  213. package/dist/Model/Repository/service.d.ts +0 -97
  214. package/dist/Model/Repository/service.d.ts.map +0 -1
  215. package/dist/Model/Repository/service.js +0 -2
  216. package/dist/Model/Repository/validation.d.ts +0 -71
  217. package/dist/Model/Repository/validation.d.ts.map +0 -1
  218. package/dist/Model/Repository/validation.js +0 -32
  219. package/dist/Model/Repository.d.ts +0 -7
  220. package/dist/Model/Repository.d.ts.map +0 -1
  221. package/dist/Model/Repository.js +0 -7
  222. package/dist/Model/dsl.d.ts +0 -33
  223. package/dist/Model/dsl.d.ts.map +0 -1
  224. package/dist/Model/dsl.js +0 -43
  225. package/dist/Model/filter/filterApi.d.ts +0 -30
  226. package/dist/Model/filter/filterApi.d.ts.map +0 -1
  227. package/dist/Model/filter/filterApi.js +0 -2
  228. package/dist/Model/filter/types/errors.d.ts +0 -29
  229. package/dist/Model/filter/types/errors.d.ts.map +0 -1
  230. package/dist/Model/filter/types/errors.js +0 -2
  231. package/dist/Model/filter/types/fields.d.ts +0 -15
  232. package/dist/Model/filter/types/fields.d.ts.map +0 -1
  233. package/dist/Model/filter/types/fields.js +0 -2
  234. package/dist/Model/filter/types/path/common.d.ts +0 -316
  235. package/dist/Model/filter/types/path/common.d.ts.map +0 -1
  236. package/dist/Model/filter/types/path/common.js +0 -2
  237. package/dist/Model/filter/types/path/eager.d.ts +0 -95
  238. package/dist/Model/filter/types/path/eager.d.ts.map +0 -1
  239. package/dist/Model/filter/types/path/eager.js +0 -31
  240. package/dist/Model/filter/types/path/index.d.ts +0 -4
  241. package/dist/Model/filter/types/path/index.d.ts.map +0 -1
  242. package/dist/Model/filter/types/path/index.js +0 -3
  243. package/dist/Model/filter/types/utils.d.ts +0 -79
  244. package/dist/Model/filter/types/utils.d.ts.map +0 -1
  245. package/dist/Model/filter/types/utils.js +0 -2
  246. package/dist/Model/filter/types/validator.d.ts +0 -30
  247. package/dist/Model/filter/types/validator.d.ts.map +0 -1
  248. package/dist/Model/filter/types/validator.js +0 -2
  249. package/dist/Model/filter/types.d.ts +0 -5
  250. package/dist/Model/filter/types.d.ts.map +0 -1
  251. package/dist/Model/filter/types.js +0 -7
  252. package/dist/Model/query/dsl.d.ts +0 -446
  253. package/dist/Model/query/dsl.d.ts.map +0 -1
  254. package/dist/Model/query/dsl.js +0 -339
  255. package/dist/Model/query/new-kid-interpreter.d.ts +0 -136
  256. package/dist/Model/query/new-kid-interpreter.d.ts.map +0 -1
  257. package/dist/Model/query/new-kid-interpreter.js +0 -336
  258. package/dist/Model/query.d.ts +0 -15
  259. package/dist/Model/query.d.ts.map +0 -1
  260. package/dist/Model/query.js +0 -3
  261. package/dist/Model.d.ts +0 -5
  262. package/dist/Model.d.ts.map +0 -1
  263. package/dist/Model.js +0 -5
  264. package/dist/QueueMaker/service.d.ts +0 -13
  265. package/dist/QueueMaker/service.d.ts.map +0 -1
  266. package/dist/QueueMaker/service.js +0 -4
  267. package/dist/RequestContext.d.ts +0 -103
  268. package/dist/RequestContext.d.ts.map +0 -1
  269. package/dist/RequestContext.js +0 -49
  270. package/dist/Store/service.d.ts +0 -138
  271. package/dist/Store/service.d.ts.map +0 -1
  272. package/dist/Store/service.js +0 -95
  273. package/dist/Store.d.ts +0 -2
  274. package/dist/Store.d.ts.map +0 -1
  275. package/dist/Store.js +0 -2
  276. package/dist/adapters/SQL/Model.d.ts.map +0 -1
  277. package/dist/adapters/SQL/Model.js +0 -469
  278. package/dist/adapters/SQL.d.ts.map +0 -1
  279. package/dist/adapters/ServiceBus.d.ts.map +0 -1
  280. package/dist/adapters/ServiceBus.js +0 -108
  281. package/dist/adapters/cosmos-client.d.ts.map +0 -1
  282. package/dist/adapters/cosmos-client.js +0 -11
  283. package/dist/adapters/index.d.ts +0 -8
  284. package/dist/adapters/index.d.ts.map +0 -1
  285. package/dist/adapters/index.js +0 -8
  286. package/dist/adapters/logger.d.ts +0 -9
  287. package/dist/adapters/logger.d.ts.map +0 -1
  288. package/dist/adapters/logger.js +0 -3
  289. package/dist/adapters/memQueue.d.ts.map +0 -1
  290. package/dist/adapters/memQueue.js +0 -21
  291. package/dist/adapters/mongo-client.d.ts.map +0 -1
  292. package/dist/adapters/mongo-client.js +0 -15
  293. package/dist/adapters/redis-client.d.ts.map +0 -1
  294. package/dist/adapters/redis-client.js +0 -98
  295. package/dist/api/ContextProvider.d.ts +0 -34
  296. package/dist/api/ContextProvider.d.ts.map +0 -1
  297. package/dist/api/ContextProvider.js +0 -40
  298. package/dist/api/codec.d.ts.map +0 -1
  299. package/dist/api/codec.js +0 -5
  300. package/dist/api/internal/RequestContextMiddleware.d.ts.map +0 -1
  301. package/dist/api/internal/RequestContextMiddleware.js +0 -46
  302. package/dist/api/internal/auth.d.ts.map +0 -1
  303. package/dist/api/internal/auth.js +0 -180
  304. package/dist/api/internal/events.d.ts.map +0 -1
  305. package/dist/api/internal/events.js +0 -49
  306. package/dist/api/internal/health.d.ts.map +0 -1
  307. package/dist/api/internal/health.js +0 -5
  308. package/dist/api/layerUtils.d.ts +0 -32
  309. package/dist/api/layerUtils.d.ts.map +0 -1
  310. package/dist/api/layerUtils.js +0 -17
  311. package/dist/api/middlewares.d.ts.map +0 -1
  312. package/dist/api/reportError.d.ts +0 -4
  313. package/dist/api/reportError.d.ts.map +0 -1
  314. package/dist/api/reportError.js +0 -28
  315. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +0 -1
  316. package/dist/api/routing/middleware/middleware.d.ts.map +0 -1
  317. package/dist/api/routing/middleware/middleware.js +0 -128
  318. package/dist/api/routing/middleware.d.ts.map +0 -1
  319. package/dist/api/routing/schema/jwt.d.ts.map +0 -1
  320. package/dist/api/routing/schema/jwt.js +0 -13
  321. package/dist/api/routing/tsort.d.ts +0 -8
  322. package/dist/api/routing/tsort.d.ts.map +0 -1
  323. package/dist/api/routing/tsort.js +0 -51
  324. package/dist/api/routing/utils.d.ts.map +0 -1
  325. package/dist/api/routing/utils.js +0 -45
  326. package/dist/api/routing.d.ts +0 -184
  327. package/dist/api/routing.d.ts.map +0 -1
  328. package/dist/api/setupRequest.d.ts.map +0 -1
  329. package/dist/api/setupRequest.js +0 -70
  330. package/dist/api/util.d.ts.map +0 -1
  331. package/dist/api/util.js +0 -14
  332. package/src/Emailer/service.ts +0 -62
  333. package/src/Emailer.ts +0 -1
  334. package/src/Model/Repository/Registry.ts +0 -34
  335. package/src/Model/Repository/ext.ts +0 -375
  336. package/src/Model/Repository/internal/internal.ts +0 -692
  337. package/src/Model/Repository/legacy.ts +0 -29
  338. package/src/Model/Repository/makeRepo.ts +0 -144
  339. package/src/Model/Repository/service.ts +0 -639
  340. package/src/Model/Repository/validation.ts +0 -31
  341. package/src/Model/Repository.ts +0 -6
  342. package/src/Model/dsl.ts +0 -129
  343. package/src/Model/filter/filterApi.ts +0 -60
  344. package/src/Model/filter/types/errors.ts +0 -47
  345. package/src/Model/filter/types/fields.ts +0 -50
  346. package/src/Model/filter/types/path/common.ts +0 -404
  347. package/src/Model/filter/types/path/eager.ts +0 -297
  348. package/src/Model/filter/types/path/index.ts +0 -4
  349. package/src/Model/filter/types/utils.ts +0 -128
  350. package/src/Model/filter/types/validator.ts +0 -46
  351. package/src/Model/filter/types.ts +0 -6
  352. package/src/Model/query/dsl.ts +0 -2546
  353. package/src/Model/query/new-kid-interpreter.ts +0 -484
  354. package/src/Model/query.ts +0 -13
  355. package/src/Model.ts +0 -4
  356. package/src/QueueMaker/service.ts +0 -19
  357. package/src/RequestContext.ts +0 -62
  358. package/src/Store/service.ts +0 -233
  359. package/src/Store.ts +0 -1
  360. package/src/adapters/index.ts +0 -7
  361. package/src/adapters/logger.ts +0 -3
  362. /package/src/{api/ContextProvider.ts → ContextProvider.ts} +0 -0
  363. /package/src/{adapters/SQL.ts → SQL.ts} +0 -0
  364. /package/src/{api/codec.ts → codec.ts} +0 -0
  365. /package/src/{adapters/cosmos-client.ts → cosmos-client.ts} +0 -0
  366. /package/src/{api/internal → internal}/auth.ts +0 -0
  367. /package/src/{api/internal → internal}/health.ts +0 -0
  368. /package/src/{adapters/memQueue.ts → memQueue.ts} +0 -0
  369. /package/src/{api/middlewares.ts → middlewares.ts} +0 -0
  370. /package/src/{adapters/mongo-client.ts → mongo-client.ts} +0 -0
  371. /package/src/{api/routing → routing}/middleware/RouterMiddleware.ts +0 -0
  372. /package/src/{api/routing → routing}/middleware.ts +0 -0
  373. /package/src/{api/routing → routing}/schema/jwt.ts +0 -0
  374. /package/src/{api/routing → routing}/tsort.ts +0 -0
  375. /package/src/{api/routing → routing}/utils.ts +0 -0
  376. /package/src/{api/routing.ts → routing.ts} +0 -0
  377. /package/src/{api/util.ts → util.ts} +0 -0
@@ -1,375 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /* eslint-disable @typescript-eslint/no-unsafe-return */
3
- import * as Array from "effect-app/Array"
4
- import type { NonEmptyArray } from "effect-app/Array"
5
- import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "effect-app/client/errors"
6
- import * as Effect from "effect-app/Effect"
7
- import * as Option from "effect-app/Option"
8
- import { type FixEnv, type PureEnv, runTerm } from "effect-app/Pure"
9
- import * as Exit from "effect/Exit"
10
- import * as Request from "effect/Request"
11
- import * as RequestResolver from "effect/RequestResolver"
12
- import { AnyPureDSL } from "../dsl.js"
13
- import type { FieldValues } from "../filter/types.js"
14
- import type { Query, QueryEnd, QueryWhere } from "../query.js"
15
- import * as Q from "../query.js"
16
- import type { Repository } from "./service.js"
17
-
18
- interface BatchOptions {
19
- readonly batch?: true | number
20
- }
21
-
22
- const asReadonlyArray = <T>(itemOrItems: T | ReadonlyArray<T>): ReadonlyArray<T> =>
23
- globalThis.Array.isArray(itemOrItems)
24
- ? itemOrItems as ReadonlyArray<T>
25
- : [itemOrItems as T]
26
-
27
- const getBatchSize = (batch?: true | number) =>
28
- batch === true
29
- ? 100
30
- : typeof batch === "number" && Number.isFinite(batch) && batch > 0
31
- ? Math.floor(batch)
32
- : undefined
33
-
34
- export const extendRepo = <
35
- T,
36
- Encoded extends FieldValues,
37
- Evt,
38
- ItemType extends string,
39
- IdKey extends keyof T & keyof Encoded,
40
- RSchema,
41
- RPublish,
42
- RProvided = never
43
- >(
44
- repo: Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish, RProvided>
45
- ) => {
46
- const get = (id: T[IdKey]) =>
47
- repo.find(id).pipe(
48
- Effect.flatMap(Option.match({
49
- onNone: () => Effect.fail(new NotFoundError<ItemType>({ type: repo.itemType, id })),
50
- onSome: Effect.succeed
51
- }))
52
- )
53
- function saveManyWithPure_<
54
- R,
55
- A,
56
- E,
57
- S1 extends T,
58
- S2 extends T
59
- >(
60
- items: Iterable<S1>,
61
- pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
62
- ) {
63
- return saveAllWithEffectInt(
64
- runTerm(pure, [...items])
65
- )
66
- }
67
-
68
- function saveWithPure_<
69
- R,
70
- A,
71
- E,
72
- S1 extends T,
73
- S2 extends T
74
- >(
75
- item: S1,
76
- pure: Effect.Effect<A, E, FixEnv<R, Evt, S1, S2>>
77
- ) {
78
- return saveAllWithEffectInt(
79
- runTerm(pure, item)
80
- .pipe(Effect
81
- .map(([item, events, a]) => [[item], events, a]))
82
- )
83
- }
84
-
85
- function saveAllWithEffectInt<
86
- P extends T,
87
- R,
88
- E,
89
- A
90
- >(
91
- gen: Effect.Effect<readonly [Iterable<P>, Iterable<Evt>, A], E, R>
92
- ) {
93
- return Effect.flatMap(gen, ([items, events, a]) => repo.saveAndPublish(items, events).pipe(Effect.map(() => a)))
94
- }
95
-
96
- function saveManyWithPureBatched_<
97
- R,
98
- A,
99
- E,
100
- S1 extends T,
101
- S2 extends T
102
- >(
103
- items: Iterable<S1>,
104
- pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>,
105
- batchSize = 100
106
- ) {
107
- return Effect.forEach(
108
- Array.chunksOf(items, batchSize),
109
- (batch) =>
110
- saveAllWithEffectInt(
111
- runTerm(pure, batch)
112
- )
113
- )
114
- }
115
-
116
- const queryAndSavePure: {
117
- <A, E2, R2, T2 extends T>(
118
- q: (
119
- q: Query<Encoded>
120
- ) => QueryEnd<Encoded, "one">,
121
- pure: Effect.Effect<A, E2, FixEnv<R2, Evt, T, T2>>
122
- ): Effect.Effect<
123
- A,
124
- InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E2,
125
- Exclude<R2, {
126
- env: PureEnv<Evt, T, T2>
127
- }>
128
- >
129
- <A, E2, R2, T2 extends T>(
130
- q: (
131
- q: Query<Encoded>
132
- ) =>
133
- | Query<Encoded>
134
- | QueryWhere<Encoded>
135
- | QueryEnd<Encoded>,
136
- pure: Effect.Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>
137
- ): Effect.Effect<
138
- A,
139
- InvalidStateError | OptimisticConcurrencyException | E2,
140
- | RSchema
141
- | RPublish
142
- | Exclude<R2, {
143
- env: PureEnv<Evt, readonly T[], readonly T2[]>
144
- }>
145
- >
146
- <A, E2, R2, T2 extends T>(
147
- q: (
148
- q: Query<Encoded>
149
- ) =>
150
- | Query<Encoded>
151
- | QueryWhere<Encoded>
152
- | QueryEnd<Encoded>,
153
- pure: Effect.Effect<A, E2, FixEnv<R2, Evt, readonly T[], readonly T2[]>>,
154
- batch: "batched" | number
155
- ): Effect.Effect<
156
- A[],
157
- InvalidStateError | OptimisticConcurrencyException | E2,
158
- | RSchema
159
- | RPublish
160
- | Exclude<R2, {
161
- env: PureEnv<Evt, readonly T[], readonly T2[]>
162
- }>
163
- >
164
- } = (q, pure, batch?: "batched" | number) =>
165
- repo.query(q).pipe(
166
- Effect.andThen((_) =>
167
- Array.isArray(_)
168
- ? batch === undefined
169
- ? saveManyWithPure_(_ as any, pure as any)
170
- : saveManyWithPureBatched_(_ as any, pure as any, batch === "batched" ? 100 : batch)
171
- : saveWithPure_(_ as any, pure as any)
172
- )
173
- ) as any
174
-
175
- const saveManyWithPure: {
176
- <R, A, E, S1 extends T, S2 extends T>(
177
- items: Iterable<S1>,
178
- pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>
179
- ): Effect.Effect<
180
- A,
181
- InvalidStateError | OptimisticConcurrencyException | E,
182
- | RSchema
183
- | RPublish
184
- | Exclude<R, {
185
- env: PureEnv<Evt, readonly S1[], readonly S2[]>
186
- }>
187
- >
188
- <R, A, E, S1 extends T, S2 extends T>(
189
- items: Iterable<S1>,
190
- pure: Effect.Effect<A, E, FixEnv<R, Evt, readonly S1[], readonly S2[]>>,
191
- batch: "batched" | number
192
- ): Effect.Effect<
193
- A[],
194
- InvalidStateError | OptimisticConcurrencyException | E,
195
- | RSchema
196
- | RPublish
197
- | Exclude<R, {
198
- env: PureEnv<Evt, readonly S1[], readonly S2[]>
199
- }>
200
- >
201
- } = (items, pure, batch?: "batched" | number) =>
202
- batch
203
- ? Effect.forEach(
204
- Array.chunksOf(items, batch === "batched" ? 100 : batch),
205
- (batch) =>
206
- saveAllWithEffectInt(
207
- runTerm(pure, batch)
208
- )
209
- )
210
- : saveAllWithEffectInt(
211
- runTerm(pure, [...items])
212
- )
213
-
214
- const byIdAndSaveWithPure: {
215
- <R, A, E, S2 extends T>(
216
- id: T[IdKey],
217
- pure: Effect.Effect<A, E, FixEnv<R, Evt, T, S2>>
218
- ): Effect.Effect<
219
- A,
220
- InvalidStateError | OptimisticConcurrencyException | NotFoundError<ItemType> | E,
221
- | RSchema
222
- | RPublish
223
- | Exclude<R, {
224
- env: PureEnv<Evt, T, S2>
225
- }>
226
- >
227
- } = (id, pure): any => get(id).pipe(Effect.flatMap((item) => saveWithPure_(item, pure)))
228
-
229
- type Req =
230
- & Request.Request<T, NotFoundError<ItemType>>
231
- & { _tag: `Get${ItemType}`; id: T[IdKey] }
232
- const _request = Request.tagged<Req>(`Get${repo.itemType}`)
233
-
234
- const requestResolver = RequestResolver
235
- .make((
236
- entries: NonEmptyArray<Request.Entry<Req>>,
237
- _key: unknown
238
- ) =>
239
- (repo.query(Q.where(repo.idKey as any, "in" as any, entries.map((_) => _.request.id)) as any) as Effect.Effect<
240
- readonly T[]
241
- >)
242
- // TODO
243
- .pipe(
244
- Effect.andThen((items) =>
245
- Effect.forEach(entries, (entry) =>
246
- Request.complete(
247
- Array
248
- .findFirst(items, (_) => _[repo.idKey] === entry.request.id)
249
- .pipe(Option.match({
250
- onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id: entry.request.id })),
251
- onSome: Exit.succeed
252
- }))
253
- )(entry), { discard: true })
254
- ),
255
- Effect
256
- .catchCause((cause) =>
257
- Effect.forEach(entries, (entry) => Request.complete(Exit.failCause(cause))(entry), { discard: true })
258
- )
259
- )
260
- )
261
- .pipe(
262
- RequestResolver.batchN(20)
263
- )
264
-
265
- const exts = {
266
- request: (id: T[IdKey]) => Effect.request(_request({ id }), requestResolver),
267
- get,
268
- log: (evt: Evt) => AnyPureDSL.log(evt),
269
- /**
270
- * Enables chunked writes for large batches via `options.batch`.
271
- * Note: batching breaks transactional properties because chunks are saved independently.
272
- */
273
- save: ((itemOrItems: T | ReadonlyArray<T>, options?: BatchOptions) => {
274
- const items = asReadonlyArray(itemOrItems)
275
- if (!Array.isReadonlyArrayNonEmpty(items)) {
276
- return Effect.void
277
- }
278
- const batchSize = getBatchSize(options?.batch)
279
- if (batchSize === undefined) {
280
- return repo.saveAndPublish(items)
281
- }
282
- return Effect.forEach(
283
- Array.chunksOf(items, batchSize),
284
- (batch) => repo.saveAndPublish(batch),
285
- { discard: true }
286
- )
287
- }) as (
288
- itemOrItems: T | ReadonlyArray<T>,
289
- options?: BatchOptions
290
- ) => Effect.Effect<
291
- void,
292
- InvalidStateError | OptimisticConcurrencyException,
293
- RSchema | RPublish
294
- >,
295
- saveWithEvents: (events: Iterable<Evt>) => (...items: NonEmptyArray<T>) => repo.saveAndPublish(items, events),
296
- /**
297
- * Enables chunked deletes for large batches via `options.batch`.
298
- * Note: batching breaks transactional properties because chunks are removed independently.
299
- */
300
- remove: ((itemOrItems: T | ReadonlyArray<T>, options?: BatchOptions) => {
301
- const items = asReadonlyArray(itemOrItems)
302
- if (!Array.isReadonlyArrayNonEmpty(items)) {
303
- return Effect.void
304
- }
305
- const batchSize = getBatchSize(options?.batch)
306
- if (batchSize === undefined) {
307
- return repo.removeAndPublish(items)
308
- }
309
- return Effect.forEach(
310
- Array.chunksOf(items, batchSize),
311
- (batch) => repo.removeAndPublish(batch),
312
- { discard: true }
313
- )
314
- }) as (
315
- itemOrItems: T | ReadonlyArray<T>,
316
- options?: BatchOptions
317
- ) => Effect.Effect<void, never, RSchema | RPublish>,
318
- /**
319
- * Enables chunked deletes for large batches via `options.batch`.
320
- * Note: batching breaks transactional properties because chunks are removed independently.
321
- */
322
- removeById: ((idOrIds: T[IdKey] | ReadonlyArray<T[IdKey]>, options?: BatchOptions) => {
323
- const ids = asReadonlyArray(idOrIds)
324
- if (!Array.isReadonlyArrayNonEmpty(ids)) {
325
- return Effect.void
326
- }
327
- const batchSize = getBatchSize(options?.batch)
328
- if (batchSize === undefined) {
329
- return repo.removeById(ids)
330
- }
331
- return Effect.forEach(
332
- Array.chunksOf(ids, batchSize),
333
- (batch) => repo.removeById(batch),
334
- { discard: true }
335
- )
336
- }) as (
337
- idOrIds: T[IdKey] | ReadonlyArray<T[IdKey]>,
338
- options?: BatchOptions
339
- ) => Effect.Effect<void, never, RSchema>,
340
- queryAndSavePure,
341
- saveManyWithPure,
342
- byIdAndSaveWithPure,
343
- saveWithPure: <
344
- R,
345
- A,
346
- E,
347
- S1 extends T,
348
- S2 extends T
349
- >(
350
- item: S1,
351
- pure: Effect.Effect<A, E, FixEnv<R, Evt, S1, S2>>
352
- ) =>
353
- saveAllWithEffectInt(
354
- runTerm(pure, item)
355
- .pipe(Effect.map(([item, events, a]) => [[item], events, a]))
356
- )
357
- }
358
-
359
- return {
360
- ...repo,
361
- ...exts
362
- } as Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish, RProvided> & typeof exts
363
- }
364
-
365
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
366
- export interface ExtendedRepository<
367
- T,
368
- Encoded extends FieldValues,
369
- Evt,
370
- ItemType extends string,
371
- IdKey extends keyof T & keyof Encoded,
372
- RSchema,
373
- RPublish,
374
- RProvided = never
375
- > extends ReturnType<typeof extendRepo<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish, RProvided>> {}