stratal 0.0.22 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/cloudflare-workers-loader.mjs +80 -7
  3. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  4. package/dist/bin/quarry.mjs +41 -54
  5. package/dist/bin/quarry.mjs.map +1 -1
  6. package/dist/cache/index.d.mts +5 -3
  7. package/dist/cache/index.d.mts.map +1 -1
  8. package/dist/cache/index.mjs +123 -39
  9. package/dist/cache/index.mjs.map +1 -1
  10. package/dist/{cache.service-e34gV6tz.d.mts → cache.service-uElmBtdS.d.mts} +24 -34
  11. package/dist/cache.service-uElmBtdS.d.mts.map +1 -0
  12. package/dist/{command-BU4ApTo5.mjs → command-BvmUAPPQ.mjs} +15 -3
  13. package/dist/command-BvmUAPPQ.mjs.map +1 -0
  14. package/dist/{command-wXfvHbBZ.d.mts → command-CPhFHjG3.d.mts} +2 -2
  15. package/dist/command-CPhFHjG3.d.mts.map +1 -0
  16. package/dist/command-not-found.error-ONAZ2Bpk.mjs +14 -0
  17. package/dist/command-not-found.error-ONAZ2Bpk.mjs.map +1 -0
  18. package/dist/config/index.d.mts +3 -3
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +7 -6
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-DHQtypr1.d.mts → consumer-registry-D3iMTSdy.d.mts} +54 -22
  23. package/dist/consumer-registry-D3iMTSdy.d.mts.map +1 -0
  24. package/dist/{container-storage-GpNNz79X.mjs → container-storage-BmOJ4_Na.mjs} +1 -1
  25. package/dist/{container-storage-GpNNz79X.mjs.map → container-storage-BmOJ4_Na.mjs.map} +1 -1
  26. package/dist/{controller.decorator-DIUazNU7.mjs → controller.decorator-C5UVeJS3.mjs} +4 -4
  27. package/dist/{controller.decorator-DIUazNU7.mjs.map → controller.decorator-C5UVeJS3.mjs.map} +1 -1
  28. package/dist/cron/index.d.mts +79 -4
  29. package/dist/cron/index.d.mts.map +1 -1
  30. package/dist/cron/index.mjs +2 -2
  31. package/dist/cron-job-NesZRk8F.d.mts +58 -0
  32. package/dist/cron-job-NesZRk8F.d.mts.map +1 -0
  33. package/dist/{cron-manager-9bpN9bu4.mjs → cron.module-Bgzq5hiT.mjs} +17 -7
  34. package/dist/cron.module-Bgzq5hiT.mjs.map +1 -0
  35. package/dist/{decorate-HgTKAYK8.mjs → decorate-CuAoSZvs.mjs} +2 -2
  36. package/dist/{deep-merge-C8NgcXw4.mjs → deep-merge-ByiAOZ3r.mjs} +1 -1
  37. package/dist/{deep-merge-C8NgcXw4.mjs.map → deep-merge-ByiAOZ3r.mjs.map} +1 -1
  38. package/dist/di/index.d.mts +2 -2
  39. package/dist/di/index.mjs +3 -3
  40. package/dist/{di-BO1QIb5H.mjs → di-DseMn-z9.mjs} +244 -135
  41. package/dist/di-DseMn-z9.mjs.map +1 -0
  42. package/dist/email/index.d.mts +33 -40
  43. package/dist/email/index.d.mts.map +1 -1
  44. package/dist/email/index.mjs +456 -41
  45. package/dist/email/index.mjs.map +1 -1
  46. package/dist/{en-BPP6h6y5.mjs → en-CDZBMcc1.mjs} +2 -2
  47. package/dist/{en-BPP6h6y5.mjs.map → en-CDZBMcc1.mjs.map} +1 -1
  48. package/dist/{env-DKSbuBi5.d.mts → env-ug22bJj7.d.mts} +1 -1
  49. package/dist/env-ug22bJj7.d.mts.map +1 -0
  50. package/dist/errors/index.d.mts +1 -1
  51. package/dist/errors/index.mjs +3 -3
  52. package/dist/{errors-BBZTnjdq.mjs → errors-mXYxG0XB.mjs} +5 -5
  53. package/dist/{errors-BBZTnjdq.mjs.map → errors-mXYxG0XB.mjs.map} +1 -1
  54. package/dist/events/index.d.mts +14 -3
  55. package/dist/events/index.d.mts.map +1 -1
  56. package/dist/events/index.mjs +2 -2
  57. package/dist/{events-D1KdDaiP.mjs → events-BXJGZjpG.mjs} +16 -6
  58. package/dist/events-BXJGZjpG.mjs.map +1 -0
  59. package/dist/{exception-context-B4kM-M53.mjs → exception-context-kEoMFwze.mjs} +3 -3
  60. package/dist/{exception-context-B4kM-M53.mjs.map → exception-context-kEoMFwze.mjs.map} +1 -1
  61. package/dist/{gateway-context-CFe6a9gz.mjs → gateway-context-TMu_AlJt.mjs} +25 -6
  62. package/dist/{gateway-context-CFe6a9gz.mjs.map → gateway-context-TMu_AlJt.mjs.map} +1 -1
  63. package/dist/guards/index.d.mts +3 -3
  64. package/dist/guards/index.d.mts.map +1 -1
  65. package/dist/guards/index.mjs +1 -1
  66. package/dist/{guards-Ced-uNIF.mjs → guards-DALPXy3_.mjs} +2 -2
  67. package/dist/{guards-Ced-uNIF.mjs.map → guards-DALPXy3_.mjs.map} +1 -1
  68. package/dist/hono-app-CvV3hOfT.mjs +161 -0
  69. package/dist/hono-app-CvV3hOfT.mjs.map +1 -0
  70. package/dist/{http-method.decorator-CdjKFJZZ.mjs → http-method.decorator-ByWZb9DO.mjs} +4 -4
  71. package/dist/{http-method.decorator-CdjKFJZZ.mjs.map → http-method.decorator-ByWZb9DO.mjs.map} +1 -1
  72. package/dist/i18n/index.d.mts +4 -4
  73. package/dist/i18n/index.d.mts.map +1 -1
  74. package/dist/i18n/index.mjs +5 -5
  75. package/dist/i18n/index.mjs.map +1 -1
  76. package/dist/i18n/messages/en/index.d.mts +1 -1
  77. package/dist/i18n/messages/en/index.mjs +1 -1
  78. package/dist/i18n/utils/index.mjs +1 -1
  79. package/dist/i18n/validation/index.d.mts +3 -3
  80. package/dist/i18n/validation/index.mjs +3 -3
  81. package/dist/{i18n.module-BlXrtAlV.mjs → i18n.module-DRQAZoSZ.mjs} +14 -11
  82. package/dist/{i18n.module-BlXrtAlV.mjs.map → i18n.module-DRQAZoSZ.mjs.map} +1 -1
  83. package/dist/{i18n.tokens-hwRpmjRq.mjs → i18n.tokens-CZ_v8oyS.mjs} +1 -1
  84. package/dist/{i18n.tokens-hwRpmjRq.mjs.map → i18n.tokens-CZ_v8oyS.mjs.map} +1 -1
  85. package/dist/{index-B4UBK-2T.d.mts → index-0ItCjaqw.d.mts} +1 -1
  86. package/dist/index-0ItCjaqw.d.mts.map +1 -0
  87. package/dist/{index-CW1YHSft.d.mts → index-B5JBRcWD.d.mts} +249 -103
  88. package/dist/index-B5JBRcWD.d.mts.map +1 -0
  89. package/dist/{index-BtlE9RuO.d.mts → index-BUt92sAE.d.mts} +1 -1
  90. package/dist/index-BUt92sAE.d.mts.map +1 -0
  91. package/dist/{index-DEncMcC6.d.mts → index-B_JoEl3V.d.mts} +221 -16
  92. package/dist/index-B_JoEl3V.d.mts.map +1 -0
  93. package/dist/{index-Dj5IMwtr.d.mts → index-DtBNIFuP.d.mts} +4 -6
  94. package/dist/index-DtBNIFuP.d.mts.map +1 -0
  95. package/dist/{index-KMgSCSM7.d.mts → index-HgOLNruQ.d.mts} +1 -1
  96. package/dist/{index-KMgSCSM7.d.mts.map → index-HgOLNruQ.d.mts.map} +1 -1
  97. package/dist/index.d.mts +6 -5
  98. package/dist/index.mjs +3 -2
  99. package/dist/{is-command-CX5rAfZW.mjs → is-command-CEPO9n8c.mjs} +2 -2
  100. package/dist/{is-command-CX5rAfZW.mjs.map → is-command-CEPO9n8c.mjs.map} +1 -1
  101. package/dist/{is-seeder-CYCtELlm.mjs → is-seeder-Gvh_AM71.mjs} +1 -1
  102. package/dist/{is-seeder-CYCtELlm.mjs.map → is-seeder-Gvh_AM71.mjs.map} +1 -1
  103. package/dist/lazy-module-loader-Ib383jH_.d.mts +60 -0
  104. package/dist/lazy-module-loader-Ib383jH_.d.mts.map +1 -0
  105. package/dist/locale-path.service-D-dHiIPc.mjs +165 -0
  106. package/dist/locale-path.service-D-dHiIPc.mjs.map +1 -0
  107. package/dist/locale-url-nZrZxqJP.mjs +44 -0
  108. package/dist/locale-url-nZrZxqJP.mjs.map +1 -0
  109. package/dist/locale-url.service-C2EWmGdq.mjs +41 -0
  110. package/dist/locale-url.service-C2EWmGdq.mjs.map +1 -0
  111. package/dist/logger/index.d.mts +1 -1
  112. package/dist/logger/index.mjs +2 -2
  113. package/dist/logger/index.mjs.map +1 -1
  114. package/dist/macroable/index.d.mts +2 -2
  115. package/dist/macroable/index.mjs +1 -1
  116. package/dist/{macroable-DzlfzT50.mjs → macroable-cvDTFZ_A.mjs} +1 -1
  117. package/dist/{macroable-DzlfzT50.mjs.map → macroable-cvDTFZ_A.mjs.map} +1 -1
  118. package/dist/{metadata-BVkc4aUu.mjs → metadata-DzzprcID.mjs} +1 -1
  119. package/dist/{metadata-BVkc4aUu.mjs.map → metadata-DzzprcID.mjs.map} +1 -1
  120. package/dist/module/index.d.mts +4 -3
  121. package/dist/module/index.d.mts.map +1 -1
  122. package/dist/module/index.mjs +10 -2
  123. package/dist/module/index.mjs.map +1 -0
  124. package/dist/{module-xYoHba6B.mjs → module-registry-Dm-pqHd3.mjs} +189 -57
  125. package/dist/module-registry-Dm-pqHd3.mjs.map +1 -0
  126. package/dist/module.decorator-CYHY6pG5.mjs +19 -0
  127. package/dist/module.decorator-CYHY6pG5.mjs.map +1 -0
  128. package/dist/openapi/index.d.mts +44 -8
  129. package/dist/openapi/index.d.mts.map +1 -1
  130. package/dist/openapi/index.mjs +3 -2
  131. package/dist/{openapi-C6lm0RmV.mjs → openapi-CstuTM8S.mjs} +55 -229
  132. package/dist/openapi-CstuTM8S.mjs.map +1 -0
  133. package/dist/openapi-tools.service-BC5EC3R3.mjs +206 -0
  134. package/dist/openapi-tools.service-BC5EC3R3.mjs.map +1 -0
  135. package/dist/{openapi.service-CrLlsXAd.d.mts → openapi.service-YhTiJ1bO.d.mts} +3 -3
  136. package/dist/{openapi.service-CrLlsXAd.d.mts.map → openapi.service-YhTiJ1bO.d.mts.map} +1 -1
  137. package/dist/quarry/index.d.mts +14 -5
  138. package/dist/quarry/index.d.mts.map +1 -1
  139. package/dist/quarry/index.mjs +6 -5
  140. package/dist/quarry/runner.d.mts +11 -11
  141. package/dist/quarry/runner.d.mts.map +1 -1
  142. package/dist/quarry/runner.mjs +192 -22
  143. package/dist/quarry/runner.mjs.map +1 -1
  144. package/dist/{quarry-registry-D4hIGScf.d.mts → quarry-registry-CXg0RFXq.d.mts} +4 -4
  145. package/dist/quarry-registry-CXg0RFXq.d.mts.map +1 -0
  146. package/dist/{quarry-registry-DkraZNwn.mjs → quarry.module-BuRPGMDm.mjs} +22 -21
  147. package/dist/quarry.module-BuRPGMDm.mjs.map +1 -0
  148. package/dist/queue/index.d.mts +3 -3
  149. package/dist/queue/index.mjs +42 -31
  150. package/dist/queue/index.mjs.map +1 -1
  151. package/dist/queue.module-nddvxzCB.mjs +613 -0
  152. package/dist/queue.module-nddvxzCB.mjs.map +1 -0
  153. package/dist/queue.tokens-DjHnFmre.mjs +11 -0
  154. package/dist/queue.tokens-DjHnFmre.mjs.map +1 -0
  155. package/dist/{r2-storage.provider-Hfm6LdZQ.mjs → r2-storage.provider-DCxQt9dD.mjs} +4 -4
  156. package/dist/{r2-storage.provider-Hfm6LdZQ.mjs.map → r2-storage.provider-DCxQt9dD.mjs.map} +1 -1
  157. package/dist/{rate-limit.decorator-D69zdZbp.mjs → rate-limit.decorator-BPAie_p3.mjs} +3 -3
  158. package/dist/{rate-limit.decorator-D69zdZbp.mjs.map → rate-limit.decorator-BPAie_p3.mjs.map} +1 -1
  159. package/dist/rate-limiter/index.d.mts +5 -5
  160. package/dist/rate-limiter/index.d.mts.map +1 -1
  161. package/dist/rate-limiter/index.mjs +26 -21
  162. package/dist/rate-limiter/index.mjs.map +1 -1
  163. package/dist/route-name-DGoBOfPg.mjs +171 -0
  164. package/dist/route-name-DGoBOfPg.mjs.map +1 -0
  165. package/dist/route-registration.service-D6vSwiKP.mjs +918 -0
  166. package/dist/route-registration.service-D6vSwiKP.mjs.map +1 -0
  167. package/dist/route-registry-CYqLp2Nj.mjs +123 -0
  168. package/dist/route-registry-CYqLp2Nj.mjs.map +1 -0
  169. package/dist/router/index.d.mts +2 -2
  170. package/dist/router/index.mjs +18 -8
  171. package/dist/router-CWGBD-Bg.mjs +78 -0
  172. package/dist/router-CWGBD-Bg.mjs.map +1 -0
  173. package/dist/router-resolver-D4YlPNlm.mjs +88 -0
  174. package/dist/router-resolver-D4YlPNlm.mjs.map +1 -0
  175. package/dist/seeder/index.d.mts +14 -4
  176. package/dist/seeder/index.d.mts.map +1 -1
  177. package/dist/seeder/index.mjs +5 -3
  178. package/dist/{seeder-BADTig4n.mjs → seeder-7ubkms-Y.mjs} +7 -56
  179. package/dist/seeder-7ubkms-Y.mjs.map +1 -0
  180. package/dist/seeder-registry-CyUmKsJq.mjs +57 -0
  181. package/dist/seeder-registry-CyUmKsJq.mjs.map +1 -0
  182. package/dist/seeder.module-CYYwk3Qk.mjs +15 -0
  183. package/dist/seeder.module-CYYwk3Qk.mjs.map +1 -0
  184. package/dist/{signed-url-BqUqt5dF.mjs → signed-url-DIU0sK_6.mjs} +1 -1
  185. package/dist/{signed-url-BqUqt5dF.mjs.map → signed-url-DIU0sK_6.mjs.map} +1 -1
  186. package/dist/storage/index.d.mts +3 -3
  187. package/dist/storage/index.d.mts.map +1 -1
  188. package/dist/storage/index.mjs +2 -2
  189. package/dist/storage/providers/index.d.mts +2 -2
  190. package/dist/storage/providers/index.d.mts.map +1 -1
  191. package/dist/storage/providers/index.mjs +1 -1
  192. package/dist/{storage-BA3ppVYM.mjs → storage-MDZypIE9.mjs} +12 -11
  193. package/dist/{storage-BA3ppVYM.mjs.map → storage-MDZypIE9.mjs.map} +1 -1
  194. package/dist/{storage-provider.interface-DQMtT42e.d.mts → storage-provider.interface-ClUwxz4S.d.mts} +2 -2
  195. package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +1 -0
  196. package/dist/storage.error-Dnib4VHc.mjs +8 -0
  197. package/dist/{storage.error-C6FY037a.mjs.map → storage.error-Dnib4VHc.mjs.map} +1 -1
  198. package/dist/{stratal-Bdq4IdB3.mjs → stratal-DL9M38_s.mjs} +142 -140
  199. package/dist/stratal-DL9M38_s.mjs.map +1 -0
  200. package/dist/{stratal-BsKmvP6J.d.mts → stratal-DwDJPY9N.d.mts} +3 -3
  201. package/dist/{stratal-BsKmvP6J.d.mts.map → stratal-DwDJPY9N.d.mts.map} +1 -1
  202. package/dist/tiered-cache.service-Dv3BhxxE.d.mts +79 -0
  203. package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +1 -0
  204. package/dist/trailing-slash-CFyw8nYu.mjs +34 -0
  205. package/dist/trailing-slash-CFyw8nYu.mjs.map +1 -0
  206. package/dist/{types-BaeHi67f.d.mts → types-CmV_9xBD.d.mts} +1 -1
  207. package/dist/types-CmV_9xBD.d.mts.map +1 -0
  208. package/dist/uri-h7Q8Jug9.mjs +251 -0
  209. package/dist/uri-h7Q8Jug9.mjs.map +1 -0
  210. package/dist/{usage-generator-DTqaUMR9.mjs → usage-generator-DAWYasuP.mjs} +4 -4
  211. package/dist/usage-generator-DAWYasuP.mjs.map +1 -0
  212. package/dist/{validation-DUzcjb8Q.mjs → validation-CpOjviyT.mjs} +6 -6
  213. package/dist/{validation-DUzcjb8Q.mjs.map → validation-CpOjviyT.mjs.map} +1 -1
  214. package/dist/{validation.context-XTysWJ3b.mjs → validation.context-CRvmrhq7.mjs} +3 -3
  215. package/dist/{validation.context-XTysWJ3b.mjs.map → validation.context-CRvmrhq7.mjs.map} +1 -1
  216. package/dist/versioning.service-C6aHky8-.mjs +36 -0
  217. package/dist/versioning.service-C6aHky8-.mjs.map +1 -0
  218. package/dist/websocket/index.d.mts +11 -2
  219. package/dist/websocket/index.d.mts.map +1 -1
  220. package/dist/websocket/index.mjs +1 -1
  221. package/dist/workers/index.d.mts +2 -2
  222. package/dist/workers/index.d.mts.map +1 -1
  223. package/dist/workers/index.mjs +3 -3
  224. package/dist/workers/index.mjs.map +1 -1
  225. package/dist/{zod-hMa3rSHV.mjs → zod-eKqqhZ5_.mjs} +2 -2
  226. package/dist/{zod-hMa3rSHV.mjs.map → zod-eKqqhZ5_.mjs.map} +1 -1
  227. package/dist/{zod-DvWTfRpI.d.mts → zod-wecrEVAs.d.mts} +8 -3
  228. package/dist/zod-wecrEVAs.d.mts.map +1 -0
  229. package/package.json +19 -30
  230. package/dist/base-email.provider-BWZHIjt8.mjs +0 -42
  231. package/dist/base-email.provider-BWZHIjt8.mjs.map +0 -1
  232. package/dist/cache.service-e34gV6tz.d.mts.map +0 -1
  233. package/dist/cache.tokens-ovi_c52J.mjs +0 -6
  234. package/dist/cache.tokens-ovi_c52J.mjs.map +0 -1
  235. package/dist/colors-axmupKdp.mjs +0 -16
  236. package/dist/colors-axmupKdp.mjs.map +0 -1
  237. package/dist/command-BU4ApTo5.mjs.map +0 -1
  238. package/dist/command-wXfvHbBZ.d.mts.map +0 -1
  239. package/dist/consumer-registry-DHQtypr1.d.mts.map +0 -1
  240. package/dist/cron-manager-9bpN9bu4.mjs.map +0 -1
  241. package/dist/cron-manager-CSTIBPcM.d.mts +0 -124
  242. package/dist/cron-manager-CSTIBPcM.d.mts.map +0 -1
  243. package/dist/di-BO1QIb5H.mjs.map +0 -1
  244. package/dist/env-DKSbuBi5.d.mts.map +0 -1
  245. package/dist/events-D1KdDaiP.mjs.map +0 -1
  246. package/dist/index-B4UBK-2T.d.mts.map +0 -1
  247. package/dist/index-BtlE9RuO.d.mts.map +0 -1
  248. package/dist/index-CW1YHSft.d.mts.map +0 -1
  249. package/dist/index-DEncMcC6.d.mts.map +0 -1
  250. package/dist/index-Dj5IMwtr.d.mts.map +0 -1
  251. package/dist/module-xYoHba6B.mjs.map +0 -1
  252. package/dist/openapi-C6lm0RmV.mjs.map +0 -1
  253. package/dist/quarry-registry-D4hIGScf.d.mts.map +0 -1
  254. package/dist/quarry-registry-DkraZNwn.mjs.map +0 -1
  255. package/dist/queue.module-DeWJ0tQM.mjs +0 -355
  256. package/dist/queue.module-DeWJ0tQM.mjs.map +0 -1
  257. package/dist/resend.provider-Ur6tU7fK.mjs +0 -68
  258. package/dist/resend.provider-Ur6tU7fK.mjs.map +0 -1
  259. package/dist/router-Cy6DjkvP.mjs +0 -1852
  260. package/dist/router-Cy6DjkvP.mjs.map +0 -1
  261. package/dist/seeder-BADTig4n.mjs.map +0 -1
  262. package/dist/smtp.provider-C129sNBT.mjs +0 -76
  263. package/dist/smtp.provider-C129sNBT.mjs.map +0 -1
  264. package/dist/storage-provider.interface-DQMtT42e.d.mts.map +0 -1
  265. package/dist/storage.error-C6FY037a.mjs +0 -8
  266. package/dist/stratal-Bdq4IdB3.mjs.map +0 -1
  267. package/dist/types-BaeHi67f.d.mts.map +0 -1
  268. package/dist/usage-generator-DTqaUMR9.mjs.map +0 -1
  269. package/dist/zod-DvWTfRpI.d.mts.map +0 -1
  270. /package/dist/{chunk-D1SwGrFN.mjs → chunk-BBjsoOtd.mjs} +0 -0
@@ -0,0 +1,251 @@
1
+ import { t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { d as inject, o as Request, r as DI_TOKENS, v as ROUTER_TOKENS } from "./di-DseMn-z9.mjs";
3
+ import { n as __decorateParam, t as __decorate } from "./decorate-CuAoSZvs.mjs";
4
+ import { o as RouterError } from "./module-registry-Dm-pqHd3.mjs";
5
+ import { t as applyTrailingSlash } from "./trailing-slash-CFyw8nYu.mjs";
6
+ import { t as applyLocalePrefix } from "./locale-url-nZrZxqJP.mjs";
7
+ import { n as verifySignedUrl, t as signUrl } from "./signed-url-DIU0sK_6.mjs";
8
+ //#region src/router/uri.ts
9
+ var uri_exports = /* @__PURE__ */ __exportAll({
10
+ Uri: () => Uri,
11
+ buildRouteUrl: () => buildRouteUrl
12
+ });
13
+ /**
14
+ * Encode a value for use as a path parameter.
15
+ *
16
+ * Splits on `/` and encodes each segment with `encodeURIComponent`, so callers
17
+ * can pass slash-containing values for catch-all params (e.g. `:slug{.+}`) and
18
+ * still get a usable URL — `'auth/login'` becomes `'auth/login'`, not
19
+ * `'auth%2Flogin'`. Single segments behave exactly like `encodeURIComponent`.
20
+ */
21
+ function encodePathParam(value) {
22
+ return value.split("/").map(encodeURIComponent).join("/");
23
+ }
24
+ /**
25
+ * Build a URL from a registered route, filling path/domain params and appending extras as query string.
26
+ *
27
+ * Pure function — no request context needed. Used by both the `Uri` class and the standalone `route()` function.
28
+ *
29
+ * @param route - The registered route to build a URL for
30
+ * @param name - Route name (used in error messages)
31
+ * @param params - Path params, domain params, and extra query params
32
+ * @returns Relative URL string (or absolute with domain prefix if route has a domain pattern)
33
+ *
34
+ * @throws RouterError if a required path or domain param is missing
35
+ */
36
+ function buildRouteUrl(route, name, params, localeConfig) {
37
+ const allParams = { ...params };
38
+ const consumedKeys = /* @__PURE__ */ new Set();
39
+ let url = route.path;
40
+ if (allParams.locale && route.localePaths?.length) {
41
+ url = applyLocalePrefix(url, allParams.locale, localeConfig);
42
+ consumedKeys.add("locale");
43
+ }
44
+ for (const paramName of route.paramNames) {
45
+ const value = allParams[paramName];
46
+ if (value === void 0) throw new RouterError(`Missing required route parameter "${paramName}" for route "${name}" (path: ${route.path})`);
47
+ url = url.replace(new RegExp(`:${paramName}(\\{[^}]*\\})?`), encodePathParam(value));
48
+ consumedKeys.add(paramName);
49
+ }
50
+ let domain;
51
+ if (route.domain) {
52
+ domain = route.domain;
53
+ for (const domainParam of route.domainParamNames) {
54
+ const value = allParams[domainParam];
55
+ if (value === void 0) throw new RouterError(`Missing required domain parameter "${domainParam}" for route "${name}" (domain: ${route.domain})`);
56
+ domain = domain.replace(`{${domainParam}}`, encodeURIComponent(value));
57
+ consumedKeys.add(domainParam);
58
+ }
59
+ }
60
+ const queryEntries = Object.entries(allParams).filter(([key]) => !consumedKeys.has(key));
61
+ if (queryEntries.length > 0) {
62
+ const queryString = queryEntries.filter(([, value]) => Boolean(value)).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&");
63
+ url = `${url}${queryString.length ? `?${queryString}` : ""}`;
64
+ }
65
+ if (domain) url = `https://${domain}${url}`;
66
+ return url;
67
+ }
68
+ let Uri = class Uri {
69
+ registry;
70
+ routerContext;
71
+ _defaults = {};
72
+ trailingSlash;
73
+ localeConfig;
74
+ constructor(registry, routerContext, application, localePathService) {
75
+ this.registry = registry;
76
+ this.routerContext = routerContext;
77
+ this.trailingSlash = application.config.trailingSlash ?? "ignore";
78
+ this.localeConfig = {
79
+ defaultLocale: localePathService.localePathConfig?.defaultLocale ?? null,
80
+ prefixDefaultLocale: localePathService.prefixDefaultLocale
81
+ };
82
+ }
83
+ /**
84
+ * Set default URL parameters for this request.
85
+ * Applied to all subsequent `route()` calls — explicit params override defaults.
86
+ *
87
+ * @param params - Default parameters (e.g., `{ locale: 'en' }`)
88
+ */
89
+ defaults(params) {
90
+ this._defaults = {
91
+ ...this._defaults,
92
+ ...params
93
+ };
94
+ }
95
+ /**
96
+ * Read the currently configured default URL parameters.
97
+ *
98
+ * Used by frameworks that need to share these with the client (e.g. the
99
+ * Inertia adapter ships them as a shared prop so `route()` calls in the
100
+ * browser auto-fill the same sticky params as the server).
101
+ */
102
+ getDefaults() {
103
+ return { ...this._defaults };
104
+ }
105
+ /**
106
+ * Generate a URL from a named route.
107
+ *
108
+ * Keys matching `:param` placeholders fill the path.
109
+ * Domain params (`{tenant}`) are consumed from the same object.
110
+ * Extra keys become query string parameters.
111
+ * Default params (from `defaults()`) are merged — explicit params override.
112
+ *
113
+ * @param name - Named route identifier
114
+ * @param params - Route params + domain params + extra query params
115
+ * @param options - URL generation options
116
+ * @returns Generated URL string
117
+ *
118
+ * @throws RouterError if route name not found or required params missing
119
+ */
120
+ route(name, params, options) {
121
+ const registeredRoute = this.registry.get(name);
122
+ if (!registeredRoute) throw new RouterError(`Route name "${name}" was not found in the registry`);
123
+ let url = applyTrailingSlash(buildRouteUrl(registeredRoute, name, {
124
+ ...this._defaults,
125
+ ...params
126
+ }, this.localeConfig), this.trailingSlash);
127
+ if (options?.absolute && !url.startsWith("http")) url = `${new URL(this.routerContext.c.req.url).origin}${url}`;
128
+ return url;
129
+ }
130
+ /**
131
+ * Generate a signed URL from a named route.
132
+ *
133
+ * @param name - Named route identifier
134
+ * @param params - Route params + domain params + extra query params
135
+ * @param options - Signing options (e.g., expiresIn) and URL options
136
+ * @returns Signed URL string with signature query param
137
+ *
138
+ * @throws Error if APP_SECRET environment variable is not set
139
+ */
140
+ async signedRoute(name, params, options) {
141
+ return signUrl(this.route(name, params, options), this.getAppSecret(), options);
142
+ }
143
+ /**
144
+ * Generate a temporary signed URL from a named route.
145
+ *
146
+ * @param name - Named route identifier
147
+ * @param expiresIn - Time-to-live in seconds
148
+ * @param params - Route params + domain params + extra query params
149
+ * @param options - URL generation options
150
+ * @returns Signed URL string with signature and expires query params
151
+ *
152
+ * @throws Error if APP_SECRET environment variable is not set
153
+ */
154
+ async temporarySignedRoute(name, expiresIn, params, options) {
155
+ return this.signedRoute(name, params, {
156
+ ...options,
157
+ expiresIn
158
+ });
159
+ }
160
+ /**
161
+ * Check if the current request has a valid signature.
162
+ *
163
+ * @returns true if the URL signature is valid and not expired
164
+ */
165
+ async hasValidSignature() {
166
+ const secret = this.routerContext.c.env.APP_SECRET;
167
+ if (!secret) return false;
168
+ return verifySignedUrl(this.routerContext.c.req.url, secret);
169
+ }
170
+ /**
171
+ * Get the current request URL pathname (without query string).
172
+ */
173
+ current() {
174
+ return applyTrailingSlash(new URL(this.routerContext.c.req.url).pathname, this.trailingSlash);
175
+ }
176
+ /**
177
+ * Get the current request URL with query string (pathname + search).
178
+ */
179
+ full() {
180
+ const parsed = new URL(this.routerContext.c.req.url);
181
+ return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash);
182
+ }
183
+ /**
184
+ * Get the previous request URL from the Referer header.
185
+ *
186
+ * @param fallback - URL to return if no Referer header (default: '/')
187
+ */
188
+ previous(fallback = "/") {
189
+ return this.routerContext.c.req.header("referer") ?? fallback;
190
+ }
191
+ /**
192
+ * Get the previous request URL pathname (no query string or host) from the Referer header.
193
+ *
194
+ * @param fallback - Path to return if no Referer header (default: '/')
195
+ */
196
+ previousPath(fallback = "/") {
197
+ const referer = this.routerContext.c.req.header("referer");
198
+ if (!referer) return fallback;
199
+ try {
200
+ return new URL(referer).pathname;
201
+ } catch {
202
+ return referer;
203
+ }
204
+ }
205
+ /**
206
+ * Build a URL to a raw path (not a named route) with optional query params.
207
+ *
208
+ * @param path - URL path (e.g., '/users')
209
+ * @param queryParams - Query parameters to append
210
+ * @param options - URL generation options
211
+ */
212
+ to(path, queryParams, options) {
213
+ let url = applyTrailingSlash(path, this.trailingSlash);
214
+ if (queryParams) {
215
+ const entries = Object.entries(queryParams);
216
+ if (entries.length > 0) {
217
+ const queryString = entries.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&");
218
+ url = url.includes("?") ? `${url}&${queryString}` : `${url}?${queryString}`;
219
+ }
220
+ }
221
+ if (options?.absolute && !url.startsWith("http")) url = `${new URL(this.routerContext.c.req.url).origin}${url}`;
222
+ return url;
223
+ }
224
+ /**
225
+ * Build a URL with query string parameters. Merges with existing query params in path.
226
+ *
227
+ * @param path - URL path, may already contain query params
228
+ * @param queryParams - Query parameters to merge (new values override existing)
229
+ */
230
+ query(path, queryParams) {
231
+ const parsed = new URL(path, "https://placeholder.local");
232
+ for (const [key, value] of Object.entries(queryParams)) parsed.searchParams.set(key, value);
233
+ return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash);
234
+ }
235
+ getAppSecret() {
236
+ const secret = this.routerContext.c.env.APP_SECRET;
237
+ if (!secret) throw new Error("APP_SECRET environment variable is required for signed URLs");
238
+ return secret;
239
+ }
240
+ };
241
+ Uri = __decorate([
242
+ Request(ROUTER_TOKENS.Uri),
243
+ __decorateParam(0, inject(ROUTER_TOKENS.RouteRegistry)),
244
+ __decorateParam(1, inject(ROUTER_TOKENS.RouterContext)),
245
+ __decorateParam(2, inject(DI_TOKENS.Application)),
246
+ __decorateParam(3, inject(ROUTER_TOKENS.LocalePathService))
247
+ ], Uri);
248
+ //#endregion
249
+ export { buildRouteUrl as n, uri_exports as r, Uri as t };
250
+
251
+ //# sourceMappingURL=uri-h7Q8Jug9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri-h7Q8Jug9.mjs","names":[],"sources":["../src/router/uri.ts"],"sourcesContent":["import type { Application } from '../application';\nimport { inject } from '../di';\nimport { Request } from '../di/decorators';\nimport { DI_TOKENS } from '../di/tokens';\nimport { applyLocalePrefix } from './locale-url';\nimport type { RouteName, RouteParams } from './route-map';\nimport type { RegisteredRoute, RouteRegistry } from './route-registry';\nimport type { RouterContext } from './router-context';\nimport { RouterError } from './router.error';\nimport { ROUTER_TOKENS } from './router.tokens';\nimport type { LocalePathService } from './services/locale-path.service';\nimport { signUrl, verifySignedUrl, type SignedUrlOptions } from './signed-url';\nimport { applyTrailingSlash } from './trailing-slash';\nimport type { LocaleUrlConfig, TrailingSlashMode } from './types';\n\n/**\n * Options for URL generation methods.\n */\nexport interface UriOptions {\n /** Generate absolute URL (scheme + host). Defaults to false. */\n absolute?: boolean\n}\n\n/**\n * Options for signed URL generation methods.\n */\nexport interface SignedUriOptions extends UriOptions, SignedUrlOptions { }\n\n/**\n * Encode a value for use as a path parameter.\n *\n * Splits on `/` and encodes each segment with `encodeURIComponent`, so callers\n * can pass slash-containing values for catch-all params (e.g. `:slug{.+}`) and\n * still get a usable URL — `'auth/login'` becomes `'auth/login'`, not\n * `'auth%2Flogin'`. Single segments behave exactly like `encodeURIComponent`.\n */\nfunction encodePathParam(value: string): string {\n return value.split('/').map(encodeURIComponent).join('/')\n}\n\n/**\n * Build a URL from a registered route, filling path/domain params and appending extras as query string.\n *\n * Pure function — no request context needed. Used by both the `Uri` class and the standalone `route()` function.\n *\n * @param route - The registered route to build a URL for\n * @param name - Route name (used in error messages)\n * @param params - Path params, domain params, and extra query params\n * @returns Relative URL string (or absolute with domain prefix if route has a domain pattern)\n *\n * @throws RouterError if a required path or domain param is missing\n */\nexport function buildRouteUrl(\n route: RegisteredRoute,\n name: string,\n params?: Record<string, string>,\n localeConfig?: LocaleUrlConfig,\n): string {\n const allParams = { ...params }\n const consumedKeys = new Set<string>()\n let url = route.path\n\n if (allParams.locale && route.localePaths?.length) {\n url = applyLocalePrefix(url, allParams.locale, localeConfig)\n consumedKeys.add('locale')\n }\n\n // Fill path :param placeholders (handles optional regex constraints like :locale{en|de|fr})\n for (const paramName of route.paramNames) {\n const value = allParams[paramName]\n if (value === undefined) {\n throw new RouterError(`Missing required route parameter \"${paramName}\" for route \"${name}\" (path: ${route.path})`)\n }\n url = url.replace(\n new RegExp(`:${paramName}(\\\\{[^}]*\\\\})?`),\n encodePathParam(value),\n )\n consumedKeys.add(paramName)\n }\n\n // Build domain if present\n let domain: string | undefined\n if (route.domain) {\n domain = route.domain\n for (const domainParam of route.domainParamNames) {\n const value = allParams[domainParam]\n if (value === undefined) {\n throw new RouterError(`Missing required domain parameter \"${domainParam}\" for route \"${name}\" (domain: ${route.domain})`)\n }\n domain = domain.replace(`{${domainParam}}`, encodeURIComponent(value))\n consumedKeys.add(domainParam)\n }\n }\n\n // Remaining params (not consumed by path or domain) become query string\n const queryEntries = Object.entries(allParams).filter(([key]) => !consumedKeys.has(key))\n if (queryEntries.length > 0) {\n const queryString = queryEntries\n .filter(([, value]) => Boolean(value))\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n url = `${url}${queryString.length ? `?${queryString}` : ''}`\n }\n\n // Prepend domain if present\n if (domain) {\n url = `https://${domain}${url}`\n }\n\n return url\n}\n\n/**\n * URL generation service for named routes, signed URLs, and request URL access.\n *\n * Registered as request-scoped in the container — has access to the current request\n * via RouterContext for features like `current()`, `full()`, and signed URLs.\n *\n * @example\n * ```typescript\n * // In a controller:\n * const uri = ctx.getContainer().resolve<Uri>(ROUTER_TOKENS.Uri)\n * uri.route('users.show', { id: '1' })\n * uri.current()\n * await uri.signedRoute('unsubscribe', { user: '1' }, { expiresIn: 3600 })\n *\n * // Set defaults (e.g., in middleware):\n * uri.defaults({ locale: 'en' })\n * uri.route('posts.index') // auto-fills :locale param\n * ```\n */\n@Request(ROUTER_TOKENS.Uri)\nexport class Uri {\n private _defaults: Record<string, string> = {}\n private readonly trailingSlash: TrailingSlashMode\n private readonly localeConfig: LocaleUrlConfig\n\n constructor(\n @inject(ROUTER_TOKENS.RouteRegistry) private readonly registry: RouteRegistry,\n @inject(ROUTER_TOKENS.RouterContext) private readonly routerContext: RouterContext,\n @inject(DI_TOKENS.Application) application: Application,\n @inject(ROUTER_TOKENS.LocalePathService) localePathService: LocalePathService,\n ) {\n this.trailingSlash = application.config.trailingSlash ?? 'ignore'\n this.localeConfig = {\n defaultLocale: localePathService.localePathConfig?.defaultLocale ?? null,\n prefixDefaultLocale: localePathService.prefixDefaultLocale,\n }\n }\n\n /**\n * Set default URL parameters for this request.\n * Applied to all subsequent `route()` calls — explicit params override defaults.\n *\n * @param params - Default parameters (e.g., `{ locale: 'en' }`)\n */\n defaults(params: Record<string, string>): void {\n this._defaults = { ...this._defaults, ...params }\n }\n\n /**\n * Read the currently configured default URL parameters.\n *\n * Used by frameworks that need to share these with the client (e.g. the\n * Inertia adapter ships them as a shared prop so `route()` calls in the\n * browser auto-fill the same sticky params as the server).\n */\n getDefaults(): Record<string, string> {\n return { ...this._defaults }\n }\n\n /**\n * Generate a URL from a named route.\n *\n * Keys matching `:param` placeholders fill the path.\n * Domain params (`{tenant}`) are consumed from the same object.\n * Extra keys become query string parameters.\n * Default params (from `defaults()`) are merged — explicit params override.\n *\n * @param name - Named route identifier\n * @param params - Route params + domain params + extra query params\n * @param options - URL generation options\n * @returns Generated URL string\n *\n * @throws RouterError if route name not found or required params missing\n */\n route<N extends RouteName>(name: N, params?: RouteParams<N>, options?: UriOptions): string {\n const registeredRoute = this.registry.get(name)\n if (!registeredRoute) {\n throw new RouterError(`Route name \"${name}\" was not found in the registry`)\n }\n\n const mergedParams = { ...this._defaults, ...params } as Record<string, string>\n let url = applyTrailingSlash(buildRouteUrl(registeredRoute, name, mergedParams, this.localeConfig), this.trailingSlash)\n\n if (options?.absolute && !url.startsWith('http')) {\n const origin = new URL(this.routerContext.c.req.url).origin\n url = `${origin}${url}`\n }\n\n return url\n }\n\n /**\n * Generate a signed URL from a named route.\n *\n * @param name - Named route identifier\n * @param params - Route params + domain params + extra query params\n * @param options - Signing options (e.g., expiresIn) and URL options\n * @returns Signed URL string with signature query param\n *\n * @throws Error if APP_SECRET environment variable is not set\n */\n async signedRoute<N extends RouteName>(name: N, params?: RouteParams<N>, options?: SignedUriOptions): Promise<string> {\n const url = this.route(name, params, options)\n const secret = this.getAppSecret()\n return signUrl(url, secret, options)\n }\n\n /**\n * Generate a temporary signed URL from a named route.\n *\n * @param name - Named route identifier\n * @param expiresIn - Time-to-live in seconds\n * @param params - Route params + domain params + extra query params\n * @param options - URL generation options\n * @returns Signed URL string with signature and expires query params\n *\n * @throws Error if APP_SECRET environment variable is not set\n */\n async temporarySignedRoute<N extends RouteName>(name: N, expiresIn: number, params?: RouteParams<N>, options?: UriOptions): Promise<string> {\n return this.signedRoute(name, params, { ...options, expiresIn })\n }\n\n /**\n * Check if the current request has a valid signature.\n *\n * @returns true if the URL signature is valid and not expired\n */\n async hasValidSignature(): Promise<boolean> {\n const secret = (this.routerContext.c.env as unknown as Record<string, string>).APP_SECRET\n if (!secret) return false\n return verifySignedUrl(this.routerContext.c.req.url, secret)\n }\n\n /**\n * Get the current request URL pathname (without query string).\n */\n current(): string {\n const parsed = new URL(this.routerContext.c.req.url)\n return applyTrailingSlash(parsed.pathname, this.trailingSlash)\n }\n\n /**\n * Get the current request URL with query string (pathname + search).\n */\n full(): string {\n const parsed = new URL(this.routerContext.c.req.url)\n return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash)\n }\n\n /**\n * Get the previous request URL from the Referer header.\n *\n * @param fallback - URL to return if no Referer header (default: '/')\n */\n previous(fallback = '/'): string {\n return this.routerContext.c.req.header('referer') ?? fallback\n }\n\n /**\n * Get the previous request URL pathname (no query string or host) from the Referer header.\n *\n * @param fallback - Path to return if no Referer header (default: '/')\n */\n previousPath(fallback = '/'): string {\n const referer = this.routerContext.c.req.header('referer')\n if (!referer) return fallback\n\n try {\n const parsed = new URL(referer)\n return parsed.pathname\n } catch {\n return referer\n }\n }\n\n /**\n * Build a URL to a raw path (not a named route) with optional query params.\n *\n * @param path - URL path (e.g., '/users')\n * @param queryParams - Query parameters to append\n * @param options - URL generation options\n */\n to(path: string, queryParams?: Record<string, string>, options?: UriOptions): string {\n let url = applyTrailingSlash(path, this.trailingSlash)\n\n if (queryParams) {\n const entries = Object.entries(queryParams)\n if (entries.length > 0) {\n const queryString = entries\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n url = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`\n }\n }\n\n if (options?.absolute && !url.startsWith('http')) {\n const origin = new URL(this.routerContext.c.req.url).origin\n url = `${origin}${url}`\n }\n\n return url\n }\n\n /**\n * Build a URL with query string parameters. Merges with existing query params in path.\n *\n * @param path - URL path, may already contain query params\n * @param queryParams - Query parameters to merge (new values override existing)\n */\n query(path: string, queryParams: Record<string, string>): string {\n const parsed = new URL(path, 'https://placeholder.local')\n for (const [key, value] of Object.entries(queryParams)) {\n parsed.searchParams.set(key, value)\n }\n return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash)\n }\n\n private getAppSecret(): string {\n const secret = this.routerContext.c.env.APP_SECRET\n if (!secret) {\n throw new Error('APP_SECRET environment variable is required for signed URLs')\n }\n return secret\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { t as __exportAll } from "./chunk-D1SwGrFN.mjs";
2
- import { i as dimWhite, n as cyan, r as dim, s as yellow, t as bold } from "./colors-axmupKdp.mjs";
1
+ import { t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { a as cyan, i as bold, o as dim, s as dimWhite, u as yellow } from "./command-BvmUAPPQ.mjs";
3
3
  //#region src/quarry/usage-generator.ts
4
4
  var usage_generator_exports = /* @__PURE__ */ __exportAll({
5
5
  generateListing: () => generateListing,
@@ -66,7 +66,7 @@ function generateListing(commands, signatures, options) {
66
66
  lines.push(` $ ${bin} [--env <name>] <command> [options]`);
67
67
  lines.push("");
68
68
  lines.push(bold(yellow("Global Options")));
69
- lines.push(...formatTable([[`-e, --env ${cyan("<name>")}`, `Select a ${dim("wrangler.jsonc")} environment (e.g. staging, production)`]]));
69
+ lines.push(...formatTable([[`-e, --env ${cyan("<name>")}`, `Select a wrangler config environment (e.g. staging, production)`]]));
70
70
  lines.push("");
71
71
  if (commands.length === 0) {
72
72
  lines.push("No registered commands.");
@@ -158,4 +158,4 @@ function formatTable(rows) {
158
158
  //#endregion
159
159
  export { usage_generator_exports as n, generateUsage as t };
160
160
 
161
- //# sourceMappingURL=usage-generator-DTqaUMR9.mjs.map
161
+ //# sourceMappingURL=usage-generator-DAWYasuP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-generator-DAWYasuP.mjs","names":[],"sources":["../src/quarry/usage-generator.ts"],"sourcesContent":["import { bold, cyan, dim, dimWhite, yellow } from './colors'\nimport type { ParsedSignature } from './types'\n\n/**\n * Generate formatted help/usage text from a parsed signature.\n *\n * Pure function, edge-compatible.\n */\nexport function generateUsage(signature: ParsedSignature, description?: string): string {\n const lines: string[] = []\n\n // Usage line\n lines.push(`${bold('Usage:')} ${bold(cyan('quarry ' + buildUsageLine(signature)))}`)\n\n // Description\n if (description) {\n lines.push('')\n lines.push(description)\n }\n\n // Arguments section\n if (signature.arguments.length > 0) {\n lines.push('')\n lines.push(bold(yellow('Arguments:')))\n const argRows = signature.arguments.map((arg) => {\n const label = arg.name\n const parts: string[] = []\n\n if (arg.description) parts.push(arg.description)\n\n if (arg.isArray) {\n parts.push('(variadic)')\n } else if (arg.required) {\n parts.push('(required)')\n } else if (arg.default !== undefined) {\n parts.push(dim(`(default: ${arg.default})`))\n } else {\n parts.push('(optional)')\n }\n\n return [label, parts.join(' ')] as const\n })\n lines.push(...formatTable(argRows))\n }\n\n // Options section\n if (signature.options.length > 0) {\n lines.push('')\n lines.push(bold(yellow('Options:')))\n const optRows = signature.options.map((opt) => {\n const flagParts: string[] = []\n if (opt.alias) flagParts.push(`-${opt.alias},`)\n flagParts.push(`--${opt.name}`)\n\n const label = flagParts.join(' ')\n const parts: string[] = []\n\n if (opt.description) parts.push(opt.description)\n if (!opt.isFlag && !opt.description) parts.push('Accepts a value')\n if (opt.isFlag && !opt.description) parts.push('Boolean flag')\n if (opt.isArray) parts.push('(multiple)')\n if (opt.default !== undefined) parts.push(dim(`(default: ${opt.default})`))\n\n return [label, parts.join(' ')] as const\n })\n lines.push(...formatTable(optRows))\n }\n\n return lines.join('\\n')\n}\n\nexport interface ListingOptions {\n binaryName?: string\n binaryLabel?: string\n binaryVersion?: string\n}\n\n/**\n * Generate a compact command listing with visual hierarchy.\n */\nexport function generateListing(\n commands: { name: string; description?: string; aliases: string[] }[],\n signatures: Map<string, ParsedSignature>,\n options?: ListingOptions,\n): string {\n const bin = options?.binaryName ?? 'quarry'\n const label = options?.binaryLabel ?? 'Quarry CLI'\n const version = options?.binaryVersion\n\n const lines: string[] = []\n\n // Header\n lines.push(bold(`${label}${version ? ` v${version}` : ''}`))\n lines.push('')\n\n // Usage\n lines.push(bold(yellow('Usage')))\n lines.push(` $ ${bin} [--env <name>] <command> [options]`)\n lines.push('')\n\n // Global Options\n lines.push(bold(yellow('Global Options')))\n lines.push(...formatTable([\n [`-e, --env ${cyan('<name>')}`, `Select a wrangler config environment (e.g. staging, production)`],\n ]))\n lines.push('')\n\n // Commands\n if (commands.length === 0) {\n lines.push('No registered commands.')\n return lines.join('\\n')\n }\n\n lines.push(bold(yellow('Commands')))\n\n const termWidth = typeof process !== 'undefined'\n ? (process.stdout.columns as number | undefined) ?? 80\n : 80\n\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i]\n const sig = signatures.get(cmd.name)\n const sigParts: string[] = [cyan(cmd.name)]\n\n if (cmd.aliases.length > 0) {\n sigParts.push(cyan(`(alias: ${cmd.aliases.join(', ')})`))\n }\n\n if (sig) {\n const inlineParts: string[] = []\n for (const arg of sig.arguments) {\n inlineParts.push(formatArgPlaceholder(arg))\n }\n\n for (const opt of sig.options) {\n const flagStr = opt.alias ? `-${opt.alias},--${opt.name}` : `--${opt.name}`\n inlineParts.push(`[${flagStr}]`)\n }\n\n if (inlineParts.length > 0) {\n sigParts.push(dim(inlineParts.join(' ')))\n }\n }\n\n const sigLine = ' ' + sigParts.join(' ')\n lines.push(...wrapLine(sigLine, termWidth, ' '))\n\n if (cmd.description) {\n lines.push(` ${dimWhite(cmd.description)}`)\n }\n\n if (i < commands.length - 1) {\n lines.push('')\n }\n }\n\n lines.push('')\n\n // Footer\n lines.push(dimWhite(`Run ${bin} help <command> for detailed information.`))\n\n return lines.join('\\n')\n}\n\n/** Format a single argument into its placeholder representation (e.g. `<name>`, `[name=default]`). */\nfunction formatArgPlaceholder(arg: ParsedSignature['arguments'][number]): string {\n if (arg.isArray) return `<${arg.name}...>`\n if (arg.required) return `<${arg.name}>`\n if (arg.default !== undefined) return `[${arg.name}=${arg.default}]`\n return `[${arg.name}]`\n}\n\n/** Build the inline usage line showing the command name with argument and option placeholders. */\nfunction buildUsageLine(signature: ParsedSignature): string {\n const parts = [signature.name]\n\n for (const arg of signature.arguments) {\n parts.push(formatArgPlaceholder(arg))\n }\n\n for (const opt of signature.options) {\n const flagStr = opt.alias ? `-${opt.alias},--${opt.name}` : `--${opt.name}`\n\n if (opt.isFlag) {\n parts.push(`[${flagStr}]`)\n } else if (opt.isArray) {\n parts.push(`[${flagStr} <value...>]`)\n } else {\n parts.push(`[${flagStr} <value>]`)\n }\n }\n\n return parts.join(' ')\n}\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g\n\n/** Remove ANSI escape sequences from a string. */\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '')\n}\n\n// eslint-disable-next-line no-control-regex\nconst TOKEN_RE = /(?:\\x1b\\[[0-9;]*m)*[^\\s\\x1b]+(?:\\x1b\\[[0-9;]*m)*/g\n\n/** Wrap a single line at word boundaries, preserving ANSI codes across wrapped segments. */\nfunction wrapLine(text: string, maxWidth: number, continuationIndent: string): string[] {\n const visibleLen = stripAnsi(text).length\n if (visibleLen <= maxWidth) return [text]\n\n const tokens = text.match(TOKEN_RE) ?? [text]\n\n const lines: string[] = []\n let currentLine = ''\n let currentVisibleLen = 0\n\n for (const token of tokens) {\n const tokenVisible = stripAnsi(token).length\n const separator = currentLine === '' ? '' : ' '\n const separatorLen = separator.length\n\n if (currentLine !== '' && currentVisibleLen + separatorLen + tokenVisible > maxWidth) {\n lines.push(currentLine)\n currentLine = continuationIndent + token\n currentVisibleLen = continuationIndent.length + tokenVisible\n } else {\n currentLine += separator + token\n currentVisibleLen += separatorLen + tokenVisible\n }\n }\n\n if (currentLine !== '') {\n lines.push(currentLine)\n }\n\n return lines\n}\n\n/** Format label/description pairs into aligned two-column table rows. */\nfunction formatTable(rows: readonly (readonly [string, string])[]): string[] {\n if (rows.length === 0) return []\n\n const maxLabel = Math.max(...rows.map(([label]) => stripAnsi(label).length))\n const padding = 4\n\n return rows.map(([label, desc]) => {\n const visibleLen = stripAnsi(label).length\n const pad = ' '.repeat(maxLabel - visibleLen + padding)\n return ` ${label}${pad}${desc}`\n })\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { n as __reExport, t as __exportAll } from "./chunk-D1SwGrFN.mjs";
2
- import { n as getContainer } from "./container-storage-GpNNz79X.mjs";
3
- import { t as I18N_TOKENS } from "./i18n.tokens-hwRpmjRq.mjs";
4
- import { a as CUID2_REGEX, i as zod_exports, n as ZodError, o as cuid2, r as z, t as OpenAPIHono } from "./zod-hMa3rSHV.mjs";
5
- import { t as zodErrorMap } from "./validation.context-XTysWJ3b.mjs";
1
+ import { n as __reExport, t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
+ import { n as getContainer } from "./container-storage-BmOJ4_Na.mjs";
3
+ import { t as I18N_TOKENS } from "./i18n.tokens-CZ_v8oyS.mjs";
4
+ import { a as CUID2_REGEX, i as zod_exports, n as ZodError, o as cuid2, r as z, t as OpenAPIHono } from "./zod-eKqqhZ5_.mjs";
5
+ import { t as zodErrorMap } from "./validation.context-CRvmrhq7.mjs";
6
6
  //#region src/i18n/validation/with-zod-i18n.ts
7
7
  /**
8
8
  * Type-safe helper for creating custom Zod error messages with i18n support
@@ -46,4 +46,4 @@ __reExport(/* @__PURE__ */ __exportAll({
46
46
  //#endregion
47
47
  export { withZodI18n as t };
48
48
 
49
- //# sourceMappingURL=validation-DUzcjb8Q.mjs.map
49
+ //# sourceMappingURL=validation-CpOjviyT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation-DUzcjb8Q.mjs","names":[],"sources":["../src/i18n/validation/with-zod-i18n.ts","../src/i18n/validation/index.ts"],"sourcesContent":["import { type $ZodRawIssue } 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-safe helper for creating custom Zod error messages with i18n support\n *\n * Usage with .refine():\n * ```typescript\n * const schema = z.string().refine(\n * (val) => val.length > 5,\n * withZodI18n('validation.minLength', { min: 5 })\n * )\n * ```\n *\n * Usage with built-in validators:\n * ```typescript\n * const schema = z.string().min(5, withZodI18n('validation.minLength', { min: 5 }))\n * const schema = z.string().email(withZodI18n('validation.email'))\n * ```\n *\n * @param key - Message key from shared i18n messages (type-safe via MessageKeys)\n * @param params - Optional interpolation parameters for the message\n * @returns Zod error configuration object with translated message\n */\nexport function withZodI18n(\n key: MessageKeys,\n params?: Record<string, unknown>\n): { error: (_issue: $ZodRawIssue) => string } {\n return {\n error: (_issue: $ZodRawIssue) => {\n try {\n const container = getContainer()\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n return i18n.t(key, params as Record<string, string | number> | undefined)\n } catch {\n return 'Invalid input'\n }\n },\n }\n}\n","export * from './zod'\nexport { withZodI18n } from './with-zod-i18n'\nexport { zodErrorMap } from './validation.context'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,YACd,KACA,QAC6C;CAC7C,OAAO,EACL,QAAQ,WAAyB;EAC/B,IAAI;GAGF,OAFkB,cACI,CAAC,QAAsB,YAAY,YAC9C,CAAC,EAAE,KAAK,OAAsD;UACnE;GACN,OAAO;;IAGZ"}
1
+ {"version":3,"file":"validation-CpOjviyT.mjs","names":[],"sources":["../src/i18n/validation/with-zod-i18n.ts","../src/i18n/validation/index.ts"],"sourcesContent":["import { type $ZodRawIssue } 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-safe helper for creating custom Zod error messages with i18n support\n *\n * Usage with .refine():\n * ```typescript\n * const schema = z.string().refine(\n * (val) => val.length > 5,\n * withZodI18n('validation.minLength', { min: 5 })\n * )\n * ```\n *\n * Usage with built-in validators:\n * ```typescript\n * const schema = z.string().min(5, withZodI18n('validation.minLength', { min: 5 }))\n * const schema = z.string().email(withZodI18n('validation.email'))\n * ```\n *\n * @param key - Message key from shared i18n messages (type-safe via MessageKeys)\n * @param params - Optional interpolation parameters for the message\n * @returns Zod error configuration object with translated message\n */\nexport function withZodI18n(\n key: MessageKeys,\n params?: Record<string, unknown>\n): { error: (_issue: $ZodRawIssue) => string } {\n return {\n error: (_issue: $ZodRawIssue) => {\n try {\n const container = getContainer()\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n return i18n.t(key, params as Record<string, string | number> | undefined)\n } catch {\n return 'Invalid input'\n }\n },\n }\n}\n","export * from './zod'\nexport { withZodI18n } from './with-zod-i18n'\nexport { zodErrorMap } from './validation.context'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,YACd,KACA,QAC6C;CAC7C,OAAO,EACL,QAAQ,WAAyB;EAC/B,IAAI;GAGF,OAFkB,aACG,EAAE,QAAsB,YAAY,WAC/C,EAAE,EAAE,KAAK,MAAqD;EAC1E,QAAQ;GACN,OAAO;EACT;CACF,EACF;AACF"}
@@ -1,5 +1,5 @@
1
- import { n as getContainer } from "./container-storage-GpNNz79X.mjs";
2
- import { t as I18N_TOKENS } from "./i18n.tokens-hwRpmjRq.mjs";
1
+ import { n as getContainer } from "./container-storage-BmOJ4_Na.mjs";
2
+ import { t as I18N_TOKENS } from "./i18n.tokens-CZ_v8oyS.mjs";
3
3
  //#region src/i18n/validation/validation.error-map.ts
4
4
  /**
5
5
  * Type guards for narrowing Zod v4 issue types
@@ -114,4 +114,4 @@ const zodErrorMap = createI18nErrorMap();
114
114
  //#endregion
115
115
  export { zodErrorMap as t };
116
116
 
117
- //# sourceMappingURL=validation.context-XTysWJ3b.mjs.map
117
+ //# sourceMappingURL=validation.context-CRvmrhq7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.context-XTysWJ3b.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;;AAGxB,SAAS,SAAS,OAA6D;CAC7E,OAAO,MAAM,SAAS;;AAGxB,SAAS,WAAW,OAA+D;CACjF,OAAO,MAAM,SAAS;;AAGxB,SAAS,gBAAgB,OAA0E;CACjG,OAAO,MAAM,SAAS;;AAGxB,SAAS,gBAAgB,OAAoE;CAC3F,OAAO,MAAM,SAAS;;AAGxB,SAAS,mBAAmB,OAAuE;CACjG,OAAO,MAAM,SAAS;;AAGxB,SAAS,eAAe,OAAmE;CACzF,OAAO,MAAM,SAAS;;AAGxB,SAAS,aAAa,OAAiE;CACrF,OAAO,MAAM,SAAS;;;;;;AAOxB,SAAS,cAAc,OAAkC;CACvD,IAAI,cAAc,MAAM,EAAE;EACxB,IAAI,MAAM,UAAU,KAAA,GAClB,OAAO;EAET,OAAO;;CAGT,IAAI,WAAW,MAAM,EAOnB,OAAO,4BANS,MAAM,UAAU,SAMW,GAL1B,MAAM,QACnB,UACA,MAAM,YACJ,cACA;CAIR,IAAI,SAAS,MAAM,EAOjB,OAAO,0BANS,MAAM,UAAU,SAMS,GALxB,MAAM,QACnB,UACA,MAAM,YACJ,cACA;CAIR,IAAI,gBAAgB,MAAM,EAExB,OAAO,iCAAiC,MAAM;CAGhD,IAAI,gBAAgB,MAAM,EACxB,OAAO;CAGT,IAAI,mBAAmB,MAAM,EAC3B,OAAO;CAGT,IAAI,eAAe,MAAM,EACvB,OAAO;CAGT,IAAI,aAAa,MAAM,EAErB,OAAO;CAIT,OAAO;;;;;;AAOT,SAAS,iBAAiB,OAAsD;CAC9E,MAAM,SAA0C,EAAE;CAElD,IAAI,cAAc,MAAM,EAAE;EACxB,OAAO,WAAW,MAAM;EACxB,OAAO,WAAW,OAAO,MAAM,MAAM;EACrC,OAAO;;CAGT,IAAI,mBAAmB,MAAM,EAAE;EAC7B,OAAO,OAAO,MAAM,KAAK,KAAK,KAAK;EACnC,OAAO;;CAGT,IAAI,aAAa,MAAM,EAGrB,OAAO;CAGT,IAAI,gBAAgB,MAAM,EAAE;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;;CAGT,IAAI,WAAW,MAAM,EAAE;EACrB,OAAO,UAAU,OAAO,MAAM,QAAQ;EACtC,OAAO,OAAO,MAAM;EACpB,IAAI,MAAM,WAAW,QACnB,OAAO,UAAU,IAAI,KAAK,OAAO,MAAM,QAAQ,CAAC,CAAC,oBAAoB;EAEvE,OAAO;;CAGT,IAAI,SAAS,MAAM,EAAE;EACnB,OAAO,UAAU,OAAO,MAAM,QAAQ;EACtC,OAAO,OAAO,MAAM;EACpB,IAAI,MAAM,WAAW,QACnB,OAAO,UAAU,IAAI,KAAK,OAAO,MAAM,QAAQ,CAAC,CAAC,oBAAoB;EAEvE,OAAO;;CAGT,IAAI,gBAAgB,MAAM,EAAE;EAC1B,OAAO,aAAa,MAAM;EAC1B,OAAO;;CAGT,OAAO;;;;;;AAOT,SAAgB,qBAAmC;CACjD,QAAQ,UAA6C;EACnD,MAAM,aAAa,cAAc,MAAM;EACvC,MAAM,gBAAgB,iBAAiB,MAAM;EAE7C,IAAI;GAGF,OAAO,EAAE,SAFS,cACI,CAAC,QAAsB,YAAY,YACnC,CAAC,EAAE,YAAY,cAAc,EAAE;UAC/C;GACN,OAAO,EAAE,SAAS,iBAAiB;;;;;;;;;;;AC1LzC,MAAa,cAAc,oBAAoB"}
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":"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"}
@@ -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 { Wn as ControllerOptions, er as RouterEnv, nt as ContextQueryResult, rt as RouterContext, xr as ApplicationError } from "../index-DEncMcC6.mjs";
2
- import { t as Constructor } from "../types-BaeHi67f.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
 
@@ -130,6 +130,15 @@ declare class GatewayContext extends RouterContext {
130
130
  constructor(c: Context<RouterEnv>, ws: WSContext$1);
131
131
  /** Send data through the WebSocket connection */
132
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;
133
142
  /** Close the WebSocket connection */
134
143
  close(code?: number, reason?: string): void;
135
144
  /** Current WebSocket ready state */
@@ -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/gateway-context.ts","../../src/websocket/websocket.error.ts"],"mappings":";;;;;;;;;;KAMY,cAAA,GAAiB,IAAA,CAAK,iBAAA;;;;;;;AAAlC;;;;;;;;AC8BA;;;;;;;;;;;;;;;;iBAAgB,OAAA,CAAQ,KAAA,UAAe,OAAA,GAAU,cAAA,cACpB,WAAA,EAAa,MAAA,EAAQ,CAAA,KAAC,CAAA;;;AAanD;;;;iBAAgB,SAAA,CAAU,MAAA;;;;;;;;AD5C1B;;;;;;;;AC8BA;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;;;;AF9F3C;;;;;;;;AC8BA;;;;;;;;cEZa,cAAA,SAAuB,aAAA;EAAA,SACiB,EAAA,EAAI,WAAA;cAA3C,CAAA,EAAG,OAAA,CAAQ,SAAA,GAA4B,EAAA,EAAI,WAAA;EFWlB;EENrC,IAAA,CAAK,IAAA,WAAe,WAAA,GAAc,UAAA,CAAW,WAAA;EFOlB;EEF3B,KAAA,CAAM,IAAA,WAAe,MAAA;EFEmB;EAAA,IEGpC,UAAA,CAAA,GAAc,cAAA;EFH+B;;AAanD;;;;;;;EEGW,KAAA,CAAA,GAAS,MAAA;EACT,KAAA,CAAM,GAAA;EDnBQ;;;;AAsBzB;ECQW,KAAA,WAAgB,MAAA,oFAAA,CAA2F,GAAA,GAAM,CAAA,GAAI,kBAAA,CAAmB,CAAA,EAAG,CAAA;;;;ADYtJ;;ECAW,IAAA,GAAA,CAAA,GAAW,OAAA,CAAQ,CAAA;AAAA;;;cC3EjB,cAAA,SAAuB,gBAAA"}
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 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-CFe6a9gz.mjs";
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
2
  export { Gateway, GatewayContext, OnClose, OnError, OnMessage, WebSocketError, getWsOnCloseMethod, getWsOnErrorMethod, getWsOnMessageMethod, isGateway };
@@ -1,5 +1,5 @@
1
- import { Y as Container } from "../index-DEncMcC6.mjs";
2
- import { t as StratalEnv } from "../env-DKSbuBi5.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 { c as DI_TOKENS } from "../di-BO1QIb5H.mjs";
2
- import { t as Stratal } from "../stratal-Bdq4IdB3.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,7 +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.initializeHandlers();
13
+ await app.ensureScopedHandlers();
14
14
  const mockCtx = app.createMockRouterContext("en");
15
15
  return app.container.runInRequestScope(mockCtx, callback);
16
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 await app.initializeHandlers()\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,IAAI,oBAAoB;CAC9B,MAAM,UAAU,IAAI,wBAAwB,KAAK;CACjD,OAAO,IAAI,UAAU,kBAAkB,SAAS,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;ACY3D,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"}
@@ -1,4 +1,4 @@
1
- import { n as __reExport, t as __exportAll } from "./chunk-D1SwGrFN.mjs";
1
+ import { n as __reExport, t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
2
  import { OpenAPIHono, z, z as z$2 } from "@hono/zod-openapi";
3
3
  import { ZodError } from "zod";
4
4
  //#region src/i18n/validation/cuid2.ts
@@ -69,4 +69,4 @@ __reExport(zod_exports, import__hono_zod_openapi);
69
69
  //#endregion
70
70
  export { CUID2_REGEX as a, zod_exports as i, ZodError as n, cuid2 as o, z$2 as r, OpenAPIHono as t };
71
71
 
72
- //# sourceMappingURL=zod-hMa3rSHV.mjs.map
72
+ //# sourceMappingURL=zod-eKqqhZ5_.mjs.map