stratal 0.0.21 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/README.md +2 -2
  2. package/dist/bin/cloudflare-workers-loader.mjs +80 -7
  3. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  4. package/dist/bin/quarry.mjs +84 -160
  5. package/dist/bin/quarry.mjs.map +1 -1
  6. package/dist/cache/index.d.mts +8 -46
  7. package/dist/cache/index.d.mts.map +1 -1
  8. package/dist/cache/index.mjs +134 -97
  9. package/dist/cache/index.mjs.map +1 -1
  10. package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-uElmBtdS.d.mts} +29 -39
  11. package/dist/cache.service-uElmBtdS.d.mts.map +1 -0
  12. package/dist/{command-BgSlsS4M.mjs → command-BvmUAPPQ.mjs} +15 -4
  13. package/dist/command-BvmUAPPQ.mjs.map +1 -0
  14. package/dist/{command-Cmmf0oHX.d.mts → command-CPhFHjG3.d.mts} +3 -2
  15. package/dist/command-CPhFHjG3.d.mts.map +1 -0
  16. package/dist/command-not-found.error-ONAZ2Bpk.mjs +14 -0
  17. package/dist/command-not-found.error-ONAZ2Bpk.mjs.map +1 -0
  18. package/dist/config/index.d.mts +24 -11
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +32 -57
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-D3iMTSdy.d.mts} +54 -22
  23. package/dist/consumer-registry-D3iMTSdy.d.mts.map +1 -0
  24. package/dist/container-storage-BmOJ4_Na.mjs +52 -0
  25. package/dist/container-storage-BmOJ4_Na.mjs.map +1 -0
  26. package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-C5UVeJS3.mjs} +8 -8
  27. package/dist/controller.decorator-C5UVeJS3.mjs.map +1 -0
  28. package/dist/cron/index.d.mts +103 -7
  29. package/dist/cron/index.d.mts.map +1 -1
  30. package/dist/cron/index.mjs +2 -2
  31. package/dist/cron-job-NesZRk8F.d.mts +58 -0
  32. package/dist/cron-job-NesZRk8F.d.mts.map +1 -0
  33. package/dist/{cron-manager-DQSK8uoV.mjs → cron.module-Bgzq5hiT.mjs} +47 -17
  34. package/dist/cron.module-Bgzq5hiT.mjs.map +1 -0
  35. package/dist/decorate-CuAoSZvs.mjs +16 -0
  36. package/dist/deep-merge-ByiAOZ3r.mjs +18 -0
  37. package/dist/deep-merge-ByiAOZ3r.mjs.map +1 -0
  38. package/dist/di/index.d.mts +2 -2
  39. package/dist/di/index.mjs +4 -3
  40. package/dist/di-DseMn-z9.mjs +524 -0
  41. package/dist/di-DseMn-z9.mjs.map +1 -0
  42. package/dist/email/index.d.mts +40 -122
  43. package/dist/email/index.d.mts.map +1 -1
  44. package/dist/email/index.mjs +446 -131
  45. package/dist/email/index.mjs.map +1 -1
  46. package/dist/en-CDZBMcc1.mjs +202 -0
  47. package/dist/en-CDZBMcc1.mjs.map +1 -0
  48. package/dist/{env-D1rcZ8_r.d.mts → env-ug22bJj7.d.mts} +1 -1
  49. package/dist/env-ug22bJj7.d.mts.map +1 -0
  50. package/dist/errors/index.d.mts +2 -2
  51. package/dist/errors/index.mjs +4 -2
  52. package/dist/errors-mXYxG0XB.mjs +333 -0
  53. package/dist/errors-mXYxG0XB.mjs.map +1 -0
  54. package/dist/events/index.d.mts +14 -3
  55. package/dist/events/index.d.mts.map +1 -1
  56. package/dist/events/index.mjs +2 -2
  57. package/dist/{events-CzCV8jI8.mjs → events-BXJGZjpG.mjs} +23 -13
  58. package/dist/events-BXJGZjpG.mjs.map +1 -0
  59. package/dist/exception-context-kEoMFwze.mjs +429 -0
  60. package/dist/exception-context-kEoMFwze.mjs.map +1 -0
  61. package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-TMu_AlJt.mjs} +38 -31
  62. package/dist/gateway-context-TMu_AlJt.mjs.map +1 -0
  63. package/dist/guards/index.d.mts +3 -3
  64. package/dist/guards/index.d.mts.map +1 -1
  65. package/dist/guards/index.mjs +1 -1
  66. package/dist/{guards-DU1_J9YA.mjs → guards-DALPXy3_.mjs} +6 -5
  67. package/dist/guards-DALPXy3_.mjs.map +1 -0
  68. package/dist/hono-app-CvV3hOfT.mjs +161 -0
  69. package/dist/hono-app-CvV3hOfT.mjs.map +1 -0
  70. package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-ByWZb9DO.mjs} +7 -6
  71. package/dist/http-method.decorator-ByWZb9DO.mjs.map +1 -0
  72. package/dist/i18n/index.d.mts +238 -3
  73. package/dist/i18n/index.d.mts.map +1 -0
  74. package/dist/i18n/index.mjs +39 -3
  75. package/dist/i18n/index.mjs.map +1 -0
  76. package/dist/i18n/messages/en/index.d.mts +2 -2
  77. package/dist/i18n/messages/en/index.mjs +2 -2
  78. package/dist/i18n/utils/index.d.mts +4 -26
  79. package/dist/i18n/utils/index.d.mts.map +1 -1
  80. package/dist/i18n/utils/index.mjs +2 -2
  81. package/dist/i18n/validation/index.d.mts +3 -2
  82. package/dist/i18n/validation/index.mjs +4 -2
  83. package/dist/i18n.module-DRQAZoSZ.mjs +222 -0
  84. package/dist/i18n.module-DRQAZoSZ.mjs.map +1 -0
  85. package/dist/i18n.tokens-CZ_v8oyS.mjs +19 -0
  86. package/dist/i18n.tokens-CZ_v8oyS.mjs.map +1 -0
  87. package/dist/{index-7-hU3GTV.d.mts → index-0ItCjaqw.d.mts} +1 -1
  88. package/dist/index-0ItCjaqw.d.mts.map +1 -0
  89. package/dist/index-B5JBRcWD.d.mts +544 -0
  90. package/dist/index-B5JBRcWD.d.mts.map +1 -0
  91. package/dist/index-BUt92sAE.d.mts +124 -0
  92. package/dist/index-BUt92sAE.d.mts.map +1 -0
  93. package/dist/{index-ByOyTmqf.d.mts → index-B_JoEl3V.d.mts} +751 -2229
  94. package/dist/index-B_JoEl3V.d.mts.map +1 -0
  95. package/dist/index-DtBNIFuP.d.mts +42 -0
  96. package/dist/index-DtBNIFuP.d.mts.map +1 -0
  97. package/dist/{index-C1KvMncZ.d.mts → index-HgOLNruQ.d.mts} +3 -108
  98. package/dist/index-HgOLNruQ.d.mts.map +1 -0
  99. package/dist/index.d.mts +6 -43
  100. package/dist/index.mjs +3 -2
  101. package/dist/{is-command-C6a7WTPw.mjs → is-command-CEPO9n8c.mjs} +2 -2
  102. package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CEPO9n8c.mjs.map} +1 -1
  103. package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-Gvh_AM71.mjs} +1 -1
  104. package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-Gvh_AM71.mjs.map} +1 -1
  105. package/dist/lazy-module-loader-Ib383jH_.d.mts +60 -0
  106. package/dist/lazy-module-loader-Ib383jH_.d.mts.map +1 -0
  107. package/dist/locale-path.service-D-dHiIPc.mjs +165 -0
  108. package/dist/locale-path.service-D-dHiIPc.mjs.map +1 -0
  109. package/dist/locale-url-nZrZxqJP.mjs +44 -0
  110. package/dist/locale-url-nZrZxqJP.mjs.map +1 -0
  111. package/dist/locale-url.service-C2EWmGdq.mjs +41 -0
  112. package/dist/locale-url.service-C2EWmGdq.mjs.map +1 -0
  113. package/dist/logger/index.d.mts +2 -2
  114. package/dist/logger/index.mjs +170 -2
  115. package/dist/logger/index.mjs.map +1 -0
  116. package/dist/macroable/index.d.mts +2 -2
  117. package/dist/macroable/index.mjs +1 -1
  118. package/dist/{macroable-BmufBshB.mjs → macroable-cvDTFZ_A.mjs} +1 -1
  119. package/dist/{macroable-BmufBshB.mjs.map → macroable-cvDTFZ_A.mjs.map} +1 -1
  120. package/dist/metadata-DzzprcID.mjs +39 -0
  121. package/dist/metadata-DzzprcID.mjs.map +1 -0
  122. package/dist/module/index.d.mts +7 -24
  123. package/dist/module/index.d.mts.map +1 -1
  124. package/dist/module/index.mjs +10 -2
  125. package/dist/module/index.mjs.map +1 -0
  126. package/dist/module-registry-Dm-pqHd3.mjs +554 -0
  127. package/dist/module-registry-Dm-pqHd3.mjs.map +1 -0
  128. package/dist/module.decorator-CYHY6pG5.mjs +19 -0
  129. package/dist/module.decorator-CYHY6pG5.mjs.map +1 -0
  130. package/dist/openapi/index.d.mts +44 -8
  131. package/dist/openapi/index.d.mts.map +1 -1
  132. package/dist/openapi/index.mjs +3 -3
  133. package/dist/openapi-CstuTM8S.mjs +309 -0
  134. package/dist/openapi-CstuTM8S.mjs.map +1 -0
  135. package/dist/{openapi-tools.service-Zs-Ewv7F.mjs → openapi-tools.service-BC5EC3R3.mjs} +8 -2
  136. package/dist/openapi-tools.service-BC5EC3R3.mjs.map +1 -0
  137. package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-YhTiJ1bO.d.mts} +3 -3
  138. package/dist/openapi.service-YhTiJ1bO.d.mts.map +1 -0
  139. package/dist/quarry/index.d.mts +14 -163
  140. package/dist/quarry/index.d.mts.map +1 -1
  141. package/dist/quarry/index.mjs +6 -5
  142. package/dist/quarry/runner.d.mts +184 -0
  143. package/dist/quarry/runner.d.mts.map +1 -0
  144. package/dist/quarry/runner.mjs +945 -0
  145. package/dist/quarry/runner.mjs.map +1 -0
  146. package/dist/quarry-registry-CXg0RFXq.d.mts +69 -0
  147. package/dist/quarry-registry-CXg0RFXq.d.mts.map +1 -0
  148. package/dist/quarry.module-BuRPGMDm.mjs +312 -0
  149. package/dist/quarry.module-BuRPGMDm.mjs.map +1 -0
  150. package/dist/queue/index.d.mts +3 -3
  151. package/dist/queue/index.mjs +57 -48
  152. package/dist/queue/index.mjs.map +1 -1
  153. package/dist/queue.module-nddvxzCB.mjs +613 -0
  154. package/dist/queue.module-nddvxzCB.mjs.map +1 -0
  155. package/dist/queue.tokens-DjHnFmre.mjs +11 -0
  156. package/dist/queue.tokens-DjHnFmre.mjs.map +1 -0
  157. package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-DCxQt9dD.mjs} +6 -6
  158. package/dist/r2-storage.provider-DCxQt9dD.mjs.map +1 -0
  159. package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-BPAie_p3.mjs} +6 -11
  160. package/dist/rate-limit.decorator-BPAie_p3.mjs.map +1 -0
  161. package/dist/rate-limiter/index.d.mts +11 -50
  162. package/dist/rate-limiter/index.d.mts.map +1 -1
  163. package/dist/rate-limiter/index.mjs +33 -42
  164. package/dist/rate-limiter/index.mjs.map +1 -1
  165. package/dist/route-name-DGoBOfPg.mjs +171 -0
  166. package/dist/route-name-DGoBOfPg.mjs.map +1 -0
  167. package/dist/route-registration.service-D6vSwiKP.mjs +918 -0
  168. package/dist/route-registration.service-D6vSwiKP.mjs.map +1 -0
  169. package/dist/route-registry-CYqLp2Nj.mjs +123 -0
  170. package/dist/route-registry-CYqLp2Nj.mjs.map +1 -0
  171. package/dist/router/index.d.mts +2 -2
  172. package/dist/router/index.mjs +18 -7
  173. package/dist/router-CWGBD-Bg.mjs +78 -0
  174. package/dist/router-CWGBD-Bg.mjs.map +1 -0
  175. package/dist/router-resolver-D4YlPNlm.mjs +88 -0
  176. package/dist/router-resolver-D4YlPNlm.mjs.map +1 -0
  177. package/dist/seeder/index.d.mts +16 -11
  178. package/dist/seeder/index.d.mts.map +1 -1
  179. package/dist/seeder/index.mjs +5 -3
  180. package/dist/seeder-7ubkms-Y.mjs +81 -0
  181. package/dist/seeder-7ubkms-Y.mjs.map +1 -0
  182. package/dist/seeder-registry-CyUmKsJq.mjs +57 -0
  183. package/dist/seeder-registry-CyUmKsJq.mjs.map +1 -0
  184. package/dist/seeder.module-CYYwk3Qk.mjs +15 -0
  185. package/dist/seeder.module-CYYwk3Qk.mjs.map +1 -0
  186. package/dist/{signed-url-BQPbv2In.mjs → signed-url-DIU0sK_6.mjs} +1 -1
  187. package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-DIU0sK_6.mjs.map} +1 -1
  188. package/dist/storage/index.d.mts +15 -39
  189. package/dist/storage/index.d.mts.map +1 -1
  190. package/dist/storage/index.mjs +3 -3
  191. package/dist/storage/providers/index.d.mts +2 -2
  192. package/dist/storage/providers/index.d.mts.map +1 -1
  193. package/dist/storage/providers/index.mjs +1 -1
  194. package/dist/{storage-D8CBP72Z.mjs → storage-MDZypIE9.mjs} +66 -59
  195. package/dist/storage-MDZypIE9.mjs.map +1 -0
  196. package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-ClUwxz4S.d.mts} +2 -3
  197. package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +1 -0
  198. package/dist/storage.error-Dnib4VHc.mjs +8 -0
  199. package/dist/storage.error-Dnib4VHc.mjs.map +1 -0
  200. package/dist/stratal-DL9M38_s.mjs +383 -0
  201. package/dist/stratal-DL9M38_s.mjs.map +1 -0
  202. package/dist/stratal-DwDJPY9N.d.mts +43 -0
  203. package/dist/stratal-DwDJPY9N.d.mts.map +1 -0
  204. package/dist/tiered-cache.service-Dv3BhxxE.d.mts +79 -0
  205. package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +1 -0
  206. package/dist/trailing-slash-CFyw8nYu.mjs +34 -0
  207. package/dist/trailing-slash-CFyw8nYu.mjs.map +1 -0
  208. package/dist/{types-cySNS_lp.d.mts → types-CmV_9xBD.d.mts} +1 -1
  209. package/dist/types-CmV_9xBD.d.mts.map +1 -0
  210. package/dist/uri-h7Q8Jug9.mjs +251 -0
  211. package/dist/uri-h7Q8Jug9.mjs.map +1 -0
  212. package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DAWYasuP.mjs} +7 -4
  213. package/dist/usage-generator-DAWYasuP.mjs.map +1 -0
  214. package/dist/validation-CpOjviyT.mjs +49 -0
  215. package/dist/validation-CpOjviyT.mjs.map +1 -0
  216. package/dist/validation.context-CRvmrhq7.mjs +117 -0
  217. package/dist/validation.context-CRvmrhq7.mjs.map +1 -0
  218. package/dist/versioning.service-C6aHky8-.mjs +36 -0
  219. package/dist/versioning.service-C6aHky8-.mjs.map +1 -0
  220. package/dist/websocket/index.d.mts +16 -14
  221. package/dist/websocket/index.d.mts.map +1 -1
  222. package/dist/websocket/index.mjs +2 -2
  223. package/dist/workers/index.d.mts +2 -2
  224. package/dist/workers/index.d.mts.map +1 -1
  225. package/dist/workers/index.mjs +3 -2
  226. package/dist/workers/index.mjs.map +1 -1
  227. package/dist/zod-eKqqhZ5_.mjs +72 -0
  228. package/dist/zod-eKqqhZ5_.mjs.map +1 -0
  229. package/dist/{index-Bnpfq6uk.d.mts → zod-wecrEVAs.d.mts} +63 -133
  230. package/dist/zod-wecrEVAs.d.mts.map +1 -0
  231. package/package.json +28 -39
  232. package/dist/base-email.provider-CfQCA08m.mjs +0 -42
  233. package/dist/base-email.provider-CfQCA08m.mjs.map +0 -1
  234. package/dist/cache.service-DsnKuNyO.d.mts.map +0 -1
  235. package/dist/cache.tokens-B7Rw1C9Q.mjs +0 -6
  236. package/dist/cache.tokens-B7Rw1C9Q.mjs.map +0 -1
  237. package/dist/colors-DJaRDXoS.mjs +0 -16
  238. package/dist/colors-DJaRDXoS.mjs.map +0 -1
  239. package/dist/command-BgSlsS4M.mjs.map +0 -1
  240. package/dist/command-Cmmf0oHX.d.mts.map +0 -1
  241. package/dist/consumer-registry-B7yUNh0q.d.mts.map +0 -1
  242. package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
  243. package/dist/cron-manager-CmTimEjf.d.mts +0 -131
  244. package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
  245. package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
  246. package/dist/en-DSH_bhh6.mjs +0 -308
  247. package/dist/en-DSH_bhh6.mjs.map +0 -1
  248. package/dist/env-D1rcZ8_r.d.mts.map +0 -1
  249. package/dist/errors-COW9-Mar.mjs +0 -1739
  250. package/dist/errors-COW9-Mar.mjs.map +0 -1
  251. package/dist/errors-ORxu1-Bb.mjs +0 -74
  252. package/dist/errors-ORxu1-Bb.mjs.map +0 -1
  253. package/dist/events-CzCV8jI8.mjs.map +0 -1
  254. package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
  255. package/dist/guards-DU1_J9YA.mjs.map +0 -1
  256. package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
  257. package/dist/i18n.module-CzXLW9Hy.mjs +0 -2532
  258. package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
  259. package/dist/index-7-hU3GTV.d.mts.map +0 -1
  260. package/dist/index-Bnpfq6uk.d.mts.map +0 -1
  261. package/dist/index-ByOyTmqf.d.mts.map +0 -1
  262. package/dist/index-C1KvMncZ.d.mts.map +0 -1
  263. package/dist/index-DBd_2wv8.d.mts +0 -263
  264. package/dist/index-DBd_2wv8.d.mts.map +0 -1
  265. package/dist/index-DUzWs0z7.d.mts +0 -494
  266. package/dist/index-DUzWs0z7.d.mts.map +0 -1
  267. package/dist/index.d.mts.map +0 -1
  268. package/dist/logger-DlV7NtvD.mjs +0 -440
  269. package/dist/logger-DlV7NtvD.mjs.map +0 -1
  270. package/dist/module-BzLg57FK.mjs +0 -866
  271. package/dist/module-BzLg57FK.mjs.map +0 -1
  272. package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
  273. package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
  274. package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
  275. package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
  276. package/dist/queue.module-BhCjZp6H.mjs +0 -409
  277. package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
  278. package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
  279. package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
  280. package/dist/resend.provider-DB4IlFjG.mjs +0 -68
  281. package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
  282. package/dist/seeder-zoEfEw9i.mjs +0 -138
  283. package/dist/seeder-zoEfEw9i.mjs.map +0 -1
  284. package/dist/setup-CefZKV_e.mjs +0 -37
  285. package/dist/setup-CefZKV_e.mjs.map +0 -1
  286. package/dist/smtp.provider-B6D7zuWX.mjs +0 -76
  287. package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
  288. package/dist/storage-D8CBP72Z.mjs.map +0 -1
  289. package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
  290. package/dist/stratal-CNwpbSZl.mjs +0 -535
  291. package/dist/stratal-CNwpbSZl.mjs.map +0 -1
  292. package/dist/types-cySNS_lp.d.mts.map +0 -1
  293. package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
  294. package/dist/validation-DtJwAv7O.mjs +0 -248
  295. package/dist/validation-DtJwAv7O.mjs.map +0 -1
  296. /package/dist/{chunk-D1SwGrFN.mjs → chunk-BBjsoOtd.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.context-CRvmrhq7.mjs","names":[],"sources":["../src/i18n/validation/validation.error-map.ts","../src/i18n/validation/validation.context.ts"],"sourcesContent":["import type {\n $ZodErrorMap,\n $ZodIssueInvalidKey,\n $ZodIssueInvalidStringFormat,\n $ZodIssueInvalidType,\n $ZodIssueInvalidUnion,\n $ZodIssueNotMultipleOf,\n $ZodIssueTooBig,\n $ZodIssueTooSmall,\n $ZodIssueUnrecognizedKeys,\n $ZodRawIssue,\n} from 'zod/v4/core'\nimport { getContainer } from '../../di/container-storage'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport type { II18nService, MessageKeys } from '../i18n.types'\n\n/**\n * Type guards for narrowing Zod v4 issue types\n */\nfunction isInvalidType(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueInvalidType> {\n return issue.code === 'invalid_type'\n}\n\nfunction isTooBig(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueTooBig> {\n return issue.code === 'too_big'\n}\n\nfunction isTooSmall(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueTooSmall> {\n return issue.code === 'too_small'\n}\n\nfunction isInvalidFormat(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueInvalidStringFormat> {\n return issue.code === 'invalid_format'\n}\n\nfunction isNotMultipleOf(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueNotMultipleOf> {\n return issue.code === 'not_multiple_of'\n}\n\nfunction isUnrecognizedKeys(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueUnrecognizedKeys> {\n return issue.code === 'unrecognized_keys'\n}\n\nfunction isInvalidUnion(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueInvalidUnion> {\n return issue.code === 'invalid_union'\n}\n\nfunction isInvalidKey(issue: $ZodRawIssue): issue is $ZodRawIssue<$ZodIssueInvalidKey> {\n return issue.code === 'invalid_key'\n}\n\n/**\n * Maps Zod issue codes to zodI18n message keys\n * Adapted for Zod v4's simpler issue code system\n */\nfunction getMessageKey(issue: $ZodRawIssue): MessageKeys {\n if (isInvalidType(issue)) {\n if (issue.input === undefined) {\n return 'zodI18n.errors.required'\n }\n return 'zodI18n.errors.invalid_type'\n }\n\n if (isTooSmall(issue)) {\n const typeKey = issue.origin || 'string'\n const exactKey = issue.exact\n ? 'exact'\n : issue.inclusive\n ? 'inclusive'\n : 'not_inclusive'\n return `zodI18n.errors.too_small.${typeKey}.${exactKey}` as MessageKeys\n }\n\n if (isTooBig(issue)) {\n const typeKey = issue.origin || 'string'\n const exactKey = issue.exact\n ? 'exact'\n : issue.inclusive\n ? 'inclusive'\n : 'not_inclusive'\n return `zodI18n.errors.too_big.${typeKey}.${exactKey}` as MessageKeys\n }\n\n if (isInvalidFormat(issue)) {\n // Map v4's format to v3-style validation keys\n return `zodI18n.errors.invalid_string.${issue.format}` as MessageKeys\n }\n\n if (isNotMultipleOf(issue)) {\n return 'zodI18n.errors.not_multiple_of'\n }\n\n if (isUnrecognizedKeys(issue)) {\n return 'zodI18n.errors.unrecognized_keys'\n }\n\n if (isInvalidUnion(issue)) {\n return 'zodI18n.errors.invalid_union'\n }\n\n if (isInvalidKey(issue)) {\n // v4: Replaces invalid_enum_value, invalid_literal\n return 'zodI18n.errors.invalid_enum_value'\n }\n\n // invalid_element, invalid_value, or unknown codes\n return 'zodI18n.errors.custom.default'\n}\n\n/**\n * Extracts interpolation parameters from Zod issue\n * Uses proper type narrowing for v4\n */\nfunction getMessageParams(issue: $ZodRawIssue): Record<string, string | number> {\n const params: Record<string, string | number> = {}\n\n if (isInvalidType(issue)) {\n params.expected = issue.expected\n params.received = String(issue.input)\n return params\n }\n\n if (isUnrecognizedKeys(issue)) {\n params.keys = issue.keys.join(', ')\n return params\n }\n\n if (isInvalidKey(issue)) {\n // v4: For enums and records\n // Since v4 doesn't have options field, we'll use generic message\n return params\n }\n\n if (isInvalidFormat(issue)) {\n params.validation = issue.format\n\n // Check for specific string format issues with additional fields\n if ('prefix' in issue && typeof issue.prefix === 'string') {\n params.startsWith = issue.prefix\n }\n if ('suffix' in issue && typeof issue.suffix === 'string') {\n params.endsWith = issue.suffix\n }\n if ('includes' in issue && typeof issue.includes === 'string') {\n params.includes = issue.includes\n }\n if (issue.pattern) {\n params.pattern = issue.pattern\n }\n\n return params\n }\n\n if (isTooSmall(issue)) {\n params.minimum = Number(issue.minimum)\n params.type = issue.origin\n if (issue.origin === 'date') {\n params.minimum = new Date(Number(issue.minimum)).toLocaleDateString()\n }\n return params\n }\n\n if (isTooBig(issue)) {\n params.maximum = Number(issue.maximum)\n params.type = issue.origin\n if (issue.origin === 'date') {\n params.maximum = new Date(Number(issue.maximum)).toLocaleDateString()\n }\n return params\n }\n\n if (isNotMultipleOf(issue)) {\n params.multipleOf = issue.divisor\n return params\n }\n\n return params\n}\n\n/**\n * Creates a Zod error map that uses i18n for translation\n * Uses Zod v4 native $ZodErrorMap signature (no ctx parameter)\n */\nexport function createI18nErrorMap(): $ZodErrorMap {\n return (issue: $ZodRawIssue): { message: string } => {\n const messageKey = getMessageKey(issue)\n const messageParams = getMessageParams(issue)\n\n try {\n const container = getContainer()\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n return { message: i18n.t(messageKey, messageParams) }\n } catch {\n return { message: 'Invalid input' }\n }\n }\n}\n","import { createI18nErrorMap } from './validation.error-map'\n\n/**\n * Zod error map that resolves I18nService from the DI container.\n * Falls back to 'Invalid input' when called outside the container scope\n * (e.g., config validation at startup, tests).\n */\nexport const zodErrorMap = createI18nErrorMap()\n"],"mappings":";;;;;;AAmBA,SAAS,cAAc,OAAkE;CACvF,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,SAAS,OAA6D;CAC7E,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,WAAW,OAA+D;CACjF,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,gBAAgB,OAA0E;CACjG,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,gBAAgB,OAAoE;CAC3F,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,mBAAmB,OAAuE;CACjG,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,eAAe,OAAmE;CACzF,OAAO,MAAM,SAAS;AACxB;AAEA,SAAS,aAAa,OAAiE;CACrF,OAAO,MAAM,SAAS;AACxB;;;;;AAMA,SAAS,cAAc,OAAkC;CACvD,IAAI,cAAc,KAAK,GAAG;EACxB,IAAI,MAAM,UAAU,KAAA,GAClB,OAAO;EAET,OAAO;CACT;CAEA,IAAI,WAAW,KAAK,GAOlB,OAAO,4BANS,MAAM,UAAU,SAMW,GAL1B,MAAM,QACnB,UACA,MAAM,YACJ,cACA;CAIR,IAAI,SAAS,KAAK,GAOhB,OAAO,0BANS,MAAM,UAAU,SAMS,GALxB,MAAM,QACnB,UACA,MAAM,YACJ,cACA;CAIR,IAAI,gBAAgB,KAAK,GAEvB,OAAO,iCAAiC,MAAM;CAGhD,IAAI,gBAAgB,KAAK,GACvB,OAAO;CAGT,IAAI,mBAAmB,KAAK,GAC1B,OAAO;CAGT,IAAI,eAAe,KAAK,GACtB,OAAO;CAGT,IAAI,aAAa,KAAK,GAEpB,OAAO;CAIT,OAAO;AACT;;;;;AAMA,SAAS,iBAAiB,OAAsD;CAC9E,MAAM,SAA0C,CAAC;CAEjD,IAAI,cAAc,KAAK,GAAG;EACxB,OAAO,WAAW,MAAM;EACxB,OAAO,WAAW,OAAO,MAAM,KAAK;EACpC,OAAO;CACT;CAEA,IAAI,mBAAmB,KAAK,GAAG;EAC7B,OAAO,OAAO,MAAM,KAAK,KAAK,IAAI;EAClC,OAAO;CACT;CAEA,IAAI,aAAa,KAAK,GAGpB,OAAO;CAGT,IAAI,gBAAgB,KAAK,GAAG;EAC1B,OAAO,aAAa,MAAM;EAG1B,IAAI,YAAY,SAAS,OAAO,MAAM,WAAW,UAC/C,OAAO,aAAa,MAAM;EAE5B,IAAI,YAAY,SAAS,OAAO,MAAM,WAAW,UAC/C,OAAO,WAAW,MAAM;EAE1B,IAAI,cAAc,SAAS,OAAO,MAAM,aAAa,UACnD,OAAO,WAAW,MAAM;EAE1B,IAAI,MAAM,SACR,OAAO,UAAU,MAAM;EAGzB,OAAO;CACT;CAEA,IAAI,WAAW,KAAK,GAAG;EACrB,OAAO,UAAU,OAAO,MAAM,OAAO;EACrC,OAAO,OAAO,MAAM;EACpB,IAAI,MAAM,WAAW,QACnB,OAAO,UAAU,IAAI,KAAK,OAAO,MAAM,OAAO,CAAC,EAAE,mBAAmB;EAEtE,OAAO;CACT;CAEA,IAAI,SAAS,KAAK,GAAG;EACnB,OAAO,UAAU,OAAO,MAAM,OAAO;EACrC,OAAO,OAAO,MAAM;EACpB,IAAI,MAAM,WAAW,QACnB,OAAO,UAAU,IAAI,KAAK,OAAO,MAAM,OAAO,CAAC,EAAE,mBAAmB;EAEtE,OAAO;CACT;CAEA,IAAI,gBAAgB,KAAK,GAAG;EAC1B,OAAO,aAAa,MAAM;EAC1B,OAAO;CACT;CAEA,OAAO;AACT;;;;;AAMA,SAAgB,qBAAmC;CACjD,QAAQ,UAA6C;EACnD,MAAM,aAAa,cAAc,KAAK;EACtC,MAAM,gBAAgB,iBAAiB,KAAK;EAE5C,IAAI;GAGF,OAAO,EAAE,SAFS,aACG,EAAE,QAAsB,YAAY,WACpC,EAAE,EAAE,YAAY,aAAa,EAAE;EACtD,QAAQ;GACN,OAAO,EAAE,SAAS,gBAAgB;EACpC;CACF;AACF;;;;;;;;AC7LA,MAAa,cAAc,mBAAmB"}
@@ -0,0 +1,36 @@
1
+ import { t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { d as inject, r as DI_TOKENS, s as Singleton } from "./di-DseMn-z9.mjs";
3
+ import { n as __decorateParam, t as __decorate } from "./decorate-CuAoSZvs.mjs";
4
+ import { f as VERSION_NEUTRAL } from "./exception-context-kEoMFwze.mjs";
5
+ //#region src/router/services/versioning.service.ts
6
+ var versioning_service_exports = /* @__PURE__ */ __exportAll({ VersioningService: () => VersioningService });
7
+ let VersioningService = class VersioningService {
8
+ options;
9
+ constructor(app) {
10
+ this.options = app.config.versioning ?? null;
11
+ }
12
+ /** Whether versioning is enabled */
13
+ get enabled() {
14
+ return this.options !== null;
15
+ }
16
+ /**
17
+ * Resolve versioned paths for a base path.
18
+ *
19
+ * @param basePath - The base path (e.g., '/users')
20
+ * @param version - Explicit version from controller/router config
21
+ * @returns Array of versioned path strings (e.g., ['/v1/users', '/v2/users'])
22
+ */
23
+ resolve(basePath, version) {
24
+ if (!this.options) return [basePath];
25
+ if (version === VERSION_NEUTRAL) return [basePath];
26
+ const prefix = this.options.prefix ?? "v";
27
+ if (version !== void 0) return (Array.isArray(version) ? version : [version]).map((v) => `/${prefix}${v}${basePath}`);
28
+ if (this.options.defaultVersion !== void 0) return (Array.isArray(this.options.defaultVersion) ? this.options.defaultVersion : [this.options.defaultVersion]).map((v) => `/${prefix}${v}${basePath}`);
29
+ return [basePath];
30
+ }
31
+ };
32
+ VersioningService = __decorate([Singleton(), __decorateParam(0, inject(DI_TOKENS.Application))], VersioningService);
33
+ //#endregion
34
+ export { versioning_service_exports as n, VersioningService as t };
35
+
36
+ //# sourceMappingURL=versioning.service-C6aHky8-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.service-C6aHky8-.mjs","names":[],"sources":["../src/router/services/versioning.service.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport { DI_TOKENS } from '../../di/tokens'\nimport type { Application } from '../../application'\nimport { VERSION_NEUTRAL } from '../constants'\nimport type { VersioningOptions } from '../types'\n\n/**\n * Resolves version prefixes for route paths.\n *\n * Handles VERSION_NEUTRAL, multi-version arrays, default version fallback,\n * and configurable prefix (default: 'v').\n *\n * Registered as a singleton in the container.\n */\n@Singleton()\nexport class VersioningService {\n private readonly options: VersioningOptions | null\n\n constructor(@inject(DI_TOKENS.Application) app: Application) {\n this.options = app.config.versioning ?? null\n }\n\n /** Whether versioning is enabled */\n get enabled(): boolean {\n return this.options !== null\n }\n\n /**\n * Resolve versioned paths for a base path.\n *\n * @param basePath - The base path (e.g., '/users')\n * @param version - Explicit version from controller/router config\n * @returns Array of versioned path strings (e.g., ['/v1/users', '/v2/users'])\n */\n resolve(basePath: string, version?: string | string[] | typeof VERSION_NEUTRAL): string[] {\n // Versioning disabled — return base path as-is\n if (!this.options) {\n return [basePath]\n }\n\n // VERSION_NEUTRAL — explicitly opt out of versioning\n if (version === VERSION_NEUTRAL) {\n return [basePath]\n }\n\n const prefix = this.options.prefix ?? 'v'\n\n // Explicit version(s) on the controller/router\n if (version !== undefined) {\n const versions = Array.isArray(version) ? version : [version]\n return versions.map(v => `/${prefix}${v}${basePath}`)\n }\n\n // No explicit version — apply defaultVersion if set\n if (this.options.defaultVersion !== undefined) {\n const defaults = Array.isArray(this.options.defaultVersion)\n ? this.options.defaultVersion\n : [this.options.defaultVersion]\n return defaults.map(v => `/${prefix}${v}${basePath}`)\n }\n\n // Versioning enabled but no version and no default — no prefix\n return [basePath]\n }\n}\n"],"mappings":";;;;;;AAgBO,IAAA,oBAAA,MAAM,kBAAkB;CAC7B;CAEA,YAAY,KAAiD;EAC3D,KAAK,UAAU,IAAI,OAAO,cAAc;CAC1C;;CAGA,IAAI,UAAmB;EACrB,OAAO,KAAK,YAAY;CAC1B;;;;;;;;CASA,QAAQ,UAAkB,SAAgE;EAExF,IAAI,CAAC,KAAK,SACR,OAAO,CAAC,QAAQ;EAIlB,IAAI,YAAY,iBACd,OAAO,CAAC,QAAQ;EAGlB,MAAM,SAAS,KAAK,QAAQ,UAAU;EAGtC,IAAI,YAAY,KAAA,GAEd,QADiB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAC5C,KAAI,MAAK,IAAI,SAAS,IAAI,UAAU;EAItD,IAAI,KAAK,QAAQ,mBAAmB,KAAA,GAIlC,QAHiB,MAAM,QAAQ,KAAK,QAAQ,cAAc,IACtD,KAAK,QAAQ,iBACb,CAAC,KAAK,QAAQ,cAAc,GAChB,KAAI,MAAK,IAAI,SAAS,IAAI,UAAU;EAItD,OAAO,CAAC,QAAQ;CAClB;AACF;gCAlDC,UAAU,GAAA,gBAAA,GAII,OAAO,UAAU,WAAW,CAAA,CAAA,GAAA,iBAAA"}
@@ -1,5 +1,5 @@
1
- import { B as ContextQueryResult, Bn as ControllerOptions, V as RouterContext, Xn as RouterEnv, d as ApplicationError } from "../index-ByOyTmqf.mjs";
2
- import { t as Constructor } from "../types-cySNS_lp.mjs";
1
+ import { Dr as ApplicationError, Yn as ControllerOptions, nt as ContextQueryResult, or as RouterEnv, rt as RouterContext } from "../index-B_JoEl3V.mjs";
2
+ import { t as Constructor } from "../types-CmV_9xBD.mjs";
3
3
  import { Context } from "hono";
4
4
  import { WSContext, WSContext as WSContext$1, WSEvents, WSMessageReceive, WSReadyState, WSReadyState as WSReadyState$1 } from "hono/ws";
5
5
 
@@ -107,16 +107,6 @@ declare function getWsOnCloseMethod(target: Constructor): string | undefined;
107
107
  */
108
108
  declare function getWsOnErrorMethod(target: Constructor): string | undefined;
109
109
  //#endregion
110
- //#region src/websocket/errors/websocket-body-not-available.error.d.ts
111
- declare class WebSocketBodyNotAvailableError extends ApplicationError {
112
- constructor();
113
- }
114
- //#endregion
115
- //#region src/websocket/errors/websocket-duplicate-event-handler.error.d.ts
116
- declare class WebSocketDuplicateEventHandlerError extends ApplicationError {
117
- constructor(decorator: string, existingMethod: string);
118
- }
119
- //#endregion
120
110
  //#region src/websocket/gateway-context.d.ts
121
111
  /**
122
112
  * WebSocket gateway context
@@ -140,6 +130,15 @@ declare class GatewayContext extends RouterContext {
140
130
  constructor(c: Context<RouterEnv>, ws: WSContext$1);
141
131
  /** Send data through the WebSocket connection */
142
132
  send(data: string | ArrayBuffer | Uint8Array<ArrayBuffer>): void;
133
+ /**
134
+ * Send only if the socket is still open. Returns `false` (and logs a warning)
135
+ * when the socket is closing/closed — e.g. inside `@OnError`, which fires on a
136
+ * transport error after the socket is already dead, or after an `await` in
137
+ * `@OnMessage` when the client disconnected mid-handler. Use this for
138
+ * fire-and-forget acks/errors instead of `send()`, which throws on a closed
139
+ * socket ("Can't call WebSocket send() after close()").
140
+ */
141
+ trySend(data: string | ArrayBuffer | Uint8Array<ArrayBuffer>): boolean;
143
142
  /** Close the WebSocket connection */
144
143
  close(code?: number, reason?: string): void;
145
144
  /** Current WebSocket ready state */
@@ -164,10 +163,13 @@ declare class GatewayContext extends RouterContext {
164
163
  /**
165
164
  * Request body is not available in WebSocket gateways
166
165
  *
167
- * @throws WebSocketBodyNotAvailableError always — WebSocket upgrade requests do not have a body
166
+ * @throws WebSocketError always — WebSocket upgrade requests do not have a body
168
167
  */
169
168
  body<T>(): Promise<T>;
170
169
  }
171
170
  //#endregion
172
- export { Gateway, GatewayContext, type GatewayOptions, OnClose, OnError, OnMessage, type WSContext, type WSEvents, type WSMessageReceive, type WSReadyState, WebSocketBodyNotAvailableError, WebSocketDuplicateEventHandlerError, getWsOnCloseMethod, getWsOnErrorMethod, getWsOnMessageMethod, isGateway };
171
+ //#region src/websocket/websocket.error.d.ts
172
+ declare class WebSocketError extends ApplicationError {}
173
+ //#endregion
174
+ export { Gateway, GatewayContext, type GatewayOptions, OnClose, OnError, OnMessage, type WSContext, type WSEvents, type WSMessageReceive, type WSReadyState, WebSocketError, getWsOnCloseMethod, getWsOnErrorMethod, getWsOnMessageMethod, isGateway };
173
175
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/websocket/types.ts","../../src/websocket/decorators/gateway.decorator.ts","../../src/websocket/decorators/ws-event.decorator.ts","../../src/websocket/errors/websocket-body-not-available.error.ts","../../src/websocket/errors/websocket-duplicate-event-handler.error.ts","../../src/websocket/gateway-context.ts"],"mappings":";;;;;;;;;;KAMY,cAAA,GAAiB,IAAA,CAAK,iBAAA;;;;;;;AAAlC;;;;;;;;AC6BA;;;;;;;;;;;;;;;;iBAAgB,OAAA,CAAQ,KAAA,UAAe,OAAA,GAAU,cAAA,cACpB,WAAA,EAAa,MAAA,EAAQ,CAAA,KAAC,CAAA;;;AAanD;;;;iBAAgB,SAAA,CAAU,MAAA;;;;;;;;AD3C1B;;;;;;;;AC6BA;iBCDgB,SAAA,CAAA,GAAa,eAAA;;;;;;;;;;;;;;;iBAsBb,OAAA,CAAA,GAAW,eAAA;;;ADP3B;;;;;;;;ACfA;;;;iBA0CgB,OAAA,CAAA,GAAW,eAAA;AApB3B;;;AAAA,iBA6BgB,oBAAA,CAAqB,MAAA,EAAQ,WAAA;;AAT7C;;iBAgBgB,kBAAA,CAAmB,MAAA,EAAQ,WAAA;;;AAP3C;iBAcgB,kBAAA,CAAmB,MAAA,EAAQ,WAAA;;;cCjG9B,8BAAA,SAAuC,gBAAA;EAAA,WAAA,CAAA;AAAA;;;cCAvC,mCAAA,SAA4C,gBAAA;cAC3C,SAAA,UAAmB,cAAA;AAAA;;;;AJGjC;;;;;;;;AC6BA;;;;;;;;cIXa,cAAA,SAAuB,aAAA;EAAA,SACiB,EAAA,EAAI,WAAA;cAA3C,CAAA,EAAG,OAAA,CAAQ,SAAA,GAA4B,EAAA,EAAI,WAAA;EJUlB;EILrC,IAAA,CAAK,IAAA,WAAe,WAAA,GAAc,UAAA,CAAW,WAAA;EJMlB;EID3B,KAAA,CAAM,IAAA,WAAe,MAAA;EJCmB;EAAA,IIIpC,UAAA,CAAA,GAAc,cAAA;EJJ+B;;AAanD;;;;;;;EIIW,KAAA,CAAA,GAAS,MAAA;EACT,KAAA,CAAM,GAAA;EHpBQ;;;;AAsBzB;EGSW,KAAA,WAAgB,MAAA,oFAAA,CAA2F,GAAA,GAAM,CAAA,GAAI,kBAAA,CAAmB,CAAA,EAAG,CAAA;;;;AHWtJ;;EGCW,IAAA,GAAA,CAAA,GAAW,OAAA,CAAQ,CAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/websocket/types.ts","../../src/websocket/decorators/gateway.decorator.ts","../../src/websocket/decorators/ws-event.decorator.ts","../../src/websocket/gateway-context.ts","../../src/websocket/websocket.error.ts"],"mappings":";;;;;;;;;;KAMY,cAAA,GAAiB,IAAI,CAAC,iBAAA;;;;;;;AAAlC;;;;AAAmD;;;;AC8BnD;;;;;;;;;;;;;;;;iBAAgB,OAAA,CAAQ,KAAA,UAAe,OAAA,GAAU,cAAA,cACpB,WAAA,EAAa,MAAA,EAAQ,CAAA,KAAC,CAAA;;AAAA;AAanD;;;;iBAAgB,SAAA,CAAU,MAAc;;;;;;;;AD5CxC;;;;AAAmD;;;;AC8BnD;iBCDgB,SAAA,IAAa,eAAe;;;;;;;;;;;;;;;iBAsB5B,OAAA,IAAW,eAAe;;ADpBS;AAanD;;;;AAAwC;;;;ACfxC;;;;iBA0CgB,OAAA,IAAW,eAAe;AApB1C;;;AAAA,iBA6BgB,oBAAA,CAAqB,MAAmB,EAAX,WAAW;AA7Bd;AAoB1C;;AApB0C,iBAoC1B,kBAAA,CAAmB,MAAmB,EAAX,WAAW;;AAhBZ;AAS1C;iBAcgB,kBAAA,CAAmB,MAAmB,EAAX,WAAW;;;;AF9FtD;;;;AAAmD;;;;AC8BnD;;;;;;;;cERa,cAAA,SAAuB,aAAA;EAAA,SACiB,EAAA,EAAI,WAAA;cAA3C,CAAA,EAAG,OAAA,CAAQ,SAAA,GAA4B,EAAA,EAAI,WAAA;EFOlB;EEFrC,IAAA,CAAK,IAAA,WAAe,WAAA,GAAc,UAAA,CAAW,WAAA;EFGlB;;;;;AAAsB;AAanD;;EEJE,OAAA,CAAQ,IAAA,WAAe,WAAA,GAAc,UAAA,CAAW,WAAA;EFIV;EEQtC,KAAA,CAAM,IAAA,WAAe,MAAA;;MAKjB,UAAA,IAAc,cAAA;;AD5BpB;;;;AAA4C;AAsB5C;;;ECmBW,KAAA,IAAS,MAAA;EACT,KAAA,CAAM,GAAA;EDAD;;;;AAA0B;ECW/B,KAAA,WAAgB,MAAA,qFAA2F,GAAA,GAAM,CAAA,GAAI,kBAAA,CAAmB,CAAA,EAAG,CAAA;EDFlH;;;AAAoB;AAOxD;ECOW,IAAA,OAAW,OAAA,CAAQ,CAAA;AAAA;;;cClGjB,cAAA,SAAuB,gBAAgB"}
@@ -1,2 +1,2 @@
1
- import { a as OnMessage, c as getWsOnMessageMethod, d as isGateway, i as OnError, l as WebSocketDuplicateEventHandlerError, n as WebSocketBodyNotAvailableError, o as getWsOnCloseMethod, r as OnClose, s as getWsOnErrorMethod, t as GatewayContext, u as Gateway } from "../gateway-context-CXmXtaUP.mjs";
2
- export { Gateway, GatewayContext, OnClose, OnError, OnMessage, WebSocketBodyNotAvailableError, WebSocketDuplicateEventHandlerError, getWsOnCloseMethod, getWsOnErrorMethod, getWsOnMessageMethod, isGateway };
1
+ import { a as getWsOnCloseMethod, c as WebSocketError, i as OnMessage, l as Gateway, n as OnClose, o as getWsOnErrorMethod, r as OnError, s as getWsOnMessageMethod, t as GatewayContext, u as isGateway } from "../gateway-context-TMu_AlJt.mjs";
2
+ export { Gateway, GatewayContext, OnClose, OnError, OnMessage, WebSocketError, getWsOnCloseMethod, getWsOnErrorMethod, getWsOnMessageMethod, isGateway };
@@ -1,5 +1,5 @@
1
- import { Dr as Container } from "../index-ByOyTmqf.mjs";
2
- import { t as StratalEnv } from "../env-D1rcZ8_r.mjs";
1
+ import { Y as Container } from "../index-B_JoEl3V.mjs";
2
+ import { t as StratalEnv } from "../env-ug22bJj7.mjs";
3
3
  import { DurableObject, WorkerEntrypoint, WorkflowEntrypoint } from "cloudflare:workers";
4
4
 
5
5
  //#region src/workers/run-in-scope.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/workers/run-in-scope.ts","../../src/workers/stratal-durable-object.ts","../../src/workers/stratal-worker-entrypoint.ts","../../src/workers/stratal-workflow.ts"],"mappings":";;;;;;;;;AASA;;iBAAsB,UAAA,GAAA,CACpB,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;;;;;AAFX;;;;;;;;;;;;;;;;;;;uBCkBsB,oBAAA,aACR,UAAA,GAAa,UAAA,UACjB,aAAA,CAAc,GAAA;EAAA,UACN,UAAA,GAAA,CACd,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;AAAA;;;;;ADvBb;;;;;;;;;;;;;;;;;;uBEgBsB,uBAAA,aACR,UAAA,GAAa,UAAA,UACjB,gBAAA,CAAiB,GAAA;EAAA,UACf,UAAA,GAAA,CACR,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;AAAA;;;;;AFrBb;;;;;;;;;;;;;;;;;;uBGgBsB,eAAA,aACR,UAAA,GAAa,UAAA,4BAEjB,kBAAA,CAAmB,GAAA,EAAK,MAAA;EAAA,UACtB,UAAA,GAAA,CACR,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/workers/run-in-scope.ts","../../src/workers/stratal-durable-object.ts","../../src/workers/stratal-worker-entrypoint.ts","../../src/workers/stratal-workflow.ts"],"mappings":";;;;;;;;;AASA;;iBAAsB,UAAA,IACpB,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;;;;;AAFX;;;;;;;;;;;;;;;;;;;uBCkBsB,oBAAA,aACR,UAAA,GAAa,UAAA,UACjB,aAAA,CAAc,GAAA;EAAA,UACN,UAAA,IACd,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;AAAA;;;;;ADvBb;;;;;;;;;;;;;;;;;;uBEgBsB,uBAAA,aACR,UAAA,GAAa,UAAA,UACjB,gBAAA,CAAiB,GAAA;EAAA,UACf,UAAA,IACR,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;AAAA;;;;;AFrBb;;;;;;;;;;;;;;;;;;uBGgBsB,eAAA,aACR,UAAA,GAAa,UAAA,4BAEjB,kBAAA,CAAmB,GAAA,EAAK,MAAA;EAAA,UACtB,UAAA,IACR,QAAA,GAAW,SAAA,EAAW,SAAA,KAAc,CAAA,GAAI,OAAA,CAAQ,CAAA,IAC/C,OAAA,CAAQ,CAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { f as DI_TOKENS } from "../logger-DlV7NtvD.mjs";
2
- import { t as Stratal } from "../stratal-CNwpbSZl.mjs";
1
+ import { r as DI_TOKENS } from "../di-DseMn-z9.mjs";
2
+ import { t as Stratal } from "../stratal-DL9M38_s.mjs";
3
3
  import { DurableObject, WorkerEntrypoint, WorkflowEntrypoint } from "cloudflare:workers";
4
4
  //#region src/workers/run-in-scope.ts
5
5
  /**
@@ -10,6 +10,7 @@ import { DurableObject, WorkerEntrypoint, WorkflowEntrypoint } from "cloudflare:
10
10
  */
11
11
  async function runInScope(callback) {
12
12
  const app = await Stratal.resolveApplication();
13
+ await app.ensureScopedHandlers();
13
14
  const mockCtx = app.createMockRouterContext("en");
14
15
  return app.container.runInRequestScope(mockCtx, callback);
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/workers/run-in-scope.ts","../../src/workers/stratal-durable-object.ts","../../src/workers/stratal-worker-entrypoint.ts","../../src/workers/stratal-workflow.ts"],"sourcesContent":["import type { Container } from '../di/container'\nimport { Stratal } from '../stratal'\n\n/**\n * Shared helper that creates a request-scoped DI container by accessing the\n * Stratal Application via the static singleton.\n *\n * Works with Durable Objects, Workflows, and WorkerEntrypoints.\n */\nexport async function runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n): Promise<T> {\n const app = await Stratal.resolveApplication()\n const mockCtx = app.createMockRouterContext('en')\n return app.container.runInRequestScope(mockCtx, callback)\n}\n","import { DurableObject } from 'cloudflare:workers'\nimport type { Container } from '../di/container'\nimport { DI_TOKENS } from '../di/tokens'\nimport type { StratalEnv } from '../env'\nimport { runInScope } from './run-in-scope'\n\n/**\n * Base class for Durable Objects with full DI access.\n *\n * Extends Cloudflare's `DurableObject` and provides a `runInScope()` helper\n * that creates a request-scoped container with `DurableObjectState` and\n * `DurableObjectId` tokens registered.\n *\n * @example\n * ```typescript\n * import { StratalDurableObject } from 'stratal/workers'\n *\n * export class Counter extends StratalDurableObject {\n * async increment() {\n * return this.runInScope(async (container) => {\n * const svc = container.resolve(CounterService)\n * return svc.increment()\n * })\n * }\n * }\n * ```\n */\nexport abstract class StratalDurableObject<\n Env extends StratalEnv = StratalEnv\n> extends DurableObject<Env> {\n protected async runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n ): Promise<T> {\n return runInScope(async (requestContainer) => {\n requestContainer.registerValue(DI_TOKENS.DurableObjectState, this.ctx)\n requestContainer.registerValue(DI_TOKENS.DurableObjectId, this.ctx.id)\n return callback(requestContainer)\n })\n }\n}\n","import { WorkerEntrypoint } from 'cloudflare:workers'\nimport type { Container } from '../di/container'\nimport type { StratalEnv } from '../env'\nimport { runInScope } from './run-in-scope'\n\n/**\n * Base class for Cloudflare WorkerEntrypoints (Service Bindings / RPC) with full DI access.\n *\n * Extends Cloudflare's `WorkerEntrypoint` and provides a `runInScope()` helper\n * that creates a request-scoped DI container.\n *\n * @example\n * ```typescript\n * import { StratalWorkerEntrypoint } from 'stratal/workers'\n *\n * export class AuthRpc extends StratalWorkerEntrypoint {\n * async verifyToken(token: string) {\n * return this.runInScope(async (container) => {\n * const auth = container.resolve(AuthService)\n * return auth.verify(token)\n * })\n * }\n * }\n * ```\n */\nexport abstract class StratalWorkerEntrypoint<\n Env extends StratalEnv = StratalEnv\n> extends WorkerEntrypoint<Env> {\n protected runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n ): Promise<T> {\n return runInScope(callback)\n }\n}\n","import { WorkflowEntrypoint } from 'cloudflare:workers'\nimport type { Container } from '../di/container'\nimport type { StratalEnv } from '../env'\nimport { runInScope } from './run-in-scope'\n\n/**\n * Base class for Cloudflare Workflows with full DI access.\n *\n * Extends Cloudflare's `WorkflowEntrypoint` and provides a `runInScope()` helper\n * that creates a request-scoped DI container.\n *\n * @example\n * ```typescript\n * import { StratalWorkflow } from 'stratal/workers'\n *\n * export class MyWorkflow extends StratalWorkflow<Env, { userId: string }> {\n * async run(event: WorkflowEvent<{ userId: string }>, step: WorkflowStep) {\n * await this.runInScope(async (container) => {\n * const svc = container.resolve(UserService)\n * await svc.process(event.payload.userId)\n * })\n * }\n * }\n * ```\n */\nexport abstract class StratalWorkflow<\n Env extends StratalEnv = StratalEnv,\n Params = unknown\n> extends WorkflowEntrypoint<Env, Params> {\n protected runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n ): Promise<T> {\n return runInScope(callback)\n }\n}\n"],"mappings":";;;;;;;;;;AASA,eAAsB,WACpB,UACY;CACZ,MAAM,MAAM,MAAM,QAAQ,oBAAoB;CAC9C,MAAM,UAAU,IAAI,wBAAwB,KAAK;CACjD,OAAO,IAAI,UAAU,kBAAkB,SAAS,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;ACa3D,IAAsB,uBAAtB,cAEU,cAAmB;CAC3B,MAAgB,WACd,UACY;EACZ,OAAO,WAAW,OAAO,qBAAqB;GAC5C,iBAAiB,cAAc,UAAU,oBAAoB,KAAK,IAAI;GACtE,iBAAiB,cAAc,UAAU,iBAAiB,KAAK,IAAI,GAAG;GACtE,OAAO,SAAS,iBAAiB;IACjC;;;;;;;;;;;;;;;;;;;;;;;;;ACZN,IAAsB,0BAAtB,cAEU,iBAAsB;CAC9B,WACE,UACY;EACZ,OAAO,WAAW,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;ACN/B,IAAsB,kBAAtB,cAGU,mBAAgC;CACxC,WACE,UACY;EACZ,OAAO,WAAW,SAAS"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/workers/run-in-scope.ts","../../src/workers/stratal-durable-object.ts","../../src/workers/stratal-worker-entrypoint.ts","../../src/workers/stratal-workflow.ts"],"sourcesContent":["import type { Container } from '../di/container'\nimport { Stratal } from '../stratal'\n\n/**\n * Shared helper that creates a request-scoped DI container by accessing the\n * Stratal Application via the static singleton.\n *\n * Works with Durable Objects, Workflows, and WorkerEntrypoints.\n */\nexport async function runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n): Promise<T> {\n const app = await Stratal.resolveApplication()\n await app.ensureScopedHandlers()\n const mockCtx = app.createMockRouterContext('en')\n return app.container.runInRequestScope(mockCtx, callback)\n}\n","import { DurableObject } from 'cloudflare:workers'\nimport type { Container } from '../di/container'\nimport { DI_TOKENS } from '../di/tokens'\nimport type { StratalEnv } from '../env'\nimport { runInScope } from './run-in-scope'\n\n/**\n * Base class for Durable Objects with full DI access.\n *\n * Extends Cloudflare's `DurableObject` and provides a `runInScope()` helper\n * that creates a request-scoped container with `DurableObjectState` and\n * `DurableObjectId` tokens registered.\n *\n * @example\n * ```typescript\n * import { StratalDurableObject } from 'stratal/workers'\n *\n * export class Counter extends StratalDurableObject {\n * async increment() {\n * return this.runInScope(async (container) => {\n * const svc = container.resolve(CounterService)\n * return svc.increment()\n * })\n * }\n * }\n * ```\n */\nexport abstract class StratalDurableObject<\n Env extends StratalEnv = StratalEnv\n> extends DurableObject<Env> {\n protected async runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n ): Promise<T> {\n return runInScope(async (requestContainer) => {\n requestContainer.registerValue(DI_TOKENS.DurableObjectState, this.ctx)\n requestContainer.registerValue(DI_TOKENS.DurableObjectId, this.ctx.id)\n return callback(requestContainer)\n })\n }\n}\n","import { WorkerEntrypoint } from 'cloudflare:workers'\nimport type { Container } from '../di/container'\nimport type { StratalEnv } from '../env'\nimport { runInScope } from './run-in-scope'\n\n/**\n * Base class for Cloudflare WorkerEntrypoints (Service Bindings / RPC) with full DI access.\n *\n * Extends Cloudflare's `WorkerEntrypoint` and provides a `runInScope()` helper\n * that creates a request-scoped DI container.\n *\n * @example\n * ```typescript\n * import { StratalWorkerEntrypoint } from 'stratal/workers'\n *\n * export class AuthRpc extends StratalWorkerEntrypoint {\n * async verifyToken(token: string) {\n * return this.runInScope(async (container) => {\n * const auth = container.resolve(AuthService)\n * return auth.verify(token)\n * })\n * }\n * }\n * ```\n */\nexport abstract class StratalWorkerEntrypoint<\n Env extends StratalEnv = StratalEnv\n> extends WorkerEntrypoint<Env> {\n protected runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n ): Promise<T> {\n return runInScope(callback)\n }\n}\n","import { WorkflowEntrypoint } from 'cloudflare:workers'\nimport type { Container } from '../di/container'\nimport type { StratalEnv } from '../env'\nimport { runInScope } from './run-in-scope'\n\n/**\n * Base class for Cloudflare Workflows with full DI access.\n *\n * Extends Cloudflare's `WorkflowEntrypoint` and provides a `runInScope()` helper\n * that creates a request-scoped DI container.\n *\n * @example\n * ```typescript\n * import { StratalWorkflow } from 'stratal/workers'\n *\n * export class MyWorkflow extends StratalWorkflow<Env, { userId: string }> {\n * async run(event: WorkflowEvent<{ userId: string }>, step: WorkflowStep) {\n * await this.runInScope(async (container) => {\n * const svc = container.resolve(UserService)\n * await svc.process(event.payload.userId)\n * })\n * }\n * }\n * ```\n */\nexport abstract class StratalWorkflow<\n Env extends StratalEnv = StratalEnv,\n Params = unknown\n> extends WorkflowEntrypoint<Env, Params> {\n protected runInScope<T>(\n callback: (container: Container) => T | Promise<T>\n ): Promise<T> {\n return runInScope(callback)\n }\n}\n"],"mappings":";;;;;;;;;;AASA,eAAsB,WACpB,UACY;CACZ,MAAM,MAAM,MAAM,QAAQ,mBAAmB;CAC7C,MAAM,IAAI,qBAAqB;CAC/B,MAAM,UAAU,IAAI,wBAAwB,IAAI;CAChD,OAAO,IAAI,UAAU,kBAAkB,SAAS,QAAQ;AAC1D;;;;;;;;;;;;;;;;;;;;;;;;ACWA,IAAsB,uBAAtB,cAEU,cAAmB;CAC3B,MAAgB,WACd,UACY;EACZ,OAAO,WAAW,OAAO,qBAAqB;GAC5C,iBAAiB,cAAc,UAAU,oBAAoB,KAAK,GAAG;GACrE,iBAAiB,cAAc,UAAU,iBAAiB,KAAK,IAAI,EAAE;GACrE,OAAO,SAAS,gBAAgB;EAClC,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;ACdA,IAAsB,0BAAtB,cAEU,iBAAsB;CAC9B,WACE,UACY;EACZ,OAAO,WAAW,QAAQ;CAC5B;AACF;;;;;;;;;;;;;;;;;;;;;;;ACRA,IAAsB,kBAAtB,cAGU,mBAAgC;CACxC,WACE,UACY;EACZ,OAAO,WAAW,QAAQ;CAC5B;AACF"}
@@ -0,0 +1,72 @@
1
+ import { n as __reExport, t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { OpenAPIHono, z, z as z$2 } from "@hono/zod-openapi";
3
+ import { ZodError } from "zod";
4
+ //#region src/i18n/validation/cuid2.ts
5
+ /**
6
+ * Default cuid2 shape: 24-32 lowercase-alphanumeric chars, starting with a
7
+ * letter. Matches what `@paralleldrive/cuid2` produces with default settings
8
+ * and what most apps expect when they say "cuid2".
9
+ *
10
+ * Used as the default for {@link cuid2}; exposed for callers who want to
11
+ * compose it into other patterns.
12
+ */
13
+ const CUID2_REGEX = /^[a-z][0-9a-z]{23,31}$/;
14
+ /**
15
+ * Stratal's cuid2 validator — a stricter drop-in for Zod 4.3.6's `z.cuid2()`.
16
+ *
17
+ * **Why this exists.** Zod 4.3.6's built-in `z.cuid2()` uses the regex
18
+ * `/^[0-9a-z]+$/`, which accepts *any* non-empty lowercase-alphanumeric
19
+ * string (including 2-letter locale prefixes like `'sw'`). That makes it
20
+ * effectively useless as a tenant-id / external-id validator.
21
+ *
22
+ * This helper layers the proper shape regex on top of `z.cuid2()`, so:
23
+ * - validation actually enforces cuid2 shape;
24
+ * - the schema still carries `z.cuid2()`'s OpenAPI metadata (i.e. spec
25
+ * output keeps `format: 'cuid2'`).
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { z, withZodI18n } from 'stratal/validation'
30
+ * import { cuid2 } from 'stratal/validation'
31
+ *
32
+ * // Default 24-32 char cuid2:
33
+ * router.prefix('/:tenantId', z.object({ tenantId: cuid2() }))
34
+ *
35
+ * // Custom regex (e.g. fixed-length 24):
36
+ * router.prefix('/:tenantId', z.object({
37
+ * tenantId: cuid2({ pattern: /^[a-z][0-9a-z]{23}$/ }),
38
+ * }))
39
+ *
40
+ * // Custom error message:
41
+ * cuid2(withZodI18n('tenants.errors.invalidId'))
42
+ *
43
+ * // Compose: chain anything Zod string accepts
44
+ * cuid2().describe('Tenant ID')
45
+ * ```
46
+ *
47
+ * @param options.pattern - Override the shape regex. Defaults to {@link CUID2_REGEX}.
48
+ * @param options.error - Custom error message (string or i18n key) for the regex check.
49
+ */
50
+ function cuid2(options) {
51
+ const pattern = options?.pattern ?? CUID2_REGEX;
52
+ return z.cuid2({
53
+ pattern,
54
+ error: typeof options?.error === "string" ? options?.error : void 0,
55
+ ...typeof options?.error === "function" ? { error: options?.error } : {}
56
+ });
57
+ }
58
+ //#endregion
59
+ //#region src/i18n/validation/zod.ts
60
+ var zod_exports = /* @__PURE__ */ __exportAll({
61
+ CUID2_REGEX: () => CUID2_REGEX,
62
+ OpenAPIHono: () => OpenAPIHono,
63
+ ZodError: () => ZodError,
64
+ cuid2: () => cuid2,
65
+ z: () => z$2
66
+ });
67
+ import * as import__hono_zod_openapi from "@hono/zod-openapi";
68
+ __reExport(zod_exports, import__hono_zod_openapi);
69
+ //#endregion
70
+ export { CUID2_REGEX as a, zod_exports as i, ZodError as n, cuid2 as o, z$2 as r, OpenAPIHono as t };
71
+
72
+ //# sourceMappingURL=zod-eKqqhZ5_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-eKqqhZ5_.mjs","names":[],"sources":["../src/i18n/validation/cuid2.ts","../src/i18n/validation/zod.ts"],"sourcesContent":["import { z } from '@hono/zod-openapi';\nimport { type $ZodRawIssue } from 'zod/v4/core';\n\n/**\n * Default cuid2 shape: 24-32 lowercase-alphanumeric chars, starting with a\n * letter. Matches what `@paralleldrive/cuid2` produces with default settings\n * and what most apps expect when they say \"cuid2\".\n *\n * Used as the default for {@link cuid2}; exposed for callers who want to\n * compose it into other patterns.\n */\nexport const CUID2_REGEX = /^[a-z][0-9a-z]{23,31}$/\n\n/**\n * Stratal's cuid2 validator — a stricter drop-in for Zod 4.3.6's `z.cuid2()`.\n *\n * **Why this exists.** Zod 4.3.6's built-in `z.cuid2()` uses the regex\n * `/^[0-9a-z]+$/`, which accepts *any* non-empty lowercase-alphanumeric\n * string (including 2-letter locale prefixes like `'sw'`). That makes it\n * effectively useless as a tenant-id / external-id validator.\n *\n * This helper layers the proper shape regex on top of `z.cuid2()`, so:\n * - validation actually enforces cuid2 shape;\n * - the schema still carries `z.cuid2()`'s OpenAPI metadata (i.e. spec\n * output keeps `format: 'cuid2'`).\n *\n * @example\n * ```ts\n * import { z, withZodI18n } from 'stratal/validation'\n * import { cuid2 } from 'stratal/validation'\n *\n * // Default 24-32 char cuid2:\n * router.prefix('/:tenantId', z.object({ tenantId: cuid2() }))\n *\n * // Custom regex (e.g. fixed-length 24):\n * router.prefix('/:tenantId', z.object({\n * tenantId: cuid2({ pattern: /^[a-z][0-9a-z]{23}$/ }),\n * }))\n *\n * // Custom error message:\n * cuid2(withZodI18n('tenants.errors.invalidId'))\n *\n * // Compose: chain anything Zod string accepts\n * cuid2().describe('Tenant ID')\n * ```\n *\n * @param options.pattern - Override the shape regex. Defaults to {@link CUID2_REGEX}.\n * @param options.error - Custom error message (string or i18n key) for the regex check.\n */\nexport function cuid2(options?: { pattern?: RegExp; error?: string | ((_issue: $ZodRawIssue) => string) }) {\n const pattern = options?.pattern ?? CUID2_REGEX\n return z.cuid2({\n pattern: pattern,\n error: typeof options?.error === 'string' ? options?.error : undefined,\n ...(typeof options?.error === 'function' ? { error: options?.error } : {})\n })\n}\n","// Consolidated zod - single source from @hono/zod-openapi (superset of zod)\nexport { OpenAPIHono, z } from '@hono/zod-openapi'\nexport type * from 'zod'\nexport { ZodError } from 'zod'\n\n// OpenAPI utilities\nexport * from '@hono/zod-openapi'\nexport type { OpenAPIObject, PathItemObject } from 'openapi3-ts/oas30'\n\n// Helpers\nexport { CUID2_REGEX, cuid2 } from './cuid2'\n\n// Types\nexport type { I18nErrorMetadata, ZodCustomIssue } from './validation.types'\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsC3B,SAAgB,MAAM,SAAqF;CACzG,MAAM,UAAU,SAAS,WAAW;CACpC,OAAO,EAAE,MAAM;EACJ;EACT,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ,KAAA;EAC7D,GAAI,OAAO,SAAS,UAAU,aAAa,EAAE,OAAO,SAAS,MAAM,IAAI,CAAC;CAC1E,CAAC;AACH"}
@@ -1,12 +1,60 @@
1
- import { t as index_d_exports$1 } from "./index-C1KvMncZ.mjs";
2
- import { AsyncLocalStorage } from "node:async_hooks";
1
+ import { t as index_d_exports } from "./index-HgOLNruQ.mjs";
3
2
  import { OpenAPIHono, z, z as z$2 } from "@hono/zod-openapi";
4
- import * as _$zod from "zod";
5
3
  import { ZodError } from "zod";
6
4
  import { OpenAPIObject, PathItemObject } from "openapi3-ts/oas30";
7
- import * as _$zod_v4_core0 from "zod/v4/core";
8
5
  import { $ZodIssueCustom, $ZodRawIssue } from "zod/v4/core";
9
6
 
7
+ //#region src/i18n/validation/cuid2.d.ts
8
+ /**
9
+ * Default cuid2 shape: 24-32 lowercase-alphanumeric chars, starting with a
10
+ * letter. Matches what `@paralleldrive/cuid2` produces with default settings
11
+ * and what most apps expect when they say "cuid2".
12
+ *
13
+ * Used as the default for {@link cuid2}; exposed for callers who want to
14
+ * compose it into other patterns.
15
+ */
16
+ declare const CUID2_REGEX: RegExp;
17
+ /**
18
+ * Stratal's cuid2 validator — a stricter drop-in for Zod 4.3.6's `z.cuid2()`.
19
+ *
20
+ * **Why this exists.** Zod 4.3.6's built-in `z.cuid2()` uses the regex
21
+ * `/^[0-9a-z]+$/`, which accepts *any* non-empty lowercase-alphanumeric
22
+ * string (including 2-letter locale prefixes like `'sw'`). That makes it
23
+ * effectively useless as a tenant-id / external-id validator.
24
+ *
25
+ * This helper layers the proper shape regex on top of `z.cuid2()`, so:
26
+ * - validation actually enforces cuid2 shape;
27
+ * - the schema still carries `z.cuid2()`'s OpenAPI metadata (i.e. spec
28
+ * output keeps `format: 'cuid2'`).
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { z, withZodI18n } from 'stratal/validation'
33
+ * import { cuid2 } from 'stratal/validation'
34
+ *
35
+ * // Default 24-32 char cuid2:
36
+ * router.prefix('/:tenantId', z.object({ tenantId: cuid2() }))
37
+ *
38
+ * // Custom regex (e.g. fixed-length 24):
39
+ * router.prefix('/:tenantId', z.object({
40
+ * tenantId: cuid2({ pattern: /^[a-z][0-9a-z]{23}$/ }),
41
+ * }))
42
+ *
43
+ * // Custom error message:
44
+ * cuid2(withZodI18n('tenants.errors.invalidId'))
45
+ *
46
+ * // Compose: chain anything Zod string accepts
47
+ * cuid2().describe('Tenant ID')
48
+ * ```
49
+ *
50
+ * @param options.pattern - Override the shape regex. Defaults to {@link CUID2_REGEX}.
51
+ * @param options.error - Custom error message (string or i18n key) for the regex check.
52
+ */
53
+ declare function cuid2(options?: {
54
+ pattern?: RegExp;
55
+ error?: string | ((_issue: $ZodRawIssue) => string);
56
+ }): z.ZodCUID2;
57
+ //#endregion
10
58
  //#region src/i18n/i18n.types.d.ts
11
59
  /**
12
60
  * Recursively extract nested keys from an object type
@@ -24,7 +72,7 @@ type DeepKeys<T, Prefix extends string = ''> = T extends object ? { [K in keyof
24
72
  * System message keys - auto-derived from system en messages
25
73
  * These are messages used by packages/modules infrastructure
26
74
  */
27
- type SystemMessageKeys = DeepKeys<typeof index_d_exports$1>;
75
+ type SystemMessageKeys = DeepKeys<typeof index_d_exports>;
28
76
  /**
29
77
  * Augmentable registry for app-specific message namespaces.
30
78
  *
@@ -79,6 +127,11 @@ type MessageKeys = SystemMessageKeys | AppMessageKeys;
79
127
  * ```
80
128
  */
81
129
  type Prefixes<T extends string> = T extends `${infer Head}.${infer Tail}` ? Head | `${Head}.${Prefixes<Tail>}` : T;
130
+ /**
131
+ * Filter a string union to only keys matching the given dot-notation prefixes.
132
+ * A key matches a prefix if it equals the prefix or starts with `${prefix}.`.
133
+ */
134
+ type FilterByPrefix<Keys extends string, Prefix extends string> = Keys extends `${Prefix}.${string}` ? Keys : Keys extends Prefix ? Keys : never;
82
135
  /**
83
136
  * Valid dot-notation prefixes for message keys
84
137
  *
@@ -119,104 +172,9 @@ interface II18nService {
119
172
  getLocale(): string;
120
173
  }
121
174
  //#endregion
122
- //#region src/i18n/validation/with-i18n.d.ts
123
- /**
124
- * Type-safe helper for creating custom Zod error messages with i18n support (Backend)
125
- *
126
- * Usage with .refine():
127
- * ```typescript
128
- * const schema = z.string().refine(
129
- * (val) => val.length > 5,
130
- * withI18n('validation.minLength', { min: 5 })
131
- * )
132
- * ```
133
- *
134
- * Usage with built-in validators:
135
- * ```typescript
136
- * const schema = z.string().min(5, withI18n('validation.minLength', { min: 5 }))
137
- * const schema = z.string().email(withI18n('validation.email'))
138
- * ```
139
- *
140
- * @param key - Message key from shared i18n messages (type-safe via MessageKeys)
141
- * @param params - Optional interpolation parameters for the message
142
- * @returns Zod error configuration object with translated message
143
- */
144
- declare function withI18n(key: MessageKeys, params?: Record<string, unknown>): {
145
- error: (_issue: $ZodRawIssue) => string;
146
- };
147
- //#endregion
148
- //#region src/i18n/validation/cuid2.d.ts
149
- /**
150
- * Default cuid2 shape: 24-32 lowercase-alphanumeric chars, starting with a
151
- * letter. Matches what `@paralleldrive/cuid2` produces with default settings
152
- * and what most apps expect when they say "cuid2".
153
- *
154
- * Used as the default for {@link cuid2}; exposed for callers who want to
155
- * compose it into other patterns.
156
- */
157
- declare const CUID2_REGEX: RegExp;
158
- /**
159
- * Stratal's cuid2 validator — a stricter drop-in for Zod 4.3.6's `z.cuid2()`.
160
- *
161
- * **Why this exists.** Zod 4.3.6's built-in `z.cuid2()` uses the regex
162
- * `/^[0-9a-z]+$/`, which accepts *any* non-empty lowercase-alphanumeric
163
- * string (including 2-letter locale prefixes like `'sw'`). That makes it
164
- * effectively useless as a tenant-id / external-id validator.
165
- *
166
- * This helper layers the proper shape regex on top of `z.cuid2()`, so:
167
- * - validation actually enforces cuid2 shape;
168
- * - the schema still carries `z.cuid2()`'s OpenAPI metadata (i.e. spec
169
- * output keeps `format: 'cuid2'`).
170
- *
171
- * @example
172
- * ```ts
173
- * import { z, withI18n } from 'stratal/validation'
174
- * import { cuid2 } from 'stratal/validation'
175
- *
176
- * // Default 24-32 char cuid2:
177
- * router.prefix('/:tenantId', z.object({ tenantId: cuid2() }))
178
- *
179
- * // Custom regex (e.g. fixed-length 24):
180
- * router.prefix('/:tenantId', z.object({
181
- * tenantId: cuid2({ pattern: /^[a-z][0-9a-z]{23}$/ }),
182
- * }))
183
- *
184
- * // Custom error message:
185
- * cuid2(withI18n('tenants.errors.invalidId'))
186
- *
187
- * // Compose: chain anything Zod string accepts
188
- * cuid2().describe('Tenant ID')
189
- * ```
190
- *
191
- * @param options.pattern - Override the shape regex. Defaults to {@link CUID2_REGEX}.
192
- * @param options.error - Custom error message (string or i18n key) for the regex check.
193
- */
194
- declare function cuid2(options?: {
195
- pattern?: RegExp;
196
- error?: string | ((_issue: $ZodRawIssue) => string);
197
- }): z.ZodCUID2;
198
- //#endregion
199
175
  //#region src/i18n/validation/validation.types.d.ts
200
176
  /**
201
- * Context provided to error map for locale-aware translation
202
- */
203
- interface ErrorMapContext {
204
- /**
205
- * Translate a message key with optional parameters
206
- */
207
- t: (key: MessageKeys, params?: Record<string, unknown>) => string;
208
- /**
209
- * Current locale code (e.g., 'en', 'fr')
210
- */
211
- locale: string;
212
- }
213
- /**
214
- * Function that provides the current translation context
215
- * Used by error maps to access request-scoped or application-wide i18n
216
- */
217
- type LocaleProvider = () => ErrorMapContext | undefined;
218
- /**
219
- * Custom error metadata for withI18n helper
177
+ * Custom error metadata for withZodI18n helper
220
178
  */
221
179
  interface I18nErrorMetadata {
222
180
  /**
@@ -238,39 +196,11 @@ type ZodCustomIssue = $ZodIssueCustom & {
238
196
  [key: string]: unknown;
239
197
  };
240
198
  };
241
- //#endregion
242
- //#region src/i18n/validation/validation.context.d.ts
243
- /**
244
- * Backend error map that accesses I18nService from AsyncLocalStorage
245
- * Must be initialized in router middleware after locale detection
246
- */
247
- declare const backendErrorMap: _$zod.ZodErrorMap<_$zod_v4_core0.$ZodIssue>;
248
- /**
249
- * Runs a function within an error map context
250
- * Used by router middleware to provide I18nService to validation
251
- *
252
- * @example
253
- * ```typescript
254
- * router.use('*', async (c, next) => {
255
- * const i18nService = c.get('i18nService')
256
- * const locale = c.get('locale')
257
- *
258
- * return runWithErrorMapContext(
259
- * {
260
- * t: (key, params) => i18nService.t(key, params),
261
- * locale,
262
- * },
263
- * () => next()
264
- * )
265
- * })
266
- * ```
267
- */
268
- declare function runWithErrorMapContext<T>(context: ErrorMapContext, fn: () => T): T;
269
- declare namespace index_d_exports {
270
- export { CUID2_REGEX, ErrorMapContext, I18nErrorMetadata, LocaleProvider, OpenAPIHono, OpenAPIObject, PathItemObject, ZodCustomIssue, ZodError, backendErrorMap, cuid2, runWithErrorMapContext, withI18n, z$2 as z };
199
+ declare namespace zod_d_exports {
200
+ export { CUID2_REGEX, I18nErrorMetadata, OpenAPIHono, OpenAPIObject, PathItemObject, ZodCustomIssue, ZodError, cuid2, z$2 as z };
271
201
  }
272
202
  import * as import_zod from "zod";
273
203
  import * as import__hono_zod_openapi from "@hono/zod-openapi";
274
204
  //#endregion
275
- export { MessageParams as C, MessageKeys as S, SystemMessageKeys as T, AppMessageNamespaces as _, index_d_exports as a, II18nService as b, runWithErrorMapContext as c, LocaleProvider as d, ZodCustomIssue as f, AppMessageKeys as g, withI18n as h, ZodError as i, ErrorMapContext as l, cuid2 as m, OpenAPIObject as n, z$2 as o, CUID2_REGEX as p, PathItemObject as r, backendErrorMap as s, OpenAPIHono as t, I18nErrorMetadata as u, AppMessages as v, Prefixes as w, MessageKeyPrefix as x, DeepKeys as y };
276
- //# sourceMappingURL=index-Bnpfq6uk.d.mts.map
205
+ export { MessageParams as _, z$2 as a, CUID2_REGEX as b, ZodCustomIssue as c, AppMessages as d, DeepKeys as f, MessageKeys as g, MessageKeyPrefix as h, ZodError as i, AppMessageKeys as l, II18nService as m, OpenAPIObject as n, zod_d_exports as o, FilterByPrefix as p, PathItemObject as r, I18nErrorMetadata as s, OpenAPIHono as t, AppMessageNamespaces as u, Prefixes as v, cuid2 as x, SystemMessageKeys as y };
206
+ //# sourceMappingURL=zod-wecrEVAs.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-wecrEVAs.d.mts","names":[],"sources":["../src/i18n/validation/cuid2.ts","../src/i18n/i18n.types.ts","../src/i18n/validation/validation.types.ts","../src/i18n/validation/zod.ts"],"mappings":";;;;;;;;;;;;;AAWA;;cAAa,WAAA,EAAW,MAA2B;;AAAA;AAsCnD;;;;;;;;;;;;;;;;;AAAyG;;;;AC7BzG;;;;;;;;;;;;;iBD6BgB,KAAA,CAAM,OAAA;EAAY,OAAA,GAAU,MAAA;EAAQ,KAAA,cAAmB,MAAA,EAAQ,YAAA;AAAA,IAA0B,CAAA,CAAA,QAAA;;;;AAtCzG;;;;AAAmD;AAsCnD;;;;;KC7BY,QAAA,kCAA0C,CAAA,gCAEtC,CAAA,YAAa,CAAA,CAAE,CAAA,mBACzB,QAAA,CAAS,CAAA,CAAE,CAAA,MAAO,MAAA,GAAS,CAAA,UACxB,MAAA,GAAS,CAAA,WACR,CAAA;;;;;KAOE,iBAAA,GAAoB,QAAQ,QAAQ,eAAA;;;;;ADiByD;;;;AC7BzG;;;;;;;;;;;;;;;;UAsCiB,oBAAA;;;;;KAML,WAAA,iBAA4B,oBAAA,GAAuB,oBAAA,CAAqB,CAAA;;;;;KAMxE,cAAA,GAAiB,QAAQ,CAAC,WAAA;;;;AA7C3B;KAoDC,WAAA,GAAc,iBAAA,GAAoB,cAAc;;;;AA7CJ;AA0BxD;;;;AAAqC;AAMrC;;;;KA4BY,QAAA,qBAA6B,CAAA,yCACrC,IAAA,MAAU,IAAA,IAAQ,QAAA,CAAS,IAAA,MAC3B,CAAA;;;;;KAMQ,cAAA,+CACV,IAAA,YAAgB,MAAA,eAAqB,IAAA,GACnC,IAAA,SAAa,MAAA,GAAS,IAAA;;;;AAtC2D;AAMrF;;;;AAAiD;AAOjD;;;;AAA4D;KA0ChD,gBAAA,GAAmB,QAAQ,CAAC,WAAA;;;;;KAM5B,aAAA,GAAgB,MAAM;;;;UAKjB,YAAA;EApCZ;;;;;;;EA4CH,CAAA,CAAE,GAAA,EAAK,WAAA,EAAa,MAAA,GAAS,aAAa;EA7Cb;;;AAC1B;AAML;EA6CE,SAAA;AAAA;;;;;;UC3Ie,iBAAA;;;AFKjB;EEDE,GAAA,EAAK,WAAA;;;AFC4C;EEIjD,MAAA,GAAS,MAAM;AAAA;;;;;KAOL,cAAA,GAAiB,eAAA;EAC3B,MAAA;IACE,IAAA,GAAO,iBAAiB;IAAA,CACvB,GAAA;EAAA;AAAA;AAAA"}