@effect-app/infra 0.198.2 → 0.199.0

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 (360) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/_cjs/RequestContext.cjs +14 -9
  3. package/_cjs/RequestContext.cjs.map +1 -1
  4. package/_cjs/_ext/Array.cjs +3 -7
  5. package/_cjs/_ext/Array.cjs.map +1 -1
  6. package/_cjs/api/reportError.cjs +3 -6
  7. package/_cjs/api/reportError.cjs.map +1 -1
  8. package/_cjs/api/routing/base.cjs +27 -61
  9. package/_cjs/api/routing/base.cjs.map +1 -1
  10. package/_cjs/api/routing/defaultErrorHandler.cjs +14 -21
  11. package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -1
  12. package/_cjs/api/routing/makeRequestHandler.cjs +44 -51
  13. package/_cjs/api/routing/makeRequestHandler.cjs.map +1 -1
  14. package/_cjs/api/routing/match.cjs +6 -13
  15. package/_cjs/api/routing/match.cjs.map +1 -1
  16. package/_cjs/api/{express → routing}/schema/jwt.cjs +3 -4
  17. package/_cjs/api/routing/schema/jwt.cjs.map +1 -0
  18. package/_cjs/api/routing/schema/routing.cjs +136 -0
  19. package/_cjs/api/routing/schema/routing.cjs.map +1 -0
  20. package/_cjs/api/setupRequest.cjs +16 -22
  21. package/_cjs/api/setupRequest.cjs.map +1 -1
  22. package/_cjs/errorReporter.cjs +16 -17
  23. package/_cjs/errorReporter.cjs.map +1 -1
  24. package/_cjs/errors.cjs +2 -4
  25. package/_cjs/errors.cjs.map +1 -1
  26. package/_cjs/filter/types/path/index.cjs +0 -2
  27. package/_cjs/filter/types/path/index.cjs.map +1 -1
  28. package/_cjs/filter.cjs +35 -0
  29. package/_cjs/filter.cjs.map +1 -1
  30. package/_cjs/logger/jsonLogger.cjs +9 -15
  31. package/_cjs/logger/jsonLogger.cjs.map +1 -1
  32. package/_cjs/logger/logFmtLogger.cjs +7 -11
  33. package/_cjs/logger/logFmtLogger.cjs.map +1 -1
  34. package/_cjs/logger/shared.cjs +6 -8
  35. package/_cjs/logger/shared.cjs.map +1 -1
  36. package/_cjs/rateLimit.cjs +9 -12
  37. package/_cjs/rateLimit.cjs.map +1 -1
  38. package/_cjs/services/Emailer/Sendgrid.cjs +9 -16
  39. package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
  40. package/_cjs/services/Emailer/fake.cjs +5 -8
  41. package/_cjs/services/Emailer/fake.cjs.map +1 -1
  42. package/_cjs/services/Emailer/service.cjs +2 -4
  43. package/_cjs/services/Emailer/service.cjs.map +1 -1
  44. package/_cjs/services/Operations/live.cjs +29 -42
  45. package/_cjs/services/Operations/live.cjs.map +1 -1
  46. package/_cjs/services/Operations/service.cjs +15 -15
  47. package/_cjs/services/Operations/service.cjs.map +1 -1
  48. package/_cjs/services/QueueMaker/errors.cjs +8 -12
  49. package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
  50. package/_cjs/services/QueueMaker/memQueue.cjs +27 -33
  51. package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
  52. package/_cjs/services/QueueMaker/sbqueue.cjs +31 -40
  53. package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
  54. package/_cjs/services/QueueMaker/service.cjs +7 -9
  55. package/_cjs/services/QueueMaker/service.cjs.map +1 -1
  56. package/_cjs/services/Repository/dsl.cjs +11 -14
  57. package/_cjs/services/Repository/dsl.cjs.map +1 -1
  58. package/_cjs/services/Repository/ext.cjs +62 -71
  59. package/_cjs/services/Repository/ext.cjs.map +1 -1
  60. package/_cjs/services/RepositoryBase.cjs +171 -169
  61. package/_cjs/services/RepositoryBase.cjs.map +1 -1
  62. package/_cjs/services/RequestContextContainer.cjs +17 -23
  63. package/_cjs/services/RequestContextContainer.cjs.map +1 -1
  64. package/_cjs/services/Store/ContextMapContainer.cjs +10 -16
  65. package/_cjs/services/Store/ContextMapContainer.cjs.map +1 -1
  66. package/_cjs/services/Store/Cosmos/query.cjs +5 -9
  67. package/_cjs/services/Store/Cosmos/query.cjs.map +1 -1
  68. package/_cjs/services/Store/Cosmos.cjs +58 -68
  69. package/_cjs/services/Store/Cosmos.cjs.map +1 -1
  70. package/_cjs/services/Store/Disk.cjs +34 -36
  71. package/_cjs/services/Store/Disk.cjs.map +1 -1
  72. package/_cjs/services/Store/Memory.cjs +55 -65
  73. package/_cjs/services/Store/Memory.cjs.map +1 -1
  74. package/_cjs/services/Store/codeFilter.cjs +2 -4
  75. package/_cjs/services/Store/codeFilter.cjs.map +1 -1
  76. package/_cjs/services/Store/codeFilter.test.cjs +13 -12
  77. package/_cjs/services/Store/codeFilter.test.cjs.map +1 -1
  78. package/_cjs/services/Store/filterApi/query.cjs +2 -4
  79. package/_cjs/services/Store/filterApi/query.cjs.map +1 -1
  80. package/_cjs/services/Store/index.cjs +6 -9
  81. package/_cjs/services/Store/index.cjs.map +1 -1
  82. package/_cjs/services/Store/service.cjs +5 -7
  83. package/_cjs/services/Store/service.cjs.map +1 -1
  84. package/_cjs/services/Store/utils.cjs +16 -20
  85. package/_cjs/services/Store/utils.cjs.map +1 -1
  86. package/_cjs/services/query.cjs +4 -1
  87. package/_cjs/services/query.cjs.map +1 -1
  88. package/_cjs/test.arbs.cjs +3 -4
  89. package/_cjs/test.arbs.cjs.map +1 -1
  90. package/dist/RequestContext.d.ts +20 -20
  91. package/dist/RequestContext.d.ts.map +1 -1
  92. package/dist/RequestContext.js +15 -8
  93. package/dist/_ext/Array.d.ts +2 -3
  94. package/dist/_ext/Array.d.ts.map +1 -1
  95. package/dist/_ext/Array.js +5 -5
  96. package/dist/api/reportError.d.ts +5 -5
  97. package/dist/api/reportError.d.ts.map +1 -1
  98. package/dist/api/reportError.js +6 -6
  99. package/dist/api/routing/base.d.ts +11 -15
  100. package/dist/api/routing/base.d.ts.map +1 -1
  101. package/dist/api/routing/base.js +48 -67
  102. package/dist/api/routing/defaultErrorHandler.d.ts +4 -6
  103. package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -1
  104. package/dist/api/routing/defaultErrorHandler.js +26 -28
  105. package/dist/api/routing/makeRequestHandler.d.ts +6 -7
  106. package/dist/api/routing/makeRequestHandler.d.ts.map +1 -1
  107. package/dist/api/routing/makeRequestHandler.js +69 -59
  108. package/dist/api/routing/match.d.ts +7 -8
  109. package/dist/api/routing/match.d.ts.map +1 -1
  110. package/dist/api/routing/match.js +7 -11
  111. package/dist/api/routing/schema/jwt.d.ts +4 -0
  112. package/dist/api/routing/schema/jwt.d.ts.map +1 -0
  113. package/dist/api/routing/schema/jwt.js +11 -0
  114. package/dist/api/{express → routing}/schema/routing.d.ts +2 -2
  115. package/dist/api/routing/schema/routing.d.ts.map +1 -0
  116. package/dist/api/routing/schema/routing.js +123 -0
  117. package/dist/api/routing.js +3 -1
  118. package/dist/api/setupRequest.d.ts +3 -5
  119. package/dist/api/setupRequest.d.ts.map +1 -1
  120. package/dist/api/setupRequest.js +20 -24
  121. package/dist/errorReporter.d.ts +4 -4
  122. package/dist/errorReporter.d.ts.map +1 -1
  123. package/dist/errorReporter.js +20 -17
  124. package/dist/errors.d.ts +1 -1
  125. package/dist/errors.d.ts.map +1 -1
  126. package/dist/errors.js +3 -3
  127. package/dist/filter/types/path/index.d.ts +2 -2
  128. package/dist/filter/types/path/index.d.ts.map +1 -1
  129. package/dist/filter/types/path/index.js +2 -3
  130. package/dist/filter/types.js +2 -1
  131. package/dist/filter.d.ts.map +1 -1
  132. package/dist/filter.js +36 -1
  133. package/dist/logger/jsonLogger.d.ts +2 -1
  134. package/dist/logger/jsonLogger.d.ts.map +1 -1
  135. package/dist/logger/jsonLogger.js +9 -13
  136. package/dist/logger/logFmtLogger.d.ts +2 -1
  137. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  138. package/dist/logger/logFmtLogger.js +9 -11
  139. package/dist/logger/shared.d.ts +2 -1
  140. package/dist/logger/shared.d.ts.map +1 -1
  141. package/dist/logger/shared.js +7 -9
  142. package/dist/rateLimit.d.ts +7 -10
  143. package/dist/rateLimit.d.ts.map +1 -1
  144. package/dist/rateLimit.js +17 -16
  145. package/dist/services/Emailer/Sendgrid.d.ts +1 -2
  146. package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
  147. package/dist/services/Emailer/Sendgrid.js +16 -20
  148. package/dist/services/Emailer/fake.d.ts +2 -2
  149. package/dist/services/Emailer/fake.d.ts.map +1 -1
  150. package/dist/services/Emailer/fake.js +10 -8
  151. package/dist/services/Emailer/service.d.ts +7 -10
  152. package/dist/services/Emailer/service.d.ts.map +1 -1
  153. package/dist/services/Emailer/service.js +3 -3
  154. package/dist/services/Operations/live.d.ts +2 -3
  155. package/dist/services/Operations/live.d.ts.map +1 -1
  156. package/dist/services/Operations/live.js +44 -51
  157. package/dist/services/Operations/service.d.ts +14 -19
  158. package/dist/services/Operations/service.d.ts.map +1 -1
  159. package/dist/services/Operations/service.js +23 -28
  160. package/dist/services/QueueMaker/errors.d.ts +5 -7
  161. package/dist/services/QueueMaker/errors.d.ts.map +1 -1
  162. package/dist/services/QueueMaker/errors.js +11 -11
  163. package/dist/services/QueueMaker/memQueue.d.ts +6 -9
  164. package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
  165. package/dist/services/QueueMaker/memQueue.js +37 -39
  166. package/dist/services/QueueMaker/sbqueue.d.ts +6 -9
  167. package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
  168. package/dist/services/QueueMaker/sbqueue.js +41 -39
  169. package/dist/services/QueueMaker/service.d.ts +2 -4
  170. package/dist/services/QueueMaker/service.d.ts.map +1 -1
  171. package/dist/services/QueueMaker/service.js +8 -8
  172. package/dist/services/Repository/dsl.d.ts +8 -10
  173. package/dist/services/Repository/dsl.d.ts.map +1 -1
  174. package/dist/services/Repository/dsl.js +12 -13
  175. package/dist/services/Repository/ext.d.ts +34 -62
  176. package/dist/services/Repository/ext.d.ts.map +1 -1
  177. package/dist/services/Repository/ext.js +59 -70
  178. package/dist/services/RepositoryBase.d.ts +41 -47
  179. package/dist/services/RepositoryBase.d.ts.map +1 -1
  180. package/dist/services/RepositoryBase.js +182 -194
  181. package/dist/services/RequestContextContainer.d.ts +13 -21
  182. package/dist/services/RequestContextContainer.d.ts.map +1 -1
  183. package/dist/services/RequestContextContainer.js +21 -25
  184. package/dist/services/Store/ContextMapContainer.d.ts +11 -18
  185. package/dist/services/Store/ContextMapContainer.d.ts.map +1 -1
  186. package/dist/services/Store/ContextMapContainer.js +17 -18
  187. package/dist/services/Store/Cosmos/query.d.ts +3 -2
  188. package/dist/services/Store/Cosmos/query.d.ts.map +1 -1
  189. package/dist/services/Store/Cosmos/query.js +10 -11
  190. package/dist/services/Store/Cosmos.d.ts +2 -3
  191. package/dist/services/Store/Cosmos.d.ts.map +1 -1
  192. package/dist/services/Store/Cosmos.js +107 -90
  193. package/dist/services/Store/Disk.d.ts +4 -4
  194. package/dist/services/Store/Disk.d.ts.map +1 -1
  195. package/dist/services/Store/Disk.js +54 -50
  196. package/dist/services/Store/Memory.d.ts +6 -8
  197. package/dist/services/Store/Memory.d.ts.map +1 -1
  198. package/dist/services/Store/Memory.js +93 -89
  199. package/dist/services/Store/codeFilter.d.ts.map +1 -1
  200. package/dist/services/Store/codeFilter.js +3 -3
  201. package/dist/services/Store/codeFilter.test.d.ts.map +1 -1
  202. package/dist/services/Store/filterApi/query.d.ts +1 -1
  203. package/dist/services/Store/filterApi/query.d.ts.map +1 -1
  204. package/dist/services/Store/filterApi/query.js +3 -3
  205. package/dist/services/Store/index.d.ts +1 -2
  206. package/dist/services/Store/index.d.ts.map +1 -1
  207. package/dist/services/Store/index.js +7 -8
  208. package/dist/services/Store/service.d.ts +20 -23
  209. package/dist/services/Store/service.d.ts.map +1 -1
  210. package/dist/services/Store/service.js +6 -6
  211. package/dist/services/Store/utils.d.ts +3 -3
  212. package/dist/services/Store/utils.d.ts.map +1 -1
  213. package/dist/services/Store/utils.js +26 -28
  214. package/dist/services/query.d.ts +6 -6
  215. package/dist/services/query.d.ts.map +1 -1
  216. package/dist/services/query.js +5 -3
  217. package/dist/test.arbs.d.ts +0 -2
  218. package/dist/test.arbs.d.ts.map +1 -1
  219. package/dist/test.arbs.js +3 -4
  220. package/package.json +28 -168
  221. package/src/RequestContext.ts +1 -0
  222. package/src/_ext/Array.ts +5 -2
  223. package/src/api/reportError.ts +14 -10
  224. package/src/api/routing/base.ts +77 -110
  225. package/src/api/routing/defaultErrorHandler.ts +64 -54
  226. package/src/api/routing/makeRequestHandler.ts +165 -135
  227. package/src/api/routing/match.ts +14 -8
  228. package/src/api/{express → routing}/schema/jwt.ts +6 -5
  229. package/src/api/{express → routing}/schema/routing.ts +2 -1
  230. package/src/api/setupRequest.ts +30 -24
  231. package/src/errorReporter.ts +12 -11
  232. package/src/errors.ts +1 -0
  233. package/src/filter/types/path/index.ts +2 -2
  234. package/src/logger/jsonLogger.ts +6 -5
  235. package/src/logger/logFmtLogger.ts +4 -5
  236. package/src/logger/shared.ts +4 -3
  237. package/src/rateLimit.ts +37 -34
  238. package/src/services/Emailer/Sendgrid.ts +12 -10
  239. package/src/services/Emailer/fake.ts +7 -4
  240. package/src/services/Emailer/service.ts +4 -1
  241. package/src/services/Operations/live.ts +66 -59
  242. package/src/services/Operations/service.ts +41 -34
  243. package/src/services/QueueMaker/errors.ts +15 -11
  244. package/src/services/QueueMaker/memQueue.ts +59 -40
  245. package/src/services/QueueMaker/sbqueue.ts +54 -33
  246. package/src/services/QueueMaker/service.ts +7 -6
  247. package/src/services/Repository/dsl.ts +12 -8
  248. package/src/services/Repository/ext.ts +52 -44
  249. package/src/services/RepositoryBase.ts +278 -240
  250. package/src/services/RequestContextContainer.ts +30 -18
  251. package/src/services/Store/ContextMapContainer.ts +26 -13
  252. package/src/services/Store/Cosmos/query.ts +17 -11
  253. package/src/services/Store/Cosmos.ts +209 -168
  254. package/src/services/Store/Disk.ts +69 -53
  255. package/src/services/Store/Memory.ts +138 -97
  256. package/src/services/Store/{Redis.ts → Redis.ts.bak} +7 -5
  257. package/src/services/Store/codeFilter.test.ts +61 -36
  258. package/src/services/Store/codeFilter.ts +1 -0
  259. package/src/services/Store/filterApi/query.ts +1 -0
  260. package/src/services/Store/index.ts +7 -6
  261. package/src/services/Store/service.ts +4 -1
  262. package/src/services/Store/utils.ts +25 -23
  263. package/src/services/query.ts +3 -2
  264. package/src/services/simpledb/{cosmosdb.ts → cosmosdb.ts.bak} +1 -0
  265. package/src/services/simpledb/{diskdb.ts → diskdb.ts.bak} +2 -1
  266. package/src/services/simpledb/{memdb.ts → memdb.ts.bak} +3 -2
  267. package/src/services/simpledb/{mongodb.ts → mongodb.ts.bak} +1 -0
  268. package/src/services/simpledb/{redisdb.ts → redisdb.ts.bak} +17 -14
  269. package/src/services/simpledb/{shared.ts → shared.ts.bak} +2 -1
  270. package/src/services/simpledb/{simpledb.ts → simpledb.ts.bak} +6 -2
  271. package/tsconfig.json +4 -21
  272. package/tsconfig.json.bak +0 -4
  273. package/_cjs/_global.cjs +0 -6
  274. package/_cjs/_global.cjs.map +0 -1
  275. package/_cjs/_global.ext.cjs +0 -5
  276. package/_cjs/_global.ext.cjs.map +0 -1
  277. package/_cjs/_global.schema.cjs +0 -5
  278. package/_cjs/_global.schema.cjs.map +0 -1
  279. package/_cjs/api/defaultErrorHandler.cjs +0 -37
  280. package/_cjs/api/defaultErrorHandler.cjs.map +0 -1
  281. package/_cjs/api/express/schema/jwt.cjs.map +0 -1
  282. package/_cjs/api/express/schema/routing.cjs +0 -23
  283. package/_cjs/api/express/schema/routing.cjs.map +0 -1
  284. package/_cjs/api/http.cjs +0 -42
  285. package/_cjs/api/http.cjs.map +0 -1
  286. package/_cjs/services/Store/Redis.cjs +0 -73
  287. package/_cjs/services/Store/Redis.cjs.map +0 -1
  288. package/_cjs/services/simpledb/cosmosdb.cjs +0 -109
  289. package/_cjs/services/simpledb/cosmosdb.cjs.map +0 -1
  290. package/_cjs/services/simpledb/diskdb.cjs +0 -125
  291. package/_cjs/services/simpledb/diskdb.cjs.map +0 -1
  292. package/_cjs/services/simpledb/index.cjs +0 -38
  293. package/_cjs/services/simpledb/index.cjs.map +0 -1
  294. package/_cjs/services/simpledb/memdb.cjs +0 -72
  295. package/_cjs/services/simpledb/memdb.cjs.map +0 -1
  296. package/_cjs/services/simpledb/mongodb.cjs +0 -99
  297. package/_cjs/services/simpledb/mongodb.cjs.map +0 -1
  298. package/_cjs/services/simpledb/redisdb.cjs +0 -135
  299. package/_cjs/services/simpledb/redisdb.cjs.map +0 -1
  300. package/_cjs/services/simpledb/shared.cjs +0 -79
  301. package/_cjs/services/simpledb/shared.cjs.map +0 -1
  302. package/_cjs/services/simpledb/simpledb.cjs +0 -85
  303. package/_cjs/services/simpledb/simpledb.cjs.map +0 -1
  304. package/dist/_global.d.ts +0 -10
  305. package/dist/_global.d.ts.map +0 -1
  306. package/dist/_global.ext.d.ts +0 -34
  307. package/dist/_global.ext.d.ts.map +0 -1
  308. package/dist/_global.ext.js +0 -6
  309. package/dist/_global.js +0 -12
  310. package/dist/_global.schema.d.ts +0 -6
  311. package/dist/_global.schema.d.ts.map +0 -1
  312. package/dist/_global.schema.js +0 -9
  313. package/dist/api/defaultErrorHandler.d.ts +0 -6
  314. package/dist/api/defaultErrorHandler.d.ts.map +0 -1
  315. package/dist/api/defaultErrorHandler.js +0 -34
  316. package/dist/api/express/schema/jwt.d.ts +0 -6
  317. package/dist/api/express/schema/jwt.d.ts.map +0 -1
  318. package/dist/api/express/schema/jwt.js +0 -11
  319. package/dist/api/express/schema/routing.d.ts.map +0 -1
  320. package/dist/api/express/schema/routing.js +0 -10
  321. package/dist/api/http.d.ts +0 -16
  322. package/dist/api/http.d.ts.map +0 -1
  323. package/dist/api/http.js +0 -12
  324. package/dist/services/Store/Redis.d.ts +0 -6
  325. package/dist/services/Store/Redis.d.ts.map +0 -1
  326. package/dist/services/Store/Redis.js +0 -76
  327. package/dist/services/simpledb/cosmosdb.d.ts +0 -14
  328. package/dist/services/simpledb/cosmosdb.d.ts.map +0 -1
  329. package/dist/services/simpledb/cosmosdb.js +0 -103
  330. package/dist/services/simpledb/diskdb.d.ts +0 -12
  331. package/dist/services/simpledb/diskdb.d.ts.map +0 -1
  332. package/dist/services/simpledb/diskdb.js +0 -109
  333. package/dist/services/simpledb/index.d.ts +0 -7
  334. package/dist/services/simpledb/index.d.ts.map +0 -1
  335. package/dist/services/simpledb/index.js +0 -7
  336. package/dist/services/simpledb/memdb.d.ts +0 -11
  337. package/dist/services/simpledb/memdb.d.ts.map +0 -1
  338. package/dist/services/simpledb/memdb.js +0 -58
  339. package/dist/services/simpledb/mongodb.d.ts +0 -13
  340. package/dist/services/simpledb/mongodb.d.ts.map +0 -1
  341. package/dist/services/simpledb/mongodb.js +0 -68
  342. package/dist/services/simpledb/redisdb.d.ts +0 -35
  343. package/dist/services/simpledb/redisdb.d.ts.map +0 -1
  344. package/dist/services/simpledb/redisdb.js +0 -126
  345. package/dist/services/simpledb/shared.d.ts +0 -87
  346. package/dist/services/simpledb/shared.d.ts.map +0 -1
  347. package/dist/services/simpledb/shared.js +0 -52
  348. package/dist/services/simpledb/simpledb.d.ts +0 -23
  349. package/dist/services/simpledb/simpledb.d.ts.map +0 -1
  350. package/dist/services/simpledb/simpledb.js +0 -69
  351. package/src/_global.ext.ts +0 -36
  352. package/src/_global.schema.ts +0 -10
  353. package/src/_global.ts +0 -14
  354. package/src/api/defaultErrorHandler.ts +0 -59
  355. package/src/api/express/makeJsonSchema.test.ts.bak +0 -76
  356. package/src/api/express/makeJsonSchema.ts.bak +0 -166
  357. package/src/api/express/makeOpenApiSpecs.ts.bak +0 -62
  358. package/src/api/http.ts +0 -26
  359. package/tsplus.config.json +0 -9
  360. /package/src/services/simpledb/{index.ts → index.ts.bak} +0 -0
@@ -17,11 +17,16 @@ import { StoreMaker } from "./Store.js"
17
17
  import type { Filter, FilterArgs, FilterFunc, PersistenceModelType, StoreConfig, Where } from "./Store.js"
18
18
  import type {} from "effect/Equal"
19
19
  import type {} from "effect/Hash"
20
+ import { toNonEmptyArray } from "@effect-app/core/Array"
20
21
  import { flatMapOption } from "@effect-app/core/Effect"
21
- import type { Opt } from "@effect-app/core/Option"
22
22
  import { makeFilters } from "@effect-app/infra/filter"
23
- import { Effect, S } from "effect-app"
24
- import { type FixEnv, runTerm } from "effect-app/Pure"
23
+ import type { ParseResult, Schema } from "@effect-app/schema"
24
+ import { NonNegativeInt } from "@effect-app/schema"
25
+ import type { Context, NonEmptyArray, NonEmptyReadonlyArray } from "effect-app"
26
+ import { Chunk, Effect, flow, Option, pipe, PubSub, ReadonlyArray, S } from "effect-app"
27
+ import { runTerm } from "effect-app/Pure"
28
+ import type { FixEnv, PureEnv } from "effect-app/Pure"
29
+ import { assignTag } from "effect-app/service"
25
30
  import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "../errors.js"
26
31
  import type { FieldValues } from "../filter/types.js"
27
32
  import { make as makeQuery, type QAll, type Query, query, type QueryProjection } from "./query.js"
@@ -67,7 +72,7 @@ export abstract class RepositoryBaseC<
67
72
  ItemType extends string
68
73
  > {
69
74
  abstract readonly itemType: ItemType
70
- abstract readonly find: (id: T["id"]) => Effect<Opt<T>>
75
+ abstract readonly find: (id: T["id"]) => Effect<Option<T>>
71
76
  abstract readonly all: Effect<T[]>
72
77
  abstract readonly saveAndPublish: (
73
78
  items: Iterable<T>,
@@ -83,7 +88,7 @@ export abstract class RepositoryBaseC<
83
88
  filter: FilterFunc<PM>
84
89
  // count: (filter?: Filter<PM>) => Effect<never, never, NonNegativeInt>
85
90
  }
86
- abstract readonly changeFeed: PubSub<[T[], "save" | "remove"]>
91
+ abstract readonly changeFeed: PubSub.PubSub<[T[], "save" | "remove"]>
87
92
  abstract readonly removeAndPublish: (
88
93
  items: Iterable<T>,
89
94
  events?: Iterable<Evt>
@@ -158,15 +163,17 @@ export class RepositoryBaseC3<
158
163
  ItemType extends string
159
164
  > extends RepositoryBaseC2<T, PM, Evt, ItemType> {
160
165
  get(id: T["id"]) {
161
- return this
162
- .find(id)
163
- .flatMap((_) => _.encaseInEffect(() => new NotFoundError<ItemType>({ type: this.itemType, id })))
166
+ return Effect.andThen(
167
+ this
168
+ .find(id),
169
+ (_) => Effect.mapError(_, () => new NotFoundError<ItemType>({ type: this.itemType, id }))
170
+ )
164
171
  }
165
172
 
166
173
  readonly log = (evt: Evt) => AnyPureDSL.log(evt)
167
174
 
168
175
  removeById(id: T["id"]) {
169
- return this.get(id).andThen((_) => this.removeAndPublish([_]))
176
+ return Effect.andThen(this.get(id), (_) => this.removeAndPublish([_]))
170
177
  }
171
178
 
172
179
  // TODO: project inside the db.
@@ -222,12 +229,13 @@ export class RepositoryBaseC3<
222
229
  >
223
230
  ): Effect<S[], E, R> {
224
231
  // TODO: a projection that gets sent to the db instead.
225
- return map.flatMap((f) =>
226
- this
227
- .utils
228
- .filter(f)
229
- .map((_) => f.collect ? _.filterMap(f.collect) : _ as unknown as S[])
230
- )
232
+ return Effect.flatMap(map, (f) =>
233
+ Effect.map(
234
+ this
235
+ .utils
236
+ .filter(f),
237
+ (_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown as S[]
238
+ ))
231
239
  }
232
240
 
233
241
  project<S = PM>(
@@ -262,9 +270,10 @@ export class RepositoryBaseC3<
262
270
  }
263
271
 
264
272
  count(filter?: Filter<PM>) {
265
- return this
266
- .projectEffect(Effect.sync(() => ({ filter })))
267
- .map((_) => NonNegativeInt(_.length))
273
+ return Effect.map(
274
+ this.projectEffect(Effect.sync(() => ({ filter }))),
275
+ (_) => NonNegativeInt(_.length)
276
+ )
268
277
  }
269
278
 
270
279
  queryEffect<
@@ -275,11 +284,12 @@ export class RepositoryBaseC3<
275
284
  // TODO: think about collectPM, collectE, and collect(Parsed)
276
285
  map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
277
286
  ) {
278
- return map.flatMap((f) =>
287
+ return Effect.flatMap(map, (f) =>
279
288
  (f.filter ? this.utils.filter(f) : this.utils.all)
280
- .flatMap((_) => this.utils.parseMany(_))
281
- .map((_) => f.collect ? _.filterMap(f.collect) : _ as any as S[])
282
- )
289
+ .pipe(
290
+ Effect.flatMap((_) => this.utils.parseMany(_)),
291
+ Effect.map((_) => f.collect ? ReadonlyArray.filterMap(_, f.collect) : _ as unknown[] as S[])
292
+ ))
283
293
  }
284
294
 
285
295
  queryOneEffect<R, E>(
@@ -302,16 +312,23 @@ export class RepositoryBaseC3<
302
312
  // TODO: think about collectPM, collectE, and collect(Parsed)
303
313
  map: Effect<{ filter?: Filter<PM>; collect?: (t: T) => Option<S> }, E, R>
304
314
  ): Effect<S, E | NotFoundError<ItemType>, R> {
305
- return map.flatMap((f) =>
315
+ return Effect.flatMap(map, (f) =>
306
316
  (f.filter ? this.utils.filter({ filter: f.filter, limit: 1 }) : this.utils.all)
307
- .flatMap((_) => this.utils.parseMany(_))
308
- .flatMap((_) =>
309
- (f.collect ? _.filterMap(f.collect) : _ as any as S[])
310
- .toNonEmpty
311
- .encaseInEffect(() => new NotFoundError<ItemType>({ type: this.itemType, id: f.filter }))
312
- .map((_) => _[0])
313
- )
314
- )
317
+ .pipe(
318
+ Effect.flatMap((_) => this.utils.parseMany(_)),
319
+ Effect
320
+ .flatMap((_) =>
321
+ toNonEmptyArray(
322
+ f.collect
323
+ ? ReadonlyArray.filterMap(_, f.collect)
324
+ : _ as unknown[] as S[]
325
+ )
326
+ .pipe(
327
+ Effect.mapError(() => new NotFoundError<ItemType>({ type: this.itemType, id: f.filter })),
328
+ Effect.map((_) => _[0])
329
+ )
330
+ )
331
+ ))
315
332
  }
316
333
 
317
334
  queryLegacy<S = T>(
@@ -373,9 +390,7 @@ export class RepositoryBaseC3<
373
390
  queryAndSaveOnePureEffect(
374
391
  map: any
375
392
  ) {
376
- return (pure: any) =>
377
- queryOneEffect(this, map)
378
- .flatMap((_) => saveWithPure_(this, _, pure))
393
+ return (pure: any) => Effect.flatMap(queryOneEffect(this, map), (_) => saveWithPure_(this, _, pure))
379
394
  }
380
395
 
381
396
  queryAndSaveOnePure<
@@ -412,8 +427,7 @@ export class RepositoryBaseC3<
412
427
  map: Effect<{ filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }, E, R>
413
428
  ) {
414
429
  return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
415
- queryEffect(this, map)
416
- .flatMap((_) => this.saveManyWithPure_(_, pure))
430
+ Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPure_(_, pure))
417
431
  }
418
432
 
419
433
  queryAndSavePure<
@@ -451,9 +465,9 @@ export class RepositoryBaseC3<
451
465
  }>
452
466
  >
453
467
  byIdAndSaveWithPure<R, A, E, S2 extends T>(id: T["id"], pure?: Effect<A, E, FixEnv<R, Evt, T, S2>>) {
454
- if (pure) return get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
468
+ if (pure) return get(this, id).pipe(Effect.flatMap((item) => saveWithPure_(this, item, pure)))
455
469
  return (pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) =>
456
- get(this, id).flatMap((item) => saveWithPure_(this, item, pure))
470
+ get(this, id).pipe(Effect.flatMap((item) => saveWithPure_(this, item, pure)))
457
471
  }
458
472
 
459
473
  /**
@@ -495,7 +509,7 @@ export class RepositoryBaseC3<
495
509
  return saveAllWithEffectInt(
496
510
  this,
497
511
  runTerm(pure, item)
498
- .map(([item, events, a]) => [[item], events, a])
512
+ .pipe(Effect.map(([item, events, a]) => [[item], events, a]))
499
513
  )
500
514
  }
501
515
 
@@ -507,10 +521,7 @@ export class RepositoryBaseC3<
507
521
  >(
508
522
  gen: Effect<readonly [Iterable<P>, Iterable<Evt>, A], E, R>
509
523
  ) {
510
- return gen
511
- .flatMap(
512
- ([items, events, a]) => this.saveAndPublish(items, events).map(() => a)
513
- )
524
+ return Effect.flatMap(gen, ([items, events, a]) => Effect.map(this.saveAndPublish(items, events), () => a))
514
525
  }
515
526
 
516
527
  queryAndSavePureEffectBatched<
@@ -523,8 +534,7 @@ export class RepositoryBaseC3<
523
534
  batchSize = 100
524
535
  ) {
525
536
  return <R2, A, E2, S2 extends T>(pure: Effect<A, E2, FixEnv<R2, Evt, S[], S2[]>>) =>
526
- queryEffect(this, map)
527
- .flatMap((_) => this.saveManyWithPureBatched_(_, pure, batchSize))
537
+ Effect.flatMap(queryEffect(this, map), (_) => this.saveManyWithPureBatched_(_, pure, batchSize))
528
538
  }
529
539
 
530
540
  queryAndSavePureBatched<
@@ -553,14 +563,14 @@ export class RepositoryBaseC3<
553
563
  pure: Effect<A, E, FixEnv<R, Evt, S1[], S2[]>>,
554
564
  batchSize = 100
555
565
  ) {
556
- return items
557
- .chunk(batchSize)
558
- .forEachEffect((batch) =>
566
+ return Effect.forEach(
567
+ ReadonlyArray.chunk_(items, batchSize),
568
+ (batch) =>
559
569
  saveAllWithEffectInt(
560
570
  this,
561
571
  runTerm(pure, batch)
562
572
  )
563
- )
573
+ )
564
574
  }
565
575
 
566
576
  readonly save = (...items: NonEmptyArray<T>) => this.saveAndPublish(items)
@@ -624,188 +634,214 @@ export function makeRepo<
624
634
  }
625
635
  }
626
636
  ) {
627
- return Do(($) => {
628
- const rctx = $(Effect.context<R>())
629
- const encode = flow(schema.encode, Effect.provide(rctx))
630
- const decode = flow(schema.decode, Effect.provide(rctx))
631
-
632
- const store = $(mkStore(args.makeInitial, args.config))
633
- const { get } = $(ContextMapContainer)
634
- const cms = get.andThen((_) => ({
635
- get: (id: string) => _.get(`${name}.${id}`),
636
- set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
637
- }))
638
-
639
- const pubCfg = $(Effect.context<R2>())
640
- const pub = "publishEvents" in args ? flow(args.publishEvents, (_) => _.provide(pubCfg)) : () => Effect.unit
641
- const changeFeed = $(PubSub.unbounded<[T[], "save" | "remove"]>())
642
-
643
- const allE = store.all.flatMap((items) =>
644
- Do(($) => {
645
- const { set } = $(cms)
646
- return items.map((_) => mapReverse(_, set))
647
- })
648
- )
649
-
650
- const all = allE.flatMap((_) =>
651
- _.forEachEffect((_) => decode(_), { concurrency: "inherit", batching: true }).orDie
652
- )
637
+ return Effect
638
+ .gen(function*($) {
639
+ const rctx = yield* $(Effect.context<R>())
640
+ const encode = flow(S.encode(schema), Effect.provide(rctx))
641
+ const decode = flow(S.decode(schema), Effect.provide(rctx))
642
+
643
+ const store = yield* $(mkStore(args.makeInitial, args.config))
644
+ const { get } = yield* $(ContextMapContainer)
645
+ const cms = Effect.andThen(get, (_) => ({
646
+ get: (id: string) => _.get(`${name}.${id}`),
647
+ set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag)
648
+ }))
649
+
650
+ const pubCfg = yield* $(Effect.context<R2>())
651
+ const pub = "publishEvents" in args
652
+ ? flow(args.publishEvents, Effect.provide(pubCfg))
653
+ : () => Effect.unit
654
+ const changeFeed = yield* $(PubSub.unbounded<[T[], "save" | "remove"]>())
655
+
656
+ const allE = store.all.pipe(Effect.flatMap((items) =>
657
+ Effect.gen(function*($) {
658
+ const { set } = yield* $(cms)
659
+ return items.map((_) => mapReverse(_, set))
660
+ })
661
+ ))
662
+
663
+ const all = Effect.flatMap(
664
+ allE,
665
+ (_) => Effect.forEach(_, (_) => decode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
666
+ )
653
667
 
654
- const structSchema = schema as unknown as { struct: typeof schema }
655
- const i = ("struct" in structSchema ? structSchema["struct"] : schema).pipe((_) =>
656
- _.ast._tag === "Union"
657
- // we need to get the TypeLiteral, incase of class it's behind a transform...
658
- ? S.union(..._.ast.types.map((_) =>
659
- (S.make(_._tag === "Transform" ? _.from : _) as unknown as Schema<T, From>)
660
- .pipe(S.pick("id"))
661
- ))
662
- : _
663
- .ast
664
- ._tag === "Transform"
665
- ? (S
666
- .make(
667
- _
668
+ const structSchema = schema as unknown as { struct: typeof schema }
669
+ const i = ("struct" in structSchema ? structSchema["struct"] : schema).pipe((_) =>
670
+ _.ast._tag === "Union"
671
+ // we need to get the TypeLiteral, incase of class it's behind a transform...
672
+ ? S.union(..._.ast.types.map((_) =>
673
+ (S.make(_._tag === "Transform" ? _.from : _) as unknown as Schema<T, From>)
674
+ .pipe(S.pick("id"))
675
+ ))
676
+ : _
668
677
  .ast
669
- .from
670
- ) as unknown as Schema<T, From>)
671
- .pipe(S
672
- .pick("id"))
673
- : _
674
- .pipe(S
675
- .pick("id"))
676
- )
677
- const encodeId = flow(i.encode, Effect.provide(rctx))
678
- function findEId(id: From["id"]) {
679
- return store
680
- .find(id)
681
- .flatMap((item) =>
682
- Do(($) => {
683
- const { set } = $(cms)
684
- return item.map((_) => mapReverse(_, set))
685
- })
678
+ ._tag === "Transform"
679
+ ? (S
680
+ .make(
681
+ _
682
+ .ast
683
+ .from
684
+ ) as unknown as Schema<T, From>)
685
+ .pipe(S
686
+ .pick("id"))
687
+ : _
688
+ .pipe(S
689
+ .pick("id"))
690
+ )
691
+ const encodeId = flow(S.encode(i), Effect.provide(rctx))
692
+ function findEId(id: From["id"]) {
693
+ return Effect.flatMap(
694
+ store.find(id),
695
+ (item) =>
696
+ Effect.gen(function*($) {
697
+ const { set } = yield* $(cms)
698
+ return item.pipe(Option.map((_) => mapReverse(_, set)))
699
+ })
686
700
  )
687
- }
688
- function findE(id: T["id"]) {
689
- return encodeId({ id })
690
- .orDie
691
- .map((_) => _.id)
692
- .flatMap(findEId)
693
- }
694
-
695
- function find(id: T["id"]) {
696
- return findE(id).flatMapOpt((_) => decode(_).orDie)
697
- }
698
-
699
- const saveAllE = (a: Iterable<From>) =>
700
- Effect
701
- .sync(() => a.toNonEmptyArray)
702
- .flatMapOpt((a) =>
703
- Do(($) => {
704
- const { get, set } = $(cms)
705
- const items = a.map((_) => mapToPersistenceModel(_, get))
706
- const ret = $(store.batchSet(items))
707
- ret.forEach((_) => set(_.id, _._etag))
708
- })
701
+ }
702
+ function findE(id: T["id"]) {
703
+ return pipe(
704
+ encodeId({ id }),
705
+ Effect.orDie,
706
+ Effect.map((_) => _.id),
707
+ Effect.flatMap(findEId)
709
708
  )
710
- .asUnit
711
-
712
- const saveAll = (a: Iterable<T>) =>
713
- a.toChunk.forEachEffect((_) => encode(_), { concurrency: "inherit", batching: true }).orDie.andThen(saveAllE)
714
-
715
- const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
716
- const it = items.toChunk
717
- return saveAll(it)
718
- .andThen(Effect.sync(() => events.toNonEmptyArray))
719
- // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
720
- .flatMapOpt(pub)
721
- .andThen(changeFeed
722
- .publish([it.toArray, "save"]))
723
- .asUnit
724
- }
709
+ }
725
710
 
726
- function removeAndPublish(a: Iterable<T>, events: Iterable<Evt> = []) {
727
- return Effect.gen(function*($) {
728
- const { get, set } = yield* $(cms)
729
- const it = a.toChunk
730
- const items = yield* $(it.forEachEffect((_) => encode(_), { concurrency: "inherit", batching: true }).orDie)
731
- // TODO: we should have a batchRemove on store so the adapter can actually batch...
732
- for (const e of items) {
733
- yield* $(store.remove(mapToPersistenceModel(e, get)))
734
- set(e.id, undefined)
735
- }
736
- yield* $(
737
- Effect
738
- .sync(() => events.toNonEmptyArray)
711
+ function find(id: T["id"]) {
712
+ return Effect.flatMapOption(findE(id), (_) => Effect.orDie(decode(_)))
713
+ }
714
+
715
+ const saveAllE = (a: Iterable<From>) =>
716
+ Effect
717
+ .flatMapOption(
718
+ Effect
719
+ .sync(() => toNonEmptyArray([...a])),
720
+ (a) =>
721
+ Effect.gen(function*($) {
722
+ const { get, set } = yield* $(cms)
723
+ const items = a.map((_) => mapToPersistenceModel(_, get))
724
+ const ret = yield* $(store.batchSet(items))
725
+ ret.forEach((_) => set(_.id, _._etag))
726
+ })
727
+ )
728
+ .pipe(Effect.asUnit)
729
+
730
+ const saveAll = (a: Iterable<T>) =>
731
+ Effect
732
+ .forEach(
733
+ Array.from(a),
734
+ (_) => encode(_),
735
+ { concurrency: "inherit", batching: true }
736
+ )
737
+ .pipe(
738
+ Effect.orDie,
739
+ Effect.andThen(saveAllE)
740
+ )
741
+
742
+ const saveAndPublish = (items: Iterable<T>, events: Iterable<Evt> = []) => {
743
+ const it = Chunk.fromIterable(items)
744
+ return saveAll(it)
745
+ .pipe(
746
+ Effect.andThen(Effect.sync(() => toNonEmptyArray([...events]))),
739
747
  // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
740
- .flatMapOpt(pub)
741
- )
748
+ (_) => Effect.flatMapOption(_, pub),
749
+ Effect.andThen(changeFeed.publish([Chunk.toArray(it), "save"])),
750
+ Effect.asUnit
751
+ )
752
+ }
742
753
 
743
- yield* $(changeFeed.publish([it.toArray, "remove"]))
744
- })
745
- }
754
+ function removeAndPublish(a: Iterable<T>, events: Iterable<Evt> = []) {
755
+ return Effect.gen(function*($) {
756
+ const { get, set } = yield* $(cms)
757
+ const it = [...a]
758
+ const items = yield* $(
759
+ Effect.forEach(it, (_) => encode(_), { concurrency: "inherit", batching: true }).pipe(Effect.orDie)
760
+ )
761
+ // TODO: we should have a batchRemove on store so the adapter can actually batch...
762
+ for (const e of items) {
763
+ yield* $(store.remove(mapToPersistenceModel(e, get)))
764
+ set(e.id, undefined)
765
+ }
766
+ yield* $(
767
+ Effect
768
+ .sync(() => toNonEmptyArray([...events]))
769
+ // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
770
+ .pipe((_) => Effect.flatMapOption(_, pub))
771
+ )
772
+
773
+ yield* $(changeFeed.publish([it, "remove"]))
774
+ })
775
+ }
746
776
 
747
- const r: Repository<T, PM, Evt, ItemType> = {
748
- /**
749
- * @internal
750
- */
751
- utils: {
752
- parseMany: (items) =>
753
- cms.flatMap((cm) =>
754
- items
755
- .forEachEffect((_) => decode(mapReverse(_, cm.set)), { concurrency: "inherit", batching: true })
756
- .orDie
757
- ),
758
- parseMany2: (items, schema) =>
759
- cms.flatMap((cm) =>
760
- items
761
- .forEachEffect((_) => schema.decode(mapReverse(_, cm.set) as any), {
762
- concurrency: "inherit",
763
- batching: true
764
- })
765
- .orDie
766
- ),
767
- filter: <U extends keyof PM = keyof PM>(args: FilterArgs<PM, U>) =>
768
- store
769
- .filter(args)
770
- .tap((items) =>
771
- args.select
772
- ? Effect.unit
773
- : cms.map(({ set }) => items.forEach((_) => set((_ as PM).id, (_ as PM)._etag)))
774
- ),
775
- all: store.all.tap((items) => cms.map(({ set }) => items.forEach((_) => set(_.id, _._etag))))
776
- },
777
- mapped: <A, R>(schema: S.Schema<A, any, R>) => {
778
- // const enc = S.encode(schema)
779
- const dec = S.decode(schema)
780
- const encMany = S.encode(S.array(schema))
781
- const decMany = S.decode(S.array(schema))
782
- return {
783
- all: cms
784
- .flatMap((cm) => r.utils.all.map((_) => _.map((_) => mapReverse(_, cm.set))))
785
- .flatMap(decMany)
786
- .map((_) => _ as any[]),
787
- find: (id: PM["id"]) => flatMapOption(findE(id), dec),
788
- query: (b: any) =>
789
- r
790
- .utils
791
- .filter({ filter: b })
792
- .flatMap(decMany)
793
- .map((_) => _ as any[]),
794
- save: (...xes: any[]) => encMany(xes).flatMap((_) => saveAllE(_ as any))
795
- }
796
- },
797
- changeFeed,
798
- itemType: name,
799
- find,
800
- all,
801
- saveAndPublish,
802
- removeAndPublish,
803
- q2: (q: any) => query(r, typeof q === "function" ? q(makeQuery()) : q) as any
804
- }
805
- return r
806
- })
807
- // .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } })
808
- .withLogSpan("Repository.make: " + name)
777
+ const r: Repository<T, PM, Evt, ItemType> = {
778
+ /**
779
+ * @internal
780
+ */
781
+ utils: {
782
+ parseMany: (items) =>
783
+ Effect.flatMap(cms, (cm) =>
784
+ Effect
785
+ .forEach(items, (_) => decode(mapReverse(_, cm.set)), { concurrency: "inherit", batching: true })
786
+ .pipe(Effect.orDie)),
787
+ parseMany2: (items, schema) =>
788
+ Effect.flatMap(cms, (cm) =>
789
+ Effect
790
+ .forEach(items, (_) => S.decode(schema)(mapReverse(_, cm.set) as any), {
791
+ concurrency: "inherit",
792
+ batching: true
793
+ })
794
+ .pipe(Effect.orDie)),
795
+ filter: <U extends keyof PM = keyof PM>(args: FilterArgs<PM, U>) =>
796
+ store
797
+ .filter(args)
798
+ .pipe(Effect.tap((items) =>
799
+ args.select
800
+ ? Effect.unit
801
+ : Effect.map(cms, ({ set }) => items.forEach((_) => set((_ as PM).id, (_ as PM)._etag)))
802
+ )),
803
+ all: Effect.tap(
804
+ store.all,
805
+ (items) => Effect.map(cms, ({ set }) => items.forEach((_) => set(_.id, _._etag)))
806
+ )
807
+ },
808
+ mapped: <A, R>(schema: S.Schema<A, any, R>) => {
809
+ // const enc = S.encode(schema)
810
+ const dec = S.decode(schema)
811
+ const encMany = S.encode(S.array(schema))
812
+ const decMany = S.decode(S.array(schema))
813
+ return {
814
+ all: cms
815
+ .pipe(
816
+ Effect.flatMap((cm) => Effect.map(r.utils.all, (_) => _.map((_) => mapReverse(_, cm.set)))),
817
+ Effect.flatMap(decMany),
818
+ Effect.map((_) => _ as any[])
819
+ ),
820
+ find: (id: PM["id"]) => flatMapOption(findE(id), dec),
821
+ query: (b: any) =>
822
+ r
823
+ .utils
824
+ .filter({ filter: b })
825
+ .pipe(
826
+ Effect.flatMap(decMany),
827
+ Effect.map((_) => _ as any[])
828
+ ),
829
+ save: (...xes: any[]) => Effect.flatMap(encMany(xes), (_) => saveAllE(_))
830
+ }
831
+ },
832
+ changeFeed,
833
+ itemType: name,
834
+ find,
835
+ all,
836
+ saveAndPublish,
837
+ removeAndPublish,
838
+ q2: (q: any) => query(r, typeof q === "function" ? q(makeQuery()) : q) as any
839
+ }
840
+ return r
841
+ })
842
+ .pipe(Effect
843
+ // .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } })
844
+ .withLogSpan("Repository.make: " + name))
809
845
  }
810
846
 
811
847
  return {
@@ -829,7 +865,7 @@ export function removeById<
829
865
  self: Repository<T, PM, Evt, ItemType>,
830
866
  id: T["id"]
831
867
  ) {
832
- return self.get(id).flatMap((_) => self.removeAndPublish([_]))
868
+ return get(self, id).pipe(Effect.flatMap((_) => self.removeAndPublish([_])))
833
869
  }
834
870
 
835
871
  export function makeWhere<PM extends { id: string; _etag: string | undefined }>() {
@@ -880,10 +916,10 @@ export function makeStore<
880
916
  function encodeToPM() {
881
917
  const getEtag = () => undefined
882
918
  return (t: T) =>
883
- schema
884
- .encode(t)
885
- .orDie
886
- .map((_) => mapToPersistenceModel(_, getEtag))
919
+ S.encode(schema)(t).pipe(
920
+ Effect.orDie,
921
+ Effect.map((_) => mapToPersistenceModel(_, getEtag))
922
+ )
887
923
  }
888
924
 
889
925
  function mapToPersistenceModel(
@@ -899,18 +935,20 @@ export function makeStore<
899
935
  partitionValue?: (a: PM) => string
900
936
  }
901
937
  ) {
902
- return Do(($) => {
903
- const { make } = $(StoreMaker)
938
+ return Effect.gen(function*($) {
939
+ const { make } = yield* $(StoreMaker)
904
940
 
905
- const store = $(
941
+ const store = yield* $(
906
942
  make<PM, string, R | RInitial, EInitial>(
907
943
  pluralize(name),
908
944
  makeInitial
909
- ? (makeInitial
910
- .flatMap((_) => _.forEachEffect(encodeToPM())))
911
- .withSpan("Repository.makeInitial [effect-app/infra]", {
912
- attributes: { "repository.model_name": name }
913
- })
945
+ ? makeInitial
946
+ .pipe(
947
+ Effect.flatMap(Effect.forEach(encodeToPM())),
948
+ Effect.withSpan("Repository.makeInitial [effect-app/infra]", {
949
+ attributes: { "repository.model_name": name }
950
+ })
951
+ )
914
952
  : undefined,
915
953
  {
916
954
  ...config,
@@ -1036,7 +1074,7 @@ export const RepositoryBaseImpl = <Service>() => {
1036
1074
  jitM?: (pm: From) => From
1037
1075
  ): Exact<PM, From & { _etag: string | undefined }> extends true ?
1038
1076
  & (abstract new() => RepositoryBaseC1<T, PM, Evt, ItemType>)
1039
- & Tag<Service, Service>
1077
+ & Context.Tag<Service, Service>
1040
1078
  & Repos<
1041
1079
  T,
1042
1080
  PM,
@@ -1058,7 +1096,7 @@ export const RepositoryBaseImpl = <Service>() => {
1058
1096
  super(itemType)
1059
1097
  }
1060
1098
  static readonly make = mkRepo.make
1061
- static readonly makeWith = ((a: any, b: any) => mkRepo.make(a).map(b)) as any
1099
+ static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
1062
1100
 
1063
1101
  static readonly Where = makeWhere<PM>()
1064
1102
  static readonly Query = Q.QueryBuilder.make<PM>()
@@ -1082,7 +1120,7 @@ export const RepositoryDefaultImpl = <Service>() => {
1082
1120
  & (abstract new(
1083
1121
  impl: Repository<T, PM, Evt, ItemType>
1084
1122
  ) => RepositoryBaseC3<T, PM, Evt, ItemType>)
1085
- & Tag<Service, Service>
1123
+ & Context.Tag<Service, Service>
1086
1124
  & Repos<
1087
1125
  T,
1088
1126
  PM,
@@ -1106,7 +1144,7 @@ export const RepositoryDefaultImpl = <Service>() => {
1106
1144
  super(itemType, impl)
1107
1145
  }
1108
1146
  static readonly make = mkRepo.make
1109
- static readonly makeWith = ((a: any, b: any) => mkRepo.make(a).map(b)) as any
1147
+ static readonly makeWith = ((a: any, b: any) => Effect.map(mkRepo.make(a), b)) as any
1110
1148
 
1111
1149
  static readonly Where = makeWhere<PM>()
1112
1150
  static readonly Query = Q.QueryBuilder.make<PM>()