stratal 0.0.20 → 0.0.22

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 (247) hide show
  1. package/README.md +1 -1
  2. package/dist/{base-email.provider-CfQCA08m.mjs → base-email.provider-BWZHIjt8.mjs} +1 -1
  3. package/dist/{base-email.provider-CfQCA08m.mjs.map → base-email.provider-BWZHIjt8.mjs.map} +1 -1
  4. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  5. package/dist/bin/quarry.mjs +46 -109
  6. package/dist/bin/quarry.mjs.map +1 -1
  7. package/dist/cache/index.d.mts +6 -46
  8. package/dist/cache/index.d.mts.map +1 -1
  9. package/dist/cache/index.mjs +22 -67
  10. package/dist/cache/index.mjs.map +1 -1
  11. package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-e34gV6tz.d.mts} +8 -8
  12. package/dist/{cache.service-DsnKuNyO.d.mts.map → cache.service-e34gV6tz.d.mts.map} +1 -1
  13. package/dist/{cache.tokens-B7Rw1C9Q.mjs → cache.tokens-ovi_c52J.mjs} +1 -1
  14. package/dist/{cache.tokens-B7Rw1C9Q.mjs.map → cache.tokens-ovi_c52J.mjs.map} +1 -1
  15. package/dist/{colors-DJaRDXoS.mjs → colors-axmupKdp.mjs} +1 -1
  16. package/dist/{colors-DJaRDXoS.mjs.map → colors-axmupKdp.mjs.map} +1 -1
  17. package/dist/{command-BgSlsS4M.mjs → command-BU4ApTo5.mjs} +2 -3
  18. package/dist/command-BU4ApTo5.mjs.map +1 -0
  19. package/dist/{command-Bu-PjJrX.d.mts → command-wXfvHbBZ.d.mts} +3 -2
  20. package/dist/command-wXfvHbBZ.d.mts.map +1 -0
  21. package/dist/config/index.d.mts +24 -11
  22. package/dist/config/index.d.mts.map +1 -1
  23. package/dist/config/index.mjs +33 -57
  24. package/dist/config/index.mjs.map +1 -1
  25. package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-DHQtypr1.d.mts} +1 -1
  26. package/dist/{consumer-registry-B7yUNh0q.d.mts.map → consumer-registry-DHQtypr1.d.mts.map} +1 -1
  27. package/dist/container-storage-GpNNz79X.mjs +52 -0
  28. package/dist/container-storage-GpNNz79X.mjs.map +1 -0
  29. package/dist/{controller.decorator-DQzenvSN.mjs → controller.decorator-DIUazNU7.mjs} +8 -8
  30. package/dist/controller.decorator-DIUazNU7.mjs.map +1 -0
  31. package/dist/cron/index.d.mts +26 -5
  32. package/dist/cron/index.d.mts.map +1 -1
  33. package/dist/cron/index.mjs +1 -1
  34. package/dist/{cron-manager-7Symz_TE.mjs → cron-manager-9bpN9bu4.mjs} +42 -16
  35. package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
  36. package/dist/{cron-manager-BEsH1mjW.d.mts → cron-manager-CSTIBPcM.d.mts} +6 -13
  37. package/dist/cron-manager-CSTIBPcM.d.mts.map +1 -0
  38. package/dist/decorate-HgTKAYK8.mjs +16 -0
  39. package/dist/deep-merge-C8NgcXw4.mjs +18 -0
  40. package/dist/deep-merge-C8NgcXw4.mjs.map +1 -0
  41. package/dist/di/index.d.mts +2 -2
  42. package/dist/di/index.mjs +4 -3
  43. package/dist/di-BO1QIb5H.mjs +415 -0
  44. package/dist/di-BO1QIb5H.mjs.map +1 -0
  45. package/dist/email/index.d.mts +14 -89
  46. package/dist/email/index.d.mts.map +1 -1
  47. package/dist/email/index.mjs +30 -125
  48. package/dist/email/index.mjs.map +1 -1
  49. package/dist/en-BPP6h6y5.mjs +202 -0
  50. package/dist/en-BPP6h6y5.mjs.map +1 -0
  51. package/dist/{env-D1rcZ8_r.d.mts → env-DKSbuBi5.d.mts} +1 -1
  52. package/dist/env-DKSbuBi5.d.mts.map +1 -0
  53. package/dist/errors/index.d.mts +2 -2
  54. package/dist/errors/index.mjs +4 -2
  55. package/dist/errors-BBZTnjdq.mjs +333 -0
  56. package/dist/errors-BBZTnjdq.mjs.map +1 -0
  57. package/dist/events/index.d.mts +2 -2
  58. package/dist/events/index.d.mts.map +1 -1
  59. package/dist/events/index.mjs +1 -1
  60. package/dist/{events-COKixqnG.mjs → events-D1KdDaiP.mjs} +13 -11
  61. package/dist/events-D1KdDaiP.mjs.map +1 -0
  62. package/dist/exception-context-B4kM-M53.mjs +429 -0
  63. package/dist/exception-context-B4kM-M53.mjs.map +1 -0
  64. package/dist/{gateway-context-CdJjpUCW.mjs → gateway-context-CFe6a9gz.mjs} +20 -31
  65. package/dist/gateway-context-CFe6a9gz.mjs.map +1 -0
  66. package/dist/guards/index.d.mts +3 -3
  67. package/dist/guards/index.d.mts.map +1 -1
  68. package/dist/guards/index.mjs +1 -1
  69. package/dist/{guards-DUk_Kzst.mjs → guards-Ced-uNIF.mjs} +7 -5
  70. package/dist/guards-Ced-uNIF.mjs.map +1 -0
  71. package/dist/{http-method.decorator-DXwxAfb_.mjs → http-method.decorator-CdjKFJZZ.mjs} +7 -6
  72. package/dist/http-method.decorator-CdjKFJZZ.mjs.map +1 -0
  73. package/dist/i18n/index.d.mts +238 -3
  74. package/dist/i18n/index.d.mts.map +1 -0
  75. package/dist/i18n/index.mjs +39 -3
  76. package/dist/i18n/index.mjs.map +1 -0
  77. package/dist/i18n/messages/en/index.d.mts +2 -2
  78. package/dist/i18n/messages/en/index.mjs +2 -2
  79. package/dist/i18n/utils/index.d.mts +4 -26
  80. package/dist/i18n/utils/index.d.mts.map +1 -1
  81. package/dist/i18n/utils/index.mjs +2 -2
  82. package/dist/i18n/validation/index.d.mts +3 -2
  83. package/dist/i18n/validation/index.mjs +4 -2
  84. package/dist/i18n.module-BlXrtAlV.mjs +219 -0
  85. package/dist/i18n.module-BlXrtAlV.mjs.map +1 -0
  86. package/dist/i18n.tokens-hwRpmjRq.mjs +19 -0
  87. package/dist/i18n.tokens-hwRpmjRq.mjs.map +1 -0
  88. package/dist/{index-7-hU3GTV.d.mts → index-B4UBK-2T.d.mts} +1 -1
  89. package/dist/{index-7-hU3GTV.d.mts.map → index-B4UBK-2T.d.mts.map} +1 -1
  90. package/dist/index-BtlE9RuO.d.mts +124 -0
  91. package/dist/index-BtlE9RuO.d.mts.map +1 -0
  92. package/dist/{index-CjaQ6_tZ.d.mts → index-CW1YHSft.d.mts} +71 -167
  93. package/dist/index-CW1YHSft.d.mts.map +1 -0
  94. package/dist/{index-D0US0X14.d.mts → index-DEncMcC6.d.mts} +559 -2239
  95. package/dist/index-DEncMcC6.d.mts.map +1 -0
  96. package/dist/index-Dj5IMwtr.d.mts +44 -0
  97. package/dist/index-Dj5IMwtr.d.mts.map +1 -0
  98. package/dist/{index-C1KvMncZ.d.mts → index-KMgSCSM7.d.mts} +3 -108
  99. package/dist/index-KMgSCSM7.d.mts.map +1 -0
  100. package/dist/index.d.mts +5 -43
  101. package/dist/index.mjs +1 -1
  102. package/dist/{is-command-C6a7WTPw.mjs → is-command-CX5rAfZW.mjs} +2 -2
  103. package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CX5rAfZW.mjs.map} +1 -1
  104. package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-CYCtELlm.mjs} +1 -1
  105. package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-CYCtELlm.mjs.map} +1 -1
  106. package/dist/logger/index.d.mts +2 -2
  107. package/dist/logger/index.mjs +170 -2
  108. package/dist/logger/index.mjs.map +1 -0
  109. package/dist/macroable/index.d.mts +1 -1
  110. package/dist/macroable/index.mjs +1 -1
  111. package/dist/{macroable-BmufBshB.mjs → macroable-DzlfzT50.mjs} +1 -1
  112. package/dist/{macroable-BmufBshB.mjs.map → macroable-DzlfzT50.mjs.map} +1 -1
  113. package/dist/metadata-BVkc4aUu.mjs +39 -0
  114. package/dist/metadata-BVkc4aUu.mjs.map +1 -0
  115. package/dist/module/index.d.mts +6 -24
  116. package/dist/module/index.d.mts.map +1 -1
  117. package/dist/module/index.mjs +2 -2
  118. package/dist/module-xYoHba6B.mjs +422 -0
  119. package/dist/module-xYoHba6B.mjs.map +1 -0
  120. package/dist/openapi/index.d.mts +3 -3
  121. package/dist/openapi/index.d.mts.map +1 -1
  122. package/dist/openapi/index.mjs +1 -2
  123. package/dist/openapi-C6lm0RmV.mjs +483 -0
  124. package/dist/openapi-C6lm0RmV.mjs.map +1 -0
  125. package/dist/{openapi.service-BLgvn3hJ.d.mts → openapi.service-CrLlsXAd.d.mts} +3 -3
  126. package/dist/openapi.service-CrLlsXAd.d.mts.map +1 -0
  127. package/dist/quarry/index.d.mts +5 -163
  128. package/dist/quarry/index.d.mts.map +1 -1
  129. package/dist/quarry/index.mjs +5 -5
  130. package/dist/quarry/runner.d.mts +184 -0
  131. package/dist/quarry/runner.d.mts.map +1 -0
  132. package/dist/quarry/runner.mjs +775 -0
  133. package/dist/quarry/runner.mjs.map +1 -0
  134. package/dist/quarry-registry-D4hIGScf.d.mts +69 -0
  135. package/dist/quarry-registry-D4hIGScf.d.mts.map +1 -0
  136. package/dist/quarry-registry-DkraZNwn.mjs +311 -0
  137. package/dist/quarry-registry-DkraZNwn.mjs.map +1 -0
  138. package/dist/queue/index.d.mts +3 -3
  139. package/dist/queue/index.mjs +27 -28
  140. package/dist/queue/index.mjs.map +1 -1
  141. package/dist/{queue.module-BCdCiySt.mjs → queue.module-DeWJ0tQM.mjs} +67 -112
  142. package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
  143. package/dist/{r2-storage.provider-Co6F0ZYV.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +8 -5
  144. package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
  145. package/dist/{rate-limit.decorator--o6Q6p9w.mjs → rate-limit.decorator-D69zdZbp.mjs} +6 -11
  146. package/dist/rate-limit.decorator-D69zdZbp.mjs.map +1 -0
  147. package/dist/rate-limiter/index.d.mts +11 -50
  148. package/dist/rate-limiter/index.d.mts.map +1 -1
  149. package/dist/rate-limiter/index.mjs +25 -30
  150. package/dist/rate-limiter/index.mjs.map +1 -1
  151. package/dist/{resend.provider-M6qRLrcy.mjs → resend.provider-Ur6tU7fK.mjs} +8 -7
  152. package/dist/resend.provider-Ur6tU7fK.mjs.map +1 -0
  153. package/dist/router/index.d.mts +2 -2
  154. package/dist/router/index.mjs +8 -7
  155. package/dist/{i18n.module-BBlNNlcG.mjs → router-Cy6DjkvP.mjs} +215 -855
  156. package/dist/router-Cy6DjkvP.mjs.map +1 -0
  157. package/dist/seeder/index.d.mts +6 -11
  158. package/dist/seeder/index.d.mts.map +1 -1
  159. package/dist/seeder/index.mjs +3 -3
  160. package/dist/{seeder-CJAOHEIo.mjs → seeder-BADTig4n.mjs} +17 -22
  161. package/dist/seeder-BADTig4n.mjs.map +1 -0
  162. package/dist/{signed-url-BQPbv2In.mjs → signed-url-BqUqt5dF.mjs} +1 -1
  163. package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-BqUqt5dF.mjs.map} +1 -1
  164. package/dist/{smtp.provider-w0Ve52Xg.mjs → smtp.provider-C129sNBT.mjs} +7 -6
  165. package/dist/smtp.provider-C129sNBT.mjs.map +1 -0
  166. package/dist/storage/index.d.mts +15 -39
  167. package/dist/storage/index.d.mts.map +1 -1
  168. package/dist/storage/index.mjs +3 -3
  169. package/dist/storage/providers/index.d.mts +2 -2
  170. package/dist/storage/providers/index.mjs +1 -1
  171. package/dist/{storage-1zw-6Yiz.mjs → storage-BA3ppVYM.mjs} +70 -59
  172. package/dist/storage-BA3ppVYM.mjs.map +1 -0
  173. package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-DQMtT42e.d.mts} +2 -3
  174. package/dist/storage-provider.interface-DQMtT42e.d.mts.map +1 -0
  175. package/dist/storage.error-C6FY037a.mjs +8 -0
  176. package/dist/storage.error-C6FY037a.mjs.map +1 -0
  177. package/dist/{stratal-DeEcGgdq.mjs → stratal-Bdq4IdB3.mjs} +31 -183
  178. package/dist/stratal-Bdq4IdB3.mjs.map +1 -0
  179. package/dist/stratal-BsKmvP6J.d.mts +43 -0
  180. package/dist/stratal-BsKmvP6J.d.mts.map +1 -0
  181. package/dist/{types-cySNS_lp.d.mts → types-BaeHi67f.d.mts} +1 -1
  182. package/dist/types-BaeHi67f.d.mts.map +1 -0
  183. package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DTqaUMR9.mjs} +6 -3
  184. package/dist/usage-generator-DTqaUMR9.mjs.map +1 -0
  185. package/dist/validation-DUzcjb8Q.mjs +49 -0
  186. package/dist/validation-DUzcjb8Q.mjs.map +1 -0
  187. package/dist/validation.context-XTysWJ3b.mjs +117 -0
  188. package/dist/validation.context-XTysWJ3b.mjs.map +1 -0
  189. package/dist/websocket/index.d.mts +7 -14
  190. package/dist/websocket/index.d.mts.map +1 -1
  191. package/dist/websocket/index.mjs +2 -2
  192. package/dist/workers/index.d.mts +2 -2
  193. package/dist/workers/index.mjs +3 -2
  194. package/dist/workers/index.mjs.map +1 -1
  195. package/dist/{index-Bnpfq6uk.d.mts → zod-DvWTfRpI.d.mts} +58 -133
  196. package/dist/zod-DvWTfRpI.d.mts.map +1 -0
  197. package/dist/zod-hMa3rSHV.mjs +72 -0
  198. package/dist/zod-hMa3rSHV.mjs.map +1 -0
  199. package/package.json +20 -20
  200. package/dist/command-BgSlsS4M.mjs.map +0 -1
  201. package/dist/command-Bu-PjJrX.d.mts.map +0 -1
  202. package/dist/controller.decorator-DQzenvSN.mjs.map +0 -1
  203. package/dist/cron-manager-7Symz_TE.mjs.map +0 -1
  204. package/dist/cron-manager-BEsH1mjW.d.mts.map +0 -1
  205. package/dist/en-DSH_bhh6.mjs +0 -308
  206. package/dist/en-DSH_bhh6.mjs.map +0 -1
  207. package/dist/env-D1rcZ8_r.d.mts.map +0 -1
  208. package/dist/errors-BdyV5PnY.mjs +0 -1725
  209. package/dist/errors-BdyV5PnY.mjs.map +0 -1
  210. package/dist/errors-Da3Pz2X7.mjs +0 -74
  211. package/dist/errors-Da3Pz2X7.mjs.map +0 -1
  212. package/dist/events-COKixqnG.mjs.map +0 -1
  213. package/dist/gateway-context-CdJjpUCW.mjs.map +0 -1
  214. package/dist/guards-DUk_Kzst.mjs.map +0 -1
  215. package/dist/http-method.decorator-DXwxAfb_.mjs.map +0 -1
  216. package/dist/i18n.module-BBlNNlcG.mjs.map +0 -1
  217. package/dist/index-Bnpfq6uk.d.mts.map +0 -1
  218. package/dist/index-C1KvMncZ.d.mts.map +0 -1
  219. package/dist/index-CjaQ6_tZ.d.mts.map +0 -1
  220. package/dist/index-D0US0X14.d.mts.map +0 -1
  221. package/dist/index-DBd_2wv8.d.mts +0 -263
  222. package/dist/index-DBd_2wv8.d.mts.map +0 -1
  223. package/dist/index.d.mts.map +0 -1
  224. package/dist/logger-V6Ms3QnQ.mjs +0 -436
  225. package/dist/logger-V6Ms3QnQ.mjs.map +0 -1
  226. package/dist/module-Dk2qTa77.mjs +0 -860
  227. package/dist/module-Dk2qTa77.mjs.map +0 -1
  228. package/dist/openapi-tools.service-Zs-Ewv7F.mjs +0 -200
  229. package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
  230. package/dist/openapi.service-BLgvn3hJ.d.mts.map +0 -1
  231. package/dist/quarry-registry-DNEej-Db.mjs +0 -688
  232. package/dist/quarry-registry-DNEej-Db.mjs.map +0 -1
  233. package/dist/queue.module-BCdCiySt.mjs.map +0 -1
  234. package/dist/r2-storage.provider-Co6F0ZYV.mjs.map +0 -1
  235. package/dist/rate-limit.decorator--o6Q6p9w.mjs.map +0 -1
  236. package/dist/resend.provider-M6qRLrcy.mjs.map +0 -1
  237. package/dist/seeder-CJAOHEIo.mjs.map +0 -1
  238. package/dist/setup-CefZKV_e.mjs +0 -37
  239. package/dist/setup-CefZKV_e.mjs.map +0 -1
  240. package/dist/smtp.provider-w0Ve52Xg.mjs.map +0 -1
  241. package/dist/storage-1zw-6Yiz.mjs.map +0 -1
  242. package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
  243. package/dist/stratal-DeEcGgdq.mjs.map +0 -1
  244. package/dist/types-cySNS_lp.d.mts.map +0 -1
  245. package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
  246. package/dist/validation-DtJwAv7O.mjs +0 -248
  247. package/dist/validation-DtJwAv7O.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"consumer-registry-B7yUNh0q.d.mts","names":[],"sources":["../src/queue/queue-consumer.ts","../src/queue/consumer-registry.ts"],"mappings":";;AAMA;;;;;UAAiB,YAAA;EAIf;EAFA,EAAA;EAMA;EAJA,SAAA;EAMA;EAJA,IAAA;EAMG;EAJH,OAAA,EAAS,CAAA;EAIK;EAFd,QAAA;IACE,MAAA;IAAA,CACC,GAAA;EAAA;AAAA;;;;;;;;;;;;;;;;;;;UAsBY,cAAA;EAsBQ;;;;;;EAAA,SAfd,YAAA;ECXE;;;;;EDkBX,MAAA,CAAO,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;ECqDD;;;;;;ED7CjC,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;AAAA;;;AAxDpD;;;;;;;;;;;;;;;AAkCA;;;;;;;;;;;;;;;;AAlCA,cC8Ba,gBAAA;EDkBJ;EAAA,QChBC,eAAA;EDwBR;EAAA,QCrBQ,YAAA;EDqBC;;;;;;;ECZT,QAAA,CAAS,QAAA,EAAU,cAAA;;;AAfrB;;;;;;;;EAuCE,YAAA,CAAa,WAAA,WAAsB,cAAA;EAjC3B;;;;;;EAgDR,YAAA,CAAa,WAAA;EAAb;;;;;EASA,eAAA,CAAA;EASiC;;;;;EAAjC,eAAA,CAAA,GAAmB,cAAA;AAAA"}
1
+ {"version":3,"file":"consumer-registry-DHQtypr1.d.mts","names":[],"sources":["../src/queue/queue-consumer.ts","../src/queue/consumer-registry.ts"],"mappings":";;AAMA;;;;;UAAiB,YAAA;EAIf;EAFA,EAAA;EAMA;EAJA,SAAA;EAMA;EAJA,IAAA;EAMG;EAJH,OAAA,EAAS,CAAA;EAIK;EAFd,QAAA;IACE,MAAA;IAAA,CACC,GAAA;EAAA;AAAA;;;;;;;;;;;;;;;;;;;UAsBY,cAAA;EAsBQ;;;;;;EAAA,SAfd,YAAA;ECXE;;;;;EDkBX,MAAA,CAAO,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;ECqDD;;;;;;ED7CjC,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,YAAA,CAAa,CAAA,IAAK,OAAA;AAAA;;;AAxDpD;;;;;;;;;;;;;;;AAkCA;;;;;;;;;;;;;;;;AAlCA,cC8Ba,gBAAA;EDkBJ;EAAA,QChBC,eAAA;EDwBR;EAAA,QCrBQ,YAAA;EDqBC;;;;;;;ECZT,QAAA,CAAS,QAAA,EAAU,cAAA;;;AAfrB;;;;;;;;EAuCE,YAAA,CAAa,WAAA,WAAsB,cAAA;EAjC3B;;;;;;EAgDR,YAAA,CAAa,WAAA;EAAb;;;;;EASA,eAAA,CAAA;EASiC;;;;;EAAjC,eAAA,CAAA,GAAmB,cAAA;AAAA"}
@@ -0,0 +1,52 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ //#region src/errors/application-error.ts
3
+ var ApplicationError = class extends Error {
4
+ timestamp;
5
+ constructor(message, cause) {
6
+ super(message ?? "Internal Server Error", cause !== void 0 ? { cause } : void 0);
7
+ Object.setPrototypeOf(this, new.target.prototype);
8
+ this.name = this.constructor.name;
9
+ this.timestamp = (/* @__PURE__ */ new Date()).toISOString();
10
+ if (Error.captureStackTrace) Error.captureStackTrace(this, this.constructor);
11
+ }
12
+ };
13
+ //#endregion
14
+ //#region src/errors/container-not-initialized.error.ts
15
+ var ContainerNotInitializedError = class extends ApplicationError {
16
+ constructor() {
17
+ super("Application container has not been initialized");
18
+ }
19
+ };
20
+ //#endregion
21
+ //#region src/di/container-storage.ts
22
+ /**
23
+ * AsyncLocalStorage for the application container.
24
+ *
25
+ * Set by `Application.initialize()` — all code from that point onward
26
+ * (Stratal handlers, TestingModuleBuilder, standalone functions like `route()`)
27
+ * can access the container without DI or static singletons.
28
+ */
29
+ const containerStorage = new AsyncLocalStorage();
30
+ /**
31
+ * Get the application container from AsyncLocalStorage.
32
+ *
33
+ * @throws ContainerNotInitializedError if called outside `Application.initialize()` scope
34
+ */
35
+ function getContainer() {
36
+ const container = containerStorage.getStore();
37
+ if (!container) throw new ContainerNotInitializedError();
38
+ return container;
39
+ }
40
+ /**
41
+ * Run a function within a container context.
42
+ *
43
+ * @param container - The application container to store
44
+ * @param fn - The function to execute with container access
45
+ */
46
+ function runWithContainer(container, fn) {
47
+ return containerStorage.run(container, fn);
48
+ }
49
+ //#endregion
50
+ export { ApplicationError as a, ContainerNotInitializedError as i, getContainer as n, runWithContainer as r, containerStorage as t };
51
+
52
+ //# sourceMappingURL=container-storage-GpNNz79X.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-storage-GpNNz79X.mjs","names":[],"sources":["../src/errors/application-error.ts","../src/errors/container-not-initialized.error.ts","../src/di/container-storage.ts"],"sourcesContent":["export class ApplicationError extends Error {\n public readonly timestamp: string\n\n constructor(message?: string, cause?: unknown) {\n super(message ?? 'Internal Server Error', cause !== undefined ? { cause } : undefined)\n\n Object.setPrototypeOf(this, new.target.prototype)\n\n this.name = this.constructor.name\n this.timestamp = new Date().toISOString()\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- captureStackTrace is V8-specific, not always present\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n","import { ApplicationError } from './application-error'\n\nexport class ContainerNotInitializedError extends ApplicationError {\n constructor() {\n super('Application container has not been initialized')\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport { ContainerNotInitializedError } from '../errors/container-not-initialized.error'\nimport type { Container } from './container'\n\n/**\n * AsyncLocalStorage for the application container.\n *\n * Set by `Application.initialize()` — all code from that point onward\n * (Stratal handlers, TestingModuleBuilder, standalone functions like `route()`)\n * can access the container without DI or static singletons.\n */\nexport const containerStorage = new AsyncLocalStorage<Container>()\n\n/**\n * Get the application container from AsyncLocalStorage.\n *\n * @throws ContainerNotInitializedError if called outside `Application.initialize()` scope\n */\nexport function getContainer(): Container {\n const container = containerStorage.getStore()\n if (!container) {\n throw new ContainerNotInitializedError()\n }\n return container\n}\n\n/**\n * Run a function within a container context.\n *\n * @param container - The application container to store\n * @param fn - The function to execute with container access\n */\nexport function runWithContainer<T>(container: Container, fn: () => T): T {\n return containerStorage.run(container, fn)\n}\n"],"mappings":";;AAAA,IAAa,mBAAb,cAAsC,MAAM;CAC1C;CAEA,YAAY,SAAkB,OAAiB;EAC7C,MAAM,WAAW,yBAAyB,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,KAAA,EAAU;EAEtF,OAAO,eAAe,MAAM,IAAI,OAAO,UAAU;EAEjD,KAAK,OAAO,KAAK,YAAY;EAC7B,KAAK,6BAAY,IAAI,MAAM,EAAC,aAAa;EAGzC,IAAI,MAAM,mBACR,MAAM,kBAAkB,MAAM,KAAK,YAAY;;;;;ACXrD,IAAa,+BAAb,cAAkD,iBAAiB;CACjE,cAAc;EACZ,MAAM,iDAAiD;;;;;;;;;;;;ACO3D,MAAa,mBAAmB,IAAI,mBAA8B;;;;;;AAOlE,SAAgB,eAA0B;CACxC,MAAM,YAAY,iBAAiB,UAAU;CAC7C,IAAI,CAAC,WACH,MAAM,IAAI,8BAA8B;CAE1C,OAAO;;;;;;;;AAST,SAAgB,iBAAoB,WAAsB,IAAgB;CACxE,OAAO,iBAAiB,IAAI,WAAW,GAAG"}
@@ -1,5 +1,6 @@
1
- import { f as ROUTE_METADATA_KEYS } from "./errors-BdyV5PnY.mjs";
2
- import { p as Transient } from "./logger-V6Ms3QnQ.mjs";
1
+ import { d as Transient } from "./di-BO1QIb5H.mjs";
2
+ import { n as getMetadata, t as defineMetadata } from "./metadata-BVkc4aUu.mjs";
3
+ import { u as ROUTE_METADATA_KEYS } from "./exception-context-B4kM-M53.mjs";
3
4
  //#region src/router/decorators/controller.decorator.ts
4
5
  const CONTROLLER_ROUTE_KEY = ROUTE_METADATA_KEYS.CONTROLLER_ROUTE;
5
6
  /**
@@ -26,8 +27,8 @@ const CONTROLLER_ROUTE_KEY = ROUTE_METADATA_KEYS.CONTROLLER_ROUTE;
26
27
  function Controller(route, options) {
27
28
  return function(target) {
28
29
  Transient()(target);
29
- Reflect.defineMetadata(CONTROLLER_ROUTE_KEY, route, target);
30
- if (options) Reflect.defineMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, options, target);
30
+ defineMetadata(CONTROLLER_ROUTE_KEY, route, target);
31
+ if (options) defineMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, options, target);
31
32
  return target;
32
33
  };
33
34
  }
@@ -38,8 +39,7 @@ function Controller(route, options) {
38
39
  * @returns Route string or undefined if not set
39
40
  */
40
41
  function getControllerRoute(target) {
41
- const metadataTarget = typeof target === "function" ? target : target.constructor;
42
- return Reflect.getMetadata(CONTROLLER_ROUTE_KEY, metadataTarget);
42
+ return getMetadata(CONTROLLER_ROUTE_KEY, typeof target === "function" ? target : target.constructor);
43
43
  }
44
44
  /**
45
45
  * Get the options from controller class metadata
@@ -49,7 +49,7 @@ function getControllerRoute(target) {
49
49
  */
50
50
  function getControllerOptions(target) {
51
51
  const metadataTarget = typeof target === "function" ? target : target.constructor;
52
- return Reflect.getMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, metadataTarget);
52
+ return getMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, metadataTarget);
53
53
  }
54
54
  /**
55
55
  * Get the version from controller class metadata
@@ -63,4 +63,4 @@ function getControllerVersion(target) {
63
63
  //#endregion
64
64
  export { getControllerVersion as i, getControllerOptions as n, getControllerRoute as r, Controller as t };
65
65
 
66
- //# sourceMappingURL=controller.decorator-DQzenvSN.mjs.map
66
+ //# sourceMappingURL=controller.decorator-DIUazNU7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.decorator-DIUazNU7.mjs","names":[],"sources":["../src/router/decorators/controller.decorator.ts"],"sourcesContent":["import { Transient } from '../../di/decorators'\nimport { defineMetadata, getMetadata } from '../../di/metadata'\nimport { type Constructor } from '../../types'\nimport { ROUTE_METADATA_KEYS } from '../constants'\nimport { type ControllerOptions } from '../types'\n\nconst CONTROLLER_ROUTE_KEY = ROUTE_METADATA_KEYS.CONTROLLER_ROUTE\n\n/**\n * Base controller decorator for route registration\n *\n * This is the core controller decorator that handles:\n * - Transient scope registration (request-scoped)\n * - Route metadata storage\n * - Controller options (tags, security schemes, hideFromDocs)\n *\n * @param route - Base route for this controller (e.g., '/api/v1/users')\n * @param options - Optional configuration (tags, security schemes, hideFromDocs)\n *\n * @example\n * ```typescript\n * import { Controller } from 'stratal/router'\n *\n * @Controller('/api/v1/users', { tags: ['Users'] })\n * export class UsersController implements IController {\n * // All routes accessible\n * }\n * ```\n */\nexport function Controller(route: string, options?: ControllerOptions) {\n return function <T extends Constructor>(target: T) {\n // Wrap @Transient (handles @injectable and scope metadata)\n Transient()(target)\n\n // Store route metadata on the class\n defineMetadata(CONTROLLER_ROUTE_KEY, route, target)\n\n // Store options metadata if provided\n if (options) {\n defineMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, options, target)\n }\n\n return target\n }\n}\n\n/**\n * Get the route from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Route string or undefined if not set\n */\nexport function getControllerRoute(target: object): string | undefined {\n // Check if target is a class constructor (function) or an instance\n // If class, get metadata from it directly; if instance, get from constructor\n const metadataTarget = typeof target === 'function' ? target : (target as { constructor: object }).constructor\n return getMetadata<string>(CONTROLLER_ROUTE_KEY, metadataTarget)\n}\n\n/**\n * Get the options from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Controller options or undefined if not set\n */\nexport function getControllerOptions(target: object): ControllerOptions | undefined {\n const metadataTarget = typeof target === 'function' ? target : (target as { constructor: object }).constructor\n return getMetadata<ControllerOptions>(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, metadataTarget)\n}\n\n/**\n * Get the version from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Version string, array, VERSION_NEUTRAL symbol, or undefined if not set\n */\nexport function getControllerVersion(target: object): ControllerOptions['version'] {\n const options = getControllerOptions(target)\n return options?.version\n}\n"],"mappings":";;;;AAMA,MAAM,uBAAuB,oBAAoB;;;;;;;;;;;;;;;;;;;;;;AAuBjD,SAAgB,WAAW,OAAe,SAA6B;CACrE,OAAO,SAAiC,QAAW;EAEjD,WAAW,CAAC,OAAO;EAGnB,eAAe,sBAAsB,OAAO,OAAO;EAGnD,IAAI,SACF,eAAe,oBAAoB,oBAAoB,SAAS,OAAO;EAGzE,OAAO;;;;;;;;;AAUX,SAAgB,mBAAmB,QAAoC;CAIrE,OAAO,YAAoB,sBADJ,OAAO,WAAW,aAAa,SAAU,OAAmC,YACnC;;;;;;;;AASlE,SAAgB,qBAAqB,QAA+C;CAClF,MAAM,iBAAiB,OAAO,WAAW,aAAa,SAAU,OAAmC;CACnG,OAAO,YAA+B,oBAAoB,oBAAoB,eAAe;;;;;;;;AAS/F,SAAgB,qBAAqB,QAA8C;CAEjF,OADgB,qBAAqB,OACvB,EAAE"}
@@ -1,15 +1,36 @@
1
- import { d as ApplicationError } from "../index-D0US0X14.mjs";
2
- import { n as CronJob, r as RegisteredJob, t as CronManager } from "../cron-manager-BEsH1mjW.mjs";
1
+ import { xr as ApplicationError } from "../index-DEncMcC6.mjs";
2
+ import { n as CronJob, r as RegisteredJob, t as CronManager } from "../cron-manager-CSTIBPcM.mjs";
3
3
  import { ScheduledController } from "@cloudflare/workers-types";
4
4
 
5
5
  //#region src/cron/errors/cron-execution.error.d.ts
6
+ interface CronJobFailure {
7
+ job: string;
8
+ error: Error;
9
+ }
10
+ interface SerializedJobFailure {
11
+ job: string;
12
+ name: string;
13
+ code?: number | string;
14
+ message: string;
15
+ dbErrorCode?: string;
16
+ sql?: string;
17
+ }
6
18
  /**
7
- * Error thrown when one or more cron jobs fail execution
19
+ * Error thrown when one or more cron jobs fail execution.
8
20
  *
9
- * This error aggregates failures from multiple jobs that share the same schedule.
21
+ * Aggregates failures from multiple jobs that share the same schedule while
22
+ * preserving each underlying error:
23
+ * - The originals are kept on `this.failures` for typed access.
24
+ * - `this.cause` is set to the only failure (1 job) or an `AggregateError`
25
+ * wrapping all of them (2+ jobs), so `LoggerService.serializeError` can
26
+ * walk the chain and surface every stack/cause.
10
27
  */
11
28
  declare class CronExecutionError extends ApplicationError {
12
- constructor(schedule: string, failedJobsCount: number, jobNames: string);
29
+ readonly failures: readonly CronJobFailure[];
30
+ readonly schedule: string;
31
+ readonly failureCount: number;
32
+ readonly jobs: SerializedJobFailure[];
33
+ constructor(schedule: string, failures: CronJobFailure[]);
13
34
  }
14
35
  //#endregion
15
36
  export { CronExecutionError, type CronJob, CronManager, type RegisteredJob, type ScheduledController };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/cron/errors/cron-execution.error.ts"],"mappings":";;;;;;;;;AAQA;cAAa,kBAAA,SAA2B,gBAAA;cAEtC,QAAA,UACA,eAAA,UACA,QAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/cron/errors/cron-execution.error.ts"],"mappings":";;;;;UAEiB,cAAA;EAChB,GAAA;EACA,KAAA,EAAO,KAAA;AAAA;AAAA,UAGE,oBAAA;EACT,GAAA;EACA,IAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,GAAA;AAAA;;AARA;;;;;;;;;cAqBY,kBAAA,SAA2B,gBAAA;EAAA,SACvB,QAAA,WAAmB,cAAA;EAAA,SACnB,QAAA;EAAA,SACA,YAAA;EAAA,SACA,IAAA,EAAM,oBAAA;cAEV,QAAA,UAAkB,QAAA,EAAU,cAAA;AAAA"}
@@ -1,2 +1,2 @@
1
- import { n as CronExecutionError, t as CronManager } from "../cron-manager-7Symz_TE.mjs";
1
+ import { n as CronExecutionError, t as CronManager } from "../cron-manager-9bpN9bu4.mjs";
2
2
  export { CronExecutionError, CronManager };
@@ -1,20 +1,43 @@
1
- import { H as ApplicationError, k as ERROR_CODES } from "./errors-BdyV5PnY.mjs";
2
- import { a as __decorate, p as Transient } from "./logger-V6Ms3QnQ.mjs";
1
+ import { a as ApplicationError } from "./container-storage-GpNNz79X.mjs";
2
+ import { d as Transient } from "./di-BO1QIb5H.mjs";
3
+ import { t as __decorate } from "./decorate-HgTKAYK8.mjs";
4
+ import { LOGGER_TOKENS } from "./logger/index.mjs";
5
+ import "./errors-BBZTnjdq.mjs";
3
6
  //#region src/cron/errors/cron-execution.error.ts
4
7
  /**
5
- * Error thrown when one or more cron jobs fail execution
8
+ * Error thrown when one or more cron jobs fail execution.
6
9
  *
7
- * This error aggregates failures from multiple jobs that share the same schedule.
10
+ * Aggregates failures from multiple jobs that share the same schedule while
11
+ * preserving each underlying error:
12
+ * - The originals are kept on `this.failures` for typed access.
13
+ * - `this.cause` is set to the only failure (1 job) or an `AggregateError`
14
+ * wrapping all of them (2+ jobs), so `LoggerService.serializeError` can
15
+ * walk the chain and surface every stack/cause.
8
16
  */
9
17
  var CronExecutionError = class extends ApplicationError {
10
- constructor(schedule, failedJobsCount, jobNames) {
11
- super("errors.cronExecutionFailed", ERROR_CODES.SYSTEM.CRON_EXECUTION_FAILED, {
12
- schedule,
13
- count: failedJobsCount,
14
- jobs: jobNames
15
- });
18
+ failures;
19
+ schedule;
20
+ failureCount;
21
+ jobs;
22
+ constructor(schedule, failures) {
23
+ const cause = failures.length === 0 ? void 0 : failures.length === 1 ? failures[0].error : new AggregateError(failures.map((f) => f.error), `${failures.length} cron jobs failed`);
24
+ super(`${failures.length} cron job(s) failed for schedule "${schedule}"`, cause);
25
+ this.failures = failures;
26
+ this.schedule = schedule;
27
+ this.failureCount = failures.length;
28
+ this.jobs = failures.map((f) => serializeFailure(f));
16
29
  }
17
30
  };
31
+ function serializeFailure({ job, error }) {
32
+ const out = {
33
+ job,
34
+ name: error.name,
35
+ message: error.message
36
+ };
37
+ const maybeCoded = error;
38
+ if (maybeCoded.code !== void 0) out.code = maybeCoded.code;
39
+ return out;
40
+ }
18
41
  //#endregion
19
42
  //#region src/cron/cron-manager.ts
20
43
  let CronManager = class CronManager {
@@ -58,7 +81,13 @@ let CronManager = class CronManager {
58
81
  async executeScheduled(controller, container) {
59
82
  const { cron } = controller;
60
83
  const matchingJobs = this.jobs.get(cron) ?? [];
61
- if (matchingJobs.length === 0) return;
84
+ if (matchingJobs.length === 0) {
85
+ container.resolve(LOGGER_TOKENS.LoggerService).warn("No cron jobs matched scheduled trigger", {
86
+ incomingCron: cron,
87
+ registeredSchedules: Array.from(this.jobs.keys())
88
+ });
89
+ return;
90
+ }
62
91
  const errors = [];
63
92
  for (const { jobClass } of matchingJobs) {
64
93
  const jobName = jobClass.name;
@@ -77,10 +106,7 @@ let CronManager = class CronManager {
77
106
  } catch {}
78
107
  }
79
108
  }
80
- if (errors.length > 0) {
81
- const jobNames = errors.map(({ job, error }) => `${job}: ${error.message}`).join("; ");
82
- throw new CronExecutionError(cron, errors.length, jobNames);
83
- }
109
+ if (errors.length > 0) throw new CronExecutionError(cron, errors);
84
110
  }
85
111
  /**
86
112
  * Get all registered jobs for a specific cron expression
@@ -114,4 +140,4 @@ CronManager = __decorate([Transient()], CronManager);
114
140
  //#endregion
115
141
  export { CronExecutionError as n, CronManager as t };
116
142
 
117
- //# sourceMappingURL=cron-manager-7Symz_TE.mjs.map
143
+ //# sourceMappingURL=cron-manager-9bpN9bu4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-manager-9bpN9bu4.mjs","names":[],"sources":["../src/cron/errors/cron-execution.error.ts","../src/cron/cron-manager.ts"],"sourcesContent":["import { ApplicationError } from '../../errors'\n\nexport interface CronJobFailure {\n\tjob: string\n\terror: Error\n}\n\ninterface SerializedJobFailure {\n\tjob: string\n\tname: string\n\tcode?: number | string\n\tmessage: string\n\tdbErrorCode?: string\n\tsql?: string\n}\n\n/**\n * Error thrown when one or more cron jobs fail execution.\n *\n * Aggregates failures from multiple jobs that share the same schedule while\n * preserving each underlying error:\n * - The originals are kept on `this.failures` for typed access.\n * - `this.cause` is set to the only failure (1 job) or an `AggregateError`\n * wrapping all of them (2+ jobs), so `LoggerService.serializeError` can\n * walk the chain and surface every stack/cause.\n */\nexport class CronExecutionError extends ApplicationError {\n\tpublic readonly failures: readonly CronJobFailure[]\n\tpublic readonly schedule: string\n\tpublic readonly failureCount: number\n\tpublic readonly jobs: SerializedJobFailure[]\n\n\tconstructor(schedule: string, failures: CronJobFailure[]) {\n\t\tconst cause =\n\t\t\tfailures.length === 0\n\t\t\t\t? undefined\n\t\t\t\t: failures.length === 1\n\t\t\t\t\t? failures[0].error\n\t\t\t\t\t: new AggregateError(failures.map((f) => f.error), `${failures.length} cron jobs failed`)\n\n\t\tsuper(\n\t\t\t`${failures.length} cron job(s) failed for schedule \"${schedule}\"`,\n\t\t\tcause,\n\t\t)\n\n\t\tthis.failures = failures\n\t\tthis.schedule = schedule\n\t\tthis.failureCount = failures.length\n\t\tthis.jobs = failures.map((f) => serializeFailure(f))\n\t}\n}\n\nfunction serializeFailure({ job, error }: CronJobFailure): SerializedJobFailure {\n\tconst out: SerializedJobFailure = {\n\t\tjob,\n\t\tname: error.name,\n\t\tmessage: error.message,\n\t}\n\tconst maybeCoded = error as { code?: number | string }\n\tif (maybeCoded.code !== undefined) out.code = maybeCoded.code\n\treturn out\n}\n","import type { Container } from '../di/container'\nimport { Transient } from '../di/decorators'\nimport { LOGGER_TOKENS } from '../logger/logger.tokens'\nimport type { LoggerService } from '../logger/services/logger.service'\nimport type { CronJob, RegisteredJob } from './cron-job'\nimport { CronExecutionError } from './errors/cron-execution.error'\n\n/**\n * Manages cron job registration and execution\n *\n * CronManager is a singleton service that:\n * - Registers cron job class references from modules\n * - Routes scheduled events to matching jobs\n * - Resolves jobs from a request-scoped container at execution time\n *\n * Jobs are grouped by their cron expression, allowing multiple jobs\n * to run on the same schedule.\n */\n@Transient()\nexport class CronManager {\n\t/**\n\t * Map of cron expressions to registered job entries\n\t * Key: Cron expression (e.g., '0 2 * * *')\n\t * Value: Array of registered jobs (class ref + schedule)\n\t */\n\tprivate jobs = new Map<string, RegisteredJob[]>()\n\n\t/**\n\t * Register a cron job class\n\t *\n\t * Jobs with the same schedule are grouped together and executed\n\t * sequentially when the trigger fires.\n\t *\n\t * @param schedule - Cron expression (e.g., '0 2 * * *')\n\t * @param jobClass - CronJob class constructor (resolved at execution time)\n\t */\n\tregisterJob(schedule: string, jobClass: RegisteredJob['jobClass']): void {\n\t\tconst existing = this.jobs.get(schedule) ?? []\n\t\texisting.push({ schedule, jobClass })\n\t\tthis.jobs.set(schedule, existing)\n\t}\n\n\t/**\n\t * Execute all jobs matching the triggered cron expression\n\t *\n\t * Jobs are resolved from the provided request-scoped container,\n\t * ensuring dependencies (e.g. database) are properly scoped.\n\t *\n\t * Jobs are executed sequentially. If a job fails:\n\t * - Its onError() hook is called (if defined)\n\t * - Execution continues with the next job\n\t * - Errors are collected and thrown as CronExecutionError\n\t *\n\t * @param controller - Cloudflare ScheduledController\n\t * @param container - Request-scoped container to resolve jobs from\n\t */\n\tasync executeScheduled(controller: ScheduledController, container: Container): Promise<void> {\n\t\tconst { cron } = controller\n\t\tconst matchingJobs = this.jobs.get(cron) ?? []\n\n\t\tif (matchingJobs.length === 0) {\n\t\t\tconst logger = container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n\t\t\tlogger.warn('No cron jobs matched scheduled trigger', {\n\t\t\t\tincomingCron: cron,\n\t\t\t\tregisteredSchedules: Array.from(this.jobs.keys()),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tconst errors: { job: string; error: Error }[] = []\n\n\t\tfor (const { jobClass } of matchingJobs) {\n\t\t\tconst jobName = jobClass.name\n\n\t\t\ttry {\n\t\t\t\t// Register the job class in the request-scoped container so its\n\t\t\t\t// dependencies are resolved from request scope (not the parent).\n\t\t\t\tcontainer.register(jobClass, jobClass)\n\t\t\t\tconst job = container.resolve<CronJob>(jobClass)\n\t\t\t\tawait job.execute(controller)\n\t\t\t} catch (error) {\n\t\t\t\tconst err = error as Error\n\t\t\t\terrors.push({ job: jobName, error: err })\n\n\t\t\t\t// Try to resolve and call onError if possible\n\t\t\t\ttry {\n\t\t\t\t\tconst job = container.resolve<CronJob>(jobClass)\n\t\t\t\t\tif (job.onError) {\n\t\t\t\t\t\tawait job.onError(err, controller)\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// If resolution or onError fails, continue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If any jobs failed, throw an aggregate error so ExceptionHandler logs\n\t\t// it. The full per-job errors are passed through so cause/stacks survive.\n\t\tif (errors.length > 0) {\n\t\t\tthrow new CronExecutionError(cron, errors)\n\t\t}\n\t}\n\n\t/**\n\t * Get all registered jobs for a specific cron expression\n\t *\n\t * @param schedule - Cron expression\n\t * @returns Array of registered jobs, or empty array if none\n\t */\n\tgetJobsForSchedule(schedule: string): RegisteredJob[] {\n\t\treturn this.jobs.get(schedule) ?? []\n\t}\n\n\t/**\n\t * Get all registered cron expressions\n\t *\n\t * @returns Array of unique cron expressions\n\t */\n\tgetAllSchedules(): string[] {\n\t\treturn Array.from(this.jobs.keys())\n\t}\n\n\t/**\n\t * Get total number of registered jobs across all schedules\n\t *\n\t * @returns Total job count\n\t */\n\tgetTotalJobCount(): number {\n\t\tlet count = 0\n\t\tfor (const jobs of this.jobs.values()) {\n\t\t\tcount += jobs.length\n\t\t}\n\t\treturn count\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA0BA,IAAa,qBAAb,cAAwC,iBAAiB;CACxD;CACA;CACA;CACA;CAEA,YAAY,UAAkB,UAA4B;EACzD,MAAM,QACL,SAAS,WAAW,IACjB,KAAA,IACA,SAAS,WAAW,IACnB,SAAS,GAAG,QACZ,IAAI,eAAe,SAAS,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,OAAO,mBAAmB;EAE5F,MACC,GAAG,SAAS,OAAO,oCAAoC,SAAS,IAChE,MACA;EAED,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,eAAe,SAAS;EAC7B,KAAK,OAAO,SAAS,KAAK,MAAM,iBAAiB,EAAE,CAAC;;;AAItD,SAAS,iBAAiB,EAAE,KAAK,SAA+C;CAC/E,MAAM,MAA4B;EACjC;EACA,MAAM,MAAM;EACZ,SAAS,MAAM;EACf;CACD,MAAM,aAAa;CACnB,IAAI,WAAW,SAAS,KAAA,GAAW,IAAI,OAAO,WAAW;CACzD,OAAO;;;;ACzCD,IAAA,cAAA,MAAM,YAAY;;;;;;CAMxB,uBAAe,IAAI,KAA8B;;;;;;;;;;CAWjD,YAAY,UAAkB,UAA2C;EACxE,MAAM,WAAW,KAAK,KAAK,IAAI,SAAS,IAAI,EAAE;EAC9C,SAAS,KAAK;GAAE;GAAU;GAAU,CAAC;EACrC,KAAK,KAAK,IAAI,UAAU,SAAS;;;;;;;;;;;;;;;;CAiBlC,MAAM,iBAAiB,YAAiC,WAAqC;EAC5F,MAAM,EAAE,SAAS;EACjB,MAAM,eAAe,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;EAE9C,IAAI,aAAa,WAAW,GAAG;GAE9B,UADyB,QAAuB,cAAc,cACxD,CAAC,KAAK,0CAA0C;IACrD,cAAc;IACd,qBAAqB,MAAM,KAAK,KAAK,KAAK,MAAM,CAAC;IACjD,CAAC;GACF;;EAGD,MAAM,SAA0C,EAAE;EAElD,KAAK,MAAM,EAAE,cAAc,cAAc;GACxC,MAAM,UAAU,SAAS;GAEzB,IAAI;IAGH,UAAU,SAAS,UAAU,SAAS;IAEtC,MADY,UAAU,QAAiB,SAC9B,CAAC,QAAQ,WAAW;YACrB,OAAO;IACf,MAAM,MAAM;IACZ,OAAO,KAAK;KAAE,KAAK;KAAS,OAAO;KAAK,CAAC;IAGzC,IAAI;KACH,MAAM,MAAM,UAAU,QAAiB,SAAS;KAChD,IAAI,IAAI,SACP,MAAM,IAAI,QAAQ,KAAK,WAAW;YAE5B;;;EAQV,IAAI,OAAO,SAAS,GACnB,MAAM,IAAI,mBAAmB,MAAM,OAAO;;;;;;;;CAU5C,mBAAmB,UAAmC;EACrD,OAAO,KAAK,KAAK,IAAI,SAAS,IAAI,EAAE;;;;;;;CAQrC,kBAA4B;EAC3B,OAAO,MAAM,KAAK,KAAK,KAAK,MAAM,CAAC;;;;;;;CAQpC,mBAA2B;EAC1B,IAAI,QAAQ;EACZ,KAAK,MAAM,QAAQ,KAAK,KAAK,QAAQ,EACpC,SAAS,KAAK;EAEf,OAAO;;;0BAlHR,WAAW,CAAA,EAAA,YAAA"}
@@ -1,18 +1,19 @@
1
- import { Dr as Container } from "./index-D0US0X14.mjs";
2
- import { t as Constructor } from "./types-cySNS_lp.mjs";
1
+ import { Y as Container } from "./index-DEncMcC6.mjs";
2
+ import { t as Constructor } from "./types-BaeHi67f.mjs";
3
3
 
4
4
  //#region src/cron/cron-job.d.ts
5
5
  /**
6
6
  * Interface for cron jobs that can be registered by modules
7
7
  *
8
8
  * Cron jobs are executed when Cloudflare triggers match their schedule.
9
- * Jobs are registered via the module's getCronJobs() method.
9
+ * The `schedule` property must be declared as a **static** field so the
10
+ * framework can read it at registration time without instantiating the class.
10
11
  *
11
12
  * @example
12
13
  * ```typescript
13
14
  * @Transient()
14
15
  * export class DataCleanupJob implements CronJob {
15
- * readonly schedule = '0 2 * * *' // Daily at 2 AM UTC
16
+ * static schedule = '0 2 * * *' // Daily at 2 AM UTC
16
17
  *
17
18
  * constructor(
18
19
  * @inject(LOGGER_TOKENS.LoggerService) private logger: LoggerService,
@@ -36,14 +37,6 @@ interface RegisteredJob {
36
37
  jobClass: Constructor<CronJob>;
37
38
  }
38
39
  interface CronJob {
39
- /**
40
- * Cron expression that triggers this job
41
- *
42
- * Must match a cron trigger defined in wrangler.jsonc
43
- * @example '0 2 * * *' // Daily at 2 AM UTC
44
- * @example '* /15 * * * *' // Every 15 minutes
45
- */
46
- readonly schedule: string;
47
40
  /**
48
41
  * Execute the cron job
49
42
  *
@@ -128,4 +121,4 @@ declare class CronManager {
128
121
  }
129
122
  //#endregion
130
123
  export { CronJob as n, RegisteredJob as r, CronManager as t };
131
- //# sourceMappingURL=cron-manager-BEsH1mjW.d.mts.map
124
+ //# sourceMappingURL=cron-manager-CSTIBPcM.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-manager-CSTIBPcM.d.mts","names":[],"sources":["../src/cron/cron-job.ts","../src/cron/cron-manager.ts"],"mappings":";;;;;;;AA8BA;;;;;;;;;;AAOA;;;;;;;;;;;;;;;UAPiB,aAAA;EAwBP;EAtBT,QAAA;EAsBuB;EApBvB,QAAA,EAAU,WAAA,CAAY,OAAA;AAAA;AAAA,UAGN,OAAA;;;;ACnBjB;;;ED0BC,OAAA,CAAQ,UAAA,EAAY,mBAAA,GAAsB,OAAA;ECYP;;;;;;;;EDFnC,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,mBAAA,GAAsB,OAAA;AAAA;;;;;AAxB1D;;;;;;;;;cCXa,WAAA;EDkBI;;;;;EAAA,QCZR,IAAA;ED6B2B;;;;;;;;;EClBnC,WAAA,CAAY,QAAA,UAAkB,QAAA,EAAU,aAAA;EDkB/B;;;;;;;;;ACpCV;;;;;EAsCO,gBAAA,CAAiB,UAAA,EAAY,mBAAA,EAAqB,SAAA,EAAW,SAAA,GAAY,OAAA;EAAA;;;;;;EAqD/E,kBAAA,CAAmB,QAAA,WAAmB,aAAA;EAzEE;;;;;EAkFxC,eAAA,CAAA;EA9DwD;;;;;EAuExD,gBAAA,CAAA;AAAA"}
@@ -0,0 +1,16 @@
1
+ //#region \0@oxc-project+runtime@0.129.0/helpers/decorateParam.js
2
+ function __decorateParam(paramIndex, decorator) {
3
+ return function(target, key) {
4
+ decorator(target, key, paramIndex);
5
+ };
6
+ }
7
+ //#endregion
8
+ //#region \0@oxc-project+runtime@0.129.0/helpers/decorate.js
9
+ function __decorate(decorators, target, key, desc) {
10
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
11
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
12
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ }
15
+ //#endregion
16
+ export { __decorateParam as n, __decorate as t };
@@ -0,0 +1,18 @@
1
+ //#region src/i18n/utils/deep-merge.ts
2
+ /**
3
+ * Deep merge two objects. Source values override target at leaf level.
4
+ */
5
+ function deepMerge(target, source) {
6
+ const result = { ...target };
7
+ for (const key of Object.keys(source)) {
8
+ const targetValue = target[key];
9
+ const sourceValue = source[key];
10
+ if (typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue) && typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue)) result[key] = deepMerge(targetValue, sourceValue);
11
+ else result[key] = sourceValue;
12
+ }
13
+ return result;
14
+ }
15
+ //#endregion
16
+ export { deepMerge as t };
17
+
18
+ //# sourceMappingURL=deep-merge-C8NgcXw4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge-C8NgcXw4.mjs","names":[],"sources":["../src/i18n/utils/deep-merge.ts"],"sourcesContent":["/**\n * Deep merge two objects. Source values override target at leaf level.\n */\nexport function deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target }\n\n for (const key of Object.keys(source)) {\n const targetValue = target[key]\n const sourceValue = source[key]\n\n if (\n typeof targetValue === 'object'\n && targetValue !== null\n && !Array.isArray(targetValue)\n && typeof sourceValue === 'object'\n && sourceValue !== null\n && !Array.isArray(sourceValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n )\n } else {\n result[key] = sourceValue\n }\n }\n\n return result\n}\n"],"mappings":";;;;AAGA,SAAgB,UACd,QACA,QACyB;CACzB,MAAM,SAAkC,EAAE,GAAG,QAAQ;CAErD,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,EAAE;EACrC,MAAM,cAAc,OAAO;EAC3B,MAAM,cAAc,OAAO;EAE3B,IACE,OAAO,gBAAgB,YACpB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,YAAY,IAC3B,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,YAAY,EAE9B,OAAO,OAAO,UACZ,aACA,YACD;OAED,OAAO,OAAO;;CAIlB,OAAO"}
@@ -1,2 +1,2 @@
1
- import { Ar as container, Br as PredicateContainer, Dr as Container, Fr as singleton, Hr as ExtensionDecorator, Ir as ConditionalBindingBuilder, Lr as ConditionalBindingBuilderImpl, Mr as inject, Nr as injectable, Or as ContainerOptions, Pr as instancePerContainerCachingFactory, Rr as ConditionalBindingGive, Ur as Scope, Vr as ContainerLike, Wr as WhenOptions, _r as DIToken, cr as runWithContainer, dr as Transient, fr as INJECT_PARAM_METADATA_KEY, gr as CONTAINER_TOKEN, hr as getMethodInjections, jr as delay, kr as DependencyContainer, lr as RequestScopeOperationNotAllowedError, mr as ParamInjection, or as containerStorage, pr as InjectParam, sr as getContainer, ur as ConditionalBindingFallbackError, vr as DI_TOKENS, zr as ConditionalBindingUse } from "../index-D0US0X14.mjs";
2
- export { CONTAINER_TOKEN, ConditionalBindingBuilder, ConditionalBindingBuilderImpl, ConditionalBindingFallbackError, ConditionalBindingGive, ConditionalBindingUse, Container, ContainerLike, ContainerOptions, DIToken, DI_TOKENS, DependencyContainer, ExtensionDecorator, INJECT_PARAM_METADATA_KEY, InjectParam, ParamInjection, PredicateContainer, RequestScopeOperationNotAllowedError, Scope, Transient, WhenOptions, container, containerStorage, delay, getContainer, getMethodInjections, inject, injectable, instancePerContainerCachingFactory, runWithContainer, singleton };
1
+ import { $ as ConditionalBindingGive, B as Transient, Bn as LazyToken, F as defineMetadata, Fn as ContainerLike, G as InjectParam, H as getInjectionTokens, Hn as lazy, I as getMetadata, In as ExtensionDecorator, J as ContainerError, K as ParamInjection, L as hasMetadata, Ln as InjectionToken, M as containerStorage, N as getContainer, P as runWithContainer, Q as ConditionalBindingBuilderImpl, R as Request, Rn as Scope, U as inject, V as getClassMetadata, Vn as isLazyToken, W as INJECT_PARAM_METADATA_KEY, X as ContainerOptions, Y as Container, Z as ConditionalBindingBuilder, br as DI_TOKENS, et as ConditionalBindingUse, q as getMethodInjections, tt as PredicateContainer, vr as CONTAINER_TOKEN, yr as DIToken, z as Singleton, zn as WhenOptions } from "../index-DEncMcC6.mjs";
2
+ export { CONTAINER_TOKEN, ConditionalBindingBuilder, ConditionalBindingBuilderImpl, ConditionalBindingGive, ConditionalBindingUse, Container, ContainerError, ContainerLike, ContainerOptions, DIToken, DI_TOKENS, ExtensionDecorator, INJECT_PARAM_METADATA_KEY, InjectParam, InjectionToken, LazyToken, ParamInjection, PredicateContainer, Request, Scope, Singleton, Transient, WhenOptions, containerStorage, defineMetadata, getClassMetadata, getContainer, getInjectionTokens, getMetadata, getMethodInjections, hasMetadata, inject, isLazyToken, lazy, runWithContainer };
package/dist/di/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
- import { A as Scope, B as ConditionalBindingFallbackError, D as runWithContainer, E as getContainer, F as injectable, I as instancePerContainerCachingFactory, L as singleton, M as container, N as delay, P as inject, R as ConditionalBindingBuilderImpl, T as containerStorage, j as Container, z as RequestScopeOperationNotAllowedError } from "../errors-BdyV5PnY.mjs";
2
- import { d as CONTAINER_TOKEN, f as DI_TOKENS, g as getMethodInjections, h as InjectParam, m as INJECT_PARAM_METADATA_KEY, p as Transient } from "../logger-V6Ms3QnQ.mjs";
3
- export { CONTAINER_TOKEN, ConditionalBindingBuilderImpl, ConditionalBindingFallbackError, Container, DI_TOKENS, INJECT_PARAM_METADATA_KEY, InjectParam, RequestScopeOperationNotAllowedError, Scope, Transient, container, containerStorage, delay, getContainer, getMethodInjections, inject, injectable, instancePerContainerCachingFactory, runWithContainer, singleton };
1
+ import { n as getContainer, r as runWithContainer, t as containerStorage } from "../container-storage-GpNNz79X.mjs";
2
+ import { _ as getMethodInjections, a as ContainerError, c as DI_TOKENS, d as Transient, f as getClassMetadata, g as InjectParam, h as INJECT_PARAM_METADATA_KEY, i as ConditionalBindingBuilderImpl, l as Request, m as inject, n as isLazyToken, p as getInjectionTokens, r as lazy, s as CONTAINER_TOKEN, t as Container, u as Singleton, v as Scope } from "../di-BO1QIb5H.mjs";
3
+ import { n as getMetadata, r as hasMetadata, t as defineMetadata } from "../metadata-BVkc4aUu.mjs";
4
+ export { CONTAINER_TOKEN, ConditionalBindingBuilderImpl, Container, ContainerError, DI_TOKENS, INJECT_PARAM_METADATA_KEY, InjectParam, Request, Scope, Singleton, Transient, containerStorage, defineMetadata, getClassMetadata, getContainer, getInjectionTokens, getMetadata, getMethodInjections, hasMetadata, inject, isLazyToken, lazy, runWithContainer };