stratal 0.0.22 → 0.0.24

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 (270) hide show
  1. package/README.md +1 -1
  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 +41 -54
  5. package/dist/bin/quarry.mjs.map +1 -1
  6. package/dist/cache/index.d.mts +5 -3
  7. package/dist/cache/index.d.mts.map +1 -1
  8. package/dist/cache/index.mjs +123 -39
  9. package/dist/cache/index.mjs.map +1 -1
  10. package/dist/{cache.service-e34gV6tz.d.mts → cache.service-uElmBtdS.d.mts} +24 -34
  11. package/dist/cache.service-uElmBtdS.d.mts.map +1 -0
  12. package/dist/{command-BU4ApTo5.mjs → command-BvmUAPPQ.mjs} +15 -3
  13. package/dist/command-BvmUAPPQ.mjs.map +1 -0
  14. package/dist/{command-wXfvHbBZ.d.mts → command-CPhFHjG3.d.mts} +2 -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 +3 -3
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +7 -6
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-DHQtypr1.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-GpNNz79X.mjs → container-storage-BmOJ4_Na.mjs} +1 -1
  25. package/dist/{container-storage-GpNNz79X.mjs.map → container-storage-BmOJ4_Na.mjs.map} +1 -1
  26. package/dist/{controller.decorator-DIUazNU7.mjs → controller.decorator-C5UVeJS3.mjs} +4 -4
  27. package/dist/{controller.decorator-DIUazNU7.mjs.map → controller.decorator-C5UVeJS3.mjs.map} +1 -1
  28. package/dist/cron/index.d.mts +79 -4
  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-9bpN9bu4.mjs → cron.module-Bgzq5hiT.mjs} +17 -7
  34. package/dist/cron.module-Bgzq5hiT.mjs.map +1 -0
  35. package/dist/{decorate-HgTKAYK8.mjs → decorate-CuAoSZvs.mjs} +2 -2
  36. package/dist/{deep-merge-C8NgcXw4.mjs → deep-merge-ByiAOZ3r.mjs} +1 -1
  37. package/dist/{deep-merge-C8NgcXw4.mjs.map → deep-merge-ByiAOZ3r.mjs.map} +1 -1
  38. package/dist/di/index.d.mts +2 -2
  39. package/dist/di/index.mjs +3 -3
  40. package/dist/{di-BO1QIb5H.mjs → di-DseMn-z9.mjs} +244 -135
  41. package/dist/di-DseMn-z9.mjs.map +1 -0
  42. package/dist/email/index.d.mts +33 -40
  43. package/dist/email/index.d.mts.map +1 -1
  44. package/dist/email/index.mjs +456 -41
  45. package/dist/email/index.mjs.map +1 -1
  46. package/dist/{en-BPP6h6y5.mjs → en-CDZBMcc1.mjs} +2 -2
  47. package/dist/{en-BPP6h6y5.mjs.map → en-CDZBMcc1.mjs.map} +1 -1
  48. package/dist/{env-DKSbuBi5.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 +1 -1
  51. package/dist/errors/index.mjs +3 -3
  52. package/dist/{errors-BBZTnjdq.mjs → errors-mXYxG0XB.mjs} +5 -5
  53. package/dist/{errors-BBZTnjdq.mjs.map → errors-mXYxG0XB.mjs.map} +1 -1
  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-D1KdDaiP.mjs → events-BXJGZjpG.mjs} +16 -6
  58. package/dist/events-BXJGZjpG.mjs.map +1 -0
  59. package/dist/{exception-context-B4kM-M53.mjs → exception-context-kEoMFwze.mjs} +3 -3
  60. package/dist/{exception-context-B4kM-M53.mjs.map → exception-context-kEoMFwze.mjs.map} +1 -1
  61. package/dist/{gateway-context-CFe6a9gz.mjs → gateway-context-TMu_AlJt.mjs} +25 -6
  62. package/dist/{gateway-context-CFe6a9gz.mjs.map → gateway-context-TMu_AlJt.mjs.map} +1 -1
  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-Ced-uNIF.mjs → guards-DALPXy3_.mjs} +2 -2
  67. package/dist/{guards-Ced-uNIF.mjs.map → guards-DALPXy3_.mjs.map} +1 -1
  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-CdjKFJZZ.mjs → http-method.decorator-ByWZb9DO.mjs} +4 -4
  71. package/dist/{http-method.decorator-CdjKFJZZ.mjs.map → http-method.decorator-ByWZb9DO.mjs.map} +1 -1
  72. package/dist/i18n/index.d.mts +4 -4
  73. package/dist/i18n/index.d.mts.map +1 -1
  74. package/dist/i18n/index.mjs +5 -5
  75. package/dist/i18n/index.mjs.map +1 -1
  76. package/dist/i18n/messages/en/index.d.mts +1 -1
  77. package/dist/i18n/messages/en/index.mjs +1 -1
  78. package/dist/i18n/utils/index.mjs +1 -1
  79. package/dist/i18n/validation/index.d.mts +3 -3
  80. package/dist/i18n/validation/index.mjs +3 -3
  81. package/dist/{i18n.module-BlXrtAlV.mjs → i18n.module-DRQAZoSZ.mjs} +14 -11
  82. package/dist/{i18n.module-BlXrtAlV.mjs.map → i18n.module-DRQAZoSZ.mjs.map} +1 -1
  83. package/dist/{i18n.tokens-hwRpmjRq.mjs → i18n.tokens-CZ_v8oyS.mjs} +1 -1
  84. package/dist/{i18n.tokens-hwRpmjRq.mjs.map → i18n.tokens-CZ_v8oyS.mjs.map} +1 -1
  85. package/dist/{index-B4UBK-2T.d.mts → index-0ItCjaqw.d.mts} +1 -1
  86. package/dist/index-0ItCjaqw.d.mts.map +1 -0
  87. package/dist/{index-CW1YHSft.d.mts → index-B5JBRcWD.d.mts} +249 -103
  88. package/dist/index-B5JBRcWD.d.mts.map +1 -0
  89. package/dist/{index-BtlE9RuO.d.mts → index-BUt92sAE.d.mts} +1 -1
  90. package/dist/index-BUt92sAE.d.mts.map +1 -0
  91. package/dist/{index-DEncMcC6.d.mts → index-B_JoEl3V.d.mts} +221 -16
  92. package/dist/index-B_JoEl3V.d.mts.map +1 -0
  93. package/dist/{index-Dj5IMwtr.d.mts → index-DtBNIFuP.d.mts} +4 -6
  94. package/dist/index-DtBNIFuP.d.mts.map +1 -0
  95. package/dist/{index-KMgSCSM7.d.mts → index-HgOLNruQ.d.mts} +1 -1
  96. package/dist/{index-KMgSCSM7.d.mts.map → index-HgOLNruQ.d.mts.map} +1 -1
  97. package/dist/index.d.mts +6 -5
  98. package/dist/index.mjs +3 -2
  99. package/dist/{is-command-CX5rAfZW.mjs → is-command-CEPO9n8c.mjs} +2 -2
  100. package/dist/{is-command-CX5rAfZW.mjs.map → is-command-CEPO9n8c.mjs.map} +1 -1
  101. package/dist/{is-seeder-CYCtELlm.mjs → is-seeder-Gvh_AM71.mjs} +1 -1
  102. package/dist/{is-seeder-CYCtELlm.mjs.map → is-seeder-Gvh_AM71.mjs.map} +1 -1
  103. package/dist/lazy-module-loader-Ib383jH_.d.mts +60 -0
  104. package/dist/lazy-module-loader-Ib383jH_.d.mts.map +1 -0
  105. package/dist/locale-path.service-D-dHiIPc.mjs +165 -0
  106. package/dist/locale-path.service-D-dHiIPc.mjs.map +1 -0
  107. package/dist/locale-url-nZrZxqJP.mjs +44 -0
  108. package/dist/locale-url-nZrZxqJP.mjs.map +1 -0
  109. package/dist/locale-url.service-C2EWmGdq.mjs +41 -0
  110. package/dist/locale-url.service-C2EWmGdq.mjs.map +1 -0
  111. package/dist/logger/index.d.mts +1 -1
  112. package/dist/logger/index.mjs +2 -2
  113. package/dist/logger/index.mjs.map +1 -1
  114. package/dist/macroable/index.d.mts +2 -2
  115. package/dist/macroable/index.mjs +1 -1
  116. package/dist/{macroable-DzlfzT50.mjs → macroable-cvDTFZ_A.mjs} +1 -1
  117. package/dist/{macroable-DzlfzT50.mjs.map → macroable-cvDTFZ_A.mjs.map} +1 -1
  118. package/dist/{metadata-BVkc4aUu.mjs → metadata-DzzprcID.mjs} +1 -1
  119. package/dist/{metadata-BVkc4aUu.mjs.map → metadata-DzzprcID.mjs.map} +1 -1
  120. package/dist/module/index.d.mts +4 -3
  121. package/dist/module/index.d.mts.map +1 -1
  122. package/dist/module/index.mjs +10 -2
  123. package/dist/module/index.mjs.map +1 -0
  124. package/dist/{module-xYoHba6B.mjs → module-registry-Dm-pqHd3.mjs} +189 -57
  125. package/dist/module-registry-Dm-pqHd3.mjs.map +1 -0
  126. package/dist/module.decorator-CYHY6pG5.mjs +19 -0
  127. package/dist/module.decorator-CYHY6pG5.mjs.map +1 -0
  128. package/dist/openapi/index.d.mts +44 -8
  129. package/dist/openapi/index.d.mts.map +1 -1
  130. package/dist/openapi/index.mjs +3 -2
  131. package/dist/{openapi-C6lm0RmV.mjs → openapi-CstuTM8S.mjs} +55 -229
  132. package/dist/openapi-CstuTM8S.mjs.map +1 -0
  133. package/dist/openapi-tools.service-BC5EC3R3.mjs +206 -0
  134. package/dist/openapi-tools.service-BC5EC3R3.mjs.map +1 -0
  135. package/dist/{openapi.service-CrLlsXAd.d.mts → openapi.service-YhTiJ1bO.d.mts} +3 -3
  136. package/dist/{openapi.service-CrLlsXAd.d.mts.map → openapi.service-YhTiJ1bO.d.mts.map} +1 -1
  137. package/dist/quarry/index.d.mts +14 -5
  138. package/dist/quarry/index.d.mts.map +1 -1
  139. package/dist/quarry/index.mjs +6 -5
  140. package/dist/quarry/runner.d.mts +11 -11
  141. package/dist/quarry/runner.d.mts.map +1 -1
  142. package/dist/quarry/runner.mjs +192 -22
  143. package/dist/quarry/runner.mjs.map +1 -1
  144. package/dist/{quarry-registry-D4hIGScf.d.mts → quarry-registry-CXg0RFXq.d.mts} +4 -4
  145. package/dist/quarry-registry-CXg0RFXq.d.mts.map +1 -0
  146. package/dist/{quarry-registry-DkraZNwn.mjs → quarry.module-BuRPGMDm.mjs} +22 -21
  147. package/dist/quarry.module-BuRPGMDm.mjs.map +1 -0
  148. package/dist/queue/index.d.mts +3 -3
  149. package/dist/queue/index.mjs +42 -31
  150. package/dist/queue/index.mjs.map +1 -1
  151. package/dist/queue.module-nddvxzCB.mjs +613 -0
  152. package/dist/queue.module-nddvxzCB.mjs.map +1 -0
  153. package/dist/queue.tokens-DjHnFmre.mjs +11 -0
  154. package/dist/queue.tokens-DjHnFmre.mjs.map +1 -0
  155. package/dist/{r2-storage.provider-Hfm6LdZQ.mjs → r2-storage.provider-DCxQt9dD.mjs} +4 -4
  156. package/dist/{r2-storage.provider-Hfm6LdZQ.mjs.map → r2-storage.provider-DCxQt9dD.mjs.map} +1 -1
  157. package/dist/{rate-limit.decorator-D69zdZbp.mjs → rate-limit.decorator-BPAie_p3.mjs} +3 -3
  158. package/dist/{rate-limit.decorator-D69zdZbp.mjs.map → rate-limit.decorator-BPAie_p3.mjs.map} +1 -1
  159. package/dist/rate-limiter/index.d.mts +5 -5
  160. package/dist/rate-limiter/index.d.mts.map +1 -1
  161. package/dist/rate-limiter/index.mjs +26 -21
  162. package/dist/rate-limiter/index.mjs.map +1 -1
  163. package/dist/route-name-DGoBOfPg.mjs +171 -0
  164. package/dist/route-name-DGoBOfPg.mjs.map +1 -0
  165. package/dist/route-registration.service-D6vSwiKP.mjs +918 -0
  166. package/dist/route-registration.service-D6vSwiKP.mjs.map +1 -0
  167. package/dist/route-registry-CYqLp2Nj.mjs +123 -0
  168. package/dist/route-registry-CYqLp2Nj.mjs.map +1 -0
  169. package/dist/router/index.d.mts +2 -2
  170. package/dist/router/index.mjs +18 -8
  171. package/dist/router-CWGBD-Bg.mjs +78 -0
  172. package/dist/router-CWGBD-Bg.mjs.map +1 -0
  173. package/dist/router-resolver-D4YlPNlm.mjs +88 -0
  174. package/dist/router-resolver-D4YlPNlm.mjs.map +1 -0
  175. package/dist/seeder/index.d.mts +14 -4
  176. package/dist/seeder/index.d.mts.map +1 -1
  177. package/dist/seeder/index.mjs +5 -3
  178. package/dist/{seeder-BADTig4n.mjs → seeder-7ubkms-Y.mjs} +7 -56
  179. package/dist/seeder-7ubkms-Y.mjs.map +1 -0
  180. package/dist/seeder-registry-CyUmKsJq.mjs +57 -0
  181. package/dist/seeder-registry-CyUmKsJq.mjs.map +1 -0
  182. package/dist/seeder.module-CYYwk3Qk.mjs +15 -0
  183. package/dist/seeder.module-CYYwk3Qk.mjs.map +1 -0
  184. package/dist/{signed-url-BqUqt5dF.mjs → signed-url-DIU0sK_6.mjs} +1 -1
  185. package/dist/{signed-url-BqUqt5dF.mjs.map → signed-url-DIU0sK_6.mjs.map} +1 -1
  186. package/dist/storage/index.d.mts +3 -3
  187. package/dist/storage/index.d.mts.map +1 -1
  188. package/dist/storage/index.mjs +2 -2
  189. package/dist/storage/providers/index.d.mts +2 -2
  190. package/dist/storage/providers/index.d.mts.map +1 -1
  191. package/dist/storage/providers/index.mjs +1 -1
  192. package/dist/{storage-BA3ppVYM.mjs → storage-MDZypIE9.mjs} +12 -11
  193. package/dist/{storage-BA3ppVYM.mjs.map → storage-MDZypIE9.mjs.map} +1 -1
  194. package/dist/{storage-provider.interface-DQMtT42e.d.mts → storage-provider.interface-ClUwxz4S.d.mts} +2 -2
  195. package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +1 -0
  196. package/dist/storage.error-Dnib4VHc.mjs +8 -0
  197. package/dist/{storage.error-C6FY037a.mjs.map → storage.error-Dnib4VHc.mjs.map} +1 -1
  198. package/dist/{stratal-Bdq4IdB3.mjs → stratal-DL9M38_s.mjs} +142 -140
  199. package/dist/stratal-DL9M38_s.mjs.map +1 -0
  200. package/dist/{stratal-BsKmvP6J.d.mts → stratal-DwDJPY9N.d.mts} +3 -3
  201. package/dist/{stratal-BsKmvP6J.d.mts.map → stratal-DwDJPY9N.d.mts.map} +1 -1
  202. package/dist/tiered-cache.service-Dv3BhxxE.d.mts +79 -0
  203. package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +1 -0
  204. package/dist/trailing-slash-CFyw8nYu.mjs +34 -0
  205. package/dist/trailing-slash-CFyw8nYu.mjs.map +1 -0
  206. package/dist/{types-BaeHi67f.d.mts → types-CmV_9xBD.d.mts} +1 -1
  207. package/dist/types-CmV_9xBD.d.mts.map +1 -0
  208. package/dist/uri-h7Q8Jug9.mjs +251 -0
  209. package/dist/uri-h7Q8Jug9.mjs.map +1 -0
  210. package/dist/{usage-generator-DTqaUMR9.mjs → usage-generator-DAWYasuP.mjs} +4 -4
  211. package/dist/usage-generator-DAWYasuP.mjs.map +1 -0
  212. package/dist/{validation-DUzcjb8Q.mjs → validation-CpOjviyT.mjs} +6 -6
  213. package/dist/{validation-DUzcjb8Q.mjs.map → validation-CpOjviyT.mjs.map} +1 -1
  214. package/dist/{validation.context-XTysWJ3b.mjs → validation.context-CRvmrhq7.mjs} +3 -3
  215. package/dist/{validation.context-XTysWJ3b.mjs.map → validation.context-CRvmrhq7.mjs.map} +1 -1
  216. package/dist/versioning.service-C6aHky8-.mjs +36 -0
  217. package/dist/versioning.service-C6aHky8-.mjs.map +1 -0
  218. package/dist/websocket/index.d.mts +11 -2
  219. package/dist/websocket/index.d.mts.map +1 -1
  220. package/dist/websocket/index.mjs +1 -1
  221. package/dist/workers/index.d.mts +2 -2
  222. package/dist/workers/index.d.mts.map +1 -1
  223. package/dist/workers/index.mjs +3 -3
  224. package/dist/workers/index.mjs.map +1 -1
  225. package/dist/{zod-hMa3rSHV.mjs → zod-eKqqhZ5_.mjs} +2 -2
  226. package/dist/{zod-hMa3rSHV.mjs.map → zod-eKqqhZ5_.mjs.map} +1 -1
  227. package/dist/{zod-DvWTfRpI.d.mts → zod-wecrEVAs.d.mts} +8 -3
  228. package/dist/zod-wecrEVAs.d.mts.map +1 -0
  229. package/package.json +19 -30
  230. package/dist/base-email.provider-BWZHIjt8.mjs +0 -42
  231. package/dist/base-email.provider-BWZHIjt8.mjs.map +0 -1
  232. package/dist/cache.service-e34gV6tz.d.mts.map +0 -1
  233. package/dist/cache.tokens-ovi_c52J.mjs +0 -6
  234. package/dist/cache.tokens-ovi_c52J.mjs.map +0 -1
  235. package/dist/colors-axmupKdp.mjs +0 -16
  236. package/dist/colors-axmupKdp.mjs.map +0 -1
  237. package/dist/command-BU4ApTo5.mjs.map +0 -1
  238. package/dist/command-wXfvHbBZ.d.mts.map +0 -1
  239. package/dist/consumer-registry-DHQtypr1.d.mts.map +0 -1
  240. package/dist/cron-manager-9bpN9bu4.mjs.map +0 -1
  241. package/dist/cron-manager-CSTIBPcM.d.mts +0 -124
  242. package/dist/cron-manager-CSTIBPcM.d.mts.map +0 -1
  243. package/dist/di-BO1QIb5H.mjs.map +0 -1
  244. package/dist/env-DKSbuBi5.d.mts.map +0 -1
  245. package/dist/events-D1KdDaiP.mjs.map +0 -1
  246. package/dist/index-B4UBK-2T.d.mts.map +0 -1
  247. package/dist/index-BtlE9RuO.d.mts.map +0 -1
  248. package/dist/index-CW1YHSft.d.mts.map +0 -1
  249. package/dist/index-DEncMcC6.d.mts.map +0 -1
  250. package/dist/index-Dj5IMwtr.d.mts.map +0 -1
  251. package/dist/module-xYoHba6B.mjs.map +0 -1
  252. package/dist/openapi-C6lm0RmV.mjs.map +0 -1
  253. package/dist/quarry-registry-D4hIGScf.d.mts.map +0 -1
  254. package/dist/quarry-registry-DkraZNwn.mjs.map +0 -1
  255. package/dist/queue.module-DeWJ0tQM.mjs +0 -355
  256. package/dist/queue.module-DeWJ0tQM.mjs.map +0 -1
  257. package/dist/resend.provider-Ur6tU7fK.mjs +0 -68
  258. package/dist/resend.provider-Ur6tU7fK.mjs.map +0 -1
  259. package/dist/router-Cy6DjkvP.mjs +0 -1852
  260. package/dist/router-Cy6DjkvP.mjs.map +0 -1
  261. package/dist/seeder-BADTig4n.mjs.map +0 -1
  262. package/dist/smtp.provider-C129sNBT.mjs +0 -76
  263. package/dist/smtp.provider-C129sNBT.mjs.map +0 -1
  264. package/dist/storage-provider.interface-DQMtT42e.d.mts.map +0 -1
  265. package/dist/storage.error-C6FY037a.mjs +0 -8
  266. package/dist/stratal-Bdq4IdB3.mjs.map +0 -1
  267. package/dist/types-BaeHi67f.d.mts.map +0 -1
  268. package/dist/usage-generator-DTqaUMR9.mjs.map +0 -1
  269. package/dist/zod-DvWTfRpI.d.mts.map +0 -1
  270. /package/dist/{chunk-D1SwGrFN.mjs → chunk-BBjsoOtd.mjs} +0 -0
@@ -1,6 +1,6 @@
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";
1
+ import { c as Transient } from "./di-DseMn-z9.mjs";
2
+ import { n as getMetadata, t as defineMetadata } from "./metadata-DzzprcID.mjs";
3
+ import { u as ROUTE_METADATA_KEYS } from "./exception-context-kEoMFwze.mjs";
4
4
  //#region src/router/decorators/controller.decorator.ts
5
5
  const CONTROLLER_ROUTE_KEY = ROUTE_METADATA_KEYS.CONTROLLER_ROUTE;
6
6
  /**
@@ -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-DIUazNU7.mjs.map
66
+ //# sourceMappingURL=controller.decorator-C5UVeJS3.mjs.map
@@ -1 +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
+ {"version":3,"file":"controller.decorator-C5UVeJS3.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,UAAU,EAAE,MAAM;EAGlB,eAAe,sBAAsB,OAAO,MAAM;EAGlD,IAAI,SACF,eAAe,oBAAoB,oBAAoB,SAAS,MAAM;EAGxE,OAAO;CACT;AACF;;;;;;;AAQA,SAAgB,mBAAmB,QAAoC;CAIrE,OAAO,YAAoB,sBADJ,OAAO,WAAW,aAAa,SAAU,OAAmC,WACpC;AACjE;;;;;;;AAQA,SAAgB,qBAAqB,QAA+C;CAClF,MAAM,iBAAiB,OAAO,WAAW,aAAa,SAAU,OAAmC;CACnG,OAAO,YAA+B,oBAAoB,oBAAoB,cAAc;AAC9F;;;;;;;AAQA,SAAgB,qBAAqB,QAA8C;CAEjF,OADgB,qBAAqB,MACxB,GAAG;AAClB"}
@@ -1,7 +1,82 @@
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
- import { ScheduledController } from "@cloudflare/workers-types";
1
+ import { Dr as ApplicationError, Y as Container } from "../index-B_JoEl3V.mjs";
2
+ import { n as RegisteredJob, t as CronJob } from "../cron-job-NesZRk8F.mjs";
3
+ import { ScheduledController as ScheduledController$1 } from "@cloudflare/workers-types";
4
4
 
5
+ //#region src/cron/cron-manager.d.ts
6
+ /**
7
+ * Manages cron job registration and execution
8
+ *
9
+ * CronManager is a singleton service that:
10
+ * - Registers cron job class references from modules
11
+ * - Routes scheduled events to matching jobs
12
+ * - Resolves jobs from a request-scoped container at execution time
13
+ *
14
+ * Jobs are grouped by their cron expression, allowing multiple jobs
15
+ * to run on the same schedule.
16
+ */
17
+ declare class CronManager {
18
+ /**
19
+ * Map of cron expressions to registered job entries
20
+ * Key: Cron expression (e.g., '0 2 * * *')
21
+ * Value: Array of registered jobs (class ref + schedule)
22
+ */
23
+ private jobs;
24
+ /**
25
+ * Register a cron job class
26
+ *
27
+ * Jobs with the same schedule are grouped together and executed
28
+ * sequentially when the trigger fires.
29
+ *
30
+ * @param schedule - Cron expression (e.g., '0 2 * * *')
31
+ * @param jobClass - CronJob class constructor (resolved at execution time)
32
+ */
33
+ registerJob(schedule: string, jobClass: RegisteredJob['jobClass']): void;
34
+ /**
35
+ * Execute all jobs matching the triggered cron expression
36
+ *
37
+ * Jobs are resolved from the provided request-scoped container,
38
+ * ensuring dependencies (e.g. database) are properly scoped.
39
+ *
40
+ * Jobs are executed sequentially. If a job fails:
41
+ * - Its onError() hook is called (if defined)
42
+ * - Execution continues with the next job
43
+ * - Errors are collected and thrown as CronExecutionError
44
+ *
45
+ * @param controller - Cloudflare ScheduledController
46
+ * @param container - Request-scoped container to resolve jobs from
47
+ */
48
+ executeScheduled(controller: ScheduledController, container: Container): Promise<void>;
49
+ /**
50
+ * Get all registered jobs for a specific cron expression
51
+ *
52
+ * @param schedule - Cron expression
53
+ * @returns Array of registered jobs, or empty array if none
54
+ */
55
+ getJobsForSchedule(schedule: string): RegisteredJob[];
56
+ /**
57
+ * Get all registered cron expressions
58
+ *
59
+ * @returns Array of unique cron expressions
60
+ */
61
+ getAllSchedules(): string[];
62
+ /**
63
+ * Get total number of registered jobs across all schedules
64
+ *
65
+ * @returns Total job count
66
+ */
67
+ getTotalJobCount(): number;
68
+ }
69
+ //#endregion
70
+ //#region src/cron/cron.module.d.ts
71
+ /**
72
+ * Registers the cron manager (`DI_TOKENS.Cron`).
73
+ *
74
+ * Lazy: loaded on demand via `await import()` — by `Application.ensureCron`
75
+ * (first scheduled trigger, or at bootstrap when the app declares jobs) and by
76
+ * the `schedule:list` command. Kept out of cold start for apps without cron.
77
+ */
78
+ declare class CronModule {}
79
+ //#endregion
5
80
  //#region src/cron/errors/cron-execution.error.d.ts
6
81
  interface CronJobFailure {
7
82
  job: string;
@@ -33,5 +108,5 @@ declare class CronExecutionError extends ApplicationError {
33
108
  constructor(schedule: string, failures: CronJobFailure[]);
34
109
  }
35
110
  //#endregion
36
- export { CronExecutionError, type CronJob, CronManager, type RegisteredJob, type ScheduledController };
111
+ export { CronExecutionError, type CronJob, CronManager, CronModule, type RegisteredJob, type ScheduledController$1 as ScheduledController };
37
112
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/cron/cron-manager.ts","../../src/cron/cron.module.ts","../../src/cron/errors/cron-execution.error.ts"],"mappings":";;;;;;;;AAmBA;;;;;;;;cACa,WAAA;EA0FuC;;;;;EAAA,QApF3C,IAAA;EA+BF;;;;;;;;;EApBN,WAAA,CAAY,QAAA,UAAkB,QAAA,EAAU,aAAA;EA2FxC;;AAAgB;;;;ACrHjB;;;;AAKuB;;;;EDyChB,gBAAA,CAAiB,UAAA,EAAY,mBAAA,EAAqB,SAAA,EAAW,SAAA,GAAY,OAAA;EEvDjD;;;;;;EF4G9B,kBAAA,CAAmB,QAAA,WAAmB,aAAA;EE1G1B;AACZ;;;;EFkHA,eAAA;EE9GA;;;;;EFuHA,gBAAA;AAAA;;;;;;;;AA7GD;;cCHa,UAAA;;;UCdI,cAAA;EAChB,GAAA;EACA,KAAA,EAAO,KAAK;AAAA;AAAA,UAGH,oBAAA;EACT,GAAA;EACA,IAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,GAAA;AAAA;;;;;;;;;;;cAaY,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-9bpN9bu4.mjs";
2
- export { CronExecutionError, CronManager };
1
+ import { i as CronExecutionError, r as CronManager, t as CronModule } from "../cron.module-Bgzq5hiT.mjs";
2
+ export { CronExecutionError, CronManager, CronModule };
@@ -0,0 +1,58 @@
1
+ import { t as Constructor } from "./types-CmV_9xBD.mjs";
2
+
3
+ //#region src/cron/cron-job.d.ts
4
+ /**
5
+ * Interface for cron jobs that can be registered by modules
6
+ *
7
+ * Cron jobs are executed when Cloudflare triggers match their schedule.
8
+ * The `schedule` property must be declared as a **static** field so the
9
+ * framework can read it at registration time without instantiating the class.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * @Transient()
14
+ * export class DataCleanupJob implements CronJob {
15
+ * static schedule = '0 2 * * *' // Daily at 2 AM UTC
16
+ *
17
+ * constructor(
18
+ * @inject(LOGGER_TOKENS.LoggerService) private logger: LoggerService,
19
+ * ) {}
20
+ *
21
+ * async execute(controller: ScheduledController): Promise<void> {
22
+ * this.logger.info('Running data cleanup')
23
+ * await this.cleanupExpiredData()
24
+ * }
25
+ *
26
+ * async onError(error: Error): Promise<void> {
27
+ * this.logger.error('Data cleanup failed', { error: error.message })
28
+ * }
29
+ * }
30
+ * ```
31
+ */
32
+ interface RegisteredJob {
33
+ /** The cron schedule expression */
34
+ schedule: string;
35
+ /** The job class constructor (resolved from container at execution time) */
36
+ jobClass: Constructor<CronJob>;
37
+ }
38
+ interface CronJob {
39
+ /**
40
+ * Execute the cron job
41
+ *
42
+ * @param controller - Cloudflare ScheduledController with scheduledTime and cron
43
+ * @throws ApplicationError for expected errors
44
+ */
45
+ execute(controller: ScheduledController): Promise<void>;
46
+ /**
47
+ * Optional error handler for job execution failures
48
+ *
49
+ * If not provided, errors are logged via ExceptionHandler
50
+ *
51
+ * @param error - Error that occurred during execution
52
+ * @param controller - Cloudflare ScheduledController
53
+ */
54
+ onError?(error: Error, controller: ScheduledController): Promise<void>;
55
+ }
56
+ //#endregion
57
+ export { RegisteredJob as n, CronJob as t };
58
+ //# sourceMappingURL=cron-job-NesZRk8F.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-job-NesZRk8F.d.mts","names":[],"sources":["../src/cron/cron-job.ts"],"mappings":";;;;;AA8BA;;;;;;;;;AAI8B;AAG9B;;;;;;;;;;;;;;;;UAPiB,aAAA;EAwBmB;EAtBnC,QAAA;EAsByD;EApBzD,QAAA,EAAU,WAAW,CAAC,OAAA;AAAA;AAAA,UAGN,OAAA;;;;;;;EAOhB,OAAA,CAAQ,UAAA,EAAY,mBAAA,GAAsB,OAAA;;;;;;;;;EAU1C,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,mBAAA,GAAsB,OAAA;AAAA"}
@@ -1,8 +1,10 @@
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";
1
+ import { t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { r as DI_TOKENS, s as Singleton } from "./di-DseMn-z9.mjs";
3
+ import { a as ApplicationError } from "./container-storage-BmOJ4_Na.mjs";
4
+ import { t as __decorate } from "./decorate-CuAoSZvs.mjs";
4
5
  import { LOGGER_TOKENS } from "./logger/index.mjs";
5
- import "./errors-BBZTnjdq.mjs";
6
+ import "./errors-mXYxG0XB.mjs";
7
+ import { n as Module } from "./module.decorator-CYHY6pG5.mjs";
6
8
  //#region src/cron/errors/cron-execution.error.ts
7
9
  /**
8
10
  * Error thrown when one or more cron jobs fail execution.
@@ -136,8 +138,16 @@ let CronManager = class CronManager {
136
138
  return count;
137
139
  }
138
140
  };
139
- CronManager = __decorate([Transient()], CronManager);
141
+ CronManager = __decorate([Singleton(DI_TOKENS.Cron)], CronManager);
140
142
  //#endregion
141
- export { CronExecutionError as n, CronManager as t };
143
+ //#region src/cron/cron.module.ts
144
+ var cron_module_exports = /* @__PURE__ */ __exportAll({ CronModule: () => CronModule });
145
+ let CronModule = class CronModule {};
146
+ CronModule = __decorate([Module({ providers: [{
147
+ provide: DI_TOKENS.Cron,
148
+ useClass: CronManager
149
+ }] })], CronModule);
150
+ //#endregion
151
+ export { CronExecutionError as i, cron_module_exports as n, CronManager as r, CronModule as t };
142
152
 
143
- //# sourceMappingURL=cron-manager-9bpN9bu4.mjs.map
153
+ //# sourceMappingURL=cron.module-Bgzq5hiT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.module-Bgzq5hiT.mjs","names":[],"sources":["../src/cron/errors/cron-execution.error.ts","../src/cron/cron-manager.ts","../src/cron/cron.module.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 { Singleton } from '../di/decorators'\nimport { DI_TOKENS } from '../di/tokens'\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@Singleton(DI_TOKENS.Cron)\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","import { DI_TOKENS } from '../di/tokens'\nimport { Module } from '../module/module.decorator'\nimport { CronManager } from './cron-manager'\n\n/**\n * Registers the cron manager (`DI_TOKENS.Cron`).\n *\n * Lazy: loaded on demand via `await import()` — by `Application.ensureCron`\n * (first scheduled trigger, or at bootstrap when the app declares jobs) and by\n * the `schedule:list` command. Kept out of cold start for apps without cron.\n */\n@Module({\n providers: [\n { provide: DI_TOKENS.Cron, useClass: CronManager },\n ],\n})\nexport class CronModule { }\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,KAAK,GAAG,GAAG,SAAS,OAAO,kBAAkB;EAE3F,MACC,GAAG,SAAS,OAAO,oCAAoC,SAAS,IAChE,KACD;EAEA,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,eAAe,SAAS;EAC7B,KAAK,OAAO,SAAS,KAAK,MAAM,iBAAiB,CAAC,CAAC;CACpD;AACD;AAEA,SAAS,iBAAiB,EAAE,KAAK,SAA+C;CAC/E,MAAM,MAA4B;EACjC;EACA,MAAM,MAAM;EACZ,SAAS,MAAM;CAChB;CACA,MAAM,aAAa;CACnB,IAAI,WAAW,SAAS,KAAA,GAAW,IAAI,OAAO,WAAW;CACzD,OAAO;AACR;;;ACzCO,IAAA,cAAA,MAAM,YAAY;;;;;;CAMxB,uBAAe,IAAI,IAA6B;;;;;;;;;;CAWhD,YAAY,UAAkB,UAA2C;EACxE,MAAM,WAAW,KAAK,KAAK,IAAI,QAAQ,KAAK,CAAC;EAC7C,SAAS,KAAK;GAAE;GAAU;EAAS,CAAC;EACpC,KAAK,KAAK,IAAI,UAAU,QAAQ;CACjC;;;;;;;;;;;;;;;CAgBA,MAAM,iBAAiB,YAAiC,WAAqC;EAC5F,MAAM,EAAE,SAAS;EACjB,MAAM,eAAe,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC;EAE7C,IAAI,aAAa,WAAW,GAAG;GAE9B,UADyB,QAAuB,cAAc,aACzD,EAAE,KAAK,0CAA0C;IACrD,cAAc;IACd,qBAAqB,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;GACjD,CAAC;GACD;EACD;EAEA,MAAM,SAA0C,CAAC;EAEjD,KAAK,MAAM,EAAE,cAAc,cAAc;GACxC,MAAM,UAAU,SAAS;GAEzB,IAAI;IAGH,UAAU,SAAS,UAAU,QAAQ;IAErC,MADY,UAAU,QAAiB,QAC/B,EAAE,QAAQ,UAAU;GAC7B,SAAS,OAAO;IACf,MAAM,MAAM;IACZ,OAAO,KAAK;KAAE,KAAK;KAAS,OAAO;IAAI,CAAC;IAGxC,IAAI;KACH,MAAM,MAAM,UAAU,QAAiB,QAAQ;KAC/C,IAAI,IAAI,SACP,MAAM,IAAI,QAAQ,KAAK,UAAU;IAEnC,QAAQ,CAER;GACD;EACD;EAIA,IAAI,OAAO,SAAS,GACnB,MAAM,IAAI,mBAAmB,MAAM,MAAM;CAE3C;;;;;;;CAQA,mBAAmB,UAAmC;EACrD,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,CAAC;CACpC;;;;;;CAOA,kBAA4B;EAC3B,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;CACnC;;;;;;CAOA,mBAA2B;EAC1B,IAAI,QAAQ;EACZ,KAAK,MAAM,QAAQ,KAAK,KAAK,OAAO,GACnC,SAAS,KAAK;EAEf,OAAO;CACR;AACD;0BApHC,UAAU,UAAU,IAAI,CAAA,GAAA,WAAA;;;;ACHlB,IAAA,aAAA,MAAM,WAAW,CAAE;yBALzB,OAAO,EACN,WAAW,CACT;CAAE,SAAS,UAAU;CAAM,UAAU;AAAY,CACnD,EACF,CAAC,CAAA,GAAA,UAAA"}
@@ -1,11 +1,11 @@
1
- //#region \0@oxc-project+runtime@0.129.0/helpers/decorateParam.js
1
+ //#region \0@oxc-project+runtime@0.133.0/helpers/esm/decorateParam.js
2
2
  function __decorateParam(paramIndex, decorator) {
3
3
  return function(target, key) {
4
4
  decorator(target, key, paramIndex);
5
5
  };
6
6
  }
7
7
  //#endregion
8
- //#region \0@oxc-project+runtime@0.129.0/helpers/decorate.js
8
+ //#region \0@oxc-project+runtime@0.133.0/helpers/esm/decorate.js
9
9
  function __decorate(decorators, target, key, desc) {
10
10
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
11
11
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -15,4 +15,4 @@ function deepMerge(target, source) {
15
15
  //#endregion
16
16
  export { deepMerge as t };
17
17
 
18
- //# sourceMappingURL=deep-merge-C8NgcXw4.mjs.map
18
+ //# sourceMappingURL=deep-merge-ByiAOZ3r.mjs.map
@@ -1 +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
+ {"version":3,"file":"deep-merge-ByiAOZ3r.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,OAAO;CAEpD,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG;EACrC,MAAM,cAAc,OAAO;EAC3B,MAAM,cAAc,OAAO;EAE3B,IACE,OAAO,gBAAgB,YACpB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,WAAW,KAC1B,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,WAAW,GAE7B,OAAO,OAAO,UACZ,aACA,WACF;OAEA,OAAO,OAAO;CAElB;CAEA,OAAO;AACT"}
@@ -1,2 +1,2 @@
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 };
1
+ import { $ as ConditionalBindingGive, B as Transient, Bn as ContainerLike, Er as DI_TOKENS, F as defineMetadata, G as InjectParam, Gn as LazyToken, H as getInjectionTokens, Hn as InjectionToken, I as getMetadata, J as ContainerError, K as ParamInjection, Kn as isLazyToken, L as hasMetadata, M as containerStorage, N as getContainer, P as runWithContainer, Q as ConditionalBindingBuilderImpl, R as Request, Tr as DIToken, U as inject, Un as Scope, V as getClassMetadata, Vn as ExtensionDecorator, W as INJECT_PARAM_METADATA_KEY, Wn as WhenOptions, X as ContainerOptions, Y as Container, Z as ConditionalBindingBuilder, et as ConditionalBindingUse, q as getMethodInjections, qn as lazy, tt as PredicateContainer, wr as CONTAINER_TOKEN, z as Singleton } from "../index-B_JoEl3V.mjs";
2
+ export { CONTAINER_TOKEN, ConditionalBindingBuilder, ConditionalBindingBuilderImpl, ConditionalBindingGive, ConditionalBindingUse, Container, ContainerError, ContainerLike, ContainerOptions, DIToken, DI_TOKENS, ExtensionDecorator, INJECT_PARAM_METADATA_KEY, InjectParam, InjectionToken, LazyToken, type 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,4 +1,4 @@
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";
1
+ import { _ as ContainerError, a as lazy, c as Transient, d as inject, f as INJECT_PARAM_METADATA_KEY, g as ConditionalBindingBuilderImpl, h as Scope, i as isLazyToken, l as getClassMetadata, m as getMethodInjections, n as CONTAINER_TOKEN, o as Request, p as InjectParam, r as DI_TOKENS, s as Singleton, t as Container, u as getInjectionTokens } from "../di-DseMn-z9.mjs";
2
+ import { n as getContainer, r as runWithContainer, t as containerStorage } from "../container-storage-BmOJ4_Na.mjs";
3
+ import { n as getMetadata, r as hasMetadata, t as defineMetadata } from "../metadata-DzzprcID.mjs";
4
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 };