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,3 +1,4 @@
1
+ import { n as getMetadata, t as defineMetadata } from "./metadata-BVkc4aUu.mjs";
1
2
  //#region src/guards/types.ts
2
3
  /**
3
4
  * Metadata key for guard storage
@@ -63,8 +64,8 @@ const GUARD_METADATA_KEY = Symbol.for("stratal:guards");
63
64
  function UseGuards(...guards) {
64
65
  return (target, propertyKey) => {
65
66
  const metadata = { guards };
66
- if (propertyKey !== void 0) Reflect.defineMetadata(GUARD_METADATA_KEY, metadata, target, propertyKey);
67
- else Reflect.defineMetadata(GUARD_METADATA_KEY, metadata, target);
67
+ if (propertyKey !== void 0) defineMetadata(GUARD_METADATA_KEY, metadata, target, propertyKey);
68
+ else defineMetadata(GUARD_METADATA_KEY, metadata, target);
68
69
  };
69
70
  }
70
71
  /**
@@ -74,7 +75,7 @@ function UseGuards(...guards) {
74
75
  * @returns Guard metadata or undefined if not decorated
75
76
  */
76
77
  function getControllerGuards(target) {
77
- return Reflect.getMetadata(GUARD_METADATA_KEY, target);
78
+ return getMetadata(GUARD_METADATA_KEY, target);
78
79
  }
79
80
  /**
80
81
  * Get method-level guard metadata
@@ -84,7 +85,7 @@ function getControllerGuards(target) {
84
85
  * @returns Guard metadata or undefined if not decorated
85
86
  */
86
87
  function getMethodGuards(target, propertyKey) {
87
- return Reflect.getMetadata(GUARD_METADATA_KEY, target, propertyKey);
88
+ return getMetadata(GUARD_METADATA_KEY, target, propertyKey);
88
89
  }
89
90
  //#endregion
90
91
  //#region src/guards/guard-execution.service.ts
@@ -95,6 +96,7 @@ function getMethodGuards(target, propertyKey) {
95
96
  * Guards are executed in order; all must pass for the request to proceed.
96
97
  */
97
98
  var GuardExecutionService = class {
99
+ logger;
98
100
  constructor(logger) {
99
101
  this.logger = logger;
100
102
  }
@@ -148,4 +150,4 @@ var GuardExecutionService = class {
148
150
  //#endregion
149
151
  export { GUARD_METADATA_KEY as a, getMethodGuards as i, UseGuards as n, getControllerGuards as r, GuardExecutionService as t };
150
152
 
151
- //# sourceMappingURL=guards-DUk_Kzst.mjs.map
153
+ //# sourceMappingURL=guards-Ced-uNIF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards-Ced-uNIF.mjs","names":[],"sources":["../src/guards/types.ts","../src/guards/use-guards.decorator.ts","../src/guards/guard-execution.service.ts"],"sourcesContent":["import type { RouterContext } from '../router'\nimport type { Constructor } from '../types'\n\n/**\n * Interface for guards that control access to routes\n *\n * Guards are executed after middlewares but before route handlers.\n * They determine if a request should be allowed to proceed.\n *\n * @example\n * ```typescript\n * class RoleGuard implements CanActivate {\n * constructor(private readonly role: string) {}\n *\n * async canActivate(context: RouterContext): Promise<boolean> {\n * const user = context.getUser()\n * return user?.roles.includes(this.role) ?? false\n * }\n * }\n * ```\n */\nexport interface CanActivate {\n /**\n * Determine if the request should be allowed\n *\n * @param context - Router context with request/response helpers\n * @returns true to allow, false to deny (throws 403)\n */\n canActivate(context: RouterContext): boolean | Promise<boolean>\n}\n\n/**\n * Type for guard class constructors\n */\nexport type GuardClass = Constructor<CanActivate>\n\n/**\n * Guard can be a class constructor or an instance\n * Instances are used for factory-created guards with configuration\n */\nexport type Guard = GuardClass | CanActivate\n\n/**\n * Options for AuthGuard factory\n */\nexport interface AuthGuardOptions {\n /**\n * Required permissions for authorization as `\"resource:action\"` strings.\n * If provided, permission check is performed after authentication.\n * If omitted, only authentication is required.\n *\n * Multiple permissions are combined with AND logic (all must be satisfied).\n *\n * @example\n * ```typescript\n * @UseGuards(AuthGuard({ permissions: 'posts:update' }))\n * @UseGuards(AuthGuard({ permissions: ['posts:update', 'posts:delete'] }))\n * @UseGuards(AuthGuard({ permissions: 'admin:access' }))\n * ```\n */\n permissions?: string | string[]\n}\n\n/**\n * Metadata stored by `@UseGuards` decorator\n */\nexport interface GuardMetadata {\n guards: Guard[]\n}\n\n/**\n * Metadata key for guard storage\n */\nexport const GUARD_METADATA_KEY = Symbol.for('stratal:guards')\n","import { defineMetadata, getMetadata } from '../di/metadata'\nimport { GUARD_METADATA_KEY, type Guard, type GuardMetadata } from './types'\n\n/**\n * UseGuards Decorator\n *\n * Applies one or more guards to a controller or method.\n * Guards are executed in order and all must pass for the request to proceed.\n *\n * **Execution Order:**\n * 1. Request → Global Middlewares → Route Middlewares\n * 2. **Guards (controller-level, then method-level)**\n * 3. Route Handler\n *\n * **Guard Resolution:**\n * - Guard classes are resolved from the request-scoped DI container\n * - Guard instances (from factory functions) are used directly\n *\n * @param guards - Guard classes or instances to apply\n *\n * @example Authentication only\n * ```typescript\n * @Controller('/api/v1/profile')\n * @UseGuards(AuthGuard())\n * export class ProfileController {\n * show() { } // Requires authentication\n * }\n * ```\n *\n * @example Authentication with permissions\n * ```typescript\n * @Controller('/api/v1/students')\n * @UseGuards(AuthGuard({ scopes: ['students:read'] }))\n * export class StudentsController {\n * index() { } // Requires 'students:read' permission\n * }\n * ```\n *\n * @example Method-level guards\n * ```typescript\n * @Controller('/api/v1/students')\n * @UseGuards(AuthGuard()) // Controller-level: auth only\n * export class StudentsController {\n * index() { } // Auth only (inherited)\n *\n * @UseGuards(AuthGuard({ scopes: ['students:create'] }))\n * create() { } // Auth + 'students:create' permission\n * }\n * ```\n *\n * @example Multiple guards\n * ```typescript\n * @UseGuards(AuthGuard(), RateLimitGuard(), CustomGuard())\n * export class SecureController {\n * // All guards must pass\n * }\n * ```\n */\nexport function UseGuards(...guards: Guard[]): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const metadata: GuardMetadata = { guards }\n\n if (propertyKey !== undefined) {\n // Method decorator - store on method\n defineMetadata(GUARD_METADATA_KEY, metadata, target, propertyKey)\n } else {\n // Class decorator - store on class\n defineMetadata(GUARD_METADATA_KEY, metadata, target)\n }\n }\n}\n\n/**\n * Get controller-level guard metadata\n *\n * @param target - Controller class\n * @returns Guard metadata or undefined if not decorated\n */\nexport function getControllerGuards(target: object): GuardMetadata | undefined {\n return getMetadata<GuardMetadata>(GUARD_METADATA_KEY, target)\n}\n\n/**\n * Get method-level guard metadata\n *\n * @param target - Controller prototype\n * @param propertyKey - Method name\n * @returns Guard metadata or undefined if not decorated\n */\nexport function getMethodGuards(target: object, propertyKey: string | symbol): GuardMetadata | undefined {\n return getMetadata<GuardMetadata>(GUARD_METADATA_KEY, target, propertyKey)\n}\n","import type { Container } from '../di'\nimport type { LoggerService } from '../logger'\nimport type { RouterContext } from '../router'\nimport type { CanActivate, Guard } from './types'\n\n/**\n * Guard Execution Service\n *\n * Executes guards for a route and determines if the request should proceed.\n * Guards are executed in order; all must pass for the request to proceed.\n */\nexport class GuardExecutionService {\n constructor(private readonly logger: LoggerService) { }\n\n /**\n * Execute all guards for a route\n *\n * @param guards - Array of guards (classes or instances)\n * @param context - Router context\n * @param container - Request-scoped DI container\n * @returns true if all guards pass\n * @throws Error from first failing guard\n */\n async executeGuards(\n guards: Guard[],\n context: RouterContext,\n container: Container\n ): Promise<boolean> {\n if (guards.length === 0) {\n return true\n }\n\n this.logger.debug('Executing guards', {\n guardCount: guards.length,\n path: context.c.req.path,\n method: context.c.req.method,\n })\n\n for (const guard of guards) {\n const guardInstance = this.resolveGuard(guard, container)\n const canActivate = await guardInstance.canActivate(context)\n\n if (!canActivate) {\n this.logger.debug('Guard denied access', {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- guard.constructor may be null at runtime\n guard: guard.constructor?.name || 'AnonymousGuard',\n path: context.c.req.path,\n })\n return false\n }\n }\n\n this.logger.debug('All guards passed', {\n guardCount: guards.length,\n path: context.c.req.path,\n })\n\n return true\n }\n\n /**\n * Resolve a guard to an instance\n *\n * @param guard - Guard class or instance\n * @param container - Request-scoped DI container\n * @returns Guard instance\n */\n private resolveGuard(guard: Guard, container: Container): CanActivate {\n // If already an instance (has canActivate method), use directly\n if (this.isGuardInstance(guard)) {\n return guard\n }\n\n // Otherwise, resolve from container\n return container.resolve<CanActivate>(guard)\n }\n\n /**\n * Type guard to check if value is a guard instance\n */\n private isGuardInstance(guard: Guard): guard is CanActivate {\n return (\n typeof guard === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typeof null === 'object', null check is required\n guard !== null &&\n 'canActivate' in guard &&\n typeof guard.canActivate === 'function'\n )\n }\n}\n"],"mappings":";;;;;AAyEA,MAAa,qBAAqB,OAAO,IAAI,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACf9D,SAAgB,UAAU,GAAG,QAAmD;CAC9E,QAAQ,QAAgB,gBAAkC;EACxD,MAAM,WAA0B,EAAE,QAAQ;EAE1C,IAAI,gBAAgB,KAAA,GAElB,eAAe,oBAAoB,UAAU,QAAQ,YAAY;OAGjE,eAAe,oBAAoB,UAAU,OAAO;;;;;;;;;AAW1D,SAAgB,oBAAoB,QAA2C;CAC7E,OAAO,YAA2B,oBAAoB,OAAO;;;;;;;;;AAU/D,SAAgB,gBAAgB,QAAgB,aAAyD;CACvG,OAAO,YAA2B,oBAAoB,QAAQ,YAAY;;;;;;;;;;AC/E5E,IAAa,wBAAb,MAAmC;CACJ;CAA7B,YAAY,QAAwC;EAAvB,KAAA,SAAA;;;;;;;;;;;CAW7B,MAAM,cACJ,QACA,SACA,WACkB;EAClB,IAAI,OAAO,WAAW,GACpB,OAAO;EAGT,KAAK,OAAO,MAAM,oBAAoB;GACpC,YAAY,OAAO;GACnB,MAAM,QAAQ,EAAE,IAAI;GACpB,QAAQ,QAAQ,EAAE,IAAI;GACvB,CAAC;EAEF,KAAK,MAAM,SAAS,QAIlB,IAAI,CAAC,MAHiB,KAAK,aAAa,OAAO,UACR,CAAC,YAAY,QAAQ,EAE1C;GAChB,KAAK,OAAO,MAAM,uBAAuB;IAEvC,OAAO,MAAM,aAAa,QAAQ;IAClC,MAAM,QAAQ,EAAE,IAAI;IACrB,CAAC;GACF,OAAO;;EAIX,KAAK,OAAO,MAAM,qBAAqB;GACrC,YAAY,OAAO;GACnB,MAAM,QAAQ,EAAE,IAAI;GACrB,CAAC;EAEF,OAAO;;;;;;;;;CAUT,aAAqB,OAAc,WAAmC;EAEpE,IAAI,KAAK,gBAAgB,MAAM,EAC7B,OAAO;EAIT,OAAO,UAAU,QAAqB,MAAM;;;;;CAM9C,gBAAwB,OAAoC;EAC1D,OACE,OAAO,UAAU,YAEjB,UAAU,QACV,iBAAiB,SACjB,OAAO,MAAM,gBAAgB"}
@@ -1,5 +1,6 @@
1
- import { f as ROUTE_METADATA_KEYS } from "./errors-BdyV5PnY.mjs";
2
- import { i as z } from "./validation-DtJwAv7O.mjs";
1
+ import { n as getMetadata, t as defineMetadata } from "./metadata-BVkc4aUu.mjs";
2
+ import { u as ROUTE_METADATA_KEYS } from "./exception-context-B4kM-M53.mjs";
3
+ import { r as z } from "./zod-hMa3rSHV.mjs";
3
4
  //#region src/router/decorators/http-method.decorator.ts
4
5
  /**
5
6
  * Creates an HTTP method decorator factory for the given HTTP method.
@@ -17,10 +18,10 @@ function createHttpMethodDecorator(method) {
17
18
  path,
18
19
  config: config ?? { response: z.any() }
19
20
  };
20
- Reflect.defineMetadata(ROUTE_METADATA_KEYS.ROUTE_CONFIG, metadata, target, propertyKey);
21
- const existing = Reflect.getOwnMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, target) ?? [];
21
+ defineMetadata(ROUTE_METADATA_KEYS.ROUTE_CONFIG, metadata, target, propertyKey);
22
+ const existing = getMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, target) ?? [];
22
23
  existing.push(propertyKey);
23
- Reflect.defineMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, existing, target);
24
+ defineMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, existing, target);
24
25
  return descriptor;
25
26
  };
26
27
  };
@@ -93,4 +94,4 @@ const All = createHttpMethodDecorator("all");
93
94
  //#endregion
94
95
  export { Post as a, Patch as i, Delete as n, Put as o, Get as r, All as t };
95
96
 
96
- //# sourceMappingURL=http-method.decorator-DXwxAfb_.mjs.map
97
+ //# sourceMappingURL=http-method.decorator-CdjKFJZZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-method.decorator-CdjKFJZZ.mjs","names":[],"sources":["../src/router/decorators/http-method.decorator.ts"],"sourcesContent":["import { defineMetadata, getMetadata } from '../../di/metadata'\nimport { z } from '../../i18n/validation/zod'\nimport { ROUTE_METADATA_KEYS } from '../constants'\nimport type { ExplicitRouteMetadata, HttpMethod, RouteConfig } from '../types'\n\n/**\n * Creates an HTTP method decorator factory for the given HTTP method.\n *\n * The returned decorator stores {@link ExplicitRouteMetadata} on the method and\n * tracks the method name under {@link ROUTE_METADATA_KEYS.DECORATED_METHODS}\n * on the controller prototype so they can be discovered at registration time.\n */\nfunction createHttpMethodDecorator(method: HttpMethod) {\n return function (path: string, config?: RouteConfig) {\n return function (\n target: object,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const metadata: ExplicitRouteMetadata = {\n type: 'explicit',\n method,\n path,\n config: config ?? { response: z.any() },\n }\n\n defineMetadata(\n ROUTE_METADATA_KEYS.ROUTE_CONFIG,\n metadata,\n target,\n propertyKey\n )\n\n // Track this method as decorated on the prototype\n const existing: string[] =\n getMetadata<string[]>(ROUTE_METADATA_KEYS.DECORATED_METHODS, target) ?? []\n existing.push(propertyKey)\n defineMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, existing, target)\n\n return descriptor\n }\n }\n}\n\n/**\n * Registers a GET route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration (response schema, body, params, etc.)\n *\n * @example\n * ```typescript\n * @Controller('/api/v1/users')\n * class UsersController {\n * @Get('/', { response: z.array(userSchema), summary: 'List users' })\n * async list(ctx: RouterContext) { ... }\n *\n * @Get('/:id', { params: z.object({ id: z.string().uuid() }), response: userSchema })\n * async getUser(ctx: RouterContext) { ... }\n * }\n * ```\n */\nexport const Get = createHttpMethodDecorator('get')\n\n/**\n * Registers a POST route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration (response schema, body, params, etc.)\n *\n * @example\n * ```typescript\n * @Controller('/api/v1/users')\n * class UsersController {\n * @Post('/', { body: createUserSchema, response: userSchema, statusCode: 201 })\n * async createUser(ctx: RouterContext) { ... }\n * }\n * ```\n */\nexport const Post = createHttpMethodDecorator('post')\n\n/**\n * Registers a PUT route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const Put = createHttpMethodDecorator('put')\n\n/**\n * Registers a PATCH route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const Patch = createHttpMethodDecorator('patch')\n\n/**\n * Registers a DELETE route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const Delete = createHttpMethodDecorator('delete')\n\n/**\n * Registers an ALL (any HTTP method) route on the controller method.\n * Routes using @All are registered without OpenAPI validation\n * since OpenAPI does not support a catch-all HTTP method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const All = createHttpMethodDecorator('all')\n"],"mappings":";;;;;;;;;;;AAYA,SAAS,0BAA0B,QAAoB;CACrD,OAAO,SAAU,MAAc,QAAsB;EACnD,OAAO,SACL,QACA,aACA,YACA;GACA,MAAM,WAAkC;IACtC,MAAM;IACN;IACA;IACA,QAAQ,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE;IACxC;GAED,eACE,oBAAoB,cACpB,UACA,QACA,YACD;GAGD,MAAM,WACJ,YAAsB,oBAAoB,mBAAmB,OAAO,IAAI,EAAE;GAC5E,SAAS,KAAK,YAAY;GAC1B,eAAe,oBAAoB,mBAAmB,UAAU,OAAO;GAEvE,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuBb,MAAa,MAAM,0BAA0B,MAAM;;;;;;;;;;;;;;;;AAiBnD,MAAa,OAAO,0BAA0B,OAAO;;;;;;;AAQrD,MAAa,MAAM,0BAA0B,MAAM;;;;;;;AAQnD,MAAa,QAAQ,0BAA0B,QAAQ;;;;;;;AAQvD,MAAa,SAAS,0BAA0B,SAAS;;;;;;;;;AAUzD,MAAa,MAAM,0BAA0B,MAAM"}
@@ -1,3 +1,238 @@
1
- import { A as LocaleNotSupportedError, C as DetectionStrategy, D as buildDetectorOptions, E as ResolvedI18nOptions, O as resolveI18nOptions, S as I18nModule, T as LanguageDetectionOptions, _ as Messages, b as messages, g as MessageRegistry, h as MessageLoaderService, k as TranslationMissingError, m as I18nContextMiddleware, v as getLocales, w as I18nModuleOptions, x as I18N_TOKENS, y as getMessages } from "../index-D0US0X14.mjs";
2
- import { C as MessageParams, S as MessageKeys, T as SystemMessageKeys, _ as AppMessageNamespaces, b as II18nService, g as AppMessageKeys, v as AppMessages, w as Prefixes, x as MessageKeyPrefix, y as DeepKeys } from "../index-Bnpfq6uk.mjs";
3
- export { AppMessageKeys, AppMessageNamespaces, AppMessages, DeepKeys, DetectionStrategy, I18N_TOKENS, I18nContextMiddleware, I18nModule, I18nModuleOptions, II18nService, LanguageDetectionOptions, LocaleNotSupportedError, MessageKeyPrefix, MessageKeys, MessageLoaderService, MessageParams, MessageRegistry, Messages, Prefixes, ResolvedI18nOptions, SystemMessageKeys, TranslationMissingError, buildDetectorOptions, getLocales, getMessages, messages, resolveI18nOptions };
1
+ import { On as ModuleContext, jn as OnInitialize, wn as DynamicModule, xr as ApplicationError } from "../index-DEncMcC6.mjs";
2
+ import { _ as Prefixes, d as AppMessages, f as DeepKeys, g as MessageParams, h as MessageKeys, l as AppMessageKeys, m as MessageKeyPrefix, p as II18nService, u as AppMessageNamespaces, v as SystemMessageKeys } from "../zod-DvWTfRpI.mjs";
3
+ import { t as index_d_exports } from "../index-KMgSCSM7.mjs";
4
+ import { DetectorOptions } from "hono/language";
5
+
6
+ //#region src/i18n/i18n.error.d.ts
7
+ declare class I18nError extends ApplicationError {}
8
+ //#endregion
9
+ //#region src/i18n/i18n.options.d.ts
10
+ /**
11
+ * Detection strategy for locale resolution
12
+ *
13
+ * - `'cookie'` — reads from the `locale` cookie (default)
14
+ * - `'header'` — reads from the `Accept-Language` header
15
+ * - `'querystring'` — reads from the `?locale=` query parameter
16
+ * - `'path'` — reads from the first URL path segment (e.g., `/en/api/users`)
17
+ */
18
+ type DetectionStrategy = 'cookie' | 'header' | 'querystring' | 'path';
19
+ interface BaseDetection {
20
+ /** Set to false to disable language detection entirely. @default true */
21
+ enabled?: boolean;
22
+ }
23
+ /**
24
+ * Language detection options (discriminated by strategy)
25
+ *
26
+ * @example Cookie detection (default)
27
+ * ```typescript
28
+ * { strategy: 'cookie' }
29
+ * ```
30
+ *
31
+ * @example Header detection
32
+ * ```typescript
33
+ * { strategy: 'header' }
34
+ * ```
35
+ *
36
+ * @example Path detection
37
+ * ```typescript
38
+ * { strategy: 'path' }
39
+ * ```
40
+ *
41
+ * @example Disable detection
42
+ * ```typescript
43
+ * { enabled: false }
44
+ * ```
45
+ */
46
+ type LanguageDetectionOptions = (BaseDetection & {
47
+ strategy?: 'cookie';
48
+ cookieOptions?: DetectorOptions['cookieOptions'];
49
+ }) | (BaseDetection & {
50
+ strategy: 'header';
51
+ }) | (BaseDetection & {
52
+ strategy: 'querystring';
53
+ }) | (BaseDetection & {
54
+ strategy: 'path';
55
+ /**
56
+ * Controls whether the default locale gets a URL path prefix.
57
+ *
58
+ * - `false` (default) — The default locale has no prefix (`/users`), other locales
59
+ * are prefixed (`/fr/users`). Requests to the prefixed default locale (`/en/users`) return 404.
60
+ * - `'redirect'` — Same as `false`, but requests to the prefixed default locale
61
+ * (`/en/users`) are 301-redirected to the unprefixed path (`/users`).
62
+ * - `true` — All locales are prefixed (`/en/users`, `/fr/users`).
63
+ *
64
+ * @default false
65
+ */
66
+ prefixDefaultLocale?: false | true | 'redirect';
67
+ }) | {
68
+ enabled: false;
69
+ };
70
+ /**
71
+ * Options for configuring the I18n module
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * I18nModule.forRoot({
76
+ * defaultLocale: 'en',
77
+ * fallbackLocale: 'en',
78
+ * locales: ['en', 'fr'],
79
+ * detection: { strategy: 'header' },
80
+ * })
81
+ * ```
82
+ */
83
+ interface I18nModuleOptions {
84
+ /**
85
+ * Default locale for the application
86
+ * @default 'en'
87
+ */
88
+ defaultLocale?: string;
89
+ /**
90
+ * Fallback locale when translation is missing
91
+ * @default 'en'
92
+ */
93
+ fallbackLocale?: string;
94
+ /**
95
+ * List of supported locales
96
+ * Request locales not in this list will fall back to defaultLocale
97
+ */
98
+ locales?: string[];
99
+ /**
100
+ * Language detection configuration
101
+ * Controls how the locale is extracted from incoming requests
102
+ */
103
+ detection?: LanguageDetectionOptions;
104
+ }
105
+ /**
106
+ * Resolved options with all defaults applied
107
+ * Used internally by I18n services
108
+ */
109
+ interface ResolvedI18nOptions {
110
+ defaultLocale: string;
111
+ fallbackLocale: string;
112
+ locales: string[];
113
+ detection: {
114
+ enabled: boolean;
115
+ strategy: DetectionStrategy; /** Resolved value of the path detection `prefixDefaultLocale` option. Only meaningful when `strategy` is `'path'`. */
116
+ prefixDefaultLocale: false | true | 'redirect';
117
+ };
118
+ }
119
+ /**
120
+ * Resolve I18n options with defaults
121
+ */
122
+ declare function resolveI18nOptions(options?: I18nModuleOptions): ResolvedI18nOptions;
123
+ /**
124
+ * Build Hono languageDetector options from I18n module options
125
+ */
126
+ declare function buildDetectorOptions(options?: I18nModuleOptions): Partial<DetectorOptions>;
127
+ //#endregion
128
+ //#region src/i18n/i18n.module.d.ts
129
+ declare class I18nModule implements OnInitialize {
130
+ onInitialize(_context: ModuleContext): void;
131
+ static forRoot(options?: I18nModuleOptions): DynamicModule;
132
+ static registerMessages(messages: Record<string, Record<string, unknown>>): DynamicModule;
133
+ }
134
+ //#endregion
135
+ //#region src/i18n/i18n.tokens.d.ts
136
+ /**
137
+ * I18n Module DI Tokens
138
+ * Symbol-based tokens to avoid string collisions
139
+ */
140
+ declare const I18N_TOKENS: {
141
+ /** MessageLoaderService - loads and caches locale messages */readonly MessageLoader: symbol; /** I18nService - request-scoped translation service */
142
+ readonly I18nService: symbol; /** I18nModuleOptions - configuration options from forRoot() */
143
+ readonly Options: symbol; /** MessageRegistry - singleton accumulator for registerMessages() contributions */
144
+ readonly MessageRegistry: symbol;
145
+ };
146
+ //#endregion
147
+ //#region src/i18n/messages/index.d.ts
148
+ /**
149
+ * All locale messages
150
+ * Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)
151
+ */
152
+ declare const messages: {
153
+ readonly en: typeof index_d_exports;
154
+ };
155
+ /**
156
+ * Type for all messages
157
+ */
158
+ type Messages = typeof messages;
159
+ /**
160
+ * Get messages for all locales
161
+ */
162
+ declare function getMessages(): Record<string, Record<string, unknown>>;
163
+ /**
164
+ * Get available locales
165
+ */
166
+ declare function getLocales(): string[];
167
+ //#endregion
168
+ //#region src/i18n/services/message-registry.d.ts
169
+ /**
170
+ * Message Registry
171
+ *
172
+ * Accumulates i18n messages from multiple `I18nModule.registerMessages()` calls.
173
+ * Messages are collected statically (at module import time) and deep-merged
174
+ * when `getMergedMessages()` is called by `MessageLoaderService`.
175
+ *
176
+ * Later registrations override earlier ones at leaf level.
177
+ */
178
+ declare class MessageRegistry {
179
+ /**
180
+ * Add messages (called statically by I18nModule.registerMessages)
181
+ */
182
+ static addMessages(messages: Record<string, Record<string, unknown>>): void;
183
+ /**
184
+ * Get all messages deep-merged in registration order
185
+ */
186
+ getMergedMessages(): Record<string, Record<string, unknown>>;
187
+ /**
188
+ * Reset registry (for testing)
189
+ * @internal
190
+ */
191
+ static reset(): void;
192
+ }
193
+ //#endregion
194
+ //#region src/i18n/services/message-loader.service.d.ts
195
+ declare class MessageLoaderService {
196
+ private readonly registry;
197
+ private readonly options?;
198
+ private readonly cache;
199
+ private readonly compiledCache;
200
+ private readonly locales;
201
+ private readonly defaultLocale;
202
+ constructor(registry: MessageRegistry, options?: I18nModuleOptions | undefined);
203
+ translate(locale: string, key: string, params?: Record<string, unknown>): string;
204
+ getMessages(locale: string): Record<string, unknown>;
205
+ getAvailableLocales(): string[];
206
+ isLocaleSupported(locale: string): boolean;
207
+ getDefaultLocale(): string;
208
+ getFilteredMessages(locale: string, options?: {
209
+ only?: MessageKeyPrefix[];
210
+ }): Record<string, string>;
211
+ private getCompiledMessages;
212
+ private flattenMessages;
213
+ }
214
+ //#endregion
215
+ //#region src/i18n/with-i18n.d.ts
216
+ /**
217
+ * Translate a message key using I18nService from the DI container.
218
+ *
219
+ * Works in both request scope (uses the request's detected locale) and
220
+ * global scope (defaults to 'en'). Can be used anywhere — services,
221
+ * middleware, error handlers, cron jobs, queue consumers, etc.
222
+ *
223
+ * @param key - Message key (e.g., 'common.welcome', 'errors.notFound')
224
+ * @param params - Optional interpolation parameters
225
+ * @returns Translated string, or the key itself if no container is available
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * import { withI18n } from 'stratal/i18n'
230
+ *
231
+ * const message = withI18n('errors.notFound')
232
+ * const greeting = withI18n('common.welcome', { name: 'Alice' })
233
+ * ```
234
+ */
235
+ declare function withI18n(key: MessageKeys, params?: MessageParams): string;
236
+ //#endregion
237
+ export { AppMessageKeys, AppMessageNamespaces, AppMessages, DeepKeys, DetectionStrategy, I18N_TOKENS, I18nError, I18nModule, I18nModuleOptions, II18nService, LanguageDetectionOptions, MessageKeyPrefix, MessageKeys, MessageLoaderService, MessageParams, MessageRegistry, type Messages, Prefixes, ResolvedI18nOptions, SystemMessageKeys, buildDetectorOptions, getLocales, getMessages, messages, resolveI18nOptions, withI18n };
238
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/i18n/i18n.error.ts","../../src/i18n/i18n.options.ts","../../src/i18n/i18n.module.ts","../../src/i18n/i18n.tokens.ts","../../src/i18n/messages/index.ts","../../src/i18n/services/message-registry.ts","../../src/i18n/services/message-loader.service.ts","../../src/i18n/with-i18n.ts"],"mappings":";;;;;;cAEa,SAAA,SAAkB,gBAAA;;;;;;;;;ACgB/B;;KAAY,iBAAA;AAAA,UAEF,aAAA;EAFmB;EAI3B,OAAA;AAAA;;;;AA0BF;;;;;;;;;;;;;;;;;;;;KAAY,wBAAA,IACP,aAAA;EAAkB,QAAA;EAAqB,aAAA,GAAgB,eAAA;AAAA,MACvD,aAAA;EAAkB,QAAA;AAAA,MAClB,aAAA;EAAkB,QAAA;AAAA,MAClB,aAAA;EACD,QAAA;EAwCF;;;;;;AAmBF;;;;;EA/CI,mBAAA;AAAA;EAEE,OAAA;AAAA;;;;;;AA4DN;;;;;;;;UA7CiB,iBAAA;EAiED;;;;EA5Dd,aAAA;EA4DiE;;;;EAtDjE,cAAA;EAsDiE;;;;EAhDjE,OAAA;;;ACzFF;;ED+FE,SAAA,GAAY,wBAAA;AAAA;;;;;UAOG,mBAAA;EACf,aAAA;EACA,cAAA;EACA,OAAA;EACA,SAAA;IACE,OAAA;IACA,QAAA,EAAU,iBAAA,ECpGC;IDsGX,mBAAA;EAAA;AAAA;;;;iBAOY,kBAAA,CAAmB,OAAA,GAAU,iBAAA,GAAoB,mBAAA;;;;iBAoBjD,oBAAA,CAAqB,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,eAAA;;;cClI9D,UAAA,YAAsB,YAAA;EACjC,YAAA,CAAa,QAAA,EAAU,aAAA;EAAA,OAIhB,OAAA,CAAQ,OAAA,GAAS,iBAAA,GAAyB,aAAA;EAAA,OAS1C,gBAAA,CAAiB,QAAA,EAAU,MAAA,SAAe,MAAA,qBAA2B,aAAA;AAAA;;;;;;;cC1BjE,WAAA;gGHHU;EAAA,8BAAQ;EAAA;;;;;;;;;cIWlB,QAAA;EAAA,oBAA0B,eAAA;AAAA;AHKvC;;;AAAA,KGAY,QAAA,UAAkB,QAAA;;AHA8C;;iBGK5D,WAAA,CAAA,GAAe,MAAA,SAAe,MAAA;;;AHyB9C;iBGlBgB,UAAA,CAAA;;;;;;;;;AJ5BhB;;;cK+Ba,eAAA;EL/BkC;;;EAAA,OKmCtC,WAAA,CAAY,QAAA,EAAU,MAAA,SAAe,MAAA;EJnBlC;;;EI4BV,iBAAA,CAAA,GAAqB,MAAA,SAAe,MAAA;EJ5BT;AAA+C;;;EAA/C,OI+CpB,KAAA,CAAA;AAAA;;;cCpDI,oBAAA;EAAA,iBAO6C,QAAA;EAAA,iBAErC,OAAA;EAAA,iBARF,KAAA;EAAA,iBACA,aAAA;EAAA,iBACA,OAAA;EAAA,iBACA,aAAA;cAGuC,QAAA,EAAU,eAAA,EAE/C,OAAA,GAAU,iBAAA;EAwB7B,SAAA,CAAU,MAAA,UAAgB,GAAA,UAAa,MAAA,GAAS,MAAA;EAOhD,WAAA,CAAY,MAAA,WAAiB,MAAA;EAI7B,mBAAA,CAAA;EAIA,iBAAA,CAAkB,MAAA;EAIlB,gBAAA,CAAA;EAIA,mBAAA,CACE,MAAA,UACA,OAAA;IAAY,IAAA,GAAO,gBAAA;EAAA,IAClB,MAAA;EAAA,QAeK,mBAAA;EAAA,QAmBA,eAAA;AAAA;;;;;;;;ANxGV;;;;;;;;ACgBA;;;;;AAA4E;iBMK5D,QAAA,CAAS,GAAA,EAAK,WAAA,EAAa,MAAA,GAAS,aAAA"}
@@ -1,3 +1,39 @@
1
- import { w as I18N_TOKENS } from "../errors-BdyV5PnY.mjs";
2
- import { B as LocaleNotSupportedError, F as getMessages, H as I18nContextMiddleware, I as messages, L as buildDetectorOptions, M as MessageRegistry, N as MessageLoaderService, P as getLocales, R as resolveI18nOptions, t as I18nModule, z as TranslationMissingError } from "../i18n.module-BBlNNlcG.mjs";
3
- export { I18N_TOKENS, I18nContextMiddleware, I18nModule, LocaleNotSupportedError, MessageLoaderService, MessageRegistry, TranslationMissingError, buildDetectorOptions, getLocales, getMessages, messages, resolveI18nOptions };
1
+ import { a as ApplicationError, n as getContainer } from "../container-storage-GpNNz79X.mjs";
2
+ import "../errors-BBZTnjdq.mjs";
3
+ import { t as I18N_TOKENS } from "../i18n.tokens-hwRpmjRq.mjs";
4
+ import { c as buildDetectorOptions, l as resolveI18nOptions } from "../router-Cy6DjkvP.mjs";
5
+ import { a as getMessages, i as getLocales, n as MessageRegistry, o as messages, r as MessageLoaderService, t as I18nModule } from "../i18n.module-BlXrtAlV.mjs";
6
+ //#region src/i18n/i18n.error.ts
7
+ var I18nError = class extends ApplicationError {};
8
+ //#endregion
9
+ //#region src/i18n/with-i18n.ts
10
+ /**
11
+ * Translate a message key using I18nService from the DI container.
12
+ *
13
+ * Works in both request scope (uses the request's detected locale) and
14
+ * global scope (defaults to 'en'). Can be used anywhere — services,
15
+ * middleware, error handlers, cron jobs, queue consumers, etc.
16
+ *
17
+ * @param key - Message key (e.g., 'common.welcome', 'errors.notFound')
18
+ * @param params - Optional interpolation parameters
19
+ * @returns Translated string, or the key itself if no container is available
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { withI18n } from 'stratal/i18n'
24
+ *
25
+ * const message = withI18n('errors.notFound')
26
+ * const greeting = withI18n('common.welcome', { name: 'Alice' })
27
+ * ```
28
+ */
29
+ function withI18n(key, params) {
30
+ try {
31
+ return getContainer().resolve(I18N_TOKENS.I18nService).t(key, params);
32
+ } catch {
33
+ return key;
34
+ }
35
+ }
36
+ //#endregion
37
+ export { I18N_TOKENS, I18nError, I18nModule, MessageLoaderService, MessageRegistry, buildDetectorOptions, getLocales, getMessages, messages, resolveI18nOptions, withI18n };
38
+
39
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/i18n/i18n.error.ts","../../src/i18n/with-i18n.ts"],"sourcesContent":["import { ApplicationError } from '../errors'\n\nexport class I18nError extends ApplicationError {}\n","import { getContainer } from '../di/container-storage'\nimport { I18N_TOKENS } from './i18n.tokens'\nimport type { II18nService, MessageKeys, MessageParams } from './i18n.types'\n\n/**\n * Translate a message key using I18nService from the DI container.\n *\n * Works in both request scope (uses the request's detected locale) and\n * global scope (defaults to 'en'). Can be used anywhere — services,\n * middleware, error handlers, cron jobs, queue consumers, etc.\n *\n * @param key - Message key (e.g., 'common.welcome', 'errors.notFound')\n * @param params - Optional interpolation parameters\n * @returns Translated string, or the key itself if no container is available\n *\n * @example\n * ```typescript\n * import { withI18n } from 'stratal/i18n'\n *\n * const message = withI18n('errors.notFound')\n * const greeting = withI18n('common.welcome', { name: 'Alice' })\n * ```\n */\nexport function withI18n(key: MessageKeys, params?: MessageParams): string {\n try {\n const container = getContainer()\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n return i18n.t(key, params)\n } catch {\n return key\n }\n}\n"],"mappings":";;;;;;AAEA,IAAa,YAAb,cAA+B,iBAAiB;;;;;;;;;;;;;;;;;;;;;;ACqBhD,SAAgB,SAAS,KAAkB,QAAgC;CACzE,IAAI;EAGF,OAFkB,cACI,CAAC,QAAsB,YAAY,YAC9C,CAAC,EAAE,KAAK,OAAO;SACpB;EACN,OAAO"}
@@ -1,2 +1,2 @@
1
- import { a as errors, i as emails, n as zodI18n, o as common, r as validation } from "../../../index-C1KvMncZ.mjs";
2
- export { common, emails, errors, validation, zodI18n };
1
+ import { a as common, i as emails, n as zodI18n, r as validation } from "../../../index-KMgSCSM7.mjs";
2
+ export { common, emails, validation, zodI18n };
@@ -1,2 +1,2 @@
1
- import { a as errors, i as emails, n as zodI18n, o as common, r as validation } from "../../../en-DSH_bhh6.mjs";
2
- export { common, emails, errors, validation, zodI18n };
1
+ import { a as common, i as emails, n as zodI18n, r as validation } from "../../../en-BPP6h6y5.mjs";
2
+ export { common, emails, validation, zodI18n };
@@ -1,30 +1,8 @@
1
- //#region src/i18n/utils/setup.d.ts
1
+ //#region src/i18n/utils/deep-merge.d.ts
2
2
  /**
3
- * I18n Setup - Message Compiler Registration
4
- *
5
- * Registers a JIT (Just-In-Time) message compiler for @intlify/core-base
6
- * that works in Cloudflare Workers edge runtime.
7
- *
8
- * This must be called ONCE at application startup, before any I18nService instances are created.
3
+ * Deep merge two objects. Source values override target at leaf level.
9
4
  */
10
- /**
11
- * Setup JIT message compiler for i18n
12
- *
13
- * Registers a message compiler that uses JIT compilation mode.
14
- * In @intlify/core-base v10+, JIT mode is enabled by default, which generates
15
- * AST (Abstract Syntax Tree) instead of JavaScript code, making it compatible
16
- * with CSP-restricted environments like Cloudflare Workers.
17
- *
18
- * **IMPORTANT:** Call this function once at application startup before creating
19
- * any I18nService instances. Safe to call multiple times (only registers once).
20
- *
21
- * @example
22
- * ```typescript
23
- * // In application entry point (before app.initialize())
24
- * setupI18nCompiler()
25
- * ```
26
- */
27
- declare function setupI18nCompiler(): void;
5
+ declare function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown>;
28
6
  //#endregion
29
- export { setupI18nCompiler };
7
+ export { deepMerge };
30
8
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/i18n/utils/setup.ts"],"mappings":";;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,iBAAA,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/i18n/utils/deep-merge.ts"],"mappings":";;AAGA;;iBAAgB,SAAA,CACd,MAAA,EAAQ,MAAA,mBACR,MAAA,EAAQ,MAAA,oBACP,MAAA"}
@@ -1,2 +1,2 @@
1
- import { t as setupI18nCompiler } from "../../setup-CefZKV_e.mjs";
2
- export { setupI18nCompiler };
1
+ import { t as deepMerge } from "../../deep-merge-C8NgcXw4.mjs";
2
+ export { deepMerge };
@@ -1,4 +1,5 @@
1
- import { c as runWithErrorMapContext, d as LocaleProvider, f as ZodCustomIssue, h as withI18n, i as ZodError, l as ErrorMapContext, m as cuid2, n as OpenAPIObject, o as z, p as CUID2_REGEX, r as PathItemObject, s as backendErrorMap, t as OpenAPIHono, u as I18nErrorMetadata } from "../../index-Bnpfq6uk.mjs";
1
+ import { a as z, b as cuid2, c as ZodCustomIssue, i as ZodError, n as OpenAPIObject, r as PathItemObject, s as I18nErrorMetadata, t as OpenAPIHono, y as CUID2_REGEX } from "../../zod-DvWTfRpI.mjs";
2
+ import { n as withZodI18n, t as zodErrorMap } from "../../index-Dj5IMwtr.mjs";
2
3
  export * from "@hono/zod-openapi";
3
4
  export * from "zod";
4
- export { CUID2_REGEX, ErrorMapContext, I18nErrorMetadata, LocaleProvider, OpenAPIHono, OpenAPIObject, PathItemObject, ZodCustomIssue, ZodError, backendErrorMap, cuid2, runWithErrorMapContext, withI18n, z };
5
+ export { CUID2_REGEX, I18nErrorMetadata, OpenAPIHono, OpenAPIObject, PathItemObject, ZodCustomIssue, ZodError, cuid2, withZodI18n, z, zodErrorMap };
@@ -1,3 +1,5 @@
1
- import { a as CUID2_REGEX, c as backendErrorMap, i as z, l as runWithErrorMapContext, n as ZodError, o as cuid2, s as withI18n, t as OpenAPIHono } from "../../validation-DtJwAv7O.mjs";
1
+ import { a as CUID2_REGEX, n as ZodError, o as cuid2, r as z, t as OpenAPIHono } from "../../zod-hMa3rSHV.mjs";
2
+ import { t as zodErrorMap } from "../../validation.context-XTysWJ3b.mjs";
3
+ import { t as withZodI18n } from "../../validation-DUzcjb8Q.mjs";
2
4
  export * from "@hono/zod-openapi";
3
- export { CUID2_REGEX, OpenAPIHono, ZodError, backendErrorMap, cuid2, runWithErrorMapContext, withI18n, z };
5
+ export { CUID2_REGEX, OpenAPIHono, ZodError, cuid2, withZodI18n, z, zodErrorMap };