stratal 0.0.21 → 0.0.23

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 (296) hide show
  1. package/README.md +2 -2
  2. package/dist/bin/cloudflare-workers-loader.mjs +80 -7
  3. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  4. package/dist/bin/quarry.mjs +84 -160
  5. package/dist/bin/quarry.mjs.map +1 -1
  6. package/dist/cache/index.d.mts +8 -46
  7. package/dist/cache/index.d.mts.map +1 -1
  8. package/dist/cache/index.mjs +134 -97
  9. package/dist/cache/index.mjs.map +1 -1
  10. package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-uElmBtdS.d.mts} +29 -39
  11. package/dist/cache.service-uElmBtdS.d.mts.map +1 -0
  12. package/dist/{command-BgSlsS4M.mjs → command-BvmUAPPQ.mjs} +15 -4
  13. package/dist/command-BvmUAPPQ.mjs.map +1 -0
  14. package/dist/{command-Cmmf0oHX.d.mts → command-CPhFHjG3.d.mts} +3 -2
  15. package/dist/command-CPhFHjG3.d.mts.map +1 -0
  16. package/dist/command-not-found.error-ONAZ2Bpk.mjs +14 -0
  17. package/dist/command-not-found.error-ONAZ2Bpk.mjs.map +1 -0
  18. package/dist/config/index.d.mts +24 -11
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +32 -57
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-D3iMTSdy.d.mts} +54 -22
  23. package/dist/consumer-registry-D3iMTSdy.d.mts.map +1 -0
  24. package/dist/container-storage-BmOJ4_Na.mjs +52 -0
  25. package/dist/container-storage-BmOJ4_Na.mjs.map +1 -0
  26. package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-C5UVeJS3.mjs} +8 -8
  27. package/dist/controller.decorator-C5UVeJS3.mjs.map +1 -0
  28. package/dist/cron/index.d.mts +103 -7
  29. package/dist/cron/index.d.mts.map +1 -1
  30. package/dist/cron/index.mjs +2 -2
  31. package/dist/cron-job-NesZRk8F.d.mts +58 -0
  32. package/dist/cron-job-NesZRk8F.d.mts.map +1 -0
  33. package/dist/{cron-manager-DQSK8uoV.mjs → cron.module-Bgzq5hiT.mjs} +47 -17
  34. package/dist/cron.module-Bgzq5hiT.mjs.map +1 -0
  35. package/dist/decorate-CuAoSZvs.mjs +16 -0
  36. package/dist/deep-merge-ByiAOZ3r.mjs +18 -0
  37. package/dist/deep-merge-ByiAOZ3r.mjs.map +1 -0
  38. package/dist/di/index.d.mts +2 -2
  39. package/dist/di/index.mjs +4 -3
  40. package/dist/di-DseMn-z9.mjs +524 -0
  41. package/dist/di-DseMn-z9.mjs.map +1 -0
  42. package/dist/email/index.d.mts +40 -122
  43. package/dist/email/index.d.mts.map +1 -1
  44. package/dist/email/index.mjs +446 -131
  45. package/dist/email/index.mjs.map +1 -1
  46. package/dist/en-CDZBMcc1.mjs +202 -0
  47. package/dist/en-CDZBMcc1.mjs.map +1 -0
  48. package/dist/{env-D1rcZ8_r.d.mts → env-ug22bJj7.d.mts} +1 -1
  49. package/dist/env-ug22bJj7.d.mts.map +1 -0
  50. package/dist/errors/index.d.mts +2 -2
  51. package/dist/errors/index.mjs +4 -2
  52. package/dist/errors-mXYxG0XB.mjs +333 -0
  53. package/dist/errors-mXYxG0XB.mjs.map +1 -0
  54. package/dist/events/index.d.mts +14 -3
  55. package/dist/events/index.d.mts.map +1 -1
  56. package/dist/events/index.mjs +2 -2
  57. package/dist/{events-CzCV8jI8.mjs → events-BXJGZjpG.mjs} +23 -13
  58. package/dist/events-BXJGZjpG.mjs.map +1 -0
  59. package/dist/exception-context-kEoMFwze.mjs +429 -0
  60. package/dist/exception-context-kEoMFwze.mjs.map +1 -0
  61. package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-TMu_AlJt.mjs} +38 -31
  62. package/dist/gateway-context-TMu_AlJt.mjs.map +1 -0
  63. package/dist/guards/index.d.mts +3 -3
  64. package/dist/guards/index.d.mts.map +1 -1
  65. package/dist/guards/index.mjs +1 -1
  66. package/dist/{guards-DU1_J9YA.mjs → guards-DALPXy3_.mjs} +6 -5
  67. package/dist/guards-DALPXy3_.mjs.map +1 -0
  68. package/dist/hono-app-CvV3hOfT.mjs +161 -0
  69. package/dist/hono-app-CvV3hOfT.mjs.map +1 -0
  70. package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-ByWZb9DO.mjs} +7 -6
  71. package/dist/http-method.decorator-ByWZb9DO.mjs.map +1 -0
  72. package/dist/i18n/index.d.mts +238 -3
  73. package/dist/i18n/index.d.mts.map +1 -0
  74. package/dist/i18n/index.mjs +39 -3
  75. package/dist/i18n/index.mjs.map +1 -0
  76. package/dist/i18n/messages/en/index.d.mts +2 -2
  77. package/dist/i18n/messages/en/index.mjs +2 -2
  78. package/dist/i18n/utils/index.d.mts +4 -26
  79. package/dist/i18n/utils/index.d.mts.map +1 -1
  80. package/dist/i18n/utils/index.mjs +2 -2
  81. package/dist/i18n/validation/index.d.mts +3 -2
  82. package/dist/i18n/validation/index.mjs +4 -2
  83. package/dist/i18n.module-DRQAZoSZ.mjs +222 -0
  84. package/dist/i18n.module-DRQAZoSZ.mjs.map +1 -0
  85. package/dist/i18n.tokens-CZ_v8oyS.mjs +19 -0
  86. package/dist/i18n.tokens-CZ_v8oyS.mjs.map +1 -0
  87. package/dist/{index-7-hU3GTV.d.mts → index-0ItCjaqw.d.mts} +1 -1
  88. package/dist/index-0ItCjaqw.d.mts.map +1 -0
  89. package/dist/index-B5JBRcWD.d.mts +544 -0
  90. package/dist/index-B5JBRcWD.d.mts.map +1 -0
  91. package/dist/index-BUt92sAE.d.mts +124 -0
  92. package/dist/index-BUt92sAE.d.mts.map +1 -0
  93. package/dist/{index-ByOyTmqf.d.mts → index-B_JoEl3V.d.mts} +751 -2229
  94. package/dist/index-B_JoEl3V.d.mts.map +1 -0
  95. package/dist/index-DtBNIFuP.d.mts +42 -0
  96. package/dist/index-DtBNIFuP.d.mts.map +1 -0
  97. package/dist/{index-C1KvMncZ.d.mts → index-HgOLNruQ.d.mts} +3 -108
  98. package/dist/index-HgOLNruQ.d.mts.map +1 -0
  99. package/dist/index.d.mts +6 -43
  100. package/dist/index.mjs +3 -2
  101. package/dist/{is-command-C6a7WTPw.mjs → is-command-CEPO9n8c.mjs} +2 -2
  102. package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CEPO9n8c.mjs.map} +1 -1
  103. package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-Gvh_AM71.mjs} +1 -1
  104. package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-Gvh_AM71.mjs.map} +1 -1
  105. package/dist/lazy-module-loader-Ib383jH_.d.mts +60 -0
  106. package/dist/lazy-module-loader-Ib383jH_.d.mts.map +1 -0
  107. package/dist/locale-path.service-D-dHiIPc.mjs +165 -0
  108. package/dist/locale-path.service-D-dHiIPc.mjs.map +1 -0
  109. package/dist/locale-url-nZrZxqJP.mjs +44 -0
  110. package/dist/locale-url-nZrZxqJP.mjs.map +1 -0
  111. package/dist/locale-url.service-C2EWmGdq.mjs +41 -0
  112. package/dist/locale-url.service-C2EWmGdq.mjs.map +1 -0
  113. package/dist/logger/index.d.mts +2 -2
  114. package/dist/logger/index.mjs +170 -2
  115. package/dist/logger/index.mjs.map +1 -0
  116. package/dist/macroable/index.d.mts +2 -2
  117. package/dist/macroable/index.mjs +1 -1
  118. package/dist/{macroable-BmufBshB.mjs → macroable-cvDTFZ_A.mjs} +1 -1
  119. package/dist/{macroable-BmufBshB.mjs.map → macroable-cvDTFZ_A.mjs.map} +1 -1
  120. package/dist/metadata-DzzprcID.mjs +39 -0
  121. package/dist/metadata-DzzprcID.mjs.map +1 -0
  122. package/dist/module/index.d.mts +7 -24
  123. package/dist/module/index.d.mts.map +1 -1
  124. package/dist/module/index.mjs +10 -2
  125. package/dist/module/index.mjs.map +1 -0
  126. package/dist/module-registry-Dm-pqHd3.mjs +554 -0
  127. package/dist/module-registry-Dm-pqHd3.mjs.map +1 -0
  128. package/dist/module.decorator-CYHY6pG5.mjs +19 -0
  129. package/dist/module.decorator-CYHY6pG5.mjs.map +1 -0
  130. package/dist/openapi/index.d.mts +44 -8
  131. package/dist/openapi/index.d.mts.map +1 -1
  132. package/dist/openapi/index.mjs +3 -3
  133. package/dist/openapi-CstuTM8S.mjs +309 -0
  134. package/dist/openapi-CstuTM8S.mjs.map +1 -0
  135. package/dist/{openapi-tools.service-Zs-Ewv7F.mjs → openapi-tools.service-BC5EC3R3.mjs} +8 -2
  136. package/dist/openapi-tools.service-BC5EC3R3.mjs.map +1 -0
  137. package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-YhTiJ1bO.d.mts} +3 -3
  138. package/dist/openapi.service-YhTiJ1bO.d.mts.map +1 -0
  139. package/dist/quarry/index.d.mts +14 -163
  140. package/dist/quarry/index.d.mts.map +1 -1
  141. package/dist/quarry/index.mjs +6 -5
  142. package/dist/quarry/runner.d.mts +184 -0
  143. package/dist/quarry/runner.d.mts.map +1 -0
  144. package/dist/quarry/runner.mjs +945 -0
  145. package/dist/quarry/runner.mjs.map +1 -0
  146. package/dist/quarry-registry-CXg0RFXq.d.mts +69 -0
  147. package/dist/quarry-registry-CXg0RFXq.d.mts.map +1 -0
  148. package/dist/quarry.module-BuRPGMDm.mjs +312 -0
  149. package/dist/quarry.module-BuRPGMDm.mjs.map +1 -0
  150. package/dist/queue/index.d.mts +3 -3
  151. package/dist/queue/index.mjs +57 -48
  152. package/dist/queue/index.mjs.map +1 -1
  153. package/dist/queue.module-nddvxzCB.mjs +613 -0
  154. package/dist/queue.module-nddvxzCB.mjs.map +1 -0
  155. package/dist/queue.tokens-DjHnFmre.mjs +11 -0
  156. package/dist/queue.tokens-DjHnFmre.mjs.map +1 -0
  157. package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-DCxQt9dD.mjs} +6 -6
  158. package/dist/r2-storage.provider-DCxQt9dD.mjs.map +1 -0
  159. package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-BPAie_p3.mjs} +6 -11
  160. package/dist/rate-limit.decorator-BPAie_p3.mjs.map +1 -0
  161. package/dist/rate-limiter/index.d.mts +11 -50
  162. package/dist/rate-limiter/index.d.mts.map +1 -1
  163. package/dist/rate-limiter/index.mjs +33 -42
  164. package/dist/rate-limiter/index.mjs.map +1 -1
  165. package/dist/route-name-DGoBOfPg.mjs +171 -0
  166. package/dist/route-name-DGoBOfPg.mjs.map +1 -0
  167. package/dist/route-registration.service-D6vSwiKP.mjs +918 -0
  168. package/dist/route-registration.service-D6vSwiKP.mjs.map +1 -0
  169. package/dist/route-registry-CYqLp2Nj.mjs +123 -0
  170. package/dist/route-registry-CYqLp2Nj.mjs.map +1 -0
  171. package/dist/router/index.d.mts +2 -2
  172. package/dist/router/index.mjs +18 -7
  173. package/dist/router-CWGBD-Bg.mjs +78 -0
  174. package/dist/router-CWGBD-Bg.mjs.map +1 -0
  175. package/dist/router-resolver-D4YlPNlm.mjs +88 -0
  176. package/dist/router-resolver-D4YlPNlm.mjs.map +1 -0
  177. package/dist/seeder/index.d.mts +16 -11
  178. package/dist/seeder/index.d.mts.map +1 -1
  179. package/dist/seeder/index.mjs +5 -3
  180. package/dist/seeder-7ubkms-Y.mjs +81 -0
  181. package/dist/seeder-7ubkms-Y.mjs.map +1 -0
  182. package/dist/seeder-registry-CyUmKsJq.mjs +57 -0
  183. package/dist/seeder-registry-CyUmKsJq.mjs.map +1 -0
  184. package/dist/seeder.module-CYYwk3Qk.mjs +15 -0
  185. package/dist/seeder.module-CYYwk3Qk.mjs.map +1 -0
  186. package/dist/{signed-url-BQPbv2In.mjs → signed-url-DIU0sK_6.mjs} +1 -1
  187. package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-DIU0sK_6.mjs.map} +1 -1
  188. package/dist/storage/index.d.mts +15 -39
  189. package/dist/storage/index.d.mts.map +1 -1
  190. package/dist/storage/index.mjs +3 -3
  191. package/dist/storage/providers/index.d.mts +2 -2
  192. package/dist/storage/providers/index.d.mts.map +1 -1
  193. package/dist/storage/providers/index.mjs +1 -1
  194. package/dist/{storage-D8CBP72Z.mjs → storage-MDZypIE9.mjs} +66 -59
  195. package/dist/storage-MDZypIE9.mjs.map +1 -0
  196. package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-ClUwxz4S.d.mts} +2 -3
  197. package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +1 -0
  198. package/dist/storage.error-Dnib4VHc.mjs +8 -0
  199. package/dist/storage.error-Dnib4VHc.mjs.map +1 -0
  200. package/dist/stratal-DL9M38_s.mjs +383 -0
  201. package/dist/stratal-DL9M38_s.mjs.map +1 -0
  202. package/dist/stratal-DwDJPY9N.d.mts +43 -0
  203. package/dist/stratal-DwDJPY9N.d.mts.map +1 -0
  204. package/dist/tiered-cache.service-Dv3BhxxE.d.mts +79 -0
  205. package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +1 -0
  206. package/dist/trailing-slash-CFyw8nYu.mjs +34 -0
  207. package/dist/trailing-slash-CFyw8nYu.mjs.map +1 -0
  208. package/dist/{types-cySNS_lp.d.mts → types-CmV_9xBD.d.mts} +1 -1
  209. package/dist/types-CmV_9xBD.d.mts.map +1 -0
  210. package/dist/uri-h7Q8Jug9.mjs +251 -0
  211. package/dist/uri-h7Q8Jug9.mjs.map +1 -0
  212. package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DAWYasuP.mjs} +7 -4
  213. package/dist/usage-generator-DAWYasuP.mjs.map +1 -0
  214. package/dist/validation-CpOjviyT.mjs +49 -0
  215. package/dist/validation-CpOjviyT.mjs.map +1 -0
  216. package/dist/validation.context-CRvmrhq7.mjs +117 -0
  217. package/dist/validation.context-CRvmrhq7.mjs.map +1 -0
  218. package/dist/versioning.service-C6aHky8-.mjs +36 -0
  219. package/dist/versioning.service-C6aHky8-.mjs.map +1 -0
  220. package/dist/websocket/index.d.mts +16 -14
  221. package/dist/websocket/index.d.mts.map +1 -1
  222. package/dist/websocket/index.mjs +2 -2
  223. package/dist/workers/index.d.mts +2 -2
  224. package/dist/workers/index.d.mts.map +1 -1
  225. package/dist/workers/index.mjs +3 -2
  226. package/dist/workers/index.mjs.map +1 -1
  227. package/dist/zod-eKqqhZ5_.mjs +72 -0
  228. package/dist/zod-eKqqhZ5_.mjs.map +1 -0
  229. package/dist/{index-Bnpfq6uk.d.mts → zod-wecrEVAs.d.mts} +63 -133
  230. package/dist/zod-wecrEVAs.d.mts.map +1 -0
  231. package/package.json +28 -39
  232. package/dist/base-email.provider-CfQCA08m.mjs +0 -42
  233. package/dist/base-email.provider-CfQCA08m.mjs.map +0 -1
  234. package/dist/cache.service-DsnKuNyO.d.mts.map +0 -1
  235. package/dist/cache.tokens-B7Rw1C9Q.mjs +0 -6
  236. package/dist/cache.tokens-B7Rw1C9Q.mjs.map +0 -1
  237. package/dist/colors-DJaRDXoS.mjs +0 -16
  238. package/dist/colors-DJaRDXoS.mjs.map +0 -1
  239. package/dist/command-BgSlsS4M.mjs.map +0 -1
  240. package/dist/command-Cmmf0oHX.d.mts.map +0 -1
  241. package/dist/consumer-registry-B7yUNh0q.d.mts.map +0 -1
  242. package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
  243. package/dist/cron-manager-CmTimEjf.d.mts +0 -131
  244. package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
  245. package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
  246. package/dist/en-DSH_bhh6.mjs +0 -308
  247. package/dist/en-DSH_bhh6.mjs.map +0 -1
  248. package/dist/env-D1rcZ8_r.d.mts.map +0 -1
  249. package/dist/errors-COW9-Mar.mjs +0 -1739
  250. package/dist/errors-COW9-Mar.mjs.map +0 -1
  251. package/dist/errors-ORxu1-Bb.mjs +0 -74
  252. package/dist/errors-ORxu1-Bb.mjs.map +0 -1
  253. package/dist/events-CzCV8jI8.mjs.map +0 -1
  254. package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
  255. package/dist/guards-DU1_J9YA.mjs.map +0 -1
  256. package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
  257. package/dist/i18n.module-CzXLW9Hy.mjs +0 -2532
  258. package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
  259. package/dist/index-7-hU3GTV.d.mts.map +0 -1
  260. package/dist/index-Bnpfq6uk.d.mts.map +0 -1
  261. package/dist/index-ByOyTmqf.d.mts.map +0 -1
  262. package/dist/index-C1KvMncZ.d.mts.map +0 -1
  263. package/dist/index-DBd_2wv8.d.mts +0 -263
  264. package/dist/index-DBd_2wv8.d.mts.map +0 -1
  265. package/dist/index-DUzWs0z7.d.mts +0 -494
  266. package/dist/index-DUzWs0z7.d.mts.map +0 -1
  267. package/dist/index.d.mts.map +0 -1
  268. package/dist/logger-DlV7NtvD.mjs +0 -440
  269. package/dist/logger-DlV7NtvD.mjs.map +0 -1
  270. package/dist/module-BzLg57FK.mjs +0 -866
  271. package/dist/module-BzLg57FK.mjs.map +0 -1
  272. package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
  273. package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
  274. package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
  275. package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
  276. package/dist/queue.module-BhCjZp6H.mjs +0 -409
  277. package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
  278. package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
  279. package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
  280. package/dist/resend.provider-DB4IlFjG.mjs +0 -68
  281. package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
  282. package/dist/seeder-zoEfEw9i.mjs +0 -138
  283. package/dist/seeder-zoEfEw9i.mjs.map +0 -1
  284. package/dist/setup-CefZKV_e.mjs +0 -37
  285. package/dist/setup-CefZKV_e.mjs.map +0 -1
  286. package/dist/smtp.provider-B6D7zuWX.mjs +0 -76
  287. package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
  288. package/dist/storage-D8CBP72Z.mjs.map +0 -1
  289. package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
  290. package/dist/stratal-CNwpbSZl.mjs +0 -535
  291. package/dist/stratal-CNwpbSZl.mjs.map +0 -1
  292. package/dist/types-cySNS_lp.d.mts.map +0 -1
  293. package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
  294. package/dist/validation-DtJwAv7O.mjs +0 -248
  295. package/dist/validation-DtJwAv7O.mjs.map +0 -1
  296. /package/dist/{chunk-D1SwGrFN.mjs → chunk-BBjsoOtd.mjs} +0 -0
@@ -1,866 +0,0 @@
1
- import { A as Scope, H as ApplicationError, S as HttpException, k as ERROR_CODES } from "./errors-COW9-Mar.mjs";
2
- import { a as __decorate, d as CONTAINER_TOKEN, o as __decorateParam, p as Transient, s as __decorateMetadata } from "./logger-DlV7NtvD.mjs";
3
- import { a as isListener } from "./events-CzCV8jI8.mjs";
4
- import { t as isCommand } from "./is-command-C6a7WTPw.mjs";
5
- import { t as isSeeder } from "./is-seeder-CebjZCDn.mjs";
6
- import { inject, injectable, instancePerContainerCachingFactory, registry } from "tsyringe";
7
- //#region src/module/errors/invalid-module-provider.error.ts
8
- /**
9
- * InvalidModuleProviderError
10
- *
11
- * Thrown when a module provider configuration is invalid.
12
- * This indicates a misconfiguration in the @Module decorator providers array.
13
- */
14
- var InvalidModuleProviderError = class extends ApplicationError {
15
- constructor(provider) {
16
- super("errors.invalidModuleProvider", ERROR_CODES.SYSTEM.INVALID_MODULE_PROVIDER, { provider: JSON.stringify(provider) });
17
- }
18
- };
19
- //#endregion
20
- //#region src/module/module.decorator.ts
21
- const MODULE_OPTIONS_KEY = Symbol.for("stratal:module:options");
22
- /**
23
- * `@Module` decorator - defines a module with imports, providers, controllers, consumers, jobs
24
- *
25
- * Uses tsyringe's `@registry` internally to auto-register providers when module is imported.
26
- *
27
- * @example
28
- * ```typescript
29
- * @Module({
30
- * imports: [OtherModule],
31
- * providers: [MyService, MyRepository],
32
- * controllers: [MyController],
33
- * })
34
- * export class MyModule {}
35
- * ```
36
- */
37
- function Module(options) {
38
- return (target) => {
39
- Reflect.defineMetadata(MODULE_OPTIONS_KEY, options, target);
40
- const registryEntries = buildRegistryEntries(options.providers ?? []);
41
- if (registryEntries.length > 0) registry(registryEntries)(target);
42
- return target;
43
- };
44
- }
45
- /**
46
- * Get module options from decorated class
47
- */
48
- function getModuleOptions(target) {
49
- return Reflect.getMetadata(MODULE_OPTIONS_KEY, target);
50
- }
51
- /**
52
- * Check if a class is decorated with `@Module`
53
- */
54
- function isModuleClass(target) {
55
- return typeof target === "function" && Reflect.hasMetadata(MODULE_OPTIONS_KEY, target);
56
- }
57
- /**
58
- * Convert our Provider types to tsyringe registry format
59
- *
60
- * Maps provider scope to tsyringe's lifecycle option.
61
- * Scope enum values map directly to Lifecycle enum values.
62
- */
63
- function buildRegistryEntries(providers) {
64
- return providers.map((provider) => {
65
- if (typeof provider === "function") return {
66
- token: provider,
67
- useClass: provider
68
- };
69
- if ("useClass" in provider) return {
70
- token: provider.provide,
71
- useClass: provider.useClass,
72
- options: provider.scope !== void 0 ? { lifecycle: provider.scope } : void 0
73
- };
74
- if ("useValue" in provider) return {
75
- token: provider.provide,
76
- useValue: provider.useValue
77
- };
78
- if ("useFactory" in provider) {
79
- const { provide, useFactory, inject = [] } = provider;
80
- return {
81
- token: provide,
82
- useFactory: instancePerContainerCachingFactory((dependencyContainer) => {
83
- return useFactory(...inject.map((token) => dependencyContainer.resolve(token)));
84
- })
85
- };
86
- }
87
- if ("useExisting" in provider) return {
88
- token: provider.provide,
89
- useToken: provider.useExisting
90
- };
91
- throw new InvalidModuleProviderError(provider);
92
- });
93
- }
94
- //#endregion
95
- //#region src/rate-limiter/errors.ts
96
- /**
97
- * Thrown when a request exceeds a configured rate limit.
98
- *
99
- * HTTP Status: 429 Too Many Requests
100
- * Error Code: 4290
101
- *
102
- * The {@link ExceptionHandler} renders the body via content negotiation
103
- * (HTML for HTML clients, JSON for everything else). Standard rate-limit
104
- * headers (`Retry-After`, `X-RateLimit-*`) are injected by the
105
- * `respond()` callback registered via `RateLimiterModule.onException`.
106
- */
107
- var TooManyRequestsError = class extends HttpException {
108
- info;
109
- constructor(info) {
110
- super(429, "errors.rateLimit.tooManyRequests");
111
- this.info = info;
112
- }
113
- };
114
- /**
115
- * Thrown when `RateLimiterRegistry.handle(name, ...)` is invoked for a
116
- * name that was never registered via `.for()`.
117
- *
118
- * Most likely cause: a typo in `router.throttle('foo')` or `@RateLimit('foo')`,
119
- * or the module that registers the limiter is missing from imports.
120
- */
121
- var RateLimiterNotDefinedError = class extends ApplicationError {
122
- limiterName;
123
- constructor(limiterName) {
124
- super("errors.rateLimit.notDefined", ERROR_CODES.SYSTEM.CONFIGURATION_ERROR, { name: limiterName });
125
- this.limiterName = limiterName;
126
- }
127
- };
128
- /**
129
- * Thrown by `RateLimiterStoreFactory.create()` (during the module's eager
130
- * `onInitialize` validation) when the user imported `RateLimiterModule`
131
- * without calling `.forRoot({ store: ... })`. There is no implicit default
132
- * store — the user must pick one.
133
- */
134
- var RateLimiterNotConfiguredError = class extends HttpException {
135
- constructor() {
136
- super(500, "errors.rateLimit.notConfigured");
137
- }
138
- };
139
- /**
140
- * Thrown when a throttled route fires but `RateLimiterModule` was never
141
- * imported in the user's AppModule (so the registry token is unbound).
142
- *
143
- * Distinct from {@link RateLimiterNotConfiguredError}, which fires when
144
- * the module IS imported but `forRoot` was not called.
145
- */
146
- var RateLimiterModuleNotImportedError = class extends ApplicationError {
147
- limiterName;
148
- constructor(limiterName) {
149
- super("errors.rateLimit.moduleNotImported", ERROR_CODES.SYSTEM.CONFIGURATION_ERROR, { name: limiterName });
150
- this.limiterName = limiterName;
151
- }
152
- };
153
- //#endregion
154
- //#region src/rate-limiter/rate-limiter.tokens.ts
155
- const RATE_LIMITER_TOKENS = {
156
- Registry: Symbol.for("stratal:rate-limiter:registry"),
157
- Store: Symbol.for("stratal:rate-limiter:store"),
158
- StoreFactory: Symbol.for("stratal:rate-limiter:store-factory"),
159
- Options: Symbol.for("stratal:rate-limiter:options"),
160
- /**
161
- * Per-app marker registered by RateLimiterModule.onInitialize. Used by
162
- * ThrottleMiddleware to detect "module not imported" — the @Module
163
- * decorator globally registers providers via tsyringe's registry(),
164
- * so the Registry/Store tokens are globally bound the moment the module
165
- * file is loaded. The only way to confirm the module was actually wired
166
- * into the *user's* AppModule is to look for an artifact registered
167
- * inside the user's app container (not the root container).
168
- */
169
- ModuleMarker: Symbol.for("stratal:rate-limiter:module-marker")
170
- };
171
- //#endregion
172
- //#region src/rate-limiter/throttle.middleware.ts
173
- const cache = /* @__PURE__ */ new Map();
174
- /**
175
- * Memoized factory that produces a Stratal `Middleware` class bound to a
176
- * named limiter. Calling twice with the same name returns the *same* class
177
- * — important for `Router.middleware` deduplication via class identity.
178
- *
179
- * Detection of "module not imported" works against a per-app marker
180
- * registered by `RateLimiterModule.onInitialize` (NOT via inject decorator,
181
- * because tsyringe would still try to construct Registry — whose Store
182
- * inject would explode with a less-actionable tsyringe wrapping). We hold
183
- * the user's container, then check `isRegistered(marker, recursive=true)`
184
- * at request time before resolving Registry.
185
- */
186
- function createThrottleMiddleware(name) {
187
- const existing = cache.get(name);
188
- if (existing) return existing;
189
- let ThrottleMiddleware = class ThrottleMiddleware {
190
- container;
191
- constructor(container) {
192
- this.container = container;
193
- }
194
- handle(ctx, next) {
195
- if (!this.container.getTsyringeContainer().isRegistered(RATE_LIMITER_TOKENS.ModuleMarker, true)) throw new RateLimiterModuleNotImportedError(name);
196
- return this.container.resolve(RATE_LIMITER_TOKENS.Registry).handle(name, ctx, next);
197
- }
198
- };
199
- ThrottleMiddleware = __decorate([
200
- Transient(),
201
- __decorateParam(0, inject(CONTAINER_TOKEN)),
202
- __decorateMetadata("design:paramtypes", [Object])
203
- ], ThrottleMiddleware);
204
- Object.defineProperty(ThrottleMiddleware, "name", { value: `Throttle(${name})` });
205
- cache.set(name, ThrottleMiddleware);
206
- return ThrottleMiddleware;
207
- }
208
- //#endregion
209
- //#region src/router/errors/controller-method-not-found.error.ts
210
- /**
211
- * ControllerMethodNotFoundError
212
- *
213
- * Thrown when a controller method is registered but doesn't exist on the controller instance.
214
- * This typically indicates a mismatch between route registration and controller implementation.
215
- */
216
- var ControllerMethodNotFoundError = class extends ApplicationError {
217
- constructor(methodName, controllerName) {
218
- super("errors.controllerMethodNotFound", ERROR_CODES.ROUTER.CONTROLLER_METHOD_NOT_FOUND, {
219
- methodName,
220
- controllerName
221
- });
222
- }
223
- };
224
- //#endregion
225
- //#region src/router/errors/controller-registration.error.ts
226
- /**
227
- * Error thrown when a controller fails to register
228
- *
229
- * This typically happens when:
230
- * - Controller is missing the `@Controller` decorator
231
- * - Controller route metadata is not set
232
- * - Controller class name is invalid
233
- *
234
- * Error Code: 9005
235
- */
236
- var ControllerRegistrationError = class extends ApplicationError {
237
- constructor(controllerName, reason) {
238
- super("errors.controllerRegistration", ERROR_CODES.ROUTER.CONTROLLER_REGISTRATION_ERROR, {
239
- controllerName,
240
- reason
241
- });
242
- }
243
- };
244
- //#endregion
245
- //#region src/router/errors/hono-app-already-configured.error.ts
246
- /**
247
- * Error thrown when HonoApp.configure() is called more than once.
248
- *
249
- * HonoApp can only be configured a single time during application bootstrap.
250
- */
251
- var HonoAppAlreadyConfiguredError = class extends ApplicationError {
252
- constructor() {
253
- super("errors.honoAppAlreadyConfigured", ERROR_CODES.SYSTEM.CONFIGURATION_ERROR);
254
- }
255
- };
256
- //#endregion
257
- //#region src/router/errors/openapi-route-registration.error.ts
258
- /**
259
- * OpenAPIRouteRegistrationError
260
- *
261
- * Thrown when an OpenAPI route fails to register properly
262
- * This indicates a configuration issue with route decorators or metadata
263
- * Uses i18n key for localized error messages
264
- *
265
- * @example
266
- * ```typescript
267
- * throw new OpenAPIRouteRegistrationError('/api/v1/users', 'Missing response schema')
268
- * ```
269
- */
270
- var OpenAPIRouteRegistrationError = class extends ApplicationError {
271
- constructor(path, reason) {
272
- super("errors.openapiRouteRegistration", ERROR_CODES.ROUTER.OPENAPI_ROUTE_REGISTRATION, {
273
- path,
274
- reason
275
- });
276
- }
277
- };
278
- //#endregion
279
- //#region src/router/errors/openapi-validation.error.ts
280
- /**
281
- * OpenAPIValidationError
282
- *
283
- * Thrown when OpenAPI request/response validation fails
284
- * Uses i18n key for localized error messages
285
- *
286
- * HTTP Status: 400 Bad Request
287
- * Error Code: 1004
288
- *
289
- * @example
290
- * ```typescript
291
- * throw new OpenAPIValidationError('Request body missing required field: email')
292
- * ```
293
- */
294
- var OpenAPIValidationError = class extends ApplicationError {
295
- constructor(details) {
296
- super("errors.openapiValidation", ERROR_CODES.VALIDATION.REQUEST_VALIDATION, { details });
297
- }
298
- };
299
- //#endregion
300
- //#region src/router/errors/route-not-found.error.ts
301
- /**
302
- * Error thrown when a requested route is not found
303
- *
304
- * HTTP Status: 404 Not Found
305
- * Error Code: 4004
306
- */
307
- var RouteNotFoundError = class extends ApplicationError {
308
- constructor(path, method) {
309
- super("errors.routeNotFound", ERROR_CODES.RESOURCE.ROUTE_NOT_FOUND, {
310
- path,
311
- method
312
- });
313
- }
314
- };
315
- //#endregion
316
- //#region src/router/errors/schema-validation.error.ts
317
- /**
318
- * SchemaValidationError
319
- *
320
- * Thrown when Zod schema validation fails
321
- */
322
- var SchemaValidationError = class extends ApplicationError {
323
- constructor(zodError) {
324
- const issues = zodError.issues.map((err) => ({
325
- path: err.path.join("."),
326
- message: err.message,
327
- code: err.code
328
- }));
329
- super("errors.schemaValidation", ERROR_CODES.VALIDATION.SCHEMA_VALIDATION, { issues });
330
- }
331
- };
332
- //#endregion
333
- //#region src/router/errors/index.ts
334
- /**
335
- * Error thrown when a request's host header does not match the expected domain pattern.
336
- *
337
- * HTTP Status: 404 Not Found
338
- */
339
- var DomainMismatchError = class extends HttpException {
340
- constructor() {
341
- super(404, "errors.domainMismatch");
342
- }
343
- };
344
- /**
345
- * Thrown when registering a named route that conflicts with an existing route name.
346
- *
347
- * Error Code: 9010
348
- */
349
- var DuplicateRouteNameError = class extends ApplicationError {
350
- constructor(name, existingHandler, newHandler) {
351
- super("errors.duplicateRouteName", ERROR_CODES.ROUTER.DUPLICATE_ROUTE_NAME, {
352
- name,
353
- existingHandler,
354
- newHandler
355
- });
356
- }
357
- };
358
- /**
359
- * Error thrown when a signed URL has an invalid or expired signature.
360
- *
361
- * HTTP Status: 403 Forbidden
362
- */
363
- var InvalidSignatureError = class extends HttpException {
364
- constructor() {
365
- super(403, "errors.invalidSignature");
366
- }
367
- };
368
- /**
369
- * Thrown when a required environment variable is not set.
370
- *
371
- * Maps to HTTP 500 via error code range (9xxx → 500).
372
- */
373
- var MissingEnvironmentVariableError = class extends ApplicationError {
374
- constructor(variable) {
375
- super("errors.missingEnvironmentVariable", ERROR_CODES.SYSTEM.MISSING_ENVIRONMENT_VARIABLE, { variable });
376
- }
377
- };
378
- /**
379
- * Thrown when a required path or domain parameter is missing during URL generation.
380
- *
381
- * Error Code: 9012
382
- */
383
- var MissingRouteParamError = class extends ApplicationError {
384
- constructor(param, name, path) {
385
- super("errors.missingRouteParam", ERROR_CODES.ROUTER.MISSING_ROUTE_PARAM, {
386
- param,
387
- name,
388
- path
389
- });
390
- }
391
- };
392
- /**
393
- * ResponseValidationError
394
- *
395
- * Thrown when a controller's response body does not match the declared Zod response schema.
396
- * Indicates a server-side schema mismatch — the controller is returning data that
397
- * violates its own API contract.
398
- */
399
- var ResponseValidationError = class extends ApplicationError {
400
- constructor(zodError) {
401
- const issues = zodError.issues.map((err) => ({
402
- path: err.path.join("."),
403
- message: err.message,
404
- code: err.code
405
- }));
406
- super("errors.responseValidation", ERROR_CODES.VALIDATION.RESPONSE_VALIDATION, { issues });
407
- }
408
- };
409
- /**
410
- * Thrown when attempting to generate a URL for a route name that doesn't exist in the registry.
411
- *
412
- * Error Code: 9011
413
- */
414
- var RouteNameNotFoundError = class extends ApplicationError {
415
- constructor(name) {
416
- super("errors.routeNameNotFound", ERROR_CODES.ROUTER.ROUTE_NAME_NOT_FOUND, { name });
417
- }
418
- };
419
- /**
420
- * Thrown when `router.use()` is called inside a `group()` callback.
421
- * `use()` registers global middleware and is only allowed on the root Router.
422
- *
423
- * Error Code: 9013
424
- */
425
- var RouterUseScopeError = class extends ApplicationError {
426
- constructor() {
427
- super("errors.routerUseScopeViolation", ERROR_CODES.ROUTER.USE_SCOPE_VIOLATION);
428
- }
429
- };
430
- /**
431
- * Thrown when a middleware calls next() more than once.
432
- * This is a programming error — each middleware must call next() at most once.
433
- *
434
- * Error Code: 9014
435
- */
436
- var MiddlewareNextCalledMultipleTimesError = class extends ApplicationError {
437
- constructor(middlewareName) {
438
- super("errors.middlewareNextCalledMultipleTimes", ERROR_CODES.ROUTER.MIDDLEWARE_NEXT_CALLED_MULTIPLE_TIMES, { middlewareName });
439
- }
440
- };
441
- //#endregion
442
- //#region src/router/router.internals.ts
443
- /**
444
- * Symbol keys for Router internal accessors.
445
- *
446
- * These symbols are NOT exported from the public `stratal/router` barrel.
447
- * Only internal modules (RouterResolver) import them, keeping the Router's
448
- * public API clean — users never see these methods.
449
- *
450
- * Declared as individual unique symbols so TypeScript can distinguish
451
- * their return types in computed property access.
452
- *
453
- * @internal
454
- */
455
- /** @internal */
456
- const getDefaultEntry = Symbol("Router.getDefaultEntry");
457
- /** @internal */
458
- const getGroups = Symbol("Router.getGroups");
459
- /** @internal */
460
- const getGlobalMiddleware = Symbol("Router.getGlobalMiddleware");
461
- //#endregion
462
- //#region src/router/router.ts
463
- /**
464
- * Fluent builder for route and middleware configuration.
465
- *
466
- * Scoped methods (`middleware()`, `prefix()`, `domain()`, `name()`, `version()`, `hideFromDocs()`)
467
- * apply only to this module's controllers or the sub-group's controllers.
468
- *
469
- * `use()` registers global middleware (all routes in the entire app).
470
- * Only callable on the root Router — throws inside `group()` callbacks.
471
- *
472
- * `group()` creates sub-groups for specific controllers with a callback.
473
- * Controllers in a sub-group are excluded from the parent scope.
474
- */
475
- var Router = class Router {
476
- _isChild;
477
- _defaultEntry = { middleware: [] };
478
- _groups = [];
479
- _globalMiddleware = [];
480
- constructor(isChild = false) {
481
- this._isChild = isChild;
482
- }
483
- /** Dynamic path prefix. For shared segments like `/:companyId` */
484
- prefix(path, params) {
485
- this._defaultEntry.prefix = path;
486
- this._defaultEntry.params = params;
487
- return this;
488
- }
489
- /** Domain pattern for controllers in this scope */
490
- domain(pattern) {
491
- this._defaultEntry.domain = pattern;
492
- return this;
493
- }
494
- /** Name prefix for routes in this scope */
495
- name(prefix) {
496
- this._defaultEntry.name = prefix;
497
- return this;
498
- }
499
- /** Middleware applied to controllers in this scope */
500
- middleware(...middlewares) {
501
- this._defaultEntry.middleware.push(...middlewares);
502
- return this;
503
- }
504
- /**
505
- * Apply a named rate limiter to controllers in this scope.
506
- *
507
- * The named limiter must be registered via `RateLimiterRegistry.for(name, ...)`
508
- * (typically inside a module's `onInitialize` hook), and the user must
509
- * import `RateLimiterModule.forRoot({ store: ... })` in their AppModule.
510
- *
511
- * @example
512
- * ```typescript
513
- * router.prefix('/uploads').throttle('uploads')
514
- * router.group([AdminController], (admin) => admin.throttle('admin'))
515
- * ```
516
- */
517
- throttle(name) {
518
- this._defaultEntry.middleware.push(createThrottleMiddleware(name));
519
- return this;
520
- }
521
- /** API version for controllers in this scope */
522
- version(version) {
523
- this._defaultEntry.version = version;
524
- return this;
525
- }
526
- /** Hide/show routes in this scope from OpenAPI docs */
527
- hideFromDocs(hide = true) {
528
- this._defaultEntry.hideFromDocs = hide;
529
- return this;
530
- }
531
- /**
532
- * Global middleware — applied to ALL routes in the entire app.
533
- * Only callable on the root Router. Throws if called inside `group()`.
534
- */
535
- use(...middlewares) {
536
- if (this._isChild) throw new RouterUseScopeError();
537
- this._globalMiddleware.push(...middlewares);
538
- return this;
539
- }
540
- /**
541
- * Create a sub-group for specific controllers/gateways.
542
- * Controllers in a sub-group are excluded from the parent (default) scope.
543
- * The callback receives a new Router (without `use()`) for fluent configuration.
544
- */
545
- group(controllers, callback) {
546
- const childRouter = new Router(true);
547
- callback(childRouter);
548
- this._groups.push({
549
- ...childRouter._defaultEntry,
550
- controllers
551
- });
552
- return this;
553
- }
554
- [getDefaultEntry]() {
555
- return this._defaultEntry;
556
- }
557
- [getGroups]() {
558
- return this._groups;
559
- }
560
- [getGlobalMiddleware]() {
561
- return this._globalMiddleware;
562
- }
563
- };
564
- //#endregion
565
- //#region src/module/module-registry.ts
566
- /**
567
- * Module Registry
568
- *
569
- * Manages module lifecycle for the @Module decorator pattern.
570
- * Simplified for tsyringe's flat container model:
571
- * - Imports are traversed for registration (organization only)
572
- * - Modules registered in declaration order
573
- * - Lifecycle hooks: onInitialize, onShutdown
574
- */
575
- /**
576
- * ModuleRegistry - manages module lifecycle
577
- *
578
- * @example
579
- * ```typescript
580
- * const registry = new ModuleRegistry(container, logger)
581
- * registry.register(AppModule) // Traverses imports recursively
582
- * await registry.initialize()
583
- * // ... application running ...
584
- * await registry.shutdown()
585
- * ```
586
- */
587
- var ModuleRegistry = class {
588
- container;
589
- logger;
590
- modules = [];
591
- registeredClasses = /* @__PURE__ */ new Set();
592
- initialized = false;
593
- allControllers = [];
594
- allConsumers = [];
595
- allJobs = [];
596
- allListeners = [];
597
- allCommands = [];
598
- allSeeders = [];
599
- allRouterConfigs = [];
600
- constructor(container, logger) {
601
- this.container = container;
602
- this.logger = logger;
603
- }
604
- /**
605
- * Register a module (static or dynamic)
606
- *
607
- * @param moduleOrDynamic - Module class decorated with `@Module` or DynamicModule from configure()
608
- */
609
- register(moduleOrDynamic) {
610
- const { moduleClass, options } = this.resolveModule(moduleOrDynamic);
611
- const isDynamic = this.isDynamicModule(moduleOrDynamic);
612
- if (this.registeredClasses.has(moduleClass)) {
613
- if (isDynamic) {
614
- this.logger.debug(`Module ${moduleClass.name} already registered, registering DynamicModule providers`);
615
- const { module: _, ...dynamicRest } = moduleOrDynamic;
616
- for (const provider of dynamicRest.providers ?? []) this.registerProvider(provider);
617
- } else this.logger.debug(`Module ${moduleClass.name} already registered, skipping`);
618
- return;
619
- }
620
- this.registeredClasses.add(moduleClass);
621
- this.logger.info(`Registering module: ${moduleClass.name}`);
622
- for (const ImportedModule of options.imports ?? []) this.register(ImportedModule);
623
- for (const provider of options.providers ?? []) this.registerProvider(provider);
624
- for (const controller of options.controllers ?? []) {
625
- this.container.register(controller);
626
- this.allControllers.push(controller);
627
- }
628
- for (const consumer of options.consumers ?? []) {
629
- this.container.register(consumer, Scope.Singleton);
630
- this.allConsumers.push(consumer);
631
- this.logger.info(`Collected consumer: ${consumer.name}`, { queueCount: this.allConsumers.length });
632
- }
633
- for (const job of options.jobs ?? []) {
634
- this.container.register(job, Scope.Singleton);
635
- this.allJobs.push(job);
636
- }
637
- this.modules.push({
638
- moduleClass,
639
- options,
640
- instance: null
641
- });
642
- }
643
- /**
644
- * Register multiple modules in order
645
- */
646
- registerAll(modules) {
647
- for (const module of modules) this.register(module);
648
- }
649
- /**
650
- * Initialize all modules (call configure and onInitialize hooks)
651
- */
652
- async initialize() {
653
- if (this.initialized) return;
654
- this.logger.info("Initializing modules...");
655
- const context = {
656
- container: this.container,
657
- logger: this.logger
658
- };
659
- for (const registered of this.modules) {
660
- const instance = new registered.moduleClass();
661
- registered.instance = instance;
662
- if (this.hasOnInitialize(instance)) {
663
- this.logger.info(`Initializing: ${registered.moduleClass.name}`);
664
- await instance.onInitialize(context);
665
- }
666
- }
667
- this.initialized = true;
668
- this.logger.info("All modules initialized");
669
- }
670
- /**
671
- * Get all controllers registered from all modules
672
- */
673
- getAllControllers() {
674
- return this.allControllers;
675
- }
676
- /**
677
- * Get all consumers registered from all modules
678
- */
679
- getAllConsumers() {
680
- return this.allConsumers;
681
- }
682
- /**
683
- * Get all jobs registered from all modules
684
- */
685
- getAllJobs() {
686
- return this.allJobs;
687
- }
688
- /**
689
- * Get all listeners registered from all modules
690
- */
691
- getAllListeners() {
692
- return this.allListeners;
693
- }
694
- /**
695
- * Get all commands registered from all modules
696
- */
697
- getAllCommands() {
698
- return this.allCommands;
699
- }
700
- /**
701
- * Get all seeders registered from all modules
702
- */
703
- getAllSeeders() {
704
- return this.allSeeders;
705
- }
706
- /**
707
- * Get all Router configurations from modules implementing RouteConfigurable.
708
- * Runs configureRoutes() lazily on first call (deferred from initialize()).
709
- */
710
- getAllRouterConfigs() {
711
- if (this.allRouterConfigs.length === 0) {
712
- for (const { moduleClass, options, instance } of this.modules) if (instance && this.hasRouteConfigurable(instance)) {
713
- this.logger.debug(`Configuring routes for: ${moduleClass.name}`);
714
- const router = new Router();
715
- instance.configureRoutes(router);
716
- const moduleControllers = options.controllers ?? [];
717
- this.allRouterConfigs.push({
718
- router,
719
- controllers: moduleControllers
720
- });
721
- }
722
- }
723
- return this.allRouterConfigs;
724
- }
725
- /**
726
- * Call `onException()` on all modules that implement the OnException interface.
727
- * Invoked by Application after the ExceptionHandler is resolved and `register()` is called.
728
- *
729
- * @param handler - The resolved ExceptionHandler instance
730
- */
731
- configureExceptionHandlers(handler) {
732
- for (const { moduleClass, instance } of this.modules) if (instance && this.hasOnException(instance)) {
733
- this.logger.debug(`Configuring exception handlers for: ${moduleClass.name}`);
734
- instance.onException(handler);
735
- }
736
- }
737
- /**
738
- * Shutdown all modules (call onShutdown hooks in reverse order)
739
- */
740
- async shutdown() {
741
- this.logger.info("Shutting down modules...");
742
- const context = {
743
- container: this.container,
744
- logger: this.logger
745
- };
746
- const reversed = [...this.modules].reverse();
747
- for (const { moduleClass, instance } of reversed) if (instance && this.hasOnShutdown(instance)) try {
748
- await instance.onShutdown(context);
749
- } catch (error) {
750
- this.logger.error(`Error shutting down ${moduleClass.name}:`, error);
751
- }
752
- this.logger.info("All modules shut down");
753
- }
754
- /**
755
- * Type guard for RouteConfigurable
756
- */
757
- hasRouteConfigurable(instance) {
758
- return typeof instance === "object" && instance !== null && "configureRoutes" in instance && typeof instance.configureRoutes === "function";
759
- }
760
- /**
761
- * Type guard for OnInitialize
762
- */
763
- hasOnInitialize(instance) {
764
- return typeof instance === "object" && instance !== null && "onInitialize" in instance && typeof instance.onInitialize === "function";
765
- }
766
- /**
767
- * Type guard for OnShutdown
768
- */
769
- hasOnShutdown(instance) {
770
- return typeof instance === "object" && instance !== null && "onShutdown" in instance && typeof instance.onShutdown === "function";
771
- }
772
- /**
773
- * Type guard for OnException
774
- */
775
- hasOnException(instance) {
776
- return typeof instance === "object" && instance !== null && "onException" in instance && typeof instance.onException === "function";
777
- }
778
- /**
779
- * Resolve module class and options from static or dynamic module
780
- *
781
- * For DynamicModules, merges the decorator metadata (consumers, controllers, jobs)
782
- * with the DynamicModule options (providers, imports). This ensures modules using
783
- * forRoot/forRootAsync patterns still have their decorator-defined consumers registered.
784
- */
785
- resolveModule(moduleOrDynamic) {
786
- if (this.isDynamicModule(moduleOrDynamic)) {
787
- const { module: moduleClass, ...dynamicRest } = moduleOrDynamic;
788
- const decoratorOptions = getModuleOptions(moduleClass) ?? {};
789
- return {
790
- moduleClass,
791
- options: {
792
- ...decoratorOptions,
793
- ...dynamicRest,
794
- providers: [...decoratorOptions.providers ?? [], ...dynamicRest.providers ?? []],
795
- imports: [...decoratorOptions.imports ?? []]
796
- }
797
- };
798
- }
799
- const moduleClass = moduleOrDynamic;
800
- return {
801
- moduleClass,
802
- options: getModuleOptions(moduleClass) ?? {}
803
- };
804
- }
805
- /**
806
- * Type guard for DynamicModule
807
- */
808
- isDynamicModule(value) {
809
- return typeof value === "object" && value !== null && "module" in value && typeof value.module === "function";
810
- }
811
- /**
812
- * Register a single provider in the container
813
- */
814
- registerProvider(provider) {
815
- if (typeof provider === "function") {
816
- this.container.register(provider);
817
- this.collectIfListener(provider);
818
- this.collectIfCommand(provider);
819
- this.collectIfSeeder(provider);
820
- } else if ("useClass" in provider) {
821
- this.container.register(provider.provide, provider.useClass, provider.scope);
822
- this.collectIfListener(provider.useClass);
823
- this.collectIfCommand(provider.useClass);
824
- this.collectIfSeeder(provider.useClass);
825
- } else if ("useValue" in provider) this.container.registerValue(provider.provide, provider.useValue);
826
- else if ("useFactory" in provider) {
827
- const { provide, useFactory, inject = [] } = provider;
828
- this.container.getTsyringeContainer().register(provide, { useFactory: instancePerContainerCachingFactory((dependencyContainer) => {
829
- return useFactory(...inject.map((token) => dependencyContainer.resolve(token)));
830
- }) });
831
- } else if ("useExisting" in provider) this.container.registerExisting(provider.provide, provider.useExisting);
832
- }
833
- /**
834
- * Check if a class is a `Command` and collect it for auto-wiring
835
- */
836
- collectIfCommand(providerClass) {
837
- if (isCommand(providerClass) && !this.allCommands.includes(providerClass)) {
838
- injectable()(providerClass);
839
- this.allCommands.push(providerClass);
840
- this.logger.debug(`Collected command: ${providerClass.name}`);
841
- }
842
- }
843
- /**
844
- * Check if a class is a `Seeder` and collect it for auto-wiring
845
- */
846
- collectIfSeeder(providerClass) {
847
- if (isSeeder(providerClass) && !this.allSeeders.includes(providerClass)) {
848
- this.allSeeders.push(providerClass);
849
- this.logger.debug(`Collected seeder: ${providerClass.name}`);
850
- }
851
- }
852
- /**
853
- * Check if a class is a `@Listener()` and collect it for auto-wiring
854
- */
855
- collectIfListener(providerClass) {
856
- if (isListener(providerClass)) {
857
- this.container.register(providerClass, providerClass, Scope.Singleton);
858
- this.allListeners.push(providerClass);
859
- this.logger.debug(`Collected listener: ${providerClass.name}`);
860
- }
861
- }
862
- };
863
- //#endregion
864
- export { getModuleOptions as A, RATE_LIMITER_TOKENS as C, TooManyRequestsError as D, RateLimiterNotDefinedError as E, MODULE_OPTIONS_KEY as O, createThrottleMiddleware as S, RateLimiterNotConfiguredError as T, OpenAPIValidationError as _, getGroups as a, ControllerRegistrationError as b, InvalidSignatureError as c, MissingRouteParamError as d, ResponseValidationError as f, RouteNotFoundError as g, SchemaValidationError as h, getGlobalMiddleware as i, isModuleClass as j, Module as k, MiddlewareNextCalledMultipleTimesError as l, RouterUseScopeError as m, Router as n, DomainMismatchError as o, RouteNameNotFoundError as p, getDefaultEntry as r, DuplicateRouteNameError as s, ModuleRegistry as t, MissingEnvironmentVariableError as u, OpenAPIRouteRegistrationError as v, RateLimiterModuleNotImportedError as w, ControllerMethodNotFoundError as x, HonoAppAlreadyConfiguredError as y };
865
-
866
- //# sourceMappingURL=module-BzLg57FK.mjs.map