@effect-app/infra 0.7.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 (438) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-314902b6271c341511f7398a50469024 +0 -0
  3. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-3f072cc7afa09b6adaead0527ab9df83 +0 -0
  4. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-74c3c295c110fc861b6a4c673afc3e24 +0 -0
  5. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-bf6dae8cb9ea9740ceb39aefaf12716c +0 -0
  6. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-cf9d1486029526079a5f68f2041dea02 +0 -0
  7. package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-b4710ed9fb3d0757c4bf23045c585670 +0 -0
  8. package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-ee17e5395bb1b7b36a4e2e22a6ae1449 +0 -0
  9. package/.jest-cache/haste-map-7dc16d7fae8c072843ed1c69eae73100-a8a4225b317477b49bca31f54559afb3-c16136699bb7f463be85273162b447c3 +0 -0
  10. package/.jest-cache/haste-map-9aa1e395a82e108eb49698982c574272-e2f1f4b6d87214e3c49442fed31f310c-f7435f46fc41ac5a13d06a49cae9a650 +0 -0
  11. package/.jest-cache/haste-map-9d206b45d610536c9ec65eec263c6964-a8a4225b317477b49bca31f54559afb3-3510506a330b44f1ae629033aac8fbb3 +0 -0
  12. package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-17b550b450b18840c25861aa6e835f0c +0 -0
  13. package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-4dc31290b1efc98335eb4c89167d75c3 +0 -0
  14. package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-997106edf4bbc31567a378146180e45e +0 -0
  15. package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-f0cd25414f9ed16c446940ca3aa23c1b +0 -0
  16. package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-2cac07d09e6384e2d37c49714edad0ba +0 -0
  17. package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-d7967c2976c5feac7161c964f0aa442f +0 -0
  18. package/.jest-cache/haste-map-fb1a173276d25bbff02f815600059283-938122bdc1c8836874b6585d7acb2e99-f705929cca05ce95ceaa6d520b560ce8 +0 -0
  19. package/.prettierignore +6 -0
  20. package/_cjs/_global.cjs +6 -0
  21. package/_cjs/_global.cjs.map +1 -0
  22. package/_cjs/_global.ext.cjs +6 -0
  23. package/_cjs/_global.ext.cjs.map +1 -0
  24. package/_cjs/_global.schema.cjs +5 -0
  25. package/_cjs/_global.schema.cjs.map +1 -0
  26. package/_cjs/errors.cjs +82 -0
  27. package/_cjs/errors.cjs.map +1 -0
  28. package/_cjs/ext.cjs +4 -0
  29. package/_cjs/ext.cjs.map +1 -0
  30. package/_cjs/index.cjs +6 -0
  31. package/_cjs/index.cjs.map +1 -0
  32. package/_cjs/lib/RequestContext.cjs +70 -0
  33. package/_cjs/lib/RequestContext.cjs.map +1 -0
  34. package/_cjs/lib/api/authorization.jwt.cjs +44 -0
  35. package/_cjs/lib/api/authorization.jwt.cjs.map +1 -0
  36. package/_cjs/lib/api/defaultErrorHandler.cjs +45 -0
  37. package/_cjs/lib/api/defaultErrorHandler.cjs.map +1 -0
  38. package/_cjs/lib/api/reportError.cjs +64 -0
  39. package/_cjs/lib/api/reportError.cjs.map +1 -0
  40. package/_cjs/lib/api/routing.cjs +262 -0
  41. package/_cjs/lib/api/routing.cjs.map +1 -0
  42. package/_cjs/lib/api/setupRequest.cjs +35 -0
  43. package/_cjs/lib/api/setupRequest.cjs.map +1 -0
  44. package/_cjs/lib/api/util.cjs +17 -0
  45. package/_cjs/lib/api/util.cjs.map +1 -0
  46. package/_cjs/lib/api/writeDocs.cjs +31 -0
  47. package/_cjs/lib/api/writeDocs.cjs.map +1 -0
  48. package/_cjs/lib/errorReporter.cjs +72 -0
  49. package/_cjs/lib/errorReporter.cjs.map +1 -0
  50. package/_cjs/lib/ext/Array.cjs +30 -0
  51. package/_cjs/lib/ext/Array.cjs.map +1 -0
  52. package/_cjs/lib/fileUtil.cjs +36 -0
  53. package/_cjs/lib/fileUtil.cjs.map +1 -0
  54. package/_cjs/lib/filter/types/errors.cjs +6 -0
  55. package/_cjs/lib/filter/types/errors.cjs.map +1 -0
  56. package/_cjs/lib/filter/types/fields.cjs +6 -0
  57. package/_cjs/lib/filter/types/fields.cjs.map +1 -0
  58. package/_cjs/lib/filter/types/index.cjs +61 -0
  59. package/_cjs/lib/filter/types/index.cjs.map +1 -0
  60. package/_cjs/lib/filter/types/path/common.cjs +6 -0
  61. package/_cjs/lib/filter/types/path/common.cjs.map +1 -0
  62. package/_cjs/lib/filter/types/path/eager.cjs +6 -0
  63. package/_cjs/lib/filter/types/path/eager.cjs.map +1 -0
  64. package/_cjs/lib/filter/types/path/index.cjs +8 -0
  65. package/_cjs/lib/filter/types/path/index.cjs.map +1 -0
  66. package/_cjs/lib/filter/types/utils.cjs +6 -0
  67. package/_cjs/lib/filter/types/utils.cjs.map +1 -0
  68. package/_cjs/lib/filter/types/validator.cjs +6 -0
  69. package/_cjs/lib/filter/types/validator.cjs.map +1 -0
  70. package/_cjs/lib/filter.cjs +238 -0
  71. package/_cjs/lib/filter.cjs.map +1 -0
  72. package/_cjs/lib/instrument.cjs +20 -0
  73. package/_cjs/lib/instrument.cjs.map +1 -0
  74. package/_cjs/lib/rateLimit.cjs +88 -0
  75. package/_cjs/lib/rateLimit.cjs.map +1 -0
  76. package/_cjs/services/CUPS/service.cjs +15 -0
  77. package/_cjs/services/CUPS/service.cjs.map +1 -0
  78. package/_cjs/services/CUPS.cjs +113 -0
  79. package/_cjs/services/CUPS.cjs.map +1 -0
  80. package/_cjs/services/Cache.cjs +39 -0
  81. package/_cjs/services/Cache.cjs.map +1 -0
  82. package/_cjs/services/Emailer/Sendgrid.cjs +112 -0
  83. package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -0
  84. package/_cjs/services/Emailer/fake.cjs +24 -0
  85. package/_cjs/services/Emailer/fake.cjs.map +1 -0
  86. package/_cjs/services/Emailer/service.cjs +12 -0
  87. package/_cjs/services/Emailer/service.cjs.map +1 -0
  88. package/_cjs/services/Emailer.cjs +17 -0
  89. package/_cjs/services/Emailer.cjs.map +1 -0
  90. package/_cjs/services/Repository.cjs +247 -0
  91. package/_cjs/services/Repository.cjs.map +1 -0
  92. package/_cjs/services/ServiceBus.cjs +69 -0
  93. package/_cjs/services/ServiceBus.cjs.map +1 -0
  94. package/_cjs/services/Store/Cosmos.cjs +324 -0
  95. package/_cjs/services/Store/Cosmos.cjs.map +1 -0
  96. package/_cjs/services/Store/Cosmos.test.cjs +59 -0
  97. package/_cjs/services/Store/Cosmos.test.cjs.map +1 -0
  98. package/_cjs/services/Store/Disk.cjs +62 -0
  99. package/_cjs/services/Store/Disk.cjs.map +1 -0
  100. package/_cjs/services/Store/Memory.cjs +70 -0
  101. package/_cjs/services/Store/Memory.cjs.map +1 -0
  102. package/_cjs/services/Store/Redis.cjs +72 -0
  103. package/_cjs/services/Store/Redis.cjs.map +1 -0
  104. package/_cjs/services/Store/codeFilter.test.cjs +61 -0
  105. package/_cjs/services/Store/codeFilter.test.cjs.map +1 -0
  106. package/_cjs/services/Store/index.cjs +72 -0
  107. package/_cjs/services/Store/index.cjs.map +1 -0
  108. package/_cjs/services/Store/service.cjs +72 -0
  109. package/_cjs/services/Store/service.cjs.map +1 -0
  110. package/_cjs/services/Store/utils.cjs +78 -0
  111. package/_cjs/services/Store/utils.cjs.map +1 -0
  112. package/_cjs/services/Store.cjs +17 -0
  113. package/_cjs/services/Store.cjs.map +1 -0
  114. package/_cjs/services/memQueue.cjs +32 -0
  115. package/_cjs/services/memQueue.cjs.map +1 -0
  116. package/_cjs/test.arbs.cjs +32 -0
  117. package/_cjs/test.arbs.cjs.map +1 -0
  118. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +14 -0
  119. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +1 -0
  120. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +29 -0
  121. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +1 -0
  122. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +32 -0
  123. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +1 -0
  124. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +266 -0
  125. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +1 -0
  126. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs +31 -0
  127. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +1 -0
  128. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +67 -0
  129. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +1 -0
  130. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +44 -0
  131. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +1 -0
  132. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +33 -0
  133. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +1 -0
  134. package/_cjs/vendor/Cache/Cache/definition.cjs +13 -0
  135. package/_cjs/vendor/Cache/Cache/definition.cjs.map +1 -0
  136. package/_cjs/vendor/Cache/Cache/operations/make.cjs +20 -0
  137. package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +1 -0
  138. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs +23 -0
  139. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +1 -0
  140. package/_cjs/vendor/Cache/Cache/operations.cjs +28 -0
  141. package/_cjs/vendor/Cache/Cache/operations.cjs.map +1 -0
  142. package/_cjs/vendor/Cache/Cache.cjs +28 -0
  143. package/_cjs/vendor/Cache/Cache.cjs.map +1 -0
  144. package/_cjs/vendor/Cache/CacheStats/definition.cjs +13 -0
  145. package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +1 -0
  146. package/_cjs/vendor/Cache/CacheStats.cjs +17 -0
  147. package/_cjs/vendor/Cache/CacheStats.cjs.map +1 -0
  148. package/_cjs/vendor/Cache/EntryStats/definition.cjs +11 -0
  149. package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +1 -0
  150. package/_cjs/vendor/Cache/EntryStats.cjs +17 -0
  151. package/_cjs/vendor/Cache/EntryStats.cjs.map +1 -0
  152. package/_cjs/vendor/Cache/Lookup/definition.cjs +6 -0
  153. package/_cjs/vendor/Cache/Lookup/definition.cjs.map +1 -0
  154. package/_cjs/vendor/Cache/Lookup.cjs +17 -0
  155. package/_cjs/vendor/Cache/Lookup.cjs.map +1 -0
  156. package/_cjs/vendor/Cache/index.cjs +17 -0
  157. package/_cjs/vendor/Cache/index.cjs.map +1 -0
  158. package/_src/_global.ext.ts +34 -0
  159. package/_src/_global.schema.ts +10 -0
  160. package/_src/_global.ts +14 -0
  161. package/_src/errors.ts +50 -0
  162. package/_src/ext.ts +1 -0
  163. package/_src/index.ts +0 -0
  164. package/_src/lib/RequestContext.ts +132 -0
  165. package/_src/lib/api/authorization.jwt.ts +52 -0
  166. package/_src/lib/api/defaultErrorHandler.ts +92 -0
  167. package/_src/lib/api/reportError.ts +50 -0
  168. package/_src/lib/api/routing.ts +623 -0
  169. package/_src/lib/api/setupRequest.ts +22 -0
  170. package/_src/lib/api/util.ts +14 -0
  171. package/_src/lib/api/writeDocs.ts +26 -0
  172. package/_src/lib/errorReporter.ts +63 -0
  173. package/_src/lib/ext/Array.ts +32 -0
  174. package/_src/lib/fileUtil.ts +56 -0
  175. package/_src/lib/filter/types/errors.ts +47 -0
  176. package/_src/lib/filter/types/fields.ts +50 -0
  177. package/_src/lib/filter/types/index.ts +5 -0
  178. package/_src/lib/filter/types/path/common.ts +404 -0
  179. package/_src/lib/filter/types/path/eager.ts +146 -0
  180. package/_src/lib/filter/types/path/index.ts +14 -0
  181. package/_src/lib/filter/types/utils.ts +106 -0
  182. package/_src/lib/filter/types/validator.ts +46 -0
  183. package/_src/lib/filter.ts +323 -0
  184. package/_src/lib/instrument.ts +9 -0
  185. package/_src/lib/rateLimit.ts +126 -0
  186. package/_src/services/CUPS/service.ts +16 -0
  187. package/_src/services/CUPS.ts +105 -0
  188. package/_src/services/Cache.ts +45 -0
  189. package/_src/services/Emailer/Sendgrid.ts +123 -0
  190. package/_src/services/Emailer/fake.ts +14 -0
  191. package/_src/services/Emailer/service.ts +33 -0
  192. package/_src/services/Emailer.ts +1 -0
  193. package/_src/services/Repository.ts +513 -0
  194. package/_src/services/ServiceBus.ts +111 -0
  195. package/_src/services/Store/Cosmos.test.ts +91 -0
  196. package/_src/services/Store/Cosmos.ts +545 -0
  197. package/_src/services/Store/Disk.ts +81 -0
  198. package/_src/services/Store/Memory.ts +77 -0
  199. package/_src/services/Store/Redis.ts +92 -0
  200. package/_src/services/Store/codeFilter.test.ts +74 -0
  201. package/_src/services/Store/index.test.ts.bak +112 -0
  202. package/_src/services/Store/index.ts +62 -0
  203. package/_src/services/Store/service.ts +174 -0
  204. package/_src/services/Store/utils.ts +126 -0
  205. package/_src/services/Store.ts +1 -0
  206. package/_src/services/memQueue.ts +30 -0
  207. package/_src/test.arbs.ts +27 -0
  208. package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +7 -0
  209. package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +28 -0
  210. package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +30 -0
  211. package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +293 -0
  212. package/_src/vendor/Cache/Cache/_internal/CacheState.ts +56 -0
  213. package/_src/vendor/Cache/Cache/_internal/KeySet.ts +58 -0
  214. package/_src/vendor/Cache/Cache/_internal/MapKey.ts +43 -0
  215. package/_src/vendor/Cache/Cache/_internal/MapValue.ts +39 -0
  216. package/_src/vendor/Cache/Cache/definition.ts +112 -0
  217. package/_src/vendor/Cache/Cache/operations/make.ts +17 -0
  218. package/_src/vendor/Cache/Cache/operations/makeWith.ts +32 -0
  219. package/_src/vendor/Cache/Cache/operations.ts +4 -0
  220. package/_src/vendor/Cache/Cache.ts +4 -0
  221. package/_src/vendor/Cache/CacheStats/definition.ts +23 -0
  222. package/_src/vendor/Cache/CacheStats.ts +3 -0
  223. package/_src/vendor/Cache/EntryStats/definition.ts +19 -0
  224. package/_src/vendor/Cache/EntryStats.ts +3 -0
  225. package/_src/vendor/Cache/Lookup/definition.ts +15 -0
  226. package/_src/vendor/Cache/Lookup.ts +3 -0
  227. package/_src/vendor/Cache/global.ts.bak +23 -0
  228. package/_src/vendor/Cache/index.ts +4 -0
  229. package/dist/_global.d.ts +10 -0
  230. package/dist/_global.d.ts.map +1 -0
  231. package/dist/_global.ext.d.ts +34 -0
  232. package/dist/_global.ext.d.ts.map +1 -0
  233. package/dist/_global.ext.js +2 -0
  234. package/dist/_global.js +12 -0
  235. package/dist/_global.schema.d.ts +6 -0
  236. package/dist/_global.schema.d.ts.map +1 -0
  237. package/dist/_global.schema.js +9 -0
  238. package/dist/errors.d.ts +41 -0
  239. package/dist/errors.d.ts.map +1 -0
  240. package/dist/errors.js +51 -0
  241. package/dist/ext.d.ts +2 -0
  242. package/dist/ext.d.ts.map +1 -0
  243. package/dist/ext.js +2 -0
  244. package/dist/index.d.ts +2 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +2 -0
  247. package/dist/lib/RequestContext.d.ts +122 -0
  248. package/dist/lib/RequestContext.d.ts.map +1 -0
  249. package/dist/lib/RequestContext.js +52 -0
  250. package/dist/lib/api/authorization.jwt.d.ts +7 -0
  251. package/dist/lib/api/authorization.jwt.d.ts.map +1 -0
  252. package/dist/lib/api/authorization.jwt.js +32 -0
  253. package/dist/lib/api/defaultErrorHandler.d.ts +8 -0
  254. package/dist/lib/api/defaultErrorHandler.d.ts.map +1 -0
  255. package/dist/lib/api/defaultErrorHandler.js +37 -0
  256. package/dist/lib/api/reportError.d.ts +32 -0
  257. package/dist/lib/api/reportError.d.ts.map +1 -0
  258. package/dist/lib/api/reportError.js +44 -0
  259. package/dist/lib/api/routing.d.ts +100 -0
  260. package/dist/lib/api/routing.d.ts.map +1 -0
  261. package/dist/lib/api/routing.js +248 -0
  262. package/dist/lib/api/setupRequest.d.ts +13 -0
  263. package/dist/lib/api/setupRequest.d.ts.map +1 -0
  264. package/dist/lib/api/setupRequest.js +25 -0
  265. package/dist/lib/api/util.d.ts +3 -0
  266. package/dist/lib/api/util.d.ts.map +1 -0
  267. package/dist/lib/api/util.js +14 -0
  268. package/dist/lib/api/writeDocs.d.ts +3 -0
  269. package/dist/lib/api/writeDocs.d.ts.map +1 -0
  270. package/dist/lib/api/writeDocs.js +23 -0
  271. package/dist/lib/errorReporter.d.ts +8 -0
  272. package/dist/lib/errorReporter.d.ts.map +1 -0
  273. package/dist/lib/errorReporter.js +45 -0
  274. package/dist/lib/ext/Array.d.ts +19 -0
  275. package/dist/lib/ext/Array.d.ts.map +1 -0
  276. package/dist/lib/ext/Array.js +21 -0
  277. package/dist/lib/fileUtil.d.ts +22 -0
  278. package/dist/lib/fileUtil.d.ts.map +1 -0
  279. package/dist/lib/fileUtil.js +23 -0
  280. package/dist/lib/filter/types/errors.d.ts +30 -0
  281. package/dist/lib/filter/types/errors.d.ts.map +1 -0
  282. package/dist/lib/filter/types/errors.js +2 -0
  283. package/dist/lib/filter/types/fields.d.ts +29 -0
  284. package/dist/lib/filter/types/fields.d.ts.map +1 -0
  285. package/dist/lib/filter/types/fields.js +2 -0
  286. package/dist/lib/filter/types/index.d.ts +6 -0
  287. package/dist/lib/filter/types/index.d.ts.map +1 -0
  288. package/dist/lib/filter/types/index.js +6 -0
  289. package/dist/lib/filter/types/path/common.d.ts +316 -0
  290. package/dist/lib/filter/types/path/common.d.ts.map +1 -0
  291. package/dist/lib/filter/types/path/common.js +2 -0
  292. package/dist/lib/filter/types/path/eager.d.ts +95 -0
  293. package/dist/lib/filter/types/path/eager.d.ts.map +1 -0
  294. package/dist/lib/filter/types/path/eager.js +2 -0
  295. package/dist/lib/filter/types/path/index.d.ts +4 -0
  296. package/dist/lib/filter/types/path/index.d.ts.map +1 -0
  297. package/dist/lib/filter/types/path/index.js +4 -0
  298. package/dist/lib/filter/types/utils.d.ts +68 -0
  299. package/dist/lib/filter/types/utils.d.ts.map +1 -0
  300. package/dist/lib/filter/types/utils.js +2 -0
  301. package/dist/lib/filter/types/validator.d.ts +30 -0
  302. package/dist/lib/filter/types/validator.d.ts.map +1 -0
  303. package/dist/lib/filter/types/validator.js +2 -0
  304. package/dist/lib/filter.d.ts +133 -0
  305. package/dist/lib/filter.d.ts.map +1 -0
  306. package/dist/lib/filter.js +171 -0
  307. package/dist/lib/instrument.d.ts +7 -0
  308. package/dist/lib/instrument.d.ts.map +1 -0
  309. package/dist/lib/instrument.js +12 -0
  310. package/dist/lib/rateLimit.d.ts +43 -0
  311. package/dist/lib/rateLimit.d.ts.map +1 -0
  312. package/dist/lib/rateLimit.js +76 -0
  313. package/dist/services/CUPS/service.d.ts +19 -0
  314. package/dist/services/CUPS/service.d.ts.map +1 -0
  315. package/dist/services/CUPS/service.js +5 -0
  316. package/dist/services/CUPS.d.ts +10 -0
  317. package/dist/services/CUPS.d.ts.map +1 -0
  318. package/dist/services/CUPS.js +89 -0
  319. package/dist/services/Cache.d.ts +28 -0
  320. package/dist/services/Cache.d.ts.map +1 -0
  321. package/dist/services/Cache.js +28 -0
  322. package/dist/services/Emailer/Sendgrid.d.ts +180 -0
  323. package/dist/services/Emailer/Sendgrid.d.ts.map +1 -0
  324. package/dist/services/Emailer/Sendgrid.js +102 -0
  325. package/dist/services/Emailer/fake.d.ts +7 -0
  326. package/dist/services/Emailer/fake.d.ts.map +1 -0
  327. package/dist/services/Emailer/fake.js +15 -0
  328. package/dist/services/Emailer/service.d.ts +41 -0
  329. package/dist/services/Emailer/service.d.ts.map +1 -0
  330. package/dist/services/Emailer/service.js +3 -0
  331. package/dist/services/Emailer.d.ts +2 -0
  332. package/dist/services/Emailer.d.ts.map +1 -0
  333. package/dist/services/Emailer.js +2 -0
  334. package/dist/services/Repository.d.ts +300 -0
  335. package/dist/services/Repository.d.ts.map +1 -0
  336. package/dist/services/Repository.js +193 -0
  337. package/dist/services/ServiceBus.d.ts +26 -0
  338. package/dist/services/ServiceBus.d.ts.map +1 -0
  339. package/dist/services/ServiceBus.js +53 -0
  340. package/dist/services/Store/Cosmos.d.ts +56 -0
  341. package/dist/services/Store/Cosmos.d.ts.map +1 -0
  342. package/dist/services/Store/Cosmos.js +321 -0
  343. package/dist/services/Store/Cosmos.test.d.ts.map +1 -0
  344. package/dist/services/Store/Disk.d.ts +14 -0
  345. package/dist/services/Store/Disk.d.ts.map +1 -0
  346. package/dist/services/Store/Disk.js +52 -0
  347. package/dist/services/Store/Memory.d.ts +17 -0
  348. package/dist/services/Store/Memory.d.ts.map +1 -0
  349. package/dist/services/Store/Memory.js +60 -0
  350. package/dist/services/Store/Redis.d.ts +12 -0
  351. package/dist/services/Store/Redis.d.ts.map +1 -0
  352. package/dist/services/Store/Redis.js +59 -0
  353. package/dist/services/Store/codeFilter.test.d.ts.map +1 -0
  354. package/dist/services/Store/index.d.ts +10 -0
  355. package/dist/services/Store/index.d.ts.map +1 -0
  356. package/dist/services/Store/index.js +52 -0
  357. package/dist/services/Store/service.d.ts +113 -0
  358. package/dist/services/Store/service.d.ts.map +1 -0
  359. package/dist/services/Store/service.js +63 -0
  360. package/dist/services/Store/utils.d.ts +14 -0
  361. package/dist/services/Store/utils.d.ts.map +1 -0
  362. package/dist/services/Store/utils.js +103 -0
  363. package/dist/services/Store.d.ts +2 -0
  364. package/dist/services/Store.d.ts.map +1 -0
  365. package/dist/services/Store.js +2 -0
  366. package/dist/services/memQueue.d.ts +18 -0
  367. package/dist/services/memQueue.d.ts.map +1 -0
  368. package/dist/services/memQueue.js +24 -0
  369. package/dist/test.arbs.d.ts +13 -0
  370. package/dist/test.arbs.d.ts.map +1 -0
  371. package/dist/test.arbs.js +22 -0
  372. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +5 -0
  373. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +1 -0
  374. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +7 -0
  375. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +8 -0
  376. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +1 -0
  377. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +22 -0
  378. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +10 -0
  379. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +1 -0
  380. package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +25 -0
  381. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +51 -0
  382. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +1 -0
  383. package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +253 -0
  384. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +33 -0
  385. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +1 -0
  386. package/dist/vendor/Cache/Cache/_internal/CacheState.js +21 -0
  387. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +20 -0
  388. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +1 -0
  389. package/dist/vendor/Cache/Cache/_internal/KeySet.js +61 -0
  390. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +24 -0
  391. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +1 -0
  392. package/dist/vendor/Cache/Cache/_internal/MapKey.js +37 -0
  393. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +32 -0
  394. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +1 -0
  395. package/dist/vendor/Cache/Cache/_internal/MapValue.js +24 -0
  396. package/dist/vendor/Cache/Cache/definition.d.ts +100 -0
  397. package/dist/vendor/Cache/Cache/definition.d.ts.map +1 -0
  398. package/dist/vendor/Cache/Cache/definition.js +5 -0
  399. package/dist/vendor/Cache/Cache/operations/make.d.ts +12 -0
  400. package/dist/vendor/Cache/Cache/operations/make.d.ts.map +1 -0
  401. package/dist/vendor/Cache/Cache/operations/make.js +12 -0
  402. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +14 -0
  403. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +1 -0
  404. package/dist/vendor/Cache/Cache/operations/makeWith.js +15 -0
  405. package/dist/vendor/Cache/Cache/operations.d.ts +3 -0
  406. package/dist/vendor/Cache/Cache/operations.d.ts.map +1 -0
  407. package/dist/vendor/Cache/Cache/operations.js +4 -0
  408. package/dist/vendor/Cache/Cache.d.ts +3 -0
  409. package/dist/vendor/Cache/Cache.d.ts.map +1 -0
  410. package/dist/vendor/Cache/Cache.js +4 -0
  411. package/dist/vendor/Cache/CacheStats/definition.d.ts +19 -0
  412. package/dist/vendor/Cache/CacheStats/definition.d.ts.map +1 -0
  413. package/dist/vendor/Cache/CacheStats/definition.js +6 -0
  414. package/dist/vendor/Cache/CacheStats.d.ts +2 -0
  415. package/dist/vendor/Cache/CacheStats.d.ts.map +1 -0
  416. package/dist/vendor/Cache/CacheStats.js +3 -0
  417. package/dist/vendor/Cache/EntryStats/definition.d.ts +17 -0
  418. package/dist/vendor/Cache/EntryStats/definition.d.ts.map +1 -0
  419. package/dist/vendor/Cache/EntryStats/definition.js +4 -0
  420. package/dist/vendor/Cache/EntryStats.d.ts +2 -0
  421. package/dist/vendor/Cache/EntryStats.d.ts.map +1 -0
  422. package/dist/vendor/Cache/EntryStats.js +3 -0
  423. package/dist/vendor/Cache/Lookup/definition.d.ts +17 -0
  424. package/dist/vendor/Cache/Lookup/definition.d.ts.map +1 -0
  425. package/dist/vendor/Cache/Lookup/definition.js +2 -0
  426. package/dist/vendor/Cache/Lookup.d.ts +2 -0
  427. package/dist/vendor/Cache/Lookup.d.ts.map +1 -0
  428. package/dist/vendor/Cache/Lookup.js +3 -0
  429. package/dist/vendor/Cache/index.d.ts +5 -0
  430. package/dist/vendor/Cache/index.d.ts.map +1 -0
  431. package/dist/vendor/Cache/index.js +5 -0
  432. package/package.json +756 -0
  433. package/tsconfig.json +107 -0
  434. package/tsconfig.json.bak +47 -0
  435. package/tsplus.config.json +6 -0
  436. package/types/modules.d.ts +1 -0
  437. package/vitest.config.ts +5 -0
  438. package/wallaby.cjs +1 -0
@@ -0,0 +1,513 @@
1
+ // Update = Must return updated items
2
+ // Modify = Must `set` updated items, and can return anything.
3
+ import type { InvalidStateError, OptimisticConcurrencyException } from "../errors.js"
4
+ import { NotFoundError } from "../errors.js"
5
+ import type { RequestContext } from "../lib/RequestContext.js"
6
+ import { ContextMap} from "../services/Store.js";
7
+ import type { Filter } from "../services/Store.js"
8
+ import type { FixEnv, PureLogT} from "@effect-app/prelude/_ext/Pure";
9
+ import { Pure } from "@effect-app/prelude/_ext/Pure"
10
+ import type { ParserEnv } from "@effect-app/schema/custom/Parser"
11
+
12
+ /**
13
+ * @tsplus type Repository
14
+ */
15
+ export interface Repository<T extends { id: Id }, PM extends { id: string }, Evt, Id extends string, ItemType extends string> {
16
+ itemType: ItemType
17
+ find: (id: Id) => Effect<ContextMap | RequestContext, never, Opt<T>>
18
+ all: Effect<ContextMap, never, Chunk<T>>
19
+ save: (
20
+ items: Iterable<T>,
21
+ events?: Iterable<Evt>
22
+ ) => Effect<ContextMap | RequestContext, InvalidStateError | OptimisticConcurrencyException, void>
23
+ utils: {
24
+ mapReverse: (
25
+ pm: PM,
26
+ setEtag: (id: string, eTag: string | undefined) => void
27
+ ) => unknown, // TODO
28
+ parse: (a: unknown, env?: ParserEnv | undefined) => T,
29
+ all: Effect<never, never, Chunk<PM>>,
30
+ filter: (filter: Filter<PM>, cursor?: { limit?: number, skip?: number}) => Effect<never, never, Chunk<PM>>
31
+ }
32
+ }
33
+
34
+ export interface PureDSL<S, S2, W> {
35
+ get: ReturnType<typeof Pure.get<S>>, set: typeof Pure.set<S2>, log: (...w: W[]) => PureLogT<W>
36
+ }
37
+
38
+ export const AnyPureDSL: PureDSL<any, any, any> = { get: Pure.get(), set: Pure.set, log: (...evt: any[]) => Pure.logMany(evt) }
39
+
40
+ /**
41
+ * @tsplus fluent Repository get
42
+ */
43
+ export function get<
44
+ Id extends string,
45
+ T extends { id: Id },
46
+ PM extends { id: string },
47
+ Evt,
48
+ ItemType extends string
49
+ >(
50
+ self: Repository<T, PM, Evt, Id, ItemType>,
51
+ id: Id
52
+ ) {
53
+ return self.find(id).flatMap(_ => _.encaseInEffect(() => new NotFoundError(self.itemType, id)))
54
+ }
55
+
56
+ /**
57
+ * @tsplus fluent Repository filter
58
+ */
59
+ export function filter<
60
+ Id extends string,
61
+ T extends { id: Id },
62
+ PM extends { id: string },
63
+ Evt,
64
+ ItemType extends string,
65
+ >(self: Repository<T, PM, Evt, Id, ItemType>, filter: Predicate<T>) {
66
+ return self.all.map(_ => _.filter(filter))
67
+ }
68
+
69
+ /**
70
+ * @tsplus fluent Repository filterAll
71
+ */
72
+ export function filterAll<
73
+ Id extends string,
74
+ T extends { id: Id },
75
+ PM extends { id: string },
76
+ Evt,
77
+ ItemType extends string,
78
+ S extends T,
79
+ >(self: Repository<T, PM, Evt, Id, ItemType>, map: (items: Chunk<T>) => Chunk<S>) {
80
+ return self.all.map(map)
81
+ }
82
+
83
+
84
+ /**
85
+ * @tsplus fluent Repository collect
86
+ */
87
+ export function collect<
88
+ Id extends string,
89
+ T extends { id: Id },
90
+ PM extends { id: string },
91
+ Evt,
92
+ ItemType extends string,
93
+ S extends T,
94
+ >(self: Repository<T, PM, Evt, Id, ItemType>, collect: (item: T) => Opt<S>) {
95
+ return self.all.map(_ => _.filterMap(collect))
96
+ }
97
+
98
+ /**
99
+ * @tsplus getter Repository log
100
+ */
101
+ export function log<
102
+ Id extends string,
103
+ T extends { id: Id },
104
+ PM extends { id: string },
105
+ Evt,
106
+ ItemType extends string
107
+ >(_: Repository<T, PM, Evt, Id, ItemType>) {
108
+ return (evt: Evt) => AnyPureDSL.log(evt)
109
+ }
110
+
111
+ /**
112
+ * TODO: project inside the db.
113
+ * @tsplus fluent Repository projectEffect
114
+ */
115
+ export function projectEffect<
116
+ Id extends string,
117
+ T extends { id: Id },
118
+ PM extends { id: string },
119
+ Evt,
120
+ ItemType extends string,
121
+ S,
122
+ R,
123
+ E
124
+ >(
125
+ self: Repository<T, PM, Evt, Id, ItemType>,
126
+ map: Effect<R, E, { filter?: Filter<PM>; collect: (t: PM) => Opt<S>; limit?: number; skip?: number }>
127
+ ) {
128
+ // TODO: a projection that gets sent to the db instead.
129
+ return map.flatMap(f =>
130
+ (f.filter ? self.utils.filter(f.filter, { limit: f.limit, skip: f.skip}) : self.utils.all)
131
+ .map(_ => _.filterMap(f.collect))
132
+ )
133
+ }
134
+
135
+ /**
136
+ * TODO: project inside the db.
137
+ * @tsplus fluent Repository project
138
+ */
139
+ export function project<
140
+ Id extends string,
141
+ T extends { id: Id },
142
+ PM extends { id: string },
143
+ Evt,
144
+ ItemType extends string,
145
+ S,
146
+ >(
147
+ self: Repository<T, PM, Evt, Id, ItemType>,
148
+ map: { filter?: Filter<PM>; collect: (t: PM) => Opt<S>; limit?: number; skip?: number }
149
+ ) {
150
+ return self.projectEffect(Effect(map))
151
+ }
152
+
153
+
154
+ /**
155
+ * @tsplus fluent Repository queryEffect
156
+ */
157
+ export function queryEffect<
158
+ Id extends string,
159
+ T extends { id: Id },
160
+ PM extends { id: string },
161
+ Evt,
162
+ ItemType extends string,
163
+ R,
164
+ E,
165
+ S,
166
+ >(
167
+ self: Repository<T, PM, Evt, Id, ItemType>,
168
+ // TODO: think about collectPM, collectE, and collect(Parsed)
169
+ map: Effect<R, E, { filter?: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }>
170
+ ) {
171
+ return map.flatMap(f =>
172
+ (f.filter ? self.utils.filter(f.filter, { limit: f.limit, skip: f.skip}) : self.utils.all)
173
+ .flatMap(items =>
174
+ Do($ => {
175
+ const { set } = $(Effect.service(ContextMap))
176
+ return items.map(_ => self.utils.mapReverse(_, set))
177
+ })
178
+ )
179
+ .map(_ => _.map(_ => self.utils.parse(_)))
180
+ .map(_ => _.filterMap(f.collect))
181
+ )
182
+ }
183
+
184
+ /**
185
+ * @tsplus fluent Repository queryOneEffect
186
+ */
187
+ export function queryOneEffect<
188
+ Id extends string,
189
+ T extends { id: Id },
190
+ PM extends { id: string },
191
+ Evt,
192
+ ItemType extends string,
193
+ R,
194
+ E,
195
+ S,
196
+ >(
197
+ self: Repository<T, PM, Evt, Id, ItemType>,
198
+ // TODO: think about collectPM, collectE, and collect(Parsed)
199
+ map: Effect<R, E, { filter?: Filter<PM>; collect: (t: T) => Opt<S> }>
200
+ ) {
201
+ return map.flatMap(f =>
202
+ (f.filter ? self.utils.filter(f.filter, { limit: 1 }) : self.utils.all)
203
+ .flatMap(items =>
204
+ Do($ => {
205
+ const { set } = $(Effect.service(ContextMap))
206
+ return items.map(_ => self.utils.mapReverse(_, set))
207
+ })
208
+ )
209
+ .map(_ => _.map(_ => self.utils.parse(_)))
210
+ .flatMap(_ => _.filterMap(f.collect).toNonEmptyArray.encaseInEffect(() => new NotFoundError(self.itemType, JSON.stringify(f.filter))).map(_ => _[0]))
211
+ )
212
+ }
213
+
214
+ /**
215
+ * @tsplus fluent Repository query
216
+ */
217
+ export function query<
218
+ Id extends string,
219
+ T extends { id: Id },
220
+ PM extends { id: string },
221
+ Evt,
222
+ ItemType extends string,
223
+ S,
224
+ >(
225
+ self: Repository<T, PM, Evt, Id, ItemType>,
226
+ // TODO: think about collectPM, collectE, and collect(Parsed)
227
+ map: { filter?: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }
228
+ ) {
229
+ return self.queryEffect(Effect(map))
230
+ }
231
+
232
+ /**
233
+ * @tsplus fluent Repository queryOne
234
+ */
235
+ export function queryOne<
236
+ Id extends string,
237
+ T extends { id: Id },
238
+ PM extends { id: string },
239
+ Evt,
240
+ ItemType extends string,
241
+ S,
242
+ >(
243
+ self: Repository<T, PM, Evt, Id, ItemType>,
244
+ // TODO: think about collectPM, collectE, and collect(Parsed)
245
+ map: { filter?: Filter<PM>; collect: (t: T) => Opt<S> }
246
+ ) {
247
+ return self.queryOneEffect(Effect(map))
248
+ }
249
+
250
+ /**
251
+ * @tsplus fluent Repository queryAndSavePureEffect
252
+ */
253
+ export function queryAndSavePureEffect<
254
+ Id extends string,
255
+ T extends { id: Id },
256
+ PM extends { id: string },
257
+ Evt,
258
+ ItemType extends string,
259
+ R,
260
+ E,
261
+ S extends T = T,
262
+ >(
263
+ self: Repository<T, PM, Evt, Id, ItemType>,
264
+ // TODO: think about collectPM, collectE, and collect(Parsed)
265
+ map: Effect<R, E, { filter: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }>
266
+ ) {
267
+ return <R2, A, E2, S2 extends T>(pure: Effect<FixEnv<R2, Evt, Chunk<S>, Iterable<S2>>, E2, A>) =>
268
+ queryEffect(self, map)
269
+ .flatMap(_ => self.saveManyWithPure_(_, pure))
270
+ }
271
+
272
+ /**
273
+ * @tsplus fluent Repository queryAndSavePure
274
+ */
275
+ export function queryAndSavePure<
276
+ Id extends string,
277
+ T extends { id: Id },
278
+ PM extends { id: string },
279
+ Evt,
280
+ ItemType extends string,
281
+ S extends T = T,
282
+ >(
283
+ self: Repository<T, PM, Evt, Id, ItemType>,
284
+ // TODO: think about collectPM, collectE, and collect(Parsed)
285
+ map: { filter: Filter<PM>; collect: (t: T) => Opt<S>; limit?: number; skip?: number }
286
+ ) {
287
+ return self.queryAndSavePureEffect(Effect(map))
288
+ }
289
+
290
+ /**
291
+ * @tsplus getter Repository saveManyWithPure
292
+ */
293
+ export function saveManyWithPure<
294
+ Id extends string,
295
+ T extends { id: Id },
296
+ PM extends { id: string },
297
+ Evt,
298
+ ItemType extends string
299
+ >(self: Repository<T, PM, Evt, Id, ItemType>) {
300
+ return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>) =>
301
+ (items: Iterable<S1>) => saveManyWithPure_(self, items, pure)
302
+ }
303
+
304
+ /**
305
+ * @tsplus fluent Repository byIdAndSaveWithPure
306
+ */
307
+ export function byIdAndSaveWithPure<
308
+ Id extends string,
309
+ T extends { id: Id },
310
+ PM extends { id: string },
311
+ Evt,
312
+ ItemType extends string
313
+ >(self: Repository<T, PM, Evt, Id, ItemType>, id: Id) {
314
+ return <R, A, E, S2 extends T>(pure: Effect<FixEnv<R, Evt, T, S2>, E, A>) => get(self, id).flatMap(item => saveWithPure_(self, item, pure))
315
+ }
316
+
317
+ /**
318
+ * NOTE: it's not as composable, only useful when the request is simple, and only this part needs request args.
319
+ * @tsplus getter Repository handleByIdAndSaveWithPure
320
+ */
321
+ export function handleByIdAndSaveWithPure<
322
+ Id extends string,
323
+ T extends { id: Id },
324
+ PM extends { id: string },
325
+ Evt,
326
+ ItemType extends string,
327
+ >(self: Repository<T, PM, Evt, Id, ItemType>) {
328
+ return <Req extends { id: Id }, Context, R, A, E, S2 extends T>(pure: (req: Req, ctx: Context) => Effect<FixEnv<R, Evt, T, S2>, E, A>) => (req: Req, ctx: Context) => byIdAndSaveWithPure(self, req.id)(pure(req, ctx))
329
+ }
330
+
331
+ /**
332
+ * @tsplus fluent Repository saveManyWithPure_
333
+ */
334
+ export function saveManyWithPure_<
335
+ Id extends string,
336
+ R,
337
+ T extends { id: Id },
338
+ PM extends { id: string },
339
+ A,
340
+ E,
341
+ Evt,
342
+ S1 extends T,
343
+ S2 extends T,
344
+ ItemType extends string
345
+ >(
346
+ self: Repository<T, PM, Evt, Id, ItemType>,
347
+ items: Iterable<S1>,
348
+ pure: Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>
349
+ ) {
350
+ return saveAllWithEffectInt(
351
+ self,
352
+ pure.runTerm(items.toChunk)
353
+ )
354
+ }
355
+
356
+ /**
357
+ * @tsplus fluent Repository saveWithPure_
358
+ */
359
+ export function saveWithPure_<
360
+ Id extends string,
361
+ R,
362
+ T extends { id: Id },
363
+ PM extends { id: string },
364
+ A,
365
+ E,
366
+ Evt,
367
+ S1 extends T,
368
+ S2 extends T,
369
+ ItemType extends string
370
+ >(
371
+ self: Repository<T, PM, Evt, Id, ItemType>,
372
+ item: S1,
373
+ pure: Effect<FixEnv<R, Evt, S1, S2>, E, A>
374
+ ) {
375
+ return saveAllWithEffectInt(
376
+ self,
377
+ pure.runTerm(item)
378
+ .map(([item, events, a]) => [[item], events, a])
379
+ )
380
+ }
381
+
382
+ function saveAllWithEffectInt<
383
+ Id extends string,
384
+ T extends { id: Id },
385
+ PM extends { id: string },
386
+ P extends T,
387
+ Evt,
388
+ ItemType extends string,
389
+ R,
390
+ E,
391
+ A
392
+ >(
393
+ self: Repository<T, PM, Evt, Id, ItemType>,
394
+ gen: Effect<R, E, readonly [Iterable<P>, Iterable<Evt>, A]>
395
+ ) {
396
+ return gen
397
+ .flatMap(
398
+ ([items, events, a]) =>
399
+ self.save(items, events)
400
+ .map(() => a)
401
+ )
402
+ }
403
+
404
+ const anyDSL = makeDSL<any, any, any>()
405
+
406
+ export type AllDSL<T, Evt> =
407
+ (<R, A, E, S1 extends T, S2 extends T>(pure: (dsl: PureDSL<Chunk<S1>, Iterable<S2>, Evt>) => Effect<R, E, A>) => Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>)
408
+ & AllDSLExt<T, Evt>
409
+
410
+
411
+ /**
412
+ * @tsplus type DSLExt
413
+ */
414
+ export interface AllDSLExt<T, Evt> {
415
+ modify: <R, E, A, S1 extends T, S2 extends T>(pure: (items: Chunk<S1>, dsl: PureDSL<Chunk<S1>, Iterable<S2>, Evt>) => Effect<R, E, A>) => Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, A>;
416
+ update: <R, E, S1 extends T, S2 extends T>(pure: (items: Chunk<S1>, log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<R, E, Iterable<S2>>) => Effect<FixEnv<R, Evt, Chunk<S1>, Iterable<S2>>, E, Iterable<S2>>;
417
+ }
418
+
419
+ export function makeAllDSL<T, Evt>() {
420
+ const dsl: AllDSL<T, Evt> = anyDSL
421
+ return dsl
422
+ }
423
+
424
+ export type OneDSL<T, Evt> =
425
+ (<R, A, E, S1 extends T, S2 extends T>(pure: (dsl: PureDSL<S1, S2, Evt>) => Effect<FixEnv<R, Evt, S1, S2>, E, A>) => Effect<FixEnv<R, Evt, S1, S2>, E, A>)
426
+ & OneDSLExt<T, Evt>
427
+
428
+
429
+ /**
430
+ * @tsplus type DSLExt
431
+ */
432
+ export interface OneDSLExt<T, Evt> {
433
+ modify: <R, E, A, S1 extends T, S2 extends T>(pure: (items: S1, dsl: PureDSL<S1, S2, Evt>) => Effect<FixEnv<R, Evt, S1, S2>, E, A>) => Effect<FixEnv<R, Evt, S1, S2> | PureEnvEnv<Evt, S1, S1>, E, A>;
434
+ update: <R, E, S1 extends T, S2 extends T>(pure: (items: S1, log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<FixEnv<R, Evt, S1, S2>, E, S2>) => Effect<FixEnv<R, Evt, S1, S2>, E, S2>;
435
+ }
436
+
437
+ /**
438
+ * @tsplus fluent DSLExt updateWith
439
+ */
440
+ export function updateWithOne<T, Evt, S1 extends T, S2 extends T>(self: OneDSL<T, Evt>, upd: (item: S1) => S2) {
441
+ return self.update((_: S1) => Effect(upd(_)))
442
+ }
443
+
444
+ /**
445
+ * @tsplus fluent DSLExt updateWith
446
+ */
447
+ export function updateWith<T, Evt, S1 extends T, S2 extends T>(self: AllDSL<T, Evt>, upd: (item: Chunk<S1>) => Iterable<S2>) {
448
+ return self.update((_: Chunk<S1>) => Effect(upd(_)))
449
+ }
450
+
451
+ export function makeOneDSL<T, Evt>(): OneDSL<T, Evt> {
452
+ return anyDSL
453
+ }
454
+
455
+ export function makeDSL<S1, S2, Evt>() {
456
+ const dsl: PureDSL<S1, S2, Evt> = AnyPureDSL
457
+
458
+ function modify<
459
+ R,
460
+ E,
461
+ A
462
+ >(
463
+ pure: (
464
+ items: S1,
465
+ dsl: PureDSL<S1, S2, Evt>
466
+ ) => Effect<R, E, A>
467
+ ): Effect<FixEnv<R, Evt, S1, S2>, E, A> {
468
+ return dsl.get.flatMap(items => pure(items, dsl)) as any
469
+ }
470
+
471
+ function update<
472
+ R,
473
+ E
474
+ >(
475
+ pure: (
476
+ items: S1,
477
+ log: (...evt: Evt[]) => PureLogT<Evt>
478
+ ) => Effect<R, E, S2>
479
+ ): Effect<FixEnv<R, Evt, S1, S2>, E, S2> {
480
+ return dsl.get.flatMap(items => pure(items, dsl.log).tap(dsl.set)) as any
481
+ }
482
+
483
+ function withDSL<
484
+ R,
485
+ A,
486
+ E
487
+ >(
488
+ pure: (dsl: PureDSL<S1, S2, Evt>) => Effect<R, E, A>
489
+ ): Effect<FixEnv<R, Evt, S1, S2>, E, A> {
490
+ return pure(AnyPureDSL) as any
491
+ }
492
+
493
+ return Object.assign(
494
+ withDSL, {
495
+ modify,
496
+ update,
497
+ }
498
+ )
499
+ }
500
+
501
+ export interface DSLExt<S1, S2, Evt> extends ReturnType<typeof makeDSL<S1, S2, Evt>> { }
502
+
503
+
504
+ export function ifAny<T, R, E, A>(fn: (items: NonEmptyReadonlyArray<T>) => Effect<R, E, A>) {
505
+ return (items: Iterable<T>) => Effect(items.toNonEmptyArray).flatMapOpt(fn)
506
+ }
507
+
508
+ /**
509
+ * @tsplus fluent Iterable ifAny
510
+ */
511
+ export function ifAny_<T, R, E, A>(items: Iterable<T>, fn: (items: NonEmptyReadonlyArray<T>) => Effect<R, E, A>) {
512
+ return Effect(items.toNonEmptyArray).flatMapOpt(fn)
513
+ }
@@ -0,0 +1,111 @@
1
+ import type {
2
+ OperationOptionsBase,
3
+ ProcessErrorArgs,
4
+ ServiceBusMessage,
5
+ ServiceBusMessageBatch,
6
+ ServiceBusReceivedMessage,
7
+ ServiceBusReceiver,
8
+ ServiceBusSender
9
+ } from "@azure/service-bus"
10
+ import { ServiceBusClient } from "@azure/service-bus"
11
+
12
+ function makeClient(url: string) {
13
+ return Effect(() => new ServiceBusClient(url)).acquireRelease(
14
+ client => Effect.promise(() => client.close())
15
+ )
16
+ }
17
+
18
+ const Client = Tag<ServiceBusClient>()
19
+ export const LiveServiceBusClient = (url: string) => makeClient(url).toScopedLayer(Client)
20
+
21
+ function makeSender(queueName: string) {
22
+ return Effect.gen(function*($) {
23
+ const serviceBusClient = yield* $(Client.access)
24
+
25
+ return yield* $(
26
+ Effect(() => serviceBusClient.createSender(queueName)).acquireRelease(
27
+ subscription => Effect.promise(() => subscription.close())
28
+ )
29
+ )
30
+ })
31
+ }
32
+ export const Sender = Tag<ServiceBusSender>()
33
+
34
+ export function LiveSender(queueName: string) {
35
+ return makeSender(queueName).toScopedLayer(Sender)
36
+ }
37
+
38
+ function makeReceiver(queueName: string) {
39
+ return Effect.gen(function*($) {
40
+ const serviceBusClient = yield* $(Client.access)
41
+
42
+ return yield* $(
43
+ Effect(() => serviceBusClient.createReceiver(queueName)).acquireRelease(
44
+ r => Effect.promise(() => r.close())
45
+ )
46
+ )
47
+ })
48
+ }
49
+
50
+ export const Receiver = Tag<ServiceBusReceiver>()
51
+ export function LiveReceiver(queueName: string) {
52
+ return makeReceiver(queueName).toScopedLayer(Receiver)
53
+ }
54
+
55
+ export function sendMessages(
56
+ messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
57
+ options?: OperationOptionsBase
58
+ ) {
59
+ return Effect.gen(function*($) {
60
+ const s = yield* $(Sender.access)
61
+ return yield* $(Effect.promise(() => s.sendMessages(messages, options)))
62
+ })
63
+ }
64
+
65
+ export function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
66
+ return Effect.gen(function*($) {
67
+ const r = yield* $(Receiver.access)
68
+
69
+ const env = yield* $(Effect.environment<RMsg | RErr>())
70
+
71
+ yield* $(
72
+ Effect(() =>
73
+ r.subscribe({
74
+ processError: err =>
75
+ hndlr.processError(err)
76
+ .provideEnvironment(env)
77
+ .unsafeRunPromise
78
+ .catch(console.error),
79
+ processMessage: msg =>
80
+ hndlr.processMessage(msg)
81
+ .provideEnvironment(env)
82
+ .unsafeRunPromise
83
+ // DO NOT CATCH ERRORS here as they should return to the queue!
84
+ })
85
+ ).acquireRelease(
86
+ subscription => Effect.promise(() => subscription.close())
87
+ )
88
+ )
89
+ })
90
+ }
91
+
92
+ const SubscribeTag = Tag<Effect.Success<ReturnType<typeof subscribe>>>()
93
+
94
+ export function Subscription<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
95
+ return subscribe(hndlr).toScopedLayer(SubscribeTag)
96
+ }
97
+
98
+ export interface MessageHandlers<RMsg, RErr> {
99
+ /**
100
+ * Handler that processes messages from service bus.
101
+ *
102
+ * @param message - A message received from Service Bus.
103
+ */
104
+ processMessage(message: ServiceBusReceivedMessage): Effect<RMsg, never, void>
105
+ /**
106
+ * Handler that processes errors that occur during receiving.
107
+ * @param args - The error and additional context to indicate where
108
+ * the error originated.
109
+ */
110
+ processError(args: ProcessErrorArgs): Effect<RErr, never, void>
111
+ }
@@ -0,0 +1,91 @@
1
+ import type { StoreWhereFilter, Where } from "@effect-app/infra/services/Store"
2
+ import { expect, test } from "vitest"
3
+ import { makeFilters } from "../../lib/filter.js"
4
+ import { buildWhereCosmosQuery } from "./Cosmos.js"
5
+
6
+ const f_ = makeFilters<Something>()
7
+ export type SomethingWhereFilter = typeof f_
8
+
9
+ export function makeSomethingFilter_(filter: (f: SomethingWhereFilter) => StoreWhereFilter) {
10
+ return filter(f_)
11
+ }
12
+
13
+ export function somethingsWhere(
14
+ makeWhere: (
15
+ f: SomethingWhereFilter
16
+ ) => Where | [Where, ...Where[]],
17
+ mode?: "or" | "and"
18
+ ) {
19
+ return makeSomethingFilter_(f => {
20
+ const m = makeWhere ? makeWhere(f) : []
21
+ return ({
22
+ mode,
23
+ where: (Array.isArray(m) ? m as unknown as [Where, ...Where[]] : [m]) as readonly [Where, ...Where[]]
24
+ })
25
+ })
26
+ }
27
+
28
+ type SomethingElse = {
29
+ a: string
30
+ b: number
31
+ }
32
+
33
+ type Something = {
34
+ a: number
35
+ id: string
36
+ b: string
37
+ c: readonly string[]
38
+ d: readonly SomethingElse[]
39
+ }
40
+
41
+ test("works", () => {
42
+ expect(buildWhereCosmosQuery(
43
+ somethingsWhere(_ => _("b", _ => "b2")),
44
+ "Somethings",
45
+ "importedMarkerId",
46
+ undefined,
47
+ 10
48
+ )).toEqual({
49
+ "parameters": [
50
+ {
51
+ "name": "@id",
52
+ "value": "importedMarkerId"
53
+ },
54
+ {
55
+ "name": "@v0",
56
+ "value": "b2"
57
+ }
58
+ ],
59
+ "query": `
60
+ SELECT f
61
+ FROM Somethings AS f
62
+
63
+ WHERE f.id != @id AND LOWER(f.b) = LOWER(@v0)
64
+ OFFSET 0 LIMIT 10`
65
+ })
66
+
67
+ expect(buildWhereCosmosQuery(
68
+ somethingsWhere(_ => _("d.-1.a", _ => _.$isnt("a2"))),
69
+ "Somethings",
70
+ "importedMarkerId",
71
+ undefined,
72
+ 10
73
+ )).toEqual({
74
+ "parameters": [
75
+ {
76
+ "name": "@id",
77
+ "value": "importedMarkerId"
78
+ },
79
+ {
80
+ "name": "@v0",
81
+ "value": "a2"
82
+ }
83
+ ],
84
+ "query": `
85
+ SELECT f
86
+ FROM Somethings AS f
87
+ JOIN d IN f.d
88
+ WHERE f.id != @id AND LOWER(d.a) <> LOWER(@v0)
89
+ OFFSET 0 LIMIT 10`
90
+ })
91
+ })