stratal 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +1 -1
  2. package/dist/{base-email.provider-CfQCA08m.mjs → base-email.provider-BWZHIjt8.mjs} +1 -1
  3. package/dist/{base-email.provider-CfQCA08m.mjs.map → base-email.provider-BWZHIjt8.mjs.map} +1 -1
  4. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  5. package/dist/bin/quarry.mjs +46 -109
  6. package/dist/bin/quarry.mjs.map +1 -1
  7. package/dist/cache/index.d.mts +6 -46
  8. package/dist/cache/index.d.mts.map +1 -1
  9. package/dist/cache/index.mjs +22 -67
  10. package/dist/cache/index.mjs.map +1 -1
  11. package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-e34gV6tz.d.mts} +8 -8
  12. package/dist/{cache.service-DsnKuNyO.d.mts.map → cache.service-e34gV6tz.d.mts.map} +1 -1
  13. package/dist/{cache.tokens-B7Rw1C9Q.mjs → cache.tokens-ovi_c52J.mjs} +1 -1
  14. package/dist/{cache.tokens-B7Rw1C9Q.mjs.map → cache.tokens-ovi_c52J.mjs.map} +1 -1
  15. package/dist/{colors-DJaRDXoS.mjs → colors-axmupKdp.mjs} +1 -1
  16. package/dist/{colors-DJaRDXoS.mjs.map → colors-axmupKdp.mjs.map} +1 -1
  17. package/dist/{command-BgSlsS4M.mjs → command-BU4ApTo5.mjs} +2 -3
  18. package/dist/command-BU4ApTo5.mjs.map +1 -0
  19. package/dist/{command-Bu-PjJrX.d.mts → command-wXfvHbBZ.d.mts} +3 -2
  20. package/dist/command-wXfvHbBZ.d.mts.map +1 -0
  21. package/dist/config/index.d.mts +24 -11
  22. package/dist/config/index.d.mts.map +1 -1
  23. package/dist/config/index.mjs +33 -57
  24. package/dist/config/index.mjs.map +1 -1
  25. package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-DHQtypr1.d.mts} +1 -1
  26. package/dist/{consumer-registry-B7yUNh0q.d.mts.map → consumer-registry-DHQtypr1.d.mts.map} +1 -1
  27. package/dist/container-storage-GpNNz79X.mjs +52 -0
  28. package/dist/container-storage-GpNNz79X.mjs.map +1 -0
  29. package/dist/{controller.decorator-DQzenvSN.mjs → controller.decorator-DIUazNU7.mjs} +8 -8
  30. package/dist/controller.decorator-DIUazNU7.mjs.map +1 -0
  31. package/dist/cron/index.d.mts +26 -5
  32. package/dist/cron/index.d.mts.map +1 -1
  33. package/dist/cron/index.mjs +1 -1
  34. package/dist/{cron-manager-7Symz_TE.mjs → cron-manager-9bpN9bu4.mjs} +42 -16
  35. package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
  36. package/dist/{cron-manager-BEsH1mjW.d.mts → cron-manager-CSTIBPcM.d.mts} +6 -13
  37. package/dist/cron-manager-CSTIBPcM.d.mts.map +1 -0
  38. package/dist/decorate-HgTKAYK8.mjs +16 -0
  39. package/dist/deep-merge-C8NgcXw4.mjs +18 -0
  40. package/dist/deep-merge-C8NgcXw4.mjs.map +1 -0
  41. package/dist/di/index.d.mts +2 -2
  42. package/dist/di/index.mjs +4 -3
  43. package/dist/di-BO1QIb5H.mjs +415 -0
  44. package/dist/di-BO1QIb5H.mjs.map +1 -0
  45. package/dist/email/index.d.mts +14 -89
  46. package/dist/email/index.d.mts.map +1 -1
  47. package/dist/email/index.mjs +30 -125
  48. package/dist/email/index.mjs.map +1 -1
  49. package/dist/en-BPP6h6y5.mjs +202 -0
  50. package/dist/en-BPP6h6y5.mjs.map +1 -0
  51. package/dist/{env-D1rcZ8_r.d.mts → env-DKSbuBi5.d.mts} +1 -1
  52. package/dist/env-DKSbuBi5.d.mts.map +1 -0
  53. package/dist/errors/index.d.mts +2 -2
  54. package/dist/errors/index.mjs +4 -2
  55. package/dist/errors-BBZTnjdq.mjs +333 -0
  56. package/dist/errors-BBZTnjdq.mjs.map +1 -0
  57. package/dist/events/index.d.mts +2 -2
  58. package/dist/events/index.d.mts.map +1 -1
  59. package/dist/events/index.mjs +1 -1
  60. package/dist/{events-COKixqnG.mjs → events-D1KdDaiP.mjs} +13 -11
  61. package/dist/events-D1KdDaiP.mjs.map +1 -0
  62. package/dist/exception-context-B4kM-M53.mjs +429 -0
  63. package/dist/exception-context-B4kM-M53.mjs.map +1 -0
  64. package/dist/{gateway-context-CdJjpUCW.mjs → gateway-context-CFe6a9gz.mjs} +20 -31
  65. package/dist/gateway-context-CFe6a9gz.mjs.map +1 -0
  66. package/dist/guards/index.d.mts +3 -3
  67. package/dist/guards/index.d.mts.map +1 -1
  68. package/dist/guards/index.mjs +1 -1
  69. package/dist/{guards-DUk_Kzst.mjs → guards-Ced-uNIF.mjs} +7 -5
  70. package/dist/guards-Ced-uNIF.mjs.map +1 -0
  71. package/dist/{http-method.decorator-DXwxAfb_.mjs → http-method.decorator-CdjKFJZZ.mjs} +7 -6
  72. package/dist/http-method.decorator-CdjKFJZZ.mjs.map +1 -0
  73. package/dist/i18n/index.d.mts +238 -3
  74. package/dist/i18n/index.d.mts.map +1 -0
  75. package/dist/i18n/index.mjs +39 -3
  76. package/dist/i18n/index.mjs.map +1 -0
  77. package/dist/i18n/messages/en/index.d.mts +2 -2
  78. package/dist/i18n/messages/en/index.mjs +2 -2
  79. package/dist/i18n/utils/index.d.mts +4 -26
  80. package/dist/i18n/utils/index.d.mts.map +1 -1
  81. package/dist/i18n/utils/index.mjs +2 -2
  82. package/dist/i18n/validation/index.d.mts +3 -2
  83. package/dist/i18n/validation/index.mjs +4 -2
  84. package/dist/i18n.module-BlXrtAlV.mjs +219 -0
  85. package/dist/i18n.module-BlXrtAlV.mjs.map +1 -0
  86. package/dist/i18n.tokens-hwRpmjRq.mjs +19 -0
  87. package/dist/i18n.tokens-hwRpmjRq.mjs.map +1 -0
  88. package/dist/{index-7-hU3GTV.d.mts → index-B4UBK-2T.d.mts} +1 -1
  89. package/dist/{index-7-hU3GTV.d.mts.map → index-B4UBK-2T.d.mts.map} +1 -1
  90. package/dist/index-BtlE9RuO.d.mts +124 -0
  91. package/dist/index-BtlE9RuO.d.mts.map +1 -0
  92. package/dist/{index-CjaQ6_tZ.d.mts → index-CW1YHSft.d.mts} +71 -167
  93. package/dist/index-CW1YHSft.d.mts.map +1 -0
  94. package/dist/{index-D0US0X14.d.mts → index-DEncMcC6.d.mts} +559 -2239
  95. package/dist/index-DEncMcC6.d.mts.map +1 -0
  96. package/dist/index-Dj5IMwtr.d.mts +44 -0
  97. package/dist/index-Dj5IMwtr.d.mts.map +1 -0
  98. package/dist/{index-C1KvMncZ.d.mts → index-KMgSCSM7.d.mts} +3 -108
  99. package/dist/index-KMgSCSM7.d.mts.map +1 -0
  100. package/dist/index.d.mts +5 -43
  101. package/dist/index.mjs +1 -1
  102. package/dist/{is-command-C6a7WTPw.mjs → is-command-CX5rAfZW.mjs} +2 -2
  103. package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CX5rAfZW.mjs.map} +1 -1
  104. package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-CYCtELlm.mjs} +1 -1
  105. package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-CYCtELlm.mjs.map} +1 -1
  106. package/dist/logger/index.d.mts +2 -2
  107. package/dist/logger/index.mjs +170 -2
  108. package/dist/logger/index.mjs.map +1 -0
  109. package/dist/macroable/index.d.mts +1 -1
  110. package/dist/macroable/index.mjs +1 -1
  111. package/dist/{macroable-BmufBshB.mjs → macroable-DzlfzT50.mjs} +1 -1
  112. package/dist/{macroable-BmufBshB.mjs.map → macroable-DzlfzT50.mjs.map} +1 -1
  113. package/dist/metadata-BVkc4aUu.mjs +39 -0
  114. package/dist/metadata-BVkc4aUu.mjs.map +1 -0
  115. package/dist/module/index.d.mts +6 -24
  116. package/dist/module/index.d.mts.map +1 -1
  117. package/dist/module/index.mjs +2 -2
  118. package/dist/module-xYoHba6B.mjs +422 -0
  119. package/dist/module-xYoHba6B.mjs.map +1 -0
  120. package/dist/openapi/index.d.mts +3 -3
  121. package/dist/openapi/index.d.mts.map +1 -1
  122. package/dist/openapi/index.mjs +1 -2
  123. package/dist/openapi-C6lm0RmV.mjs +483 -0
  124. package/dist/openapi-C6lm0RmV.mjs.map +1 -0
  125. package/dist/{openapi.service-BLgvn3hJ.d.mts → openapi.service-CrLlsXAd.d.mts} +3 -3
  126. package/dist/openapi.service-CrLlsXAd.d.mts.map +1 -0
  127. package/dist/quarry/index.d.mts +5 -163
  128. package/dist/quarry/index.d.mts.map +1 -1
  129. package/dist/quarry/index.mjs +5 -5
  130. package/dist/quarry/runner.d.mts +184 -0
  131. package/dist/quarry/runner.d.mts.map +1 -0
  132. package/dist/quarry/runner.mjs +775 -0
  133. package/dist/quarry/runner.mjs.map +1 -0
  134. package/dist/quarry-registry-D4hIGScf.d.mts +69 -0
  135. package/dist/quarry-registry-D4hIGScf.d.mts.map +1 -0
  136. package/dist/quarry-registry-DkraZNwn.mjs +311 -0
  137. package/dist/quarry-registry-DkraZNwn.mjs.map +1 -0
  138. package/dist/queue/index.d.mts +3 -3
  139. package/dist/queue/index.mjs +27 -28
  140. package/dist/queue/index.mjs.map +1 -1
  141. package/dist/{queue.module-BCdCiySt.mjs → queue.module-DeWJ0tQM.mjs} +67 -112
  142. package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
  143. package/dist/{r2-storage.provider-Co6F0ZYV.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +8 -5
  144. package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
  145. package/dist/{rate-limit.decorator--o6Q6p9w.mjs → rate-limit.decorator-D69zdZbp.mjs} +6 -11
  146. package/dist/rate-limit.decorator-D69zdZbp.mjs.map +1 -0
  147. package/dist/rate-limiter/index.d.mts +11 -50
  148. package/dist/rate-limiter/index.d.mts.map +1 -1
  149. package/dist/rate-limiter/index.mjs +25 -30
  150. package/dist/rate-limiter/index.mjs.map +1 -1
  151. package/dist/{resend.provider-M6qRLrcy.mjs → resend.provider-Ur6tU7fK.mjs} +8 -7
  152. package/dist/resend.provider-Ur6tU7fK.mjs.map +1 -0
  153. package/dist/router/index.d.mts +2 -2
  154. package/dist/router/index.mjs +8 -7
  155. package/dist/{i18n.module-BBlNNlcG.mjs → router-Cy6DjkvP.mjs} +215 -855
  156. package/dist/router-Cy6DjkvP.mjs.map +1 -0
  157. package/dist/seeder/index.d.mts +6 -11
  158. package/dist/seeder/index.d.mts.map +1 -1
  159. package/dist/seeder/index.mjs +3 -3
  160. package/dist/{seeder-CJAOHEIo.mjs → seeder-BADTig4n.mjs} +17 -22
  161. package/dist/seeder-BADTig4n.mjs.map +1 -0
  162. package/dist/{signed-url-BQPbv2In.mjs → signed-url-BqUqt5dF.mjs} +1 -1
  163. package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-BqUqt5dF.mjs.map} +1 -1
  164. package/dist/{smtp.provider-w0Ve52Xg.mjs → smtp.provider-C129sNBT.mjs} +7 -6
  165. package/dist/smtp.provider-C129sNBT.mjs.map +1 -0
  166. package/dist/storage/index.d.mts +15 -39
  167. package/dist/storage/index.d.mts.map +1 -1
  168. package/dist/storage/index.mjs +3 -3
  169. package/dist/storage/providers/index.d.mts +2 -2
  170. package/dist/storage/providers/index.mjs +1 -1
  171. package/dist/{storage-1zw-6Yiz.mjs → storage-BA3ppVYM.mjs} +70 -59
  172. package/dist/storage-BA3ppVYM.mjs.map +1 -0
  173. package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-DQMtT42e.d.mts} +2 -3
  174. package/dist/storage-provider.interface-DQMtT42e.d.mts.map +1 -0
  175. package/dist/storage.error-C6FY037a.mjs +8 -0
  176. package/dist/storage.error-C6FY037a.mjs.map +1 -0
  177. package/dist/{stratal-DeEcGgdq.mjs → stratal-Bdq4IdB3.mjs} +31 -183
  178. package/dist/stratal-Bdq4IdB3.mjs.map +1 -0
  179. package/dist/stratal-BsKmvP6J.d.mts +43 -0
  180. package/dist/stratal-BsKmvP6J.d.mts.map +1 -0
  181. package/dist/{types-cySNS_lp.d.mts → types-BaeHi67f.d.mts} +1 -1
  182. package/dist/types-BaeHi67f.d.mts.map +1 -0
  183. package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DTqaUMR9.mjs} +6 -3
  184. package/dist/usage-generator-DTqaUMR9.mjs.map +1 -0
  185. package/dist/validation-DUzcjb8Q.mjs +49 -0
  186. package/dist/validation-DUzcjb8Q.mjs.map +1 -0
  187. package/dist/validation.context-XTysWJ3b.mjs +117 -0
  188. package/dist/validation.context-XTysWJ3b.mjs.map +1 -0
  189. package/dist/websocket/index.d.mts +7 -14
  190. package/dist/websocket/index.d.mts.map +1 -1
  191. package/dist/websocket/index.mjs +2 -2
  192. package/dist/workers/index.d.mts +2 -2
  193. package/dist/workers/index.mjs +3 -2
  194. package/dist/workers/index.mjs.map +1 -1
  195. package/dist/{index-Bnpfq6uk.d.mts → zod-DvWTfRpI.d.mts} +58 -133
  196. package/dist/zod-DvWTfRpI.d.mts.map +1 -0
  197. package/dist/zod-hMa3rSHV.mjs +72 -0
  198. package/dist/zod-hMa3rSHV.mjs.map +1 -0
  199. package/package.json +20 -20
  200. package/dist/command-BgSlsS4M.mjs.map +0 -1
  201. package/dist/command-Bu-PjJrX.d.mts.map +0 -1
  202. package/dist/controller.decorator-DQzenvSN.mjs.map +0 -1
  203. package/dist/cron-manager-7Symz_TE.mjs.map +0 -1
  204. package/dist/cron-manager-BEsH1mjW.d.mts.map +0 -1
  205. package/dist/en-DSH_bhh6.mjs +0 -308
  206. package/dist/en-DSH_bhh6.mjs.map +0 -1
  207. package/dist/env-D1rcZ8_r.d.mts.map +0 -1
  208. package/dist/errors-BdyV5PnY.mjs +0 -1725
  209. package/dist/errors-BdyV5PnY.mjs.map +0 -1
  210. package/dist/errors-Da3Pz2X7.mjs +0 -74
  211. package/dist/errors-Da3Pz2X7.mjs.map +0 -1
  212. package/dist/events-COKixqnG.mjs.map +0 -1
  213. package/dist/gateway-context-CdJjpUCW.mjs.map +0 -1
  214. package/dist/guards-DUk_Kzst.mjs.map +0 -1
  215. package/dist/http-method.decorator-DXwxAfb_.mjs.map +0 -1
  216. package/dist/i18n.module-BBlNNlcG.mjs.map +0 -1
  217. package/dist/index-Bnpfq6uk.d.mts.map +0 -1
  218. package/dist/index-C1KvMncZ.d.mts.map +0 -1
  219. package/dist/index-CjaQ6_tZ.d.mts.map +0 -1
  220. package/dist/index-D0US0X14.d.mts.map +0 -1
  221. package/dist/index-DBd_2wv8.d.mts +0 -263
  222. package/dist/index-DBd_2wv8.d.mts.map +0 -1
  223. package/dist/index.d.mts.map +0 -1
  224. package/dist/logger-V6Ms3QnQ.mjs +0 -436
  225. package/dist/logger-V6Ms3QnQ.mjs.map +0 -1
  226. package/dist/module-Dk2qTa77.mjs +0 -860
  227. package/dist/module-Dk2qTa77.mjs.map +0 -1
  228. package/dist/openapi-tools.service-Zs-Ewv7F.mjs +0 -200
  229. package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
  230. package/dist/openapi.service-BLgvn3hJ.d.mts.map +0 -1
  231. package/dist/quarry-registry-DNEej-Db.mjs +0 -688
  232. package/dist/quarry-registry-DNEej-Db.mjs.map +0 -1
  233. package/dist/queue.module-BCdCiySt.mjs.map +0 -1
  234. package/dist/r2-storage.provider-Co6F0ZYV.mjs.map +0 -1
  235. package/dist/rate-limit.decorator--o6Q6p9w.mjs.map +0 -1
  236. package/dist/resend.provider-M6qRLrcy.mjs.map +0 -1
  237. package/dist/seeder-CJAOHEIo.mjs.map +0 -1
  238. package/dist/setup-CefZKV_e.mjs +0 -37
  239. package/dist/setup-CefZKV_e.mjs.map +0 -1
  240. package/dist/smtp.provider-w0Ve52Xg.mjs.map +0 -1
  241. package/dist/storage-1zw-6Yiz.mjs.map +0 -1
  242. package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
  243. package/dist/stratal-DeEcGgdq.mjs.map +0 -1
  244. package/dist/types-cySNS_lp.d.mts.map +0 -1
  245. package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
  246. package/dist/validation-DtJwAv7O.mjs +0 -248
  247. package/dist/validation-DtJwAv7O.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.mjs","names":[],"sources":["../../src/quarry/commands/api.command.ts","../../src/quarry/commands/event-list.command.ts","../../src/quarry/commands/help.command.ts","../../src/quarry/commands/i18n-utils.ts","../../src/quarry/commands/i18n-check.command.ts","../../src/quarry/commands/i18n-duplicates.command.ts","../../src/quarry/commands/i18n-list.command.ts","../../src/quarry/commands/i18n-namespaces.command.ts","../../src/quarry/commands/i18n-search.command.ts","../../src/quarry/commands/i18n-stats.command.ts","../../src/quarry/commands/mcp-serve.command.ts","../../src/quarry/commands/mcp-tools.command.ts","../../src/quarry/commands/queue-list.command.ts","../../src/quarry/commands/route-list.command.ts","../../src/quarry/commands/route-types.command.ts","../../src/quarry/commands/schedule-list.command.ts","../../src/quarry/builtin-quarry.module.ts","../../src/quarry/quarry-runner.ts"],"sourcesContent":["import { inject } from '../../di'\nimport type { Application } from '../../application'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { Command } from '../command'\nimport { bold, cyan, green, red, yellow } from '../colors'\n\nexport class ApiCommand extends Command {\n static command = 'api {route?} {--method= : HTTP method} {--data= : JSON request body} {--header=* : Headers (Key:Value)} {--query=* : Query params (key=value)}'\n static description = 'Call an API route directly'\n static aliases = ['api:call']\n\n constructor(@inject(DI_TOKENS.Application) private app: Application) {\n super()\n }\n\n async handle(): Promise<number | undefined> {\n const route = this.string('route')\n\n if (!route) {\n return (await this.call('route:list')).exitCode\n }\n\n return this.callRoute(route)\n }\n\n private async callRoute(route: string): Promise<number> {\n const method = (this.string('method') || 'GET').toUpperCase()\n const data = this.string('data')\n const headerArgs = this.array('header')\n const queryArgs = this.array('query')\n\n const headers: Record<string, string> = {}\n if (data) {\n headers['Content-Type'] = 'application/json'\n }\n for (const h of headerArgs) {\n const colonIdx = h.indexOf(':')\n if (colonIdx > 0) {\n headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim()\n }\n }\n\n // Build query string\n let url = route\n if (queryArgs.length > 0) {\n const parts = queryArgs.map((q) => {\n const eqIdx = q.indexOf('=')\n if (eqIdx > 0) {\n return `${encodeURIComponent(q.slice(0, eqIdx))}=${encodeURIComponent(q.slice(eqIdx + 1))}`\n }\n return encodeURIComponent(q)\n })\n url += `?${parts.join('&')}`\n }\n\n const request = new Request(`http://localhost${url}`, {\n method,\n headers,\n body: data || undefined,\n })\n\n const hono = await this.app.ensureHono()\n const response = await hono.fetch(request, this.app.env)\n const body = await response.text()\n\n // Color-coded status\n const statusText = `${response.status} ${response.statusText}`\n let coloredStatus: string\n if (response.status >= 200 && response.status < 300) {\n coloredStatus = green(bold(statusText))\n } else if (response.status >= 300 && response.status < 400) {\n coloredStatus = yellow(bold(statusText))\n } else {\n coloredStatus = red(bold(statusText))\n }\n\n this.line(`${cyan(method)} ${route} ${coloredStatus}`)\n this.newLine()\n\n // Response headers\n const headerLines: string[] = []\n response.headers.forEach((value, key) => {\n headerLines.push(` ${key}: ${value}`)\n })\n if (headerLines.length > 0) {\n this.line(bold('Headers:'))\n for (const hl of headerLines) {\n this.line(hl)\n }\n this.newLine()\n }\n\n // Body\n if (body) {\n this.line(bold('Body:'))\n try {\n this.line(JSON.stringify(JSON.parse(body), null, 2))\n } catch {\n this.line(body)\n }\n }\n\n return response.status >= 400 ? 1 : 0\n }\n}\n","import { inject } from '../../di'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { getListenerHandlers } from '../../events'\nimport type { ModuleRegistry } from '../../module/module-registry'\nimport { Command } from '../command'\n\nexport class EventListCommand extends Command {\n static command = 'event:list'\n static description = 'List all registered event listeners'\n\n constructor(@inject(DI_TOKENS.ModuleRegistry) private modules: ModuleRegistry) {\n super()\n }\n\n handle(): number | undefined {\n const listeners = this.modules.getAllListeners()\n\n if (listeners.length === 0) {\n this.info('No event listeners found')\n return 0\n }\n\n const rows: string[][] = []\n\n for (const ListenerClass of listeners) {\n const handlers = getListenerHandlers(ListenerClass)\n for (const { methodName, event, options } of handlers) {\n rows.push([\n event,\n ListenerClass.name,\n methodName,\n String(options?.priority ?? 0),\n options?.blocking ? 'Yes' : 'No',\n ])\n }\n }\n\n if (rows.length === 0) {\n this.info('No event handlers found')\n return 0\n }\n\n this.table(['Event', 'Listener', 'Method', 'Priority', 'Blocking'], rows)\n\n return undefined\n }\n}\n","import { inject } from '../../di'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { Command } from '../command'\nimport { CommandNotFoundError } from '../errors/command-not-found.error'\nimport type { QuarryRegistry } from '../quarry-registry'\n\nexport class HelpCommand extends Command {\n static command = 'help {command?}'\n static description = 'Show help for a command or list all commands'\n static aliases = ['list']\n\n constructor(@inject(DI_TOKENS.Quarry) private quarryRegistry: QuarryRegistry) {\n super()\n }\n\n async handle(): Promise<number | undefined> {\n const commandName = this.string('command')\n\n if (!commandName) {\n const listing = await this.quarryRegistry.listUsage()\n this.line(listing)\n return 0\n }\n\n try {\n const usage = await this.quarryRegistry.usage(commandName)\n this.line(usage)\n return 0\n } catch (error) {\n if (error instanceof CommandNotFoundError) {\n this.fail(`Unknown command: ${commandName}`)\n return 1\n }\n throw error\n }\n }\n}\n","export function computeKeyDiff(\n baseKeys: Set<string>,\n targetKeys: Set<string>,\n): { missing: string[]; extra: string[] } {\n const missing: string[] = []\n const extra: string[] = []\n\n for (const key of baseKeys) {\n if (!targetKeys.has(key)) missing.push(key)\n }\n for (const key of targetKeys) {\n if (!baseKeys.has(key)) extra.push(key)\n }\n\n return { missing: missing.sort(), extra: extra.sort() }\n}\n\nexport function extractNamespace(key: string, depth: number): string {\n return key.split('.').slice(0, depth).join('.')\n}\n","import { inject } from '../../di'\nimport type { MessageLoaderService } from '../../i18n/services/message-loader.service'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport { Command } from '../command'\nimport { computeKeyDiff } from './i18n-utils'\n\nexport class I18nCheckCommand extends Command {\n static command = 'i18n:check {--locale= : Check a specific locale only} {--prefix= : Filter by namespace prefix}'\n static description = 'Check i18n translations for missing or extra keys'\n\n constructor(@inject(I18N_TOKENS.MessageLoader) private loader: MessageLoaderService) {\n super()\n }\n\n handle(): number | undefined {\n const localeFilter = this.string('locale')\n const prefix = this.string('prefix')\n const filterOptions = prefix ? { only: [prefix] as never[] } : undefined\n\n const enKeys = new Set(Object.keys(this.loader.getFilteredMessages('en', filterOptions)))\n\n if (enKeys.size === 0) {\n this.info('No message keys found')\n return 0\n }\n\n const locales = this.loader.getAvailableLocales().filter((l) => l !== 'en')\n const targets = localeFilter ? locales.filter((l) => l === localeFilter) : locales\n\n if (targets.length === 0) {\n this.info(localeFilter ? `Locale \"${localeFilter}\" not found` : 'No non-en locales configured')\n return 0\n }\n\n let totalIssues = 0\n const summaryRows: string[][] = []\n\n for (const locale of targets) {\n const localeKeys = new Set(Object.keys(this.loader.getFilteredMessages(locale, filterOptions)))\n const { missing, extra } = computeKeyDiff(enKeys, localeKeys)\n\n this.newLine()\n this.info(`Locale: ${locale}`)\n\n if (missing.length > 0) {\n this.warn(` Missing (${missing.length}):`)\n for (const key of missing) {\n this.line(` ${key}`)\n }\n } else {\n this.line(' Missing (0)')\n }\n\n if (extra.length > 0) {\n this.warn(` Extra (${extra.length}):`)\n for (const key of extra) {\n this.line(` ${key}`)\n }\n } else {\n this.line(' Extra (0)')\n }\n\n totalIssues += missing.length + extra.length\n summaryRows.push([locale, String(enKeys.size), String(missing.length), String(extra.length)])\n }\n\n this.newLine()\n this.table(['Locale', 'Total', 'Missing', 'Extra'], summaryRows)\n\n if (totalIssues > 0) {\n this.newLine()\n this.fail(`${totalIssues} issue(s) found`)\n return undefined\n }\n\n this.newLine()\n this.success('All translations are complete')\n return 0\n }\n}\n","import { inject } from '../../di'\nimport type { MessageLoaderService } from '../../i18n/services/message-loader.service'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport { Command } from '../command'\n\nexport class I18nDuplicatesCommand extends Command {\n static command = 'i18n:duplicates {--locale= : Locale to check (default: en)} {--prefix= : Filter by namespace prefix}'\n static description = 'Find i18n keys with duplicate translation values'\n\n constructor(@inject(I18N_TOKENS.MessageLoader) private loader: MessageLoaderService) {\n super()\n }\n\n handle(): number | undefined {\n const locale = this.string('locale') || 'en'\n const prefix = this.string('prefix')\n const filterOptions = prefix ? { only: [prefix] as never[] } : undefined\n\n const messages = this.loader.getFilteredMessages(locale, filterOptions)\n const valueToKeys = new Map<string, string[]>()\n\n for (const [key, value] of Object.entries(messages)) {\n const existing = valueToKeys.get(value)\n if (existing) {\n existing.push(key)\n } else {\n valueToKeys.set(value, [key])\n }\n }\n\n const duplicates: [string, string][] = []\n for (const [value, keys] of valueToKeys) {\n if (keys.length > 1) {\n duplicates.push([value, keys.sort().join(', ')])\n }\n }\n\n if (duplicates.length === 0) {\n this.info('No duplicate values found')\n return 0\n }\n\n duplicates.sort((a, b) => a[0].localeCompare(b[0]))\n this.table(['Value', 'Keys'], duplicates)\n return 0\n }\n}\n","import { inject } from '../../di'\nimport type { MessageLoaderService } from '../../i18n/services/message-loader.service'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport { Command } from '../command'\n\nexport class I18nListCommand extends Command {\n static command = 'i18n:list {--locale= : Show keys for a specific locale} {--prefix= : Filter by namespace prefix} {--values : Show translated values}'\n static description = 'List all i18n message keys'\n\n constructor(@inject(I18N_TOKENS.MessageLoader) private loader: MessageLoaderService) {\n super()\n }\n\n handle(): number | undefined {\n const localeFilter = this.string('locale')\n const prefix = this.string('prefix')\n const showValues = this.boolean('values')\n const filterOptions = prefix ? { only: [prefix] as never[] } : undefined\n\n const enMessages = this.loader.getFilteredMessages('en', filterOptions)\n const enKeys = Object.keys(enMessages).sort()\n\n if (enKeys.length === 0) {\n this.info('No message keys found')\n return 0\n }\n\n if (localeFilter && showValues) {\n const localeMessages = this.loader.getFilteredMessages(localeFilter, filterOptions)\n const rows = enKeys.map((key) => [key, localeMessages[key] ?? '-'])\n this.table(['Key', 'Value'], rows)\n return 0\n }\n\n const locales = localeFilter\n ? [localeFilter]\n : this.loader.getAvailableLocales()\n\n const localeMessages = new Map<string, Set<string>>()\n for (const locale of locales) {\n localeMessages.set(locale, new Set(Object.keys(this.loader.getFilteredMessages(locale, filterOptions))))\n }\n\n const headers = ['Key', ...locales]\n const rows = enKeys.map((key) => {\n const coverage = locales.map((locale) => (localeMessages.get(locale)!.has(key) ? 'Y' : 'N'))\n return [key, ...coverage]\n })\n\n this.table(headers, rows)\n return 0\n }\n}\n","import { inject } from '../../di'\nimport type { MessageLoaderService } from '../../i18n/services/message-loader.service'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport { Command } from '../command'\nimport { extractNamespace } from './i18n-utils'\n\nexport class I18nNamespacesCommand extends Command {\n static command = 'i18n:namespaces {--depth= : Namespace depth (default: 1)} {--locale= : Show counts for a specific locale}'\n static description = 'List i18n message namespaces with key counts'\n\n constructor(@inject(I18N_TOKENS.MessageLoader) private loader: MessageLoaderService) {\n super()\n }\n\n handle(): number | undefined {\n const depth = this.number('depth') || 1\n const localeFilter = this.string('locale')\n\n const locales = localeFilter\n ? [localeFilter]\n : this.loader.getAvailableLocales()\n\n const namespaceCounts = new Map<string, Map<string, number>>()\n\n for (const locale of locales) {\n const messages = this.loader.getFilteredMessages(locale)\n\n for (const key of Object.keys(messages)) {\n const ns = extractNamespace(key, depth)\n\n if (!namespaceCounts.has(ns)) {\n namespaceCounts.set(ns, new Map())\n }\n const counts = namespaceCounts.get(ns)!\n counts.set(locale, (counts.get(locale) ?? 0) + 1)\n }\n }\n\n if (namespaceCounts.size === 0) {\n this.info('No namespaces found')\n return 0\n }\n\n const sortedNamespaces = [...namespaceCounts.keys()].sort()\n const headers = ['Namespace', ...locales]\n const rows = sortedNamespaces.map((ns) => {\n const counts = namespaceCounts.get(ns)!\n return [ns, ...locales.map((locale) => String(counts.get(locale) ?? 0))]\n })\n\n this.table(headers, rows)\n return 0\n }\n}\n","import { inject } from '../../di'\nimport type { MessageLoaderService } from '../../i18n/services/message-loader.service'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport { Command } from '../command'\n\nexport class I18nSearchCommand extends Command {\n static command = 'i18n:search {query : Search term (substring match)} {--locale= : Locale to search in (default: en)} {--keys-only : Only match key names, not values}'\n static description = 'Search for i18n message keys or values'\n\n constructor(@inject(I18N_TOKENS.MessageLoader) private loader: MessageLoaderService) {\n super()\n }\n\n handle(): number | undefined {\n const query = this.string('query').toLowerCase()\n const locale = this.string('locale') || 'en'\n const keysOnly = this.boolean('keys-only')\n\n const messages = this.loader.getFilteredMessages(locale)\n const matches: [string, string][] = []\n\n for (const [key, value] of Object.entries(messages)) {\n const keyMatch = key.toLowerCase().includes(query)\n const valueMatch = !keysOnly && value.toLowerCase().includes(query)\n\n if (keyMatch || valueMatch) {\n matches.push([key, value])\n }\n }\n\n if (matches.length === 0) {\n this.info(`No keys matching \"${this.string('query')}\" found`)\n return 0\n }\n\n matches.sort((a, b) => a[0].localeCompare(b[0]))\n this.table(['Key', 'Value'], matches)\n return 0\n }\n}\n","import { inject } from '../../di'\nimport type { MessageLoaderService } from '../../i18n/services/message-loader.service'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport { Command } from '../command'\n\nexport class I18nStatsCommand extends Command {\n static command = 'i18n:stats {--prefix= : Filter by namespace prefix}'\n static description = 'Show i18n translation coverage statistics'\n\n constructor(@inject(I18N_TOKENS.MessageLoader) private loader: MessageLoaderService) {\n super()\n }\n\n handle(): number | undefined {\n const prefix = this.string('prefix')\n const filterOptions = prefix ? { only: [prefix] as never[] } : undefined\n\n const enKeys = new Set(Object.keys(this.loader.getFilteredMessages('en', filterOptions)))\n\n if (enKeys.size === 0) {\n this.info('No message keys found')\n return 0\n }\n\n const locales = this.loader.getAvailableLocales()\n const rows: string[][] = []\n\n for (const locale of locales) {\n const localeKeys = new Set(Object.keys(this.loader.getFilteredMessages(locale, filterOptions)))\n const isBase = locale === 'en'\n\n let translated = 0\n for (const key of enKeys) {\n if (localeKeys.has(key)) translated++\n }\n\n const missing = enKeys.size - translated\n let extra = 0\n for (const key of localeKeys) {\n if (!enKeys.has(key)) extra++\n }\n\n const coverage = ((translated / enKeys.size) * 100).toFixed(1) + '%'\n\n rows.push([\n locale,\n String(enKeys.size),\n String(translated),\n String(missing),\n isBase ? '-' : String(extra),\n coverage,\n ])\n }\n\n this.table(['Locale', 'Keys', 'Translated', 'Missing', 'Extra', 'Coverage'], rows)\n return 0\n }\n}\n","import { inject } from '../../di'\nimport { z } from 'zod'\nimport type { Application } from '../../application'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { OPENAPI_TOKENS } from '../../openapi/openapi.tokens'\nimport type { Dispatcher } from '../../openapi/services/openapi-tools.service'\nimport { OpenApiToolsService } from '../../openapi/services/openapi-tools.service'\nimport type { OpenAPIService } from '../../openapi/services/openapi.service'\nimport type { IOpenAPIConfigService } from '../../openapi/types'\nimport { Command } from '../command'\n\nexport class McpServeCommand extends Command {\n static command = 'mcp:serve {--url= : Base URL for external dispatch} {--header=* : Headers (Key:Value)} {--tag=* : Only expose routes with these OpenAPI tags} {--path= : Only expose routes matching this path prefix}'\n static description = 'Start an MCP stdio server exposing API routes as tools'\n\n constructor(\n @inject(DI_TOKENS.Application) private app: Application,\n @inject(OPENAPI_TOKENS.OpenAPIService) private openAPIService: OpenAPIService,\n ) {\n super()\n }\n\n async handle(): Promise<number | undefined> {\n const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js')\n const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js')\n\n const baseUrl = this.string('url')\n const headerArgs = this.array('header')\n const tags = this.array('tag')\n const pathPrefix = this.string('path')\n\n const headers: Record<string, string> = {}\n for (const h of headerArgs) {\n const colonIdx = h.indexOf(':')\n if (colonIdx > 0) {\n headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim()\n }\n }\n\n const hono = await this.app.ensureHono()\n const spec = this.openAPIService.getSpec(hono, this.app.container)\n\n const dispatcher: Dispatcher = baseUrl\n ? async (method, url, opts) => {\n const fullUrl = `${baseUrl}${url}`\n try {\n return await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n ...opts?.headers,\n },\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n })\n } catch (error) {\n throw new Error(`MCP dispatch failed: ${method} ${fullUrl} — ${error instanceof Error ? error.message : String(error)}`, { cause: error })\n }\n }\n : async (method, url, opts) => {\n const request = new Request(`http://localhost${url}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n ...opts?.headers,\n },\n body: opts?.body !== undefined ? JSON.stringify(opts.body) : undefined,\n })\n try {\n return await hono.fetch(request, this.app.env)\n } catch (error) {\n throw new Error(`MCP dispatch failed: ${method} ${url} — ${error instanceof Error ? error.message : String(error)}`, { cause: error })\n }\n }\n\n const service = new OpenApiToolsService(spec, { dispatcher })\n const filter = {\n tags: tags.length > 0 ? tags : undefined,\n pathPrefix: pathPrefix || undefined,\n }\n const tools = service.getTools(filter)\n\n const configService = this.app.container.resolve<IOpenAPIConfigService>(OPENAPI_TOKENS.ConfigService)\n const config = configService.getEffectiveConfig()\n\n const server = new McpServer({\n name: config.info.title,\n version: config.info.version,\n })\n\n // Register each tool\n for (const tool of tools) {\n const inputSchema = z.fromJSONSchema(tool.inputSchema)\n server.registerTool(tool.name, { description: tool.description, inputSchema }, async (args) => {\n const result = await service.executeTool(tool.name, args as Record<string, unknown>)\n return {\n content: [{ type: 'text' as const, text: `Status: ${result.status}\\n\\n${result.body}` }],\n }\n })\n }\n\n // Expose OpenAPI spec as a resource\n server.registerResource(\n 'openapi-spec',\n 'openapi://spec',\n { description: 'Full OpenAPI specification', mimeType: 'application/json' },\n () => ({\n contents: [{\n uri: 'openapi://spec',\n mimeType: 'application/json',\n text: JSON.stringify(spec, null, 2),\n }],\n }),\n )\n\n const transport = new StdioServerTransport()\n const closed = new Promise<void>((resolve) => { transport.onclose = resolve })\n await server.connect(transport)\n\n // Write info to stderr (stdout is reserved for MCP JSON-RPC)\n process.stderr.write(`MCP server started with ${tools.length} tool(s)\\n`)\n\n // Keep process alive until client disconnects\n await closed\n\n return 0\n }\n}\n","import { inject } from '../../di'\nimport type { Application } from '../../application'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { OPENAPI_TOKENS } from '../../openapi/openapi.tokens'\nimport type { OpenAPIService } from '../../openapi/services/openapi.service'\nimport { OpenApiToolsService } from '../../openapi/services/openapi-tools.service'\nimport { Command } from '../command'\n\nexport class McpToolsCommand extends Command {\n static command = 'mcp:tools {--tag=* : Filter by OpenAPI tags} {--path= : Filter by path prefix}'\n static description = 'List API routes that would be exposed as MCP tools'\n\n constructor(\n @inject(DI_TOKENS.Application) private app: Application,\n @inject(OPENAPI_TOKENS.OpenAPIService) private openAPIService: OpenAPIService,\n ) {\n super()\n }\n\n async handle(): Promise<number | undefined> {\n const tags = this.array('tag')\n const pathPrefix = this.string('path')\n\n const hono = await this.app.ensureHono()\n const spec = this.openAPIService.getSpec(hono, this.app.container)\n\n const service = new OpenApiToolsService(spec)\n const filter = {\n tags: tags.length > 0 ? tags : undefined,\n pathPrefix: pathPrefix || undefined,\n }\n const tools = service.getTools(filter)\n\n if (tools.length === 0) {\n this.info('No tools found')\n return 0\n }\n\n this.table(\n ['Name', 'Method', 'Path', 'Description'],\n tools.map((t) => [t.name, t.method, t.path, t.description]),\n )\n\n return 0\n }\n}\n","import { inject } from '../../di'\nimport { DI_TOKENS } from '../../di/tokens'\nimport type { ConsumerRegistry } from '../../queue/consumer-registry'\nimport { Command } from '../command'\n\nexport class QueueListCommand extends Command {\n static command = 'queue:list'\n static description = 'List all registered queue consumers'\n\n constructor(@inject(DI_TOKENS.ConsumerRegistry) private consumers: ConsumerRegistry) {\n super()\n }\n\n handle(): number | undefined {\n const consumers = this.consumers.getAllConsumers()\n\n if (consumers.length === 0) {\n this.info('No queue consumers found')\n return 0\n }\n\n this.table(\n ['Consumer', 'Message Types'],\n consumers.map(c => [c.constructor.name, c.messageTypes.join(', ')]),\n )\n\n return undefined\n }\n}\n","import { inject } from '../../di'\nimport type { RouteRegistry, RegisteredRoute } from '../../router/route-registry'\nimport { ROUTER_TOKENS } from '../../router/router.tokens'\nimport { Command } from '../command'\n\n/**\n * List all registered routes from RouteRegistry.\n *\n * By default, hidden routes (hideFromDocs) are excluded.\n * Use `--hidden` to include them.\n *\n * @example\n * ```bash\n * quarry route:list\n * quarry route:list --method=GET\n * quarry route:list --path=/users\n * quarry route:list --name=users\n * quarry route:list --hidden\n * ```\n */\nexport class RouteListCommand extends Command {\n static command = 'route:list {--method= : Filter by HTTP method} {--path= : Filter by path substring} {--name= : Filter by route name} {--hidden : Include hidden routes}'\n static description = 'List all registered routes'\n\n constructor(@inject(ROUTER_TOKENS.RouteRegistry) private registry: RouteRegistry) {\n super()\n }\n\n handle(): number | undefined {\n const methodFilter = this.string('method').toUpperCase()\n const pathFilter = this.string('path')\n const nameFilter = this.string('name')\n const showHidden = this.boolean('hidden')\n\n let routes = this.registry.all()\n\n // Filter hidden routes (default: exclude)\n if (!showHidden) {\n routes = routes.filter(r => !r.hidden)\n }\n\n if (methodFilter) {\n routes = routes.filter(r => r.method.toUpperCase() === methodFilter)\n }\n\n if (pathFilter) {\n routes = routes.filter(r => r.path.includes(pathFilter))\n }\n\n if (nameFilter) {\n routes = routes.filter(r => r.name?.includes(nameFilter))\n }\n\n if (routes.length === 0) {\n this.info('No routes found')\n return 0\n }\n\n this.table(\n ['Method', 'Path', 'Name', 'Handler', 'Domain'],\n routes.map(r => this.formatRow(r)),\n )\n\n return undefined\n }\n\n private formatRow(route: RegisteredRoute): string[] {\n return [\n route.method.toUpperCase(),\n route.path,\n route.name ?? '-',\n `${route.controller}.${route.action}`,\n route.domain ?? '-',\n ]\n }\n}\n","import { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { inject } from '../../di'\nimport type { RouteRegistry, RegisteredRoute } from '../../router/route-registry'\nimport { ROUTER_TOKENS } from '../../router/router.tokens'\nimport type { LocalePathService } from '../../router/services/locale-path.service'\nimport { Command } from '../command'\n\n/**\n * Generate TypeScript types for named routes.\n *\n * Outputs a `stratal.d.ts` file with `StratalRouteMap` augmentation\n * that provides autocomplete and type-safe params for `route()` and `ctx.route()`.\n *\n * @example\n * ```bash\n * quarry route:types # → src/stratal.d.ts\n * quarry route:types --output=types/routes.d.ts\n * ```\n */\nexport class RouteTypesCommand extends Command {\n static command = 'route:types {--output=src/stratal.d.ts : Output file path}'\n static description = 'Generate TypeScript types for named routes'\n\n constructor(\n @inject(ROUTER_TOKENS.RouteRegistry) private registry: RouteRegistry,\n @inject(ROUTER_TOKENS.LocalePathService) private localePathService: LocalePathService,\n ) {\n super()\n }\n\n handle(): number | undefined {\n const outputPath = resolve(this.string('output') || 'src/stratal.d.ts')\n const namedRoutes = this.registry.named()\n\n if (namedRoutes.length === 0) {\n this.warn('No named routes found. Add name to your @Route() or @Get()/@Post() decorators.')\n return 0\n }\n\n const content = this.generateDeclaration(namedRoutes)\n writeFileSync(outputPath, content, 'utf-8')\n this.info(`Generated route types for ${namedRoutes.length} named routes → ${outputPath}`)\n\n return undefined\n }\n\n /**\n * Generate the StratalRouteMap declaration content.\n */\n private generateDeclaration(routes: RegisteredRoute[]): string {\n const localeConfig = this.localePathService.enabled ? this.localePathService.localePathConfig : null\n const localeType = localeConfig\n ? localeConfig.allLocales.map(l => `'${l}'`).join(' | ')\n : null\n const localeOptional = localeConfig ? this.localePathService.prefixDefaultLocale !== true : false\n\n const entries = routes\n .filter((r): r is RegisteredRoute & { name: string } => r.name !== undefined)\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(route => {\n const paramEntries = [\n ...route.paramNames.map(p => `${p}: string`),\n ...route.domainParamNames.map(p => `${p}: string`),\n ]\n\n if (localeType && route.localePaths?.length) {\n const optionalMarker = localeOptional ? '?' : ''\n paramEntries.push(`locale${optionalMarker}: StratalLocale`)\n }\n\n // Extra keys become query-string params at runtime, so allow any\n // string key. Typed path/domain params above still take precedence.\n const indexSignature = localeType && route.localePaths?.length\n ? '[key: string]: string | StratalLocale | undefined'\n : '[key: string]: string | undefined'\n paramEntries.push(indexSignature)\n\n const paramsType = `{ ${paramEntries.join('; ')} }`\n return ` '${route.name}': { params: ${paramsType} }`\n })\n .join('\\n')\n\n const lines = [\n '// Auto-generated by `quarry route:types` — do not edit manually',\n \"declare module 'stratal/router' {\",\n ]\n\n if (localeType) {\n lines.push(` type StratalLocale = ${localeType}`)\n lines.push('')\n }\n\n lines.push(\n ' interface StratalRouteMap {',\n entries,\n ' }',\n '}',\n )\n\n return [\n ...lines,\n '',\n 'export {}',\n '',\n ].join('\\n')\n }\n}\n","import { inject } from '../../di'\nimport { DI_TOKENS } from '../../di/tokens'\nimport type { CronManager } from '../../cron/cron-manager'\nimport { Command } from '../command'\n\nexport class ScheduleListCommand extends Command {\n static command = 'schedule:list'\n static description = 'List all registered cron jobs'\n\n constructor(@inject(DI_TOKENS.Cron) private cron: CronManager) {\n super()\n }\n\n handle(): number | undefined {\n const schedules = this.cron.getAllSchedules()\n\n if (schedules.length === 0) {\n this.info('No cron jobs found')\n return 0\n }\n\n const rows: string[][] = []\n\n for (const schedule of schedules) {\n const jobs = this.cron.getJobsForSchedule(schedule)\n for (const { jobClass } of jobs) {\n rows.push([schedule, jobClass.name])\n }\n }\n\n this.table(['Schedule', 'Job'], rows)\n\n return undefined\n }\n}\n","import { Module } from '../module/module.decorator'\nimport { DbSeedCommand, DbSeedListCommand } from '../seeder'\nimport { ApiCommand } from './commands/api.command'\nimport { EventListCommand } from './commands/event-list.command'\nimport { HelpCommand } from './commands/help.command'\nimport { I18nCheckCommand } from './commands/i18n-check.command'\nimport { I18nDuplicatesCommand } from './commands/i18n-duplicates.command'\nimport { I18nListCommand } from './commands/i18n-list.command'\nimport { I18nNamespacesCommand } from './commands/i18n-namespaces.command'\nimport { I18nSearchCommand } from './commands/i18n-search.command'\nimport { I18nStatsCommand } from './commands/i18n-stats.command'\nimport { McpServeCommand } from './commands/mcp-serve.command'\nimport { McpToolsCommand } from './commands/mcp-tools.command'\nimport { QueueListCommand } from './commands/queue-list.command'\nimport { RouteListCommand } from './commands/route-list.command'\nimport { RouteTypesCommand } from './commands/route-types.command'\nimport { ScheduleListCommand } from './commands/schedule-list.command'\n\n/**\n * Built-in framework CLI commands.\n *\n * Registered automatically by `QuarryRunner` so they're available from\n * `src/quarry.ts` (CLI side). The worker entry (`src/index.ts`) never\n * imports this module, which keeps each command's transitive deps\n * (e.g. `@modelcontextprotocol/sdk` reached via `McpServeCommand`) out\n * of the worker bundle and the worker-env Vite dev optimizer.\n */\n@Module({\n providers: [\n HelpCommand,\n DbSeedCommand,\n DbSeedListCommand,\n RouteListCommand,\n RouteTypesCommand,\n EventListCommand,\n ScheduleListCommand,\n QueueListCommand,\n McpServeCommand,\n McpToolsCommand,\n ApiCommand,\n I18nCheckCommand,\n I18nDuplicatesCommand,\n I18nListCommand,\n I18nNamespacesCommand,\n I18nSearchCommand,\n I18nStatsCommand,\n ],\n})\nexport class BuiltinQuarryModule {}\n","import type { ExceptionHandler } from '../errors'\nimport { LogLevel } from '../logger/contracts/log-level'\nimport { Module } from '../module/module.decorator'\nimport { Stratal } from '../stratal'\nimport type { Constructor } from '../types'\nimport { BuiltinQuarryModule } from './builtin-quarry.module'\n\nexport interface QuarryRunOptions {\n /**\n * Modules to register for the CLI run. Always includes the app's root\n * module (e.g., `AppModule`); additional entries are typically CLI-only\n * command modules from stratal ecosystem packages (e.g.,\n * `InertiaQuarryModule` from `@stratal/inertia/quarry`). Anything listed\n * here stays out of the worker bundle because `src/index.ts` doesn't\n * import it.\n */\n imports: Constructor[]\n /**\n * Provider classes registered only for the CLI run — typically seeders\n * (classes extending `Seeder`) and other CLI-only services. Placed into a\n * synthesized wrapper module's `providers` so they go through the\n * standard DI registration path.\n */\n providers?: Constructor[]\n /** Optional custom exception handler. Same shape as `Stratal({ exceptionHandler })`. */\n exceptionHandler?: Constructor<ExceptionHandler>\n}\n\n/**\n * Builds a `Stratal` instance for the quarry CLI entry (`src/quarry.ts`).\n *\n * Synthesizes a wrapper module from the given `imports` and `providers`,\n * so CLI-only classes (seeders, ecosystem CLI commands) stay out of the\n * worker bundle — `src/index.ts` doesn't reference any of them. Forces\n * CLI-friendly logging defaults (`level: 'error'`, `formatter: 'pretty'`).\n *\n * @example\n * ```ts\n * // src/quarry.ts\n * export default QuarryRunner.run({\n * imports: [AppModule, InertiaQuarryModule],\n * providers: [GeoSeeder, DemoSeeder],\n * })\n * ```\n */\nexport class QuarryRunner {\n static run(options: QuarryRunOptions): Stratal {\n // `BuiltinQuarryModule` carries the framework's built-in CLI commands\n // (help, db:seed, route:list, mcp:serve, etc.). It's auto-included here\n // — and ONLY here — so the static graph that reaches `@modelcontextprotocol/sdk`\n // and friends never touches the worker entry's module graph.\n @Module({\n imports: [BuiltinQuarryModule, ...options.imports],\n providers: options.providers ?? [],\n })\n class QuarryEntryModule {}\n\n return new Stratal({\n module: QuarryEntryModule,\n exceptionHandler: options.exceptionHandler,\n logging: { level: LogLevel.ERROR, formatter: 'pretty' },\n })\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Y as Container, _n as CommandResult, hn as CommandInput, xn as Quarry } from "./index-DEncMcC6.mjs";
2
+ import { t as Constructor } from "./types-BaeHi67f.mjs";
3
+ import { t as Command } from "./command-wXfvHbBZ.mjs";
4
+
5
+ //#region src/quarry/quarry-registry.d.ts
6
+ /**
7
+ * QuarryRegistry — edge-compatible programmatic API for running commands.
8
+ *
9
+ * Registered as a singleton via DI_TOKENS.Quarry.
10
+ * Commands are auto-discovered from module providers and registered at bootstrap.
11
+ * Command constructors are stored at bootstrap; fresh instances are resolved per `call()`.
12
+ *
13
+ * Users should inject and type as `Quarry` (the interface), which only exposes `call()`.
14
+ */
15
+ declare class QuarryRegistry implements Quarry {
16
+ private readonly container;
17
+ private commands;
18
+ private signatures;
19
+ private aliases;
20
+ constructor(container: Container);
21
+ /**
22
+ * Execute a command by name with optional flat input.
23
+ * A fresh command instance is resolved from the container per invocation.
24
+ */
25
+ call(name: string, input?: CommandInput): Promise<CommandResult>;
26
+ /**
27
+ * Check if a command exists by name or alias.
28
+ */
29
+ has(name: string): boolean;
30
+ /**
31
+ * Get a command constructor by name or alias.
32
+ */
33
+ get(name: string): Constructor<Command> | undefined;
34
+ /**
35
+ * Get all registered command constructors.
36
+ */
37
+ all(): Map<string, Constructor<Command>>;
38
+ /**
39
+ * List all commands with their descriptions and aliases.
40
+ */
41
+ list(): {
42
+ name: string;
43
+ description?: string;
44
+ aliases: string[];
45
+ }[];
46
+ /**
47
+ * Generate a compact listing of all commands with visual hierarchy and colors.
48
+ */
49
+ listUsage(options?: {
50
+ binaryName?: string;
51
+ binaryLabel?: string;
52
+ binaryVersion?: string;
53
+ }): Promise<string>;
54
+ /**
55
+ * Get auto-generated usage text for a command.
56
+ */
57
+ usage(name: string): Promise<string>;
58
+ /**
59
+ * Register a command constructor with the registry.
60
+ * @internal Called by Application during bootstrap.
61
+ */
62
+ register(commandClass: Constructor<Command>): void;
63
+ private handleError;
64
+ private resolveName;
65
+ private applyDefaults;
66
+ }
67
+ //#endregion
68
+ export { QuarryRegistry as t };
69
+ //# sourceMappingURL=quarry-registry-D4hIGScf.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarry-registry-D4hIGScf.d.mts","names":[],"sources":["../src/quarry/quarry-registry.ts"],"mappings":";;;;;;AAuBA;;;;;;;;cACa,cAAA,YAA0B,MAAA;EAAA,iBAKqB,SAAA;EAAA,QAJlD,QAAA;EAAA,QACA,UAAA;EAAA,QACA,OAAA;cAEkD,SAAA,EAAW,SAAA;EAuJlC;;;;EAjJ7B,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,aAAA;EAXnB;;;EA4ErC,GAAA,CAAI,IAAA;EAzEI;;;EAiFR,GAAA,CAAI,IAAA,WAAe,WAAA,CAAY,OAAA;EAzEzB;;;EAiFN,GAAA,CAAA,GAAO,GAAA,SAAY,WAAA,CAAY,OAAA;EAjFiB;;;EAwFhD,IAAA,CAAA;IAAU,IAAA;IAAc,WAAA;IAAsB,OAAA;EAAA;EAP9C;;;EAiCM,SAAA,CAAU,OAAA;IAAY,UAAA;IAAqB,WAAA;IAAsB,aAAA;EAAA,IAA2B,OAAA;EAA5F;;;EAWA,KAAA,CAAM,IAAA,WAAe,OAAA;EAXX;;;;EA+BhB,QAAA,CAAS,YAAA,EAAc,WAAA,CAAY,OAAA;EAAA,QAkC3B,WAAA;EAAA,QAQA,WAAA;EAAA,QAIA,aAAA;AAAA"}
@@ -0,0 +1,311 @@
1
+ import { c as DI_TOKENS, d as Transient, m as inject } from "./di-BO1QIb5H.mjs";
2
+ import { n as __decorateParam, t as __decorate } from "./decorate-HgTKAYK8.mjs";
3
+ import { t as createCliExceptionContext } from "./exception-context-B4kM-M53.mjs";
4
+ import { n as CommandError, r as COMMAND_INTERNALS } from "./command-BU4ApTo5.mjs";
5
+ //#region src/quarry/command-internals.ts
6
+ /** @internal Set the flat input values before calling handle() */
7
+ function setCommandInputs(command, values) {
8
+ command[COMMAND_INTERNALS].inputs = { ...values };
9
+ }
10
+ /** @internal Set the Quarry reference for this.call() support */
11
+ function setCommandQuarry(command, quarry) {
12
+ command[COMMAND_INTERNALS].quarry = quarry;
13
+ }
14
+ /** @internal Collect the result after handle() completes */
15
+ function getCommandResult(command) {
16
+ const internals = command[COMMAND_INTERNALS];
17
+ return {
18
+ exitCode: internals.exitCode,
19
+ output: [...internals.output],
20
+ errors: [...internals.errors]
21
+ };
22
+ }
23
+ //#endregion
24
+ //#region src/quarry/errors/command-not-found.error.ts
25
+ /**
26
+ * Thrown when a command is not found in the Quarry registry.
27
+ */
28
+ var CommandNotFoundError = class extends Error {
29
+ constructor(name) {
30
+ super(`Command "${name}" is not registered.`);
31
+ this.name = "CommandNotFoundError";
32
+ }
33
+ };
34
+ //#endregion
35
+ //#region src/quarry/signature-parser.ts
36
+ /**
37
+ * Parse a Laravel-style command signature string.
38
+ *
39
+ * Signature syntax:
40
+ * command-name {arg} ... — flat command
41
+ * group subcommand {arg} ... — subcommand hierarchy (space-separated)
42
+ * namespace:command {arg} ... — namespaced flat command (colon-separated)
43
+ * {--flag} {--name=} {--name=default} {--name=*} {--A|name} {--name= : desc}
44
+ *
45
+ * Pure function, zero dependencies, edge-compatible.
46
+ */
47
+ function parseSignature(signature) {
48
+ const tokens = extractTokens(signature);
49
+ const name = extractCommandName(signature);
50
+ const args = [];
51
+ const options = [];
52
+ for (const token of tokens) {
53
+ const inner = token.slice(1, -1).trim();
54
+ if (inner.startsWith("--")) options.push(parseOption(inner));
55
+ else args.push(parseArgument(inner));
56
+ }
57
+ return {
58
+ name,
59
+ arguments: args,
60
+ options
61
+ };
62
+ }
63
+ function extractCommandName(signature) {
64
+ const match = /^[\w:.-]+(?:\s+[\w:.-]+)*/.exec(signature);
65
+ if (!match) throw new CommandError(`Invalid signature: cannot extract command name from "${signature}"`);
66
+ return match[0];
67
+ }
68
+ function extractTokens(signature) {
69
+ const tokens = [];
70
+ const regex = /\{[^}]+\}/g;
71
+ let match;
72
+ while ((match = regex.exec(signature)) !== null) tokens.push(match[0]);
73
+ return tokens;
74
+ }
75
+ function parseArgument(inner) {
76
+ const { value, description } = splitDescription(inner);
77
+ if (value.endsWith("*")) return {
78
+ name: value.slice(0, -1).trim(),
79
+ required: true,
80
+ isArray: true,
81
+ description
82
+ };
83
+ const eqIdx = value.indexOf("=");
84
+ if (eqIdx !== -1) return {
85
+ name: value.slice(0, eqIdx).trim(),
86
+ required: false,
87
+ default: value.slice(eqIdx + 1).trim(),
88
+ isArray: false,
89
+ description
90
+ };
91
+ if (value.endsWith("?")) return {
92
+ name: value.slice(0, -1).trim(),
93
+ required: false,
94
+ isArray: false,
95
+ description
96
+ };
97
+ return {
98
+ name: value.trim(),
99
+ required: true,
100
+ isArray: false,
101
+ description
102
+ };
103
+ }
104
+ function parseOption(inner) {
105
+ const { value, description } = splitDescription(inner.slice(2));
106
+ let alias;
107
+ let optBody = value;
108
+ const pipeIdx = optBody.indexOf("|");
109
+ if (pipeIdx !== -1) {
110
+ alias = optBody.slice(0, pipeIdx).trim();
111
+ optBody = optBody.slice(pipeIdx + 1).trim();
112
+ }
113
+ if (optBody.endsWith("=*")) return {
114
+ name: optBody.slice(0, -2).trim(),
115
+ alias,
116
+ isFlag: false,
117
+ isArray: true,
118
+ description
119
+ };
120
+ const eqIdx = optBody.indexOf("=");
121
+ if (eqIdx !== -1) {
122
+ const name = optBody.slice(0, eqIdx).trim();
123
+ const defaultValue = optBody.slice(eqIdx + 1).trim();
124
+ return {
125
+ name,
126
+ alias,
127
+ isFlag: false,
128
+ isArray: false,
129
+ default: defaultValue || void 0,
130
+ description
131
+ };
132
+ }
133
+ return {
134
+ name: optBody.trim(),
135
+ alias,
136
+ isFlag: true,
137
+ isArray: false,
138
+ description
139
+ };
140
+ }
141
+ function splitDescription(value) {
142
+ const colonIdx = value.indexOf(" : ");
143
+ if (colonIdx === -1) return { value };
144
+ return {
145
+ value: value.slice(0, colonIdx).trim(),
146
+ description: value.slice(colonIdx + 3).trim()
147
+ };
148
+ }
149
+ //#endregion
150
+ //#region src/quarry/quarry-registry.ts
151
+ let QuarryRegistry = class QuarryRegistry {
152
+ container;
153
+ commands = /* @__PURE__ */ new Map();
154
+ signatures = /* @__PURE__ */ new Map();
155
+ aliases = /* @__PURE__ */ new Map();
156
+ constructor(container) {
157
+ this.container = container;
158
+ }
159
+ /**
160
+ * Execute a command by name with optional flat input.
161
+ * A fresh command instance is resolved from the container per invocation.
162
+ */
163
+ async call(name, input) {
164
+ const resolvedName = this.resolveName(name);
165
+ const CommandClass = this.commands.get(resolvedName);
166
+ if (!CommandClass) throw new CommandNotFoundError(name);
167
+ const signature = this.signatures.get(resolvedName);
168
+ const mergedInput = this.applyDefaults(input ?? {}, signature);
169
+ for (const arg of signature.arguments) if (arg.required && (mergedInput[arg.name] === void 0 || mergedInput[arg.name] === null)) throw new CommandError(`Missing required argument: ${arg.name}`);
170
+ let command;
171
+ try {
172
+ command = this.container.resolve(CommandClass);
173
+ setCommandQuarry(command, this);
174
+ setCommandInputs(command, mergedInput);
175
+ const exitCode = await command.handle();
176
+ const result = getCommandResult(command);
177
+ if (typeof exitCode === "number") return {
178
+ ...result,
179
+ exitCode
180
+ };
181
+ return result;
182
+ } catch (error) {
183
+ if (error instanceof CommandError) {
184
+ if (command) {
185
+ const result = getCommandResult(command);
186
+ return {
187
+ exitCode: result.exitCode === 0 ? 1 : result.exitCode,
188
+ output: result.output,
189
+ errors: [...result.errors, error.message]
190
+ };
191
+ }
192
+ return {
193
+ exitCode: 1,
194
+ output: [],
195
+ errors: [error.message]
196
+ };
197
+ }
198
+ const errorMessage = this.handleError(error, resolvedName);
199
+ if (command) {
200
+ const result = getCommandResult(command);
201
+ return {
202
+ exitCode: result.exitCode === 0 ? 1 : result.exitCode,
203
+ output: result.output,
204
+ errors: [...result.errors, errorMessage]
205
+ };
206
+ }
207
+ return {
208
+ exitCode: 1,
209
+ output: [],
210
+ errors: [errorMessage]
211
+ };
212
+ }
213
+ }
214
+ /**
215
+ * Check if a command exists by name or alias.
216
+ */
217
+ has(name) {
218
+ const resolved = this.resolveName(name);
219
+ return this.commands.has(resolved);
220
+ }
221
+ /**
222
+ * Get a command constructor by name or alias.
223
+ */
224
+ get(name) {
225
+ const resolved = this.resolveName(name);
226
+ return this.commands.get(resolved);
227
+ }
228
+ /**
229
+ * Get all registered command constructors.
230
+ */
231
+ all() {
232
+ return new Map(this.commands);
233
+ }
234
+ /**
235
+ * List all commands with their descriptions and aliases.
236
+ */
237
+ list() {
238
+ const result = [];
239
+ for (const [name, CommandClass] of this.commands) {
240
+ const staticCommand = CommandClass;
241
+ const commandAliases = [];
242
+ for (const [alias, target] of this.aliases) if (target === name) commandAliases.push(alias);
243
+ result.push({
244
+ name,
245
+ description: staticCommand.description,
246
+ aliases: commandAliases
247
+ });
248
+ }
249
+ return result.sort((a, b) => a.name.localeCompare(b.name));
250
+ }
251
+ /**
252
+ * Generate a compact listing of all commands with visual hierarchy and colors.
253
+ */
254
+ async listUsage(options) {
255
+ const commands = this.list();
256
+ const { generateListing } = await import("./usage-generator-DTqaUMR9.mjs").then((n) => n.n);
257
+ return generateListing(commands, this.signatures, options);
258
+ }
259
+ /**
260
+ * Get auto-generated usage text for a command.
261
+ */
262
+ async usage(name) {
263
+ const resolvedName = this.resolveName(name);
264
+ const CommandClass = this.commands.get(resolvedName);
265
+ if (!CommandClass) throw new CommandNotFoundError(name);
266
+ const signature = this.signatures.get(resolvedName);
267
+ const staticCommand = CommandClass;
268
+ const { generateUsage } = await import("./usage-generator-DTqaUMR9.mjs").then((n) => n.n);
269
+ return generateUsage(signature, staticCommand.description);
270
+ }
271
+ /**
272
+ * Register a command constructor with the registry.
273
+ * @internal Called by Application during bootstrap.
274
+ */
275
+ register(commandClass) {
276
+ const staticCommand = commandClass;
277
+ if (!staticCommand.command) throw new CommandError(`Command class ${commandClass.name} is missing static "command" signature`);
278
+ const signature = parseSignature(staticCommand.command);
279
+ const name = signature.name;
280
+ if (this.commands.has(name) || this.aliases.has(name)) throw new CommandError(`Duplicate command name: "${name}" is already registered`);
281
+ if (staticCommand.aliases) {
282
+ for (const alias of staticCommand.aliases) if (this.commands.has(alias) || this.aliases.has(alias)) throw new CommandError(`Duplicate alias: "${alias}" conflicts with an existing command or alias`);
283
+ }
284
+ this.commands.set(name, commandClass);
285
+ this.signatures.set(name, signature);
286
+ if (staticCommand.aliases) for (const alias of staticCommand.aliases) this.aliases.set(alias, name);
287
+ }
288
+ handleError(error, commandName) {
289
+ const handler = this.container.resolve(DI_TOKENS.ExceptionHandler);
290
+ const ctx = createCliExceptionContext(commandName);
291
+ handler.handle(error, ctx);
292
+ return error instanceof Error ? error.message : String(error);
293
+ }
294
+ resolveName(name) {
295
+ return this.aliases.get(name) ?? name;
296
+ }
297
+ applyDefaults(input, signature) {
298
+ const result = { ...input };
299
+ for (const arg of signature.arguments) if (result[arg.name] === void 0 && arg.default !== void 0) result[arg.name] = arg.default;
300
+ for (const opt of signature.options) if (result[opt.name] === void 0) {
301
+ if (opt.default !== void 0) result[opt.name] = opt.default;
302
+ else if (opt.isFlag) result[opt.name] = false;
303
+ }
304
+ return result;
305
+ }
306
+ };
307
+ QuarryRegistry = __decorate([Transient(DI_TOKENS.Quarry), __decorateParam(0, inject(DI_TOKENS.Container))], QuarryRegistry);
308
+ //#endregion
309
+ export { parseSignature as n, CommandNotFoundError as r, QuarryRegistry as t };
310
+
311
+ //# sourceMappingURL=quarry-registry-DkraZNwn.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarry-registry-DkraZNwn.mjs","names":[],"sources":["../src/quarry/command-internals.ts","../src/quarry/errors/command-not-found.error.ts","../src/quarry/signature-parser.ts","../src/quarry/quarry-registry.ts"],"sourcesContent":["import type { Command } from './command'\nimport { COMMAND_INTERNALS } from './constants'\nimport type { CommandInput, CommandInternals, CommandResult } from './types'\n\n/** @internal Set the flat input values before calling handle() */\nexport function setCommandInputs(command: Command, values: CommandInput): void {\n command[COMMAND_INTERNALS].inputs = { ...values }\n}\n\n/** @internal Set the Quarry reference for this.call() support */\nexport function setCommandQuarry(\n command: Command,\n quarry: { call(name: string, input?: CommandInput): Promise<CommandResult> },\n): void {\n command[COMMAND_INTERNALS].quarry = quarry\n}\n\n/** @internal Collect the result after handle() completes */\nexport function getCommandResult(command: Command): CommandResult {\n const internals: CommandInternals = command[COMMAND_INTERNALS]\n return {\n exitCode: internals.exitCode,\n output: [...internals.output],\n errors: [...internals.errors],\n }\n}\n\n/** @internal Reset state between invocations */\nexport function resetCommandState(command: Command): void {\n const internals: CommandInternals = command[COMMAND_INTERNALS]\n internals.inputs = {}\n internals.output = []\n internals.errors = []\n internals.exitCode = 0\n}\n","/**\n * Thrown when a command is not found in the Quarry registry.\n */\nexport class CommandNotFoundError extends Error {\n constructor(name: string) {\n super(`Command \"${name}\" is not registered.`)\n this.name = 'CommandNotFoundError'\n }\n}\n","import { CommandError } from './errors/command.error'\nimport type { ParsedArgument, ParsedOption, ParsedSignature } from './types'\n\n/**\n * Parse a Laravel-style command signature string.\n *\n * Signature syntax:\n * command-name {arg} ... — flat command\n * group subcommand {arg} ... — subcommand hierarchy (space-separated)\n * namespace:command {arg} ... — namespaced flat command (colon-separated)\n * {--flag} {--name=} {--name=default} {--name=*} {--A|name} {--name= : desc}\n *\n * Pure function, zero dependencies, edge-compatible.\n */\nexport function parseSignature(signature: string): ParsedSignature {\n const tokens = extractTokens(signature)\n const name = extractCommandName(signature)\n const args: ParsedArgument[] = []\n const options: ParsedOption[] = []\n\n for (const token of tokens) {\n const inner = token.slice(1, -1).trim() // strip { }\n\n if (inner.startsWith('--')) {\n options.push(parseOption(inner))\n } else {\n args.push(parseArgument(inner))\n }\n }\n\n return { name, arguments: args, options }\n}\n\nfunction extractCommandName(signature: string): string {\n const match = /^[\\w:.-]+(?:\\s+[\\w:.-]+)*/.exec(signature)\n if (!match) {\n throw new CommandError(`Invalid signature: cannot extract command name from \"${signature}\"`)\n }\n return match[0]\n}\n\nfunction extractTokens(signature: string): string[] {\n const tokens: string[] = []\n const regex = /\\{[^}]+\\}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(signature)) !== null) {\n tokens.push(match[0])\n }\n\n return tokens\n}\n\nfunction parseArgument(inner: string): ParsedArgument {\n const { value, description } = splitDescription(inner)\n\n // {name*} — array/variadic argument\n if (value.endsWith('*')) {\n return {\n name: value.slice(0, -1).trim(),\n required: true,\n isArray: true,\n description,\n }\n }\n\n // {name=default} — argument with default value\n const eqIdx = value.indexOf('=')\n if (eqIdx !== -1) {\n return {\n name: value.slice(0, eqIdx).trim(),\n required: false,\n default: value.slice(eqIdx + 1).trim(),\n isArray: false,\n description,\n }\n }\n\n // {name?} — optional argument\n if (value.endsWith('?')) {\n return {\n name: value.slice(0, -1).trim(),\n required: false,\n isArray: false,\n description,\n }\n }\n\n // {name} — required argument\n return {\n name: value.trim(),\n required: true,\n isArray: false,\n description,\n }\n}\n\nfunction parseOption(inner: string): ParsedOption {\n // Remove leading --\n const withoutDashes = inner.slice(2)\n const { value, description } = splitDescription(withoutDashes)\n\n // Check for alias: {--A|name...}\n let alias: string | undefined\n let optBody = value\n\n const pipeIdx = optBody.indexOf('|')\n if (pipeIdx !== -1) {\n alias = optBody.slice(0, pipeIdx).trim()\n optBody = optBody.slice(pipeIdx + 1).trim()\n }\n\n // {--name=*} — array option\n if (optBody.endsWith('=*')) {\n return {\n name: optBody.slice(0, -2).trim(),\n alias,\n isFlag: false,\n isArray: true,\n description,\n }\n }\n\n // {--name=default} — option with default value\n const eqIdx = optBody.indexOf('=')\n if (eqIdx !== -1) {\n const name = optBody.slice(0, eqIdx).trim()\n const defaultValue = optBody.slice(eqIdx + 1).trim()\n\n return {\n name,\n alias,\n isFlag: false,\n isArray: false,\n default: defaultValue || undefined,\n description,\n }\n }\n\n // {--flag} — boolean flag\n return {\n name: optBody.trim(),\n alias,\n isFlag: true,\n isArray: false,\n description,\n }\n}\n\nfunction splitDescription(value: string): { value: string; description?: string } {\n const colonIdx = value.indexOf(' : ')\n if (colonIdx === -1) {\n return { value }\n }\n\n return {\n value: value.slice(0, colonIdx).trim(),\n description: value.slice(colonIdx + 3).trim(),\n }\n}\n","import { inject } from '../di'\nimport type { Container } from '../di/container'\nimport { Transient } from '../di/decorators'\nimport { DI_TOKENS } from '../di/tokens'\nimport { createCliExceptionContext } from '../errors/exception-context'\nimport type { ExceptionHandler } from '../errors/exception-handler'\nimport type { Constructor } from '../types'\nimport { type Command } from './command'\nimport { getCommandResult, setCommandInputs, setCommandQuarry } from './command-internals'\nimport { CommandNotFoundError } from './errors/command-not-found.error'\nimport { CommandError } from './errors/command.error'\nimport { parseSignature } from './signature-parser'\nimport type { CommandInput, CommandResult, ParsedSignature, Quarry } from './types'\n\n/**\n * QuarryRegistry — edge-compatible programmatic API for running commands.\n *\n * Registered as a singleton via DI_TOKENS.Quarry.\n * Commands are auto-discovered from module providers and registered at bootstrap.\n * Command constructors are stored at bootstrap; fresh instances are resolved per `call()`.\n *\n * Users should inject and type as `Quarry` (the interface), which only exposes `call()`.\n */\n@Transient(DI_TOKENS.Quarry)\nexport class QuarryRegistry implements Quarry {\n private commands = new Map<string, Constructor<Command>>()\n private signatures = new Map<string, ParsedSignature>()\n private aliases = new Map<string, string>()\n\n constructor(@inject(DI_TOKENS.Container) private readonly container: Container) { }\n\n /**\n * Execute a command by name with optional flat input.\n * A fresh command instance is resolved from the container per invocation.\n */\n async call(name: string, input?: CommandInput): Promise<CommandResult> {\n const resolvedName = this.resolveName(name)\n const CommandClass = this.commands.get(resolvedName)\n\n if (!CommandClass) {\n throw new CommandNotFoundError(name)\n }\n\n const signature = this.signatures.get(resolvedName)!\n const mergedInput = this.applyDefaults(input ?? {}, signature)\n\n // Validate required arguments\n for (const arg of signature.arguments) {\n if (arg.required && (mergedInput[arg.name] === undefined || mergedInput[arg.name] === null)) {\n throw new CommandError(`Missing required argument: ${arg.name}`)\n }\n }\n\n let command: Command | undefined\n\n try {\n // Resolve a fresh instance per invocation to avoid shared mutable state\n command = this.container.resolve<Command>(CommandClass)\n\n setCommandQuarry(command, this)\n setCommandInputs(command, mergedInput)\n\n const exitCode = await command.handle()\n const result = getCommandResult(command)\n\n if (typeof exitCode === 'number') {\n return { ...result, exitCode }\n }\n\n return result\n } catch (error) {\n if (error instanceof CommandError) {\n if (command) {\n const result = getCommandResult(command)\n return {\n exitCode: result.exitCode === 0 ? 1 : result.exitCode,\n output: result.output,\n errors: [...result.errors, error.message],\n }\n }\n return { exitCode: 1, output: [], errors: [error.message] }\n }\n\n const errorMessage = this.handleError(error, resolvedName)\n\n if (command) {\n const result = getCommandResult(command)\n return {\n exitCode: result.exitCode === 0 ? 1 : result.exitCode,\n output: result.output,\n errors: [...result.errors, errorMessage],\n }\n }\n return { exitCode: 1, output: [], errors: [errorMessage] }\n }\n }\n\n /**\n * Check if a command exists by name or alias.\n */\n has(name: string): boolean {\n const resolved = this.resolveName(name)\n return this.commands.has(resolved)\n }\n\n /**\n * Get a command constructor by name or alias.\n */\n get(name: string): Constructor<Command> | undefined {\n const resolved = this.resolveName(name)\n return this.commands.get(resolved)\n }\n\n /**\n * Get all registered command constructors.\n */\n all(): Map<string, Constructor<Command>> {\n return new Map(this.commands)\n }\n\n /**\n * List all commands with their descriptions and aliases.\n */\n list(): { name: string; description?: string; aliases: string[] }[] {\n const result: { name: string; description?: string; aliases: string[] }[] = []\n\n for (const [name, CommandClass] of this.commands) {\n const staticCommand = CommandClass as unknown as typeof Command\n const commandAliases: string[] = []\n\n for (const [alias, target] of this.aliases) {\n if (target === name) {\n commandAliases.push(alias)\n }\n }\n\n result.push({\n name,\n description: staticCommand.description,\n aliases: commandAliases,\n })\n }\n\n return result.sort((a, b) => a.name.localeCompare(b.name))\n }\n\n /**\n * Generate a compact listing of all commands with visual hierarchy and colors.\n */\n async listUsage(options?: { binaryName?: string; binaryLabel?: string; binaryVersion?: string }): Promise<string> {\n const commands = this.list()\n\n // Dynamic import to keep usage-generator tree-shakeable\n const { generateListing } = await import('./usage-generator')\n return generateListing(commands, this.signatures, options)\n }\n\n /**\n * Get auto-generated usage text for a command.\n */\n async usage(name: string): Promise<string> {\n const resolvedName = this.resolveName(name)\n const CommandClass = this.commands.get(resolvedName)\n\n if (!CommandClass) {\n throw new CommandNotFoundError(name)\n }\n\n const signature = this.signatures.get(resolvedName)!\n const staticCommand = CommandClass as unknown as typeof Command\n\n // Dynamic import to keep usage-generator tree-shakeable\n const { generateUsage } = await import('./usage-generator')\n return generateUsage(signature, staticCommand.description)\n }\n\n /**\n * Register a command constructor with the registry.\n * @internal Called by Application during bootstrap.\n */\n register(commandClass: Constructor<Command>): void {\n const staticCommand = commandClass as unknown as typeof Command\n\n if (!staticCommand.command) {\n throw new CommandError(`Command class ${commandClass.name} is missing static \"command\" signature`)\n }\n\n const signature = parseSignature(staticCommand.command)\n const name = signature.name\n\n if (this.commands.has(name) || this.aliases.has(name)) {\n throw new CommandError(`Duplicate command name: \"${name}\" is already registered`)\n }\n\n // Validate all aliases before any mutation\n if (staticCommand.aliases) {\n for (const alias of staticCommand.aliases) {\n if (this.commands.has(alias) || this.aliases.has(alias)) {\n throw new CommandError(`Duplicate alias: \"${alias}\" conflicts with an existing command or alias`)\n }\n }\n }\n\n // All checks passed — safe to mutate\n this.commands.set(name, commandClass)\n this.signatures.set(name, signature)\n\n if (staticCommand.aliases) {\n for (const alias of staticCommand.aliases) {\n this.aliases.set(alias, name)\n }\n }\n }\n\n private handleError(error: unknown, commandName: string): string {\n const handler = this.container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n const ctx = createCliExceptionContext(commandName)\n // Fire-and-forget — reporting happens via waitUntil internally\n void handler.handle(error, ctx)\n return error instanceof Error ? error.message : String(error)\n }\n\n private resolveName(name: string): string {\n return this.aliases.get(name) ?? name\n }\n\n private applyDefaults(input: CommandInput, signature: ParsedSignature): CommandInput {\n const result = { ...input }\n\n // Apply argument defaults\n for (const arg of signature.arguments) {\n if (result[arg.name] === undefined && arg.default !== undefined) {\n result[arg.name] = arg.default\n }\n }\n\n // Apply option defaults\n for (const opt of signature.options) {\n if (result[opt.name] === undefined) {\n if (opt.default !== undefined) {\n result[opt.name] = opt.default\n } else if (opt.isFlag) {\n result[opt.name] = false\n }\n }\n }\n\n return result\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { n as IQueueConsumer, r as QueueMessage, t as ConsumerRegistry } from "../consumer-registry-B7yUNh0q.mjs";
2
- import { _ as QueueNames, a as InjectQueue, c as QueueModule, d as SyncQueueProvider, f as CloudflareQueueProvider, g as QueueName, h as IQueueSender, i as QueueToken, l as QueueModuleOptions, m as DispatchMessage, n as QueueBindingNotFoundError, o as QueueRegistry, p as IQueueProvider, r as QUEUE_TOKENS, s as QueueProviderFactory, t as QueueProviderNotSupportedError, u as QueueSender, v as QueueManager } from "../index-CjaQ6_tZ.mjs";
3
- export { CloudflareQueueProvider, ConsumerRegistry, DispatchMessage, IQueueConsumer, IQueueProvider, IQueueSender, InjectQueue, QUEUE_TOKENS, QueueBindingNotFoundError, QueueManager, QueueMessage, QueueModule, QueueModuleOptions, QueueName, QueueNames, QueueProviderFactory, QueueProviderNotSupportedError, QueueRegistry, QueueSender, QueueToken, SyncQueueProvider };
1
+ import { n as IQueueConsumer, r as QueueMessage, t as ConsumerRegistry } from "../consumer-registry-DHQtypr1.mjs";
2
+ import { a as QueueRegistry, c as QueueModuleOptions, d as CloudflareQueueProvider, f as IQueueProvider, g as QueueManager, h as QueueBinding, i as InjectQueue, l as QueueSender, m as IQueueSender, n as QUEUE_TOKENS, o as QueueProviderFactory, p as DispatchMessage, r as QueueToken, s as QueueModule, t as QueueError, u as SyncQueueProvider } from "../index-CW1YHSft.mjs";
3
+ export { CloudflareQueueProvider, ConsumerRegistry, DispatchMessage, IQueueConsumer, IQueueProvider, IQueueSender, InjectQueue, QUEUE_TOKENS, QueueBinding, QueueError, QueueManager, QueueMessage, QueueModule, QueueModuleOptions, QueueProviderFactory, QueueRegistry, QueueSender, QueueToken, SyncQueueProvider };