@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,623 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type { _E, _R } from "@effect-app/prelude/_ext/Prelude.ext"
3
+ import type { GetRequest, GetResponse } from "@effect-app/prelude/schema"
4
+ import { extractSchema, SchemaNamed } from "@effect-app/prelude/schema"
5
+ import * as MO from "@effect-app/prelude/schema"
6
+ import { pretty } from "@effect-app/prelude/utils"
7
+ import * as Ex from "@effect-app/infra-adapters/express/index"
8
+ import type {
9
+ Encode,
10
+ RequestHandler,
11
+ RequestHandlerOptRes,
12
+ RequestParsers
13
+ } from "@effect-app/infra-adapters/express/schema/requestHandler"
14
+ import { parseRequestParams } from "@effect-app/infra-adapters/express/schema/requestHandler"
15
+ import type { RouteDescriptorAny } from "@effect-app/infra-adapters/express/schema/routing"
16
+ import { makeRouteDescriptor } from "@effect-app/infra-adapters/express/schema/routing"
17
+ import type express from "express"
18
+ import type { ValidationError } from "../../errors.js"
19
+ import { RequestContext, RequestId } from "../../lib/RequestContext.js"
20
+ import type { SupportedErrors } from "./defaultErrorHandler.js"
21
+ import { defaultBasicErrorHandler } from "./defaultErrorHandler.js"
22
+ import { reportRequestError } from "./reportError.js"
23
+ import { snipString, snipValue } from "./util.js"
24
+
25
+ export function makeRequestParsers<
26
+ R,
27
+ PathA,
28
+ CookieA,
29
+ QueryA,
30
+ BodyA,
31
+ HeaderA,
32
+ ReqA extends PathA & QueryA & BodyA,
33
+ ResA,
34
+ Errors
35
+ >(
36
+ Request: RequestHandler<
37
+ R,
38
+ PathA,
39
+ CookieA,
40
+ QueryA,
41
+ BodyA,
42
+ HeaderA,
43
+ ReqA,
44
+ ResA,
45
+ Errors
46
+ >["Request"]
47
+ ): RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA> {
48
+ const ph = Effect(
49
+ Opt.fromNullable(Request.Headers)
50
+ .map(s => s)
51
+ .map(Parser.for)
52
+ .map(MO.condemnFail)
53
+ )
54
+ const parseHeaders = (u: unknown) => ph.flatMapOpt(d => d(u))
55
+
56
+ const pq = Effect(
57
+ Opt.fromNullable(Request.Query)
58
+ .map(s => s)
59
+ .map(Parser.for)
60
+ .map(MO.condemnFail)
61
+ )
62
+ const parseQuery = (u: unknown) => pq.flatMapOpt(d => d(u))
63
+
64
+ const pb = Effect(
65
+ Opt.fromNullable(Request.Body)
66
+ .map(s => s)
67
+ .map(Parser.for)
68
+ .map(MO.condemnFail)
69
+ )
70
+ const parseBody = (u: unknown) => pb.flatMapOpt(d => d(u))
71
+
72
+ const pp = Effect(
73
+ Opt.fromNullable(Request.Path)
74
+ .map(s => s)
75
+ .map(Parser.for)
76
+ .map(MO.condemnFail)
77
+ )
78
+ const parsePath = (u: unknown) => pp.flatMapOpt(d => d(u))
79
+
80
+ const pc = Effect(
81
+ Opt.fromNullable(Request.Cookie)
82
+ .map(s => s)
83
+ .map(Parser.for)
84
+ .map(MO.condemnFail)
85
+ )
86
+ const parseCookie = (u: unknown) => pc.flatMapOpt(d => d(u))
87
+
88
+ return {
89
+ parseBody,
90
+ parseCookie,
91
+ parseHeaders,
92
+ parsePath,
93
+ parseQuery
94
+ }
95
+ }
96
+
97
+ export type MakeMiddlewareContext<ResE, R2 = never, PR = never> = (
98
+ req: express.Request,
99
+ res: express.Response,
100
+ context: RequestContext
101
+ ) => Effect<R2, ResE, Context<PR>>
102
+
103
+ export type Middleware<
104
+ R,
105
+ PathA,
106
+ CookieA,
107
+ QueryA,
108
+ BodyA,
109
+ HeaderA,
110
+ ReqA extends PathA & QueryA & BodyA,
111
+ ResA,
112
+ ResE,
113
+ R2 = never,
114
+ PR = never
115
+ > = (
116
+ handler: RequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE>
117
+ ) => {
118
+ handler: typeof handler
119
+ makeContext: MakeMiddlewareContext<ResE, R2, PR>
120
+ }
121
+
122
+ export function match<
123
+ R,
124
+ E,
125
+ PathA,
126
+ CookieA,
127
+ QueryA,
128
+ BodyA,
129
+ HeaderA,
130
+ ReqA extends PathA & QueryA & BodyA,
131
+ ResA,
132
+ R2 = never,
133
+ PR = never,
134
+ RErr = never
135
+ >(
136
+ requestHandler: RequestHandler<
137
+ R,
138
+ PathA,
139
+ CookieA,
140
+ QueryA,
141
+ BodyA,
142
+ HeaderA,
143
+ ReqA,
144
+ ResA,
145
+ E
146
+ >,
147
+ errorHandler: <R>(
148
+ req: express.Request,
149
+ res: express.Response,
150
+ requestContext: RequestContext,
151
+ r2: Effect<R, E | ValidationError, void>
152
+ ) => Effect<RErr, never, void>,
153
+ middleware?: Middleware<
154
+ R,
155
+ PathA,
156
+ CookieA,
157
+ QueryA,
158
+ BodyA,
159
+ HeaderA,
160
+ ReqA,
161
+ ResA,
162
+ E,
163
+ R2,
164
+ PR
165
+ >
166
+ ) {
167
+ let makeMiddlewareContext = undefined
168
+ if (middleware) {
169
+ const { handler, makeContext } = middleware(requestHandler)
170
+ requestHandler = handler
171
+ makeMiddlewareContext = makeContext
172
+ }
173
+ return Ex.match(requestHandler.Request.method.toLowerCase() as any)(
174
+ requestHandler.Request.path.split("?")[0],
175
+ makeRequestHandler<R, E, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, R2, PR, RErr>(
176
+ requestHandler,
177
+ errorHandler,
178
+ makeMiddlewareContext
179
+ )
180
+ ).zipRight(
181
+ Effect(() =>
182
+ makeRouteDescriptor(
183
+ requestHandler.Request.path,
184
+ requestHandler.Request.method,
185
+ requestHandler
186
+ )
187
+ )
188
+ )
189
+ }
190
+
191
+ export function respondSuccess<ReqA, A, E>(
192
+ encodeResponse: (req: ReqA) => Encode<A, E>
193
+ ) {
194
+ return (req: ReqA, res: express.Response, a: A) =>
195
+ Effect(() => encodeResponse(req)(a))
196
+ .flatMap(r =>
197
+ Effect(() => {
198
+ r === undefined
199
+ ? res.status(204).send()
200
+ : res.status(200)
201
+ .send(JSON.stringify(r))
202
+ })
203
+ )
204
+ }
205
+
206
+ export function makeRequestHandler<
207
+ R,
208
+ E,
209
+ PathA,
210
+ CookieA,
211
+ QueryA,
212
+ BodyA,
213
+ HeaderA,
214
+ ReqA extends PathA & QueryA & BodyA,
215
+ ResA = void,
216
+ R2 = never,
217
+ PR = never,
218
+ RErr = never
219
+ >(
220
+ handler: RequestHandlerOptRes<
221
+ R | PR,
222
+ PathA,
223
+ CookieA,
224
+ QueryA,
225
+ BodyA,
226
+ HeaderA,
227
+ ReqA,
228
+ ResA,
229
+ E
230
+ >,
231
+ errorHandler: <R>(
232
+ req: express.Request,
233
+ res: express.Response,
234
+ requestContext: RequestContext,
235
+ r2: Effect<R, E | ValidationError, void>
236
+ ) => Effect<RErr | R, never, void>,
237
+ makeMiddlewareContext?: MakeMiddlewareContext<E, R2, PR>
238
+ ): (req: express.Request, res: express.Response) => Effect<RErr | R | R2, never, void> {
239
+ const { Request, Response, adaptResponse, h: handle } = handler
240
+ const response = Response ? extractSchema(Response as any) : Void
241
+ const encoder = Encoder.for(response)
242
+ const encodeResponse = adaptResponse
243
+ ? (req: ReqA) => Encoder.for(adaptResponse(req))
244
+ : () => encoder
245
+
246
+ const requestParsers = makeRequestParsers(Request)
247
+ const parseRequest = parseRequestParams(requestParsers)
248
+ const respond = respondSuccess(encodeResponse)
249
+
250
+ function getParams(req: express.Request) {
251
+ return Effect(() => ({
252
+ path: req.params,
253
+ query: req.query,
254
+ body: req.body,
255
+ headers: req.headers
256
+ ? Object.entries(req.headers).reduce((prev, [key, value]) => {
257
+ prev[key] = snipValue(value)
258
+ return prev
259
+ }, {} as Record<string, any>)
260
+ : req.headers,
261
+ cookies: req.cookies
262
+ ? Object.entries(req.cookies).reduce((prev, [key, value]) => {
263
+ prev[key] = typeof value === "string" || Array.isArray(value)
264
+ ? snipValue(value)
265
+ : value
266
+ return prev
267
+ }, {} as Record<string, any>)
268
+ : req.cookies
269
+ }))
270
+ }
271
+
272
+ function makeContext(req: express.Request) {
273
+ const start = new Date()
274
+ const supported = ["en", "de"] as const
275
+ const desiredLocale = req.headers["x-locale"]
276
+ const locale = desiredLocale && supported.includes(desiredLocale as any)
277
+ ? (desiredLocale as typeof supported[number])
278
+ : ("en" as const)
279
+
280
+ // const context = getAppInsightsContext()
281
+ // if (!context) {
282
+ // throw new Error("AI Context missing")
283
+ // }
284
+
285
+ const requestId = req.headers["request-id"]
286
+ const rootId = requestId ? RequestId.parseUnsafe(requestId) : RequestId.make()
287
+
288
+ const requestContext = new RequestContext({
289
+ rootId,
290
+ name: ReasonableString(
291
+ Request.Model instanceof SchemaNamed ? Request.Model.name : Request.name
292
+ ),
293
+ locale,
294
+ createdAt: start
295
+ // ...(context.operation.parentId
296
+ // ? {
297
+ // parent: new RequestContextParent({
298
+ // id: RequestId(context.operation.parentId),
299
+ // locale,
300
+ // name: ReasonableString("API Request")
301
+ // })
302
+ // }
303
+ // : {})
304
+ })
305
+ // context.requestContext = requestContext
306
+ return requestContext
307
+ }
308
+
309
+ return (req: express.Request, res: express.Response) => {
310
+ return Effect.struct({
311
+ requestContext: Effect(() => {
312
+ const requestContext = makeContext(req)
313
+ if (req.method === "GET") {
314
+ res.setHeader("Cache-Control", "no-store")
315
+ }
316
+ res.setHeader("Content-Language", requestContext.locale)
317
+ return requestContext
318
+ }),
319
+ pars: getParams(req)
320
+ })
321
+ .flatMap(({ pars, requestContext }) =>
322
+ Effect.logInfo("Processing request").apply(Effect.logAnnotates({
323
+ method: req.method,
324
+ path: req.originalUrl,
325
+ reqPath: pars.path.$$.pretty,
326
+ reqQuery: pars.query.$$.pretty,
327
+ reqBody: pretty(pars.body),
328
+ reqCookies: pretty(pars.cookies),
329
+ reqHeaders: pars.headers.$$.pretty
330
+ })).zipRight(
331
+ Effect.suspendSucceed(() => {
332
+ const handleRequest = parseRequest(req)
333
+ .map(({ body, path, query }) => {
334
+ const hn = {
335
+ ...body.value,
336
+ ...query.value,
337
+ ...path.value
338
+ } as unknown as ReqA
339
+ return hn
340
+ })
341
+ .flatMap(parsedReq =>
342
+ handle(parsedReq as any)
343
+ .flatMap(r => respond(parsedReq, res, r))
344
+ )
345
+ // Commands should not be interruptable.
346
+ const r = (
347
+ req.method !== "GET" ? handleRequest.uninterruptible : handleRequest
348
+ ) // .instrument("Performance.RequestResponse")
349
+ // the first log entry should be of the request start.
350
+ const r2 = makeMiddlewareContext
351
+ ? r.provideSomeEnvironmentEffect(makeMiddlewareContext(req, res, requestContext))
352
+ : // PR is not relevant here
353
+ r as Effect<R, E | ValidationError, void>
354
+ return errorHandler(
355
+ req,
356
+ res,
357
+ requestContext,
358
+ r2
359
+ )
360
+ })
361
+ )
362
+ .tapErrorCause(cause =>
363
+ Effect.suspendSucceed(() => {
364
+ res.status(500).send()
365
+ return reportRequestError(cause, {
366
+ requestContext,
367
+ path: req.originalUrl,
368
+ method: req.method
369
+ })
370
+ }).zipRight(
371
+ Effect.suspendSucceed(() => {
372
+ const headers = res.getHeaders()
373
+ return Effect.logErrorCauseMessage(
374
+ "Processed request",
375
+ cause
376
+ ).apply(Effect.logAnnotates({
377
+ method: req.method,
378
+ path: req.originalUrl,
379
+ statusCode: res.statusCode.toString(),
380
+ resHeaders: Object.entries(headers).reduce((prev, [key, value]) => {
381
+ prev[key] = value && typeof value === "string" ? snipString(value) : value
382
+ return prev
383
+ }, {} as Record<string, any>)
384
+ .$$.pretty
385
+ }))
386
+ })
387
+ )
388
+ .tapErrorCause(cause => Effect(() => console.error("Error occurred while reporting error", cause)))
389
+ )
390
+ .tap(() =>
391
+ Effect.suspendSucceed(() => {
392
+ const headers = res.getHeaders()
393
+ return Effect.logInfo("Processed request").apply(Effect.logAnnotates({
394
+ method: req.method,
395
+ path: req.originalUrl,
396
+ statusCode: res.statusCode.toString(),
397
+ resHeaders: Object.entries(headers).reduce((prev, [key, value]) => {
398
+ prev[key] = value && typeof value === "string" ? snipString(value) : value
399
+ return prev
400
+ }, {} as Record<string, any>)
401
+ .$$.pretty
402
+ }))
403
+ })
404
+ )
405
+ .provideService(RequestContext.Tag, requestContext) // otherwise external error reporter breaks.
406
+ .setupRequest(requestContext)
407
+ )
408
+ }
409
+ }
410
+
411
+ export type RequestHandlers = { [key: string]: BasicRequestHandler }
412
+ export type BasicRequestHandler = RequestHandler<any, any, any, any, any, any, any, any, ValidationError>
413
+
414
+ export type AnyRequestHandler = RequestHandler<any, any, any, any, any, any, any, any, any>
415
+
416
+ type RouteAll<T extends RequestHandlers> = {
417
+ [K in keyof T]: T[K] extends RequestHandler<
418
+ infer R,
419
+ any, // infer PathA,
420
+ any, // infer CookieA,
421
+ any, // infer QueryA,
422
+ any, // infer BodyA,
423
+ any, // infer HeaderA,
424
+ any, // infer ReqA,
425
+ any, // infer ResA,
426
+ ValidationError // infer ResE
427
+ > ? RouteMatch<R, never>
428
+ : never
429
+ }
430
+
431
+ export type RouteMatch<
432
+ R,
433
+ // PathA,
434
+ // CookieA,
435
+ // QueryA,
436
+ // BodyA,
437
+ // HeaderA,
438
+ // ReqA extends PathA & QueryA & BodyA,
439
+ // ResA,
440
+ PR = never
441
+ > = Effect<
442
+ | Ex.ExpressAppConfig
443
+ | Ex.ExpressApp
444
+ | Exclude<
445
+ R,
446
+ PR
447
+ >,
448
+ never,
449
+ RouteDescriptorAny // RouteDescriptor<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, SupportedErrors, Methods>
450
+ >
451
+
452
+ /**
453
+ * Gather all handlers of a module and attach them to the Server.
454
+ * Requires no login.
455
+ */
456
+ export function matchAll<T extends RequestHandlers>(handlers: T) {
457
+ const mapped = handlers.$$.keys.reduce((prev, cur) => {
458
+ prev[cur] = match(handlers[cur] as AnyRequestHandler, defaultBasicErrorHandler)
459
+ return prev
460
+ }, {} as any) as RouteAll<typeof handlers>
461
+
462
+ return mapped
463
+ }
464
+
465
+ /**
466
+ * Gather all handlers of a module and attach them to the Server.
467
+ * Requires no login.
468
+ */
469
+ export function matchAllAlt<T extends RequestHandlersTest>(handlers: T) {
470
+ const mapped = handlers.$$.keys.reduce((prev, cur) => {
471
+ const matches = matchAll(handlers[cur])
472
+ matches.$$.keys.forEach(key => prev[`${cur as string}.${key as string}`] = matches[key])
473
+ return prev
474
+ }, {} as any) as Flatten<RouteAllTest<typeof handlers>>
475
+
476
+ return mapped
477
+ }
478
+
479
+ export type RequestHandlersTest = {
480
+ [key: string]: Record<string, BasicRequestHandler>
481
+ }
482
+
483
+ export type RouteAllTest<T extends RequestHandlersTest> = {
484
+ [K in keyof T]: RouteAll<T[K]>
485
+ }
486
+
487
+ // type JoinObjects<T extends Record<string, Record<string, any>> = { [`${K in keyof T }`]: RouteAll<T[K]> }
488
+
489
+ export type Flatten<T extends object> = object extends T ? object : {
490
+ [K in keyof T]-?: (
491
+ x: NonNullable<T[K]> extends infer V ? V extends object ? V extends readonly any[] ? Pick<T, K>
492
+ : FlattenLVL1<V> extends infer FV ? ({
493
+ [P in keyof FV as `${Extract<K, string | number>}.${Extract<P, string | number>}`]: FV[P]
494
+ })
495
+ : never
496
+ : Pick<T, K>
497
+ : never
498
+ ) => void
499
+ } extends Record<keyof T, (y: infer O) => void> ? O extends unknown /* infer U */ ? { [K in keyof O]: O[K] } : never
500
+ : never
501
+
502
+ type FlattenLVL1<T extends object> = object extends T ? object : {
503
+ [K in keyof T]-?: (
504
+ x: NonNullable<T[K]> extends infer V ? V extends object ? V extends readonly any[] ? Pick<T, K>
505
+ : /*: Flatten<V> extends infer FV ? ({
506
+ [P in keyof FV as `${Extract<K, string | number>}.${Extract<P, string | number>}`]: FV[P]
507
+ })
508
+ : never
509
+ */ Pick<T, K>
510
+ : never
511
+ : never
512
+ ) => void
513
+ } extends Record<keyof T, (y: infer O) => void> ? O extends unknown /* infer U */ ? { [K in keyof O]: O[K] } : never
514
+ : never
515
+
516
+ export function handle<
517
+ TModule extends Record<
518
+ string,
519
+ any // { Model: MO.SchemaAny; new (...args: any[]): any } | MO.SchemaAny
520
+ >
521
+ >(
522
+ _: TModule & { ResponseOpenApi?: any },
523
+ adaptResponse?: any
524
+ ) {
525
+ // TODO: Prevent over providing // no strict/shrink yet.
526
+ const Request = MO.extractRequest(_)
527
+ const Response = MO.extractResponse(_)
528
+
529
+ type ReqSchema = MO.GetRequest<TModule>
530
+ type ResSchema = MO.GetResponse<TModule>
531
+ type Req = InstanceType<
532
+ ReqSchema extends { new(...args: any[]): any } ? ReqSchema
533
+ : never
534
+ >
535
+ type Res = MO.ParsedShapeOf<Extr<ResSchema>>
536
+
537
+ return <R, E>(
538
+ h: (r: Req) => Effect<R, E, Res>
539
+ ) => ({
540
+ adaptResponse,
541
+ h,
542
+ Request,
543
+ Response,
544
+ ResponseOpenApi: _.ResponseOpenApi ?? Response
545
+ } as ReqHandler<
546
+ Req,
547
+ R,
548
+ E,
549
+ Res,
550
+ ReqSchema,
551
+ ResSchema
552
+ >)
553
+ }
554
+
555
+ export type Extr<T> = T extends { Model: MO.SchemaAny } ? T["Model"]
556
+ : T extends MO.SchemaAny ? T
557
+ : never
558
+
559
+ export interface ReqHandler<
560
+ Req,
561
+ R,
562
+ E,
563
+ Res,
564
+ ReqSchema extends MO.SchemaAny,
565
+ ResSchema extends MO.SchemaAny,
566
+ CTX = any
567
+ > {
568
+ h: (r: Req, ctx: CTX) => Effect<R, E, Res>
569
+ Request: ReqSchema
570
+ Response: ResSchema
571
+ ResponseOpenApi: any
572
+ }
573
+
574
+ /**
575
+ * Provided a module with resources, and provided an Object with resource handlers, will prepare route handlers to be attached to server.
576
+ * @param mod The module with Resources you want to match.
577
+ * @returns A function that must be called with an Object with a handler "Request -> Effect<R, E, Response>" for each resource defined in the Module.
578
+ *
579
+ * Example:
580
+ * ```
581
+ * class SayHelloRequest extends Get("/say-hello")<SayHelloRequest>()({ name: prop(ReasonableString) }) {}
582
+ * class SayHelloResponse extends Model<SayHelloRequest>()({ message: prop(LongString) }) {}
583
+ *
584
+ * export const SayHelloControllers = matchResource({ SayHello: { SayHelloRequest, SayHelloResponse } })({
585
+ * SayHello: (req) => Effect({ message: `Hi ${req.name}` })
586
+ * })
587
+ * ```
588
+ */
589
+ export function matchResource<TModules extends Record<string, Record<string, any>>>(mod: TModules) {
590
+ type Keys = keyof TModules
591
+ return <
592
+ THandlers extends {
593
+ [K in Keys]: (
594
+ req: ReqFromSchema<GetRequest<TModules[K]>>
595
+ ) => Effect<any, SupportedErrors, ResFromSchema<GetResponse<TModules[K]>>>
596
+ }
597
+ >(
598
+ handlers: THandlers
599
+ ) => {
600
+ const handler = mod.$$.keys.reduce((prev, cur) => {
601
+ prev[cur] = handle(mod[cur])(handlers[cur] as any)
602
+ return prev
603
+ }, {} as any)
604
+ type HNDLRS = typeof handlers
605
+ return handler as {
606
+ [K in Keys]: ReqHandler<
607
+ ReqFromSchema<GetRequest<TModules[K]>>,
608
+ _R<ReturnType<HNDLRS[K]>>,
609
+ _E<ReturnType<HNDLRS[K]>>,
610
+ ResFromSchema<GetResponse<TModules[K]>>,
611
+ GetRequest<TModules[K]>,
612
+ GetResponse<TModules[K]>
613
+ >
614
+ }
615
+ }
616
+ }
617
+
618
+ export type ReqFromSchema<ReqSchema> = InstanceType<
619
+ ReqSchema extends { new(...args: any[]): any } ? ReqSchema
620
+ : never
621
+ >
622
+
623
+ export type ResFromSchema<ResSchema> = ParsedShapeOf<Extr<ResSchema>>
@@ -0,0 +1,22 @@
1
+ import { RequestContext } from "../RequestContext.js"
2
+
3
+ /**
4
+ * @tsplus fluent effect/io/Effect setupRequest
5
+ */
6
+ export function setupRequest<R, E, A>(self: Effect<R, E, A>, requestContext: RequestContext) {
7
+ return pipe(
8
+ self.withSpan("request"),
9
+ Effect.logAnnotates({
10
+ requestRootId: requestContext.rootId,
11
+ requestId: requestContext.id,
12
+ requestName: requestContext.name
13
+ })
14
+ )
15
+ }
16
+
17
+ /**
18
+ * @tsplus getter effect/io/Effect setupRequestFrom
19
+ */
20
+ export function setupRequestFrom<R, E, A>(self: Effect<R, E, A>) {
21
+ return RequestContext.Tag.accessWithEffect(requestContext => self.setupRequest(requestContext))
22
+ }
@@ -0,0 +1,14 @@
1
+ export function snipValue(value: string | readonly string[] | undefined) {
2
+ if (!value) {
3
+ return value
4
+ }
5
+ return Array.isArray(value)
6
+ ? value.map(snipString)
7
+ : typeof value === "string" && value.length > 50
8
+ ? snipString(value)
9
+ : value
10
+ }
11
+
12
+ export function snipString(value: string) {
13
+ return value.length > 255 ? value.slice(0, 255) + "...snip" : value
14
+ }
@@ -0,0 +1,26 @@
1
+ import { makeOpenApiSpecs } from "@effect-app/infra-adapters/express/makeOpenApiSpecs"
2
+ import type { RouteDescriptorAny } from "@effect-app/infra-adapters/express/schema/routing"
3
+ import * as Plutus from "@effect-app/infra-adapters/Openapi/atlas-plutus"
4
+ import { writeTextFile } from "@effect-app/infra-adapters/simpledb/fileutil"
5
+
6
+ import { typedValuesOf } from "@effect-app/core/utils"
7
+
8
+ export function writeOpenapiDocs(rdescs: Record<string, Record<string, RouteDescriptorAny>>) {
9
+ return makeOpenApiSpecs(
10
+ typedValuesOf(rdescs).reduce((prev, cur) => prev.concat(typedValuesOf(cur)), [] as readonly RouteDescriptorAny[])
11
+ .sortWith(Ord.string.contramap((a: RouteDescriptorAny) => a.path)),
12
+ Plutus.info({
13
+ title: "api",
14
+ version: "X",
15
+ pageTitle: "api"
16
+ })
17
+ )
18
+ .map(_ => ({
19
+ ..._,
20
+ tags: [
21
+ // add the tags here
22
+ ]
23
+ }))
24
+ .flatMap(_ => writeTextFile("./openapi.json", JSON.stringify(_, undefined, 2)).orDie)
25
+ .flatMap(() => Effect.logInfo("OpenAPI spec written to './openapi.json'"))
26
+ }