stratal 0.0.17 → 0.0.19

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 (200) hide show
  1. package/README.md +8 -8
  2. package/dist/{base-email.provider-DypUAfWm.mjs → base-email.provider-mjynzewK.mjs} +1 -1
  3. package/dist/{base-email.provider-DypUAfWm.mjs.map → base-email.provider-mjynzewK.mjs.map} +1 -1
  4. package/dist/bin/cloudflare-workers-loader.mjs +33 -1
  5. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
  6. package/dist/bin/quarry.mjs +169 -7
  7. package/dist/bin/quarry.mjs.map +1 -1
  8. package/dist/cache/index.d.mts +3 -2
  9. package/dist/cache/index.d.mts.map +1 -1
  10. package/dist/cache/index.mjs +3 -10
  11. package/dist/cache/index.mjs.map +1 -1
  12. package/dist/{colors-Y7WIFXs7.mjs → colors-DJaRDXoS.mjs} +1 -1
  13. package/dist/{colors-Y7WIFXs7.mjs.map → colors-DJaRDXoS.mjs.map} +1 -1
  14. package/dist/{command-B1CPgsrU.mjs → command-BgSlsS4M.mjs} +3 -3
  15. package/dist/command-BgSlsS4M.mjs.map +1 -0
  16. package/dist/{command-TnkPYWta.d.mts → command-DsQq56Lp.d.mts} +2 -2
  17. package/dist/{command-TnkPYWta.d.mts.map → command-DsQq56Lp.d.mts.map} +1 -1
  18. package/dist/config/index.d.mts +81 -37
  19. package/dist/config/index.d.mts.map +1 -1
  20. package/dist/config/index.mjs +135 -61
  21. package/dist/config/index.mjs.map +1 -1
  22. package/dist/{consumer-registry-Bymm6ff4.d.mts → consumer-registry-Doom7BEh.d.mts} +1 -1
  23. package/dist/{consumer-registry-Bymm6ff4.d.mts.map → consumer-registry-Doom7BEh.d.mts.map} +1 -1
  24. package/dist/controller.decorator-LZY9aHYG.mjs +66 -0
  25. package/dist/controller.decorator-LZY9aHYG.mjs.map +1 -0
  26. package/dist/cron/index.d.mts +4 -3
  27. package/dist/cron/index.d.mts.map +1 -1
  28. package/dist/cron/index.mjs +1 -3
  29. package/dist/{cron-manager-CFBamKKk.mjs → cron-manager-C30t9UZM.mjs} +29 -19
  30. package/dist/cron-manager-C30t9UZM.mjs.map +1 -0
  31. package/dist/{cron-manager-D7imGwUT.d.mts → cron-manager-RuPtFVLy.d.mts} +28 -14
  32. package/dist/cron-manager-RuPtFVLy.d.mts.map +1 -0
  33. package/dist/di/index.d.mts +2 -2
  34. package/dist/di/index.mjs +3 -3
  35. package/dist/email/index.d.mts +3 -3
  36. package/dist/email/index.mjs +87 -18
  37. package/dist/email/index.mjs.map +1 -1
  38. package/dist/{en-DaewN8hc.mjs → en-rHmW6vD9.mjs} +14 -31
  39. package/dist/en-rHmW6vD9.mjs.map +1 -0
  40. package/dist/env-CamWD-U1.d.mts +25 -0
  41. package/dist/env-CamWD-U1.d.mts.map +1 -0
  42. package/dist/errors/index.d.mts +2 -2
  43. package/dist/errors/index.mjs +2 -3
  44. package/dist/errors-B4pYgYON.mjs +1714 -0
  45. package/dist/errors-B4pYgYON.mjs.map +1 -0
  46. package/dist/{errors-DuAR5Wke.mjs → errors-BUyUfr2Z.mjs} +14 -7
  47. package/dist/errors-BUyUfr2Z.mjs.map +1 -0
  48. package/dist/events/index.d.mts +2 -2
  49. package/dist/events/index.mjs +1 -2
  50. package/dist/{events-CvUSgEuN.mjs → events-COKixqnG.mjs} +2 -2
  51. package/dist/{events-CvUSgEuN.mjs.map → events-COKixqnG.mjs.map} +1 -1
  52. package/dist/{gateway-context-CNOLkLUC.mjs → gateway-context-cqZ8wMoi.mjs} +4 -9
  53. package/dist/gateway-context-cqZ8wMoi.mjs.map +1 -0
  54. package/dist/guards/index.d.mts +14 -5
  55. package/dist/guards/index.d.mts.map +1 -1
  56. package/dist/guards/index.mjs +1 -1
  57. package/dist/{guards-DUk_Kzst.mjs → guards-DMbsAxSX.mjs} +1 -1
  58. package/dist/guards-DMbsAxSX.mjs.map +1 -0
  59. package/dist/http-method.decorator-BT3ufnz8.mjs +96 -0
  60. package/dist/http-method.decorator-BT3ufnz8.mjs.map +1 -0
  61. package/dist/i18n/index.d.mts +3 -3
  62. package/dist/i18n/index.mjs +3 -16
  63. package/dist/i18n/messages/en/index.d.mts +1 -1
  64. package/dist/i18n/messages/en/index.mjs +1 -1
  65. package/dist/i18n/utils/index.d.mts +30 -0
  66. package/dist/i18n/utils/index.d.mts.map +1 -0
  67. package/dist/i18n/utils/index.mjs +2 -0
  68. package/dist/i18n/validation/index.d.mts +1 -1
  69. package/dist/i18n/validation/index.mjs +1 -1
  70. package/dist/i18n.module-CI_prYFD.mjs +2340 -0
  71. package/dist/i18n.module-CI_prYFD.mjs.map +1 -0
  72. package/dist/{index-NGxg-KP_.d.mts → index-B437eK7p.d.mts} +59 -16
  73. package/dist/index-B437eK7p.d.mts.map +1 -0
  74. package/dist/{index-Dp6A5ywM.d.mts → index-CWRS7Ri3.d.mts} +1 -1
  75. package/dist/{index-Dp6A5ywM.d.mts.map → index-CWRS7Ri3.d.mts.map} +1 -1
  76. package/dist/{index-D_w_Rmtd.d.mts → index-DFhEeFfC.d.mts} +13 -30
  77. package/dist/{index-D_w_Rmtd.d.mts.map → index-DFhEeFfC.d.mts.map} +1 -1
  78. package/dist/index-DPFqRs8L.d.mts +4318 -0
  79. package/dist/index-DPFqRs8L.d.mts.map +1 -0
  80. package/dist/{index-DGRe6Yoa.d.mts → index-Dnqm9ZB6.d.mts} +5 -4
  81. package/dist/index-Dnqm9ZB6.d.mts.map +1 -0
  82. package/dist/index-SHx31sBJ.d.mts +101 -0
  83. package/dist/index-SHx31sBJ.d.mts.map +1 -0
  84. package/dist/index.d.mts +5 -3
  85. package/dist/index.d.mts.map +1 -1
  86. package/dist/index.mjs +1 -20
  87. package/dist/{is-command-DJVI6wEJ.mjs → is-command-C6a7WTPw.mjs} +2 -2
  88. package/dist/{is-command-DJVI6wEJ.mjs.map → is-command-C6a7WTPw.mjs.map} +1 -1
  89. package/dist/{is-seeder-D5MIEcdz.mjs → is-seeder-CebjZCDn.mjs} +1 -1
  90. package/dist/{is-seeder-D5MIEcdz.mjs.map → is-seeder-CebjZCDn.mjs.map} +1 -1
  91. package/dist/logger/index.d.mts +1 -1
  92. package/dist/logger/index.mjs +1 -1
  93. package/dist/{logger-CGT91VY6.mjs → logger-V6Ms3QnQ.mjs} +63 -45
  94. package/dist/logger-V6Ms3QnQ.mjs.map +1 -0
  95. package/dist/macroable/index.d.mts +2 -0
  96. package/dist/macroable/index.mjs +2 -0
  97. package/dist/macroable-BmufBshB.mjs +122 -0
  98. package/dist/macroable-BmufBshB.mjs.map +1 -0
  99. package/dist/module/index.d.mts +3 -4
  100. package/dist/module/index.d.mts.map +1 -1
  101. package/dist/module/index.mjs +1 -10
  102. package/dist/module-qGE_1duv.mjs +732 -0
  103. package/dist/module-qGE_1duv.mjs.map +1 -0
  104. package/dist/openapi/index.d.mts +3 -3
  105. package/dist/openapi/index.mjs +2 -15
  106. package/dist/{openapi-tools.service-B3TxYKoQ.mjs → openapi-tools.service-CYWGuhue.mjs} +4 -1
  107. package/dist/{openapi-tools.service-B3TxYKoQ.mjs.map → openapi-tools.service-CYWGuhue.mjs.map} +1 -1
  108. package/dist/{openapi.service-DGnX3Fc4.d.mts → openapi.service-Bv_NioM9.d.mts} +9 -17
  109. package/dist/openapi.service-Bv_NioM9.d.mts.map +1 -0
  110. package/dist/quarry/index.d.mts +26 -12
  111. package/dist/quarry/index.d.mts.map +1 -1
  112. package/dist/quarry/index.mjs +4 -8
  113. package/dist/{quarry-registry-B2rkO-JS.mjs → quarry-registry-DFfRRkA7.mjs} +45 -40
  114. package/dist/quarry-registry-DFfRRkA7.mjs.map +1 -0
  115. package/dist/queue/index.d.mts +2 -2
  116. package/dist/queue/index.mjs +3 -13
  117. package/dist/queue/index.mjs.map +1 -1
  118. package/dist/{queue.module-BtI8f4Jo.mjs → queue.module-P-G-nCYz.mjs} +39 -42
  119. package/dist/queue.module-P-G-nCYz.mjs.map +1 -0
  120. package/dist/r2-storage.provider-LdzK9tfG.mjs +244 -0
  121. package/dist/r2-storage.provider-LdzK9tfG.mjs.map +1 -0
  122. package/dist/{resend.provider-bXMEkdRJ.mjs → resend.provider-bwILp0WI.mjs} +2 -4
  123. package/dist/{resend.provider-bXMEkdRJ.mjs.map → resend.provider-bwILp0WI.mjs.map} +1 -1
  124. package/dist/router/index.d.mts +2 -2
  125. package/dist/router/index.mjs +7 -16
  126. package/dist/seeder/index.d.mts +3 -4
  127. package/dist/seeder/index.d.mts.map +1 -1
  128. package/dist/seeder/index.mjs +2 -6
  129. package/dist/{seeder-R7RXJC35.mjs → seeder-BcqIFa2X.mjs} +5 -5
  130. package/dist/{seeder-R7RXJC35.mjs.map → seeder-BcqIFa2X.mjs.map} +1 -1
  131. package/dist/setup-CtekcwuO.mjs +37 -0
  132. package/dist/setup-CtekcwuO.mjs.map +1 -0
  133. package/dist/signed-url-COX7cCWR.mjs +74 -0
  134. package/dist/signed-url-COX7cCWR.mjs.map +1 -0
  135. package/dist/{smtp.provider-DrbHQztF.mjs → smtp.provider-B07yuARi.mjs} +2 -4
  136. package/dist/{smtp.provider-DrbHQztF.mjs.map → smtp.provider-B07yuARi.mjs.map} +1 -1
  137. package/dist/storage/index.d.mts +39 -17
  138. package/dist/storage/index.d.mts.map +1 -1
  139. package/dist/storage/index.mjs +3 -14
  140. package/dist/storage/providers/index.d.mts +30 -69
  141. package/dist/storage/providers/index.d.mts.map +1 -1
  142. package/dist/storage/providers/index.mjs +2 -5
  143. package/dist/{storage-CZKHOhci.mjs → storage-P6X4h9So.mjs} +102 -29
  144. package/dist/storage-P6X4h9So.mjs.map +1 -0
  145. package/dist/{storage-provider.interface-0IqcdhBf.d.mts → storage-provider.interface-CC1nniHk.d.mts} +20 -15
  146. package/dist/storage-provider.interface-CC1nniHk.d.mts.map +1 -0
  147. package/dist/stratal-BCiwCFN9.mjs +533 -0
  148. package/dist/stratal-BCiwCFN9.mjs.map +1 -0
  149. package/dist/{types-DahElfUw.d.mts → types-DIWemRad.d.mts} +2 -2
  150. package/dist/types-DIWemRad.d.mts.map +1 -0
  151. package/dist/{usage-generator-CVIsENuE.mjs → usage-generator-MBcRo0Q2.mjs} +2 -2
  152. package/dist/{usage-generator-CVIsENuE.mjs.map → usage-generator-MBcRo0Q2.mjs.map} +1 -1
  153. package/dist/{validation-DQTC259A.mjs → validation-Dbg3ehdP.mjs} +2 -2
  154. package/dist/{validation-DQTC259A.mjs.map → validation-Dbg3ehdP.mjs.map} +1 -1
  155. package/dist/websocket/index.d.mts +3 -3
  156. package/dist/websocket/index.d.mts.map +1 -1
  157. package/dist/websocket/index.mjs +1 -4
  158. package/dist/workers/index.d.mts +2 -1
  159. package/dist/workers/index.d.mts.map +1 -1
  160. package/dist/workers/index.mjs +2 -20
  161. package/dist/workers/index.mjs.map +1 -1
  162. package/package.json +41 -50
  163. package/dist/application-DfPtIzxF.d.mts +0 -177
  164. package/dist/application-DfPtIzxF.d.mts.map +0 -1
  165. package/dist/command-B1CPgsrU.mjs.map +0 -1
  166. package/dist/cron-manager-CFBamKKk.mjs.map +0 -1
  167. package/dist/cron-manager-D7imGwUT.d.mts.map +0 -1
  168. package/dist/en-DaewN8hc.mjs.map +0 -1
  169. package/dist/errors-DSKapqD8.mjs +0 -707
  170. package/dist/errors-DSKapqD8.mjs.map +0 -1
  171. package/dist/errors-DuAR5Wke.mjs.map +0 -1
  172. package/dist/gateway-context-CNOLkLUC.mjs.map +0 -1
  173. package/dist/guards-DUk_Kzst.mjs.map +0 -1
  174. package/dist/i18n.module-Dn9SrFdS.mjs +0 -1841
  175. package/dist/i18n.module-Dn9SrFdS.mjs.map +0 -1
  176. package/dist/index-BFCxSp_f.d.mts +0 -2625
  177. package/dist/index-BFCxSp_f.d.mts.map +0 -1
  178. package/dist/index-DGRe6Yoa.d.mts.map +0 -1
  179. package/dist/index-NGxg-KP_.d.mts.map +0 -1
  180. package/dist/logger-CGT91VY6.mjs.map +0 -1
  181. package/dist/middleware/index.d.mts +0 -2
  182. package/dist/middleware/index.mjs +0 -5
  183. package/dist/middleware-Bl-b5pkt.mjs +0 -362
  184. package/dist/middleware-Bl-b5pkt.mjs.map +0 -1
  185. package/dist/module-registry-CmjBX6ol.d.mts +0 -121
  186. package/dist/module-registry-CmjBX6ol.d.mts.map +0 -1
  187. package/dist/module-tUtyVJ5E.mjs +0 -371
  188. package/dist/module-tUtyVJ5E.mjs.map +0 -1
  189. package/dist/openapi.service-DGnX3Fc4.d.mts.map +0 -1
  190. package/dist/quarry-registry-B2rkO-JS.mjs.map +0 -1
  191. package/dist/queue.module-BtI8f4Jo.mjs.map +0 -1
  192. package/dist/router-context-D9R1v2Ac.mjs +0 -267
  193. package/dist/router-context-D9R1v2Ac.mjs.map +0 -1
  194. package/dist/s3-storage.provider-CttzNnDR.mjs +0 -335
  195. package/dist/s3-storage.provider-CttzNnDR.mjs.map +0 -1
  196. package/dist/storage-CZKHOhci.mjs.map +0 -1
  197. package/dist/storage-provider.interface-0IqcdhBf.d.mts.map +0 -1
  198. package/dist/stratal-D5smIU1y.mjs +0 -315
  199. package/dist/stratal-D5smIU1y.mjs.map +0 -1
  200. package/dist/types-DahElfUw.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-qGE_1duv.mjs","names":["internal.getDefaultEntry","internal.getGroups","internal.getGlobalMiddleware"],"sources":["../src/module/errors/invalid-module-provider.error.ts","../src/module/module.decorator.ts","../src/router/errors/controller-method-not-found.error.ts","../src/router/errors/controller-registration.error.ts","../src/router/errors/hono-app-already-configured.error.ts","../src/router/errors/openapi-route-registration.error.ts","../src/router/errors/openapi-validation.error.ts","../src/router/errors/route-not-found.error.ts","../src/router/errors/schema-validation.error.ts","../src/router/errors/index.ts","../src/router/router.internals.ts","../src/router/router.ts","../src/module/module-registry.ts"],"sourcesContent":["import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * InvalidModuleProviderError\n *\n * Thrown when a module provider configuration is invalid.\n * This indicates a misconfiguration in the @Module decorator providers array.\n */\nexport class InvalidModuleProviderError extends ApplicationError {\n constructor(provider: unknown) {\n super(\n 'errors.invalidModuleProvider',\n ERROR_CODES.SYSTEM.INVALID_MODULE_PROVIDER,\n { provider: JSON.stringify(provider) }\n )\n }\n}\n","/**\n * Module Decorator\n *\n * NestJS-style @Module decorator for defining modules with providers, controllers, etc.\n * Encapsulates tsyringe's @registry decorator for auto-registration.\n */\n\nimport type { DependencyContainer, Provider as TsyringeProvider } from 'tsyringe'\nimport { instancePerContainerCachingFactory, type Lifecycle, registry } from 'tsyringe'\nimport type InjectionToken from 'tsyringe/dist/typings/providers/injection-token'\nimport type RegistrationOptions from 'tsyringe/dist/typings/types/registration-options'\nimport type { Constructor } from '../types'\nimport { InvalidModuleProviderError } from './errors'\nimport type { ModuleOptions, Provider } from './types'\n\nexport const MODULE_OPTIONS_KEY = Symbol.for('stratal:module:options')\n\n/**\n * Tsyringe registry entry format\n */\ntype RegistryEntry = {\n token: InjectionToken\n options?: RegistrationOptions\n} & TsyringeProvider\n\n/**\n * `@Module` decorator - defines a module with imports, providers, controllers, consumers, jobs\n *\n * Uses tsyringe's `@registry` internally to auto-register providers when module is imported.\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [OtherModule],\n * providers: [MyService, MyRepository],\n * controllers: [MyController],\n * })\n * export class MyModule {}\n * ```\n */\nexport function Module(options: ModuleOptions) {\n return <TFunction extends abstract new (...args: never[]) => unknown>(target: TFunction): TFunction => {\n // Store module options for runtime access\n Reflect.defineMetadata(MODULE_OPTIONS_KEY, options, target)\n\n // Build tsyringe registry entries from providers\n const registryEntries = buildRegistryEntries(options.providers ?? [])\n\n // Apply tsyringe @registry decorator (encapsulated)\n if (registryEntries.length > 0) {\n registry(registryEntries)(target)\n }\n\n return target\n }\n}\n\n/**\n * Get module options from decorated class\n */\nexport function getModuleOptions(target: Constructor): ModuleOptions | undefined {\n return Reflect.getMetadata(MODULE_OPTIONS_KEY, target) as ModuleOptions | undefined\n}\n\n/**\n * Check if a class is decorated with `@Module`\n */\nexport function isModuleClass(target: unknown): target is Constructor {\n return (\n typeof target === 'function' &&\n Reflect.hasMetadata(MODULE_OPTIONS_KEY, target)\n )\n}\n\n/**\n * Convert our Provider types to tsyringe registry format\n *\n * Maps provider scope to tsyringe's lifecycle option.\n * Scope enum values map directly to Lifecycle enum values.\n */\nfunction buildRegistryEntries(providers: Provider[]): RegistryEntry[] {\n return providers.map((provider): RegistryEntry => {\n // Class-only provider - transient by default\n if (typeof provider === 'function') {\n return {\n token: provider as InjectionToken,\n useClass: provider,\n }\n }\n\n // ClassProvider with optional scope\n if ('useClass' in provider) {\n return {\n token: provider.provide as InjectionToken,\n useClass: provider.useClass,\n options: provider.scope !== undefined\n ? { lifecycle: provider.scope as unknown as Lifecycle }\n : undefined,\n }\n }\n\n // ValueProvider - no scope needed (values are inherently singleton)\n if ('useValue' in provider) {\n return {\n token: provider.provide as InjectionToken,\n useValue: provider.useValue,\n }\n }\n\n // FactoryProvider - use instancePerContainerCachingFactory to:\n // 1. Get the actual container at resolution time (global vs request)\n // 2. Cache result per container\n if ('useFactory' in provider) {\n const { provide, useFactory, inject = [] } = provider\n return {\n token: provide as InjectionToken,\n useFactory: instancePerContainerCachingFactory((dependencyContainer: DependencyContainer): object => {\n const deps = inject.map((token) => dependencyContainer.resolve(token))\n return useFactory(...deps) as object\n }),\n }\n }\n\n // ExistingProvider - alias to another token (uses tsyringe's useToken)\n if ('useExisting' in provider) {\n return {\n token: provider.provide as InjectionToken,\n useToken: provider.useExisting as InjectionToken,\n }\n }\n\n // Fallback (should not reach here with proper types)\n throw new InvalidModuleProviderError(provider)\n })\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * ControllerMethodNotFoundError\n *\n * Thrown when a controller method is registered but doesn't exist on the controller instance.\n * This typically indicates a mismatch between route registration and controller implementation.\n */\nexport class ControllerMethodNotFoundError extends ApplicationError {\n constructor(methodName: string, controllerName: string) {\n super(\n 'errors.controllerMethodNotFound',\n ERROR_CODES.ROUTER.CONTROLLER_METHOD_NOT_FOUND,\n { methodName, controllerName }\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * Error thrown when a controller fails to register\n *\n * This typically happens when:\n * - Controller is missing the `@Controller` decorator\n * - Controller route metadata is not set\n * - Controller class name is invalid\n *\n * Error Code: 9005\n */\nexport class ControllerRegistrationError extends ApplicationError {\n constructor(controllerName: string, reason?: string) {\n super('errors.controllerRegistration', ERROR_CODES.ROUTER.CONTROLLER_REGISTRATION_ERROR, {\n controllerName,\n reason,\n })\n }\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * Error thrown when HonoApp.configure() is called more than once.\n *\n * HonoApp can only be configured a single time during application bootstrap.\n */\nexport class HonoAppAlreadyConfiguredError extends ApplicationError {\n constructor() {\n super(\n 'errors.honoAppAlreadyConfigured',\n ERROR_CODES.SYSTEM.CONFIGURATION_ERROR\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * OpenAPIRouteRegistrationError\n *\n * Thrown when an OpenAPI route fails to register properly\n * This indicates a configuration issue with route decorators or metadata\n * Uses i18n key for localized error messages\n *\n * @example\n * ```typescript\n * throw new OpenAPIRouteRegistrationError('/api/v1/users', 'Missing response schema')\n * ```\n */\nexport class OpenAPIRouteRegistrationError extends ApplicationError {\n constructor(path: string, reason: string) {\n super(\n 'errors.openapiRouteRegistration',\n ERROR_CODES.ROUTER.OPENAPI_ROUTE_REGISTRATION,\n { path, reason }\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * OpenAPIValidationError\n *\n * Thrown when OpenAPI request/response validation fails\n * Uses i18n key for localized error messages\n *\n * HTTP Status: 400 Bad Request\n * Error Code: 1004\n *\n * @example\n * ```typescript\n * throw new OpenAPIValidationError('Request body missing required field: email')\n * ```\n */\nexport class OpenAPIValidationError extends ApplicationError {\n constructor(details: string) {\n super(\n 'errors.openapiValidation',\n ERROR_CODES.VALIDATION.REQUEST_VALIDATION,\n { details }\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * Error thrown when a requested route is not found\n *\n * HTTP Status: 404 Not Found\n * Error Code: 4004\n */\nexport class RouteNotFoundError extends ApplicationError {\n constructor(path: string, method: string) {\n super(\n 'errors.routeNotFound',\n ERROR_CODES.RESOURCE.ROUTE_NOT_FOUND,\n { path, method }\n )\n }\n}\n","import { ApplicationError, ERROR_CODES } from '../../errors';\nimport type { ZodError } from '../../i18n/validation';\nimport { type z } from '../../i18n/validation';\n/**\n * SchemaValidationError\n *\n * Thrown when Zod schema validation fails\n */\nexport class SchemaValidationError extends ApplicationError {\n constructor(zodError: ZodError) {\n const issues = zodError.issues.map((err: z.core.$ZodIssue) => ({\n path: err.path.join('.'),\n message: err.message,\n code: err.code\n }))\n\n super(\n 'errors.schemaValidation',\n ERROR_CODES.VALIDATION.SCHEMA_VALIDATION,\n { issues }\n )\n }\n}\n","import { ApplicationError, ERROR_CODES, HttpException } from '../../errors'\nimport { type z, type ZodError } from '../../i18n/validation'\n\nexport { ControllerMethodNotFoundError } from './controller-method-not-found.error'\n\nexport { ControllerRegistrationError } from './controller-registration.error'\n\n/**\n * Error thrown when a request's host header does not match the expected domain pattern.\n *\n * HTTP Status: 404 Not Found\n */\nexport class DomainMismatchError extends HttpException {\n constructor() {\n super(404, 'errors.domainMismatch')\n }\n}\n\n/**\n * Thrown when registering a named route that conflicts with an existing route name.\n *\n * Error Code: 9010\n */\nexport class DuplicateRouteNameError extends ApplicationError {\n constructor(name: string, existingHandler: string, newHandler: string) {\n super('errors.duplicateRouteName', ERROR_CODES.ROUTER.DUPLICATE_ROUTE_NAME, {\n name,\n existingHandler,\n newHandler,\n })\n }\n}\n\nexport { HonoAppAlreadyConfiguredError } from './hono-app-already-configured.error'\n\n/**\n * Error thrown when a signed URL has an invalid or expired signature.\n *\n * HTTP Status: 403 Forbidden\n */\nexport class InvalidSignatureError extends HttpException {\n constructor() {\n super(403, 'errors.invalidSignature')\n }\n}\n\n/**\n * Thrown when a required environment variable is not set.\n *\n * Maps to HTTP 500 via error code range (9xxx → 500).\n */\nexport class MissingEnvironmentVariableError extends ApplicationError {\n constructor(variable: string) {\n super('errors.missingEnvironmentVariable', ERROR_CODES.SYSTEM.MISSING_ENVIRONMENT_VARIABLE, {\n variable,\n })\n }\n}\n\n/**\n * Thrown when a required path or domain parameter is missing during URL generation.\n *\n * Error Code: 9012\n */\nexport class MissingRouteParamError extends ApplicationError {\n constructor(param: string, name: string, path: string) {\n super('errors.missingRouteParam', ERROR_CODES.ROUTER.MISSING_ROUTE_PARAM, {\n param,\n name,\n path,\n })\n }\n}\n\nexport { OpenAPIRouteRegistrationError } from './openapi-route-registration.error'\nexport { OpenAPIValidationError } from './openapi-validation.error'\n\n/**\n * ResponseValidationError\n *\n * Thrown when a controller's response body does not match the declared Zod response schema.\n * Indicates a server-side schema mismatch — the controller is returning data that\n * violates its own API contract.\n */\nexport class ResponseValidationError extends ApplicationError {\n constructor(zodError: ZodError) {\n const issues = zodError.issues.map((err: z.core.$ZodIssue) => ({\n path: err.path.join('.'),\n message: err.message,\n code: err.code,\n }))\n\n super(\n 'errors.responseValidation',\n ERROR_CODES.VALIDATION.RESPONSE_VALIDATION,\n { issues }\n )\n }\n}\n\n/**\n * Thrown when attempting to generate a URL for a route name that doesn't exist in the registry.\n *\n * Error Code: 9011\n */\nexport class RouteNameNotFoundError extends ApplicationError {\n constructor(name: string) {\n super('errors.routeNameNotFound', ERROR_CODES.ROUTER.ROUTE_NAME_NOT_FOUND, {\n name,\n })\n }\n}\n\nexport { RouteNotFoundError } from './route-not-found.error'\n\n/**\n * Thrown when `router.use()` is called inside a `group()` callback.\n * `use()` registers global middleware and is only allowed on the root Router.\n *\n * Error Code: 9013\n */\nexport class RouterUseScopeError extends ApplicationError {\n constructor() {\n super('errors.routerUseScopeViolation', ERROR_CODES.ROUTER.USE_SCOPE_VIOLATION)\n }\n}\n\n/**\n * Thrown when a middleware calls next() more than once.\n * This is a programming error — each middleware must call next() at most once.\n *\n * Error Code: 9014\n */\nexport class MiddlewareNextCalledMultipleTimesError extends ApplicationError {\n constructor(middlewareName: string) {\n super('errors.middlewareNextCalledMultipleTimes', ERROR_CODES.ROUTER.MIDDLEWARE_NEXT_CALLED_MULTIPLE_TIMES, {\n middlewareName,\n })\n }\n}\n\nexport { SchemaValidationError } from './schema-validation.error'\n","/**\n * Symbol keys for Router internal accessors.\n *\n * These symbols are NOT exported from the public `stratal/router` barrel.\n * Only internal modules (RouterResolver) import them, keeping the Router's\n * public API clean — users never see these methods.\n *\n * Declared as individual unique symbols so TypeScript can distinguish\n * their return types in computed property access.\n *\n * @internal\n */\n\n/** @internal */\nexport const getDefaultEntry: unique symbol = Symbol('Router.getDefaultEntry')\n/** @internal */\nexport const getGroups: unique symbol = Symbol('Router.getGroups')\n/** @internal */\nexport const getGlobalMiddleware: unique symbol = Symbol('Router.getGlobalMiddleware')\n","import type { ZodObject } from '../i18n/validation'\nimport type { Constructor } from '../types'\nimport { RouterUseScopeError } from './errors'\nimport type { Middleware } from './middleware.interface'\nimport * as internal from './router.internals'\n\n/**\n * Configuration for a sub-group created via `router.group()`.\n */\nexport interface RouterGroupConfig {\n prefix?: string\n domain?: string\n name?: string\n middleware?: Constructor<Middleware>[]\n version?: string | string[]\n hideFromDocs?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n params?: ZodObject<any>\n}\n\n/**\n * Internal entry representing a sub-group or the default scope.\n * @internal — used by RouterResolver, not exported publicly.\n */\nexport interface RouterEntry {\n prefix?: string\n domain?: string\n name?: string\n middleware: Constructor<Middleware>[]\n version?: string | string[]\n hideFromDocs?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n params?: ZodObject<any>\n /** Controllers in this entry. undefined = all controllers not in any sub-group */\n controllers?: Constructor[]\n}\n\n/**\n * Modules implement this to configure routes and middleware.\n * Replaces `MiddlewareConfigurable`.\n *\n * @example\n * ```typescript\n * @Module({ controllers: [UsersController, PostsController] })\n * export class ApiModule implements RouteConfigurable {\n * configureRoutes(router: Router): void {\n * router\n * .name('api.')\n * .middleware(CorsMiddleware)\n * .version('1')\n * }\n * }\n * ```\n */\nexport interface RouteConfigurable {\n configureRoutes(router: Router): void\n}\n\n/**\n * Fluent builder for route and middleware configuration.\n *\n * Scoped methods (`middleware()`, `prefix()`, `domain()`, `name()`, `version()`, `hideFromDocs()`)\n * apply only to this module's controllers or the sub-group's controllers.\n *\n * `use()` registers global middleware (all routes in the entire app).\n * Only callable on the root Router — throws inside `group()` callbacks.\n *\n * `group()` creates sub-groups for specific controllers with a callback.\n * Controllers in a sub-group are excluded from the parent scope.\n */\nexport class Router {\n private readonly _isChild: boolean\n private readonly _defaultEntry: RouterEntry = { middleware: [] }\n private readonly _groups: RouterEntry[] = []\n private readonly _globalMiddleware: Constructor<Middleware>[] = []\n\n constructor(isChild = false) {\n this._isChild = isChild\n }\n\n /** Dynamic path prefix. For shared segments like `/:companyId` */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n prefix(path: string, params?: ZodObject<any>): this {\n this._defaultEntry.prefix = path\n this._defaultEntry.params = params\n return this\n }\n\n /** Domain pattern for controllers in this scope */\n domain(pattern: string): this {\n this._defaultEntry.domain = pattern\n return this\n }\n\n /** Name prefix for routes in this scope */\n name(prefix: string): this {\n this._defaultEntry.name = prefix\n return this\n }\n\n /** Middleware applied to controllers in this scope */\n middleware(...middlewares: Constructor<Middleware>[]): this {\n this._defaultEntry.middleware.push(...middlewares)\n return this\n }\n\n /** API version for controllers in this scope */\n version(version: string | string[]): this {\n this._defaultEntry.version = version\n return this\n }\n\n /** Hide/show routes in this scope from OpenAPI docs */\n hideFromDocs(hide = true): this {\n this._defaultEntry.hideFromDocs = hide\n return this\n }\n\n /**\n * Global middleware — applied to ALL routes in the entire app.\n * Only callable on the root Router. Throws if called inside `group()`.\n */\n use(...middlewares: Constructor<Middleware>[]): this {\n if (this._isChild) {\n throw new RouterUseScopeError()\n }\n this._globalMiddleware.push(...middlewares)\n return this\n }\n\n /**\n * Create a sub-group for specific controllers/gateways.\n * Controllers in a sub-group are excluded from the parent (default) scope.\n * The callback receives a new Router (without `use()`) for fluent configuration.\n */\n group(controllers: Constructor[], callback: (router: Omit<Router, 'use'>) => void): this {\n const childRouter = new Router(true)\n callback(childRouter)\n\n this._groups.push({\n ...childRouter._defaultEntry,\n controllers,\n })\n return this\n }\n\n // --- Internal accessors via symbol keys (invisible to consumers) ---\n\n [internal.getDefaultEntry](): RouterEntry {\n return this._defaultEntry\n }\n\n [internal.getGroups](): RouterEntry[] {\n return this._groups\n }\n\n [internal.getGlobalMiddleware](): Constructor<Middleware>[] {\n return this._globalMiddleware\n }\n}\n","/**\n * Module Registry\n *\n * Manages module lifecycle for the @Module decorator pattern.\n * Simplified for tsyringe's flat container model:\n * - Imports are traversed for registration (organization only)\n * - Modules registered in declaration order\n * - Lifecycle hooks: onInitialize, onShutdown\n */\n\nimport { injectable, instancePerContainerCachingFactory } from 'tsyringe'\nimport type { Container } from '../di/container'\nimport { Scope } from '../di/types'\nimport { isListener } from '../events'\nimport type { LoggerService } from '../logger'\nimport { Router, type RouteConfigurable } from '../router/router'\nimport { isCommand } from '../quarry/is-command'\nimport { isSeeder } from '../seeder/is-seeder'\nimport type { Constructor } from '../types'\nimport { getModuleOptions } from './module.decorator'\nimport type { ExceptionHandler } from '../errors/exception-handler'\nimport type {\n DynamicModule,\n ModuleClass,\n ModuleContext,\n ModuleOptions,\n OnException,\n OnInitialize,\n OnShutdown,\n Provider,\n} from './types'\n\n\ninterface RegisteredModule {\n moduleClass: Constructor\n options: ModuleOptions\n instance: object | null\n}\n\n/**\n * ModuleRegistry - manages module lifecycle\n *\n * @example\n * ```typescript\n * const registry = new ModuleRegistry(container, logger)\n * registry.register(AppModule) // Traverses imports recursively\n * await registry.initialize()\n * // ... application running ...\n * await registry.shutdown()\n * ```\n */\nexport class ModuleRegistry {\n private modules: RegisteredModule[] = []\n private registeredClasses = new Set<Constructor>()\n private initialized = false\n\n // Collected items from all modules for Application to use\n private allControllers: Constructor[] = []\n private allConsumers: Constructor[] = []\n private allJobs: Constructor[] = []\n private allListeners: Constructor[] = []\n private allCommands: Constructor[] = []\n private allSeeders: Constructor[] = []\n private allRouterConfigs: { router: Router; controllers: Constructor[] }[] = []\n\n constructor(\n private readonly container: Container,\n private readonly logger: LoggerService\n ) { }\n\n /**\n * Register a module (static or dynamic)\n *\n * @param moduleOrDynamic - Module class decorated with `@Module` or DynamicModule from configure()\n */\n register(moduleOrDynamic: ModuleClass | DynamicModule): void {\n const { moduleClass, options } = this.resolveModule(moduleOrDynamic)\n const isDynamic = this.isDynamicModule(moduleOrDynamic)\n\n // Check for duplicate registration\n if (this.registeredClasses.has(moduleClass)) {\n // For DynamicModules: Still register the additional providers\n // This allows forRoot() to add configuration even if base module is registered\n if (isDynamic) {\n this.logger.debug(`Module ${moduleClass.name} already registered, registering DynamicModule providers`)\n const { module: _, ...dynamicRest } = moduleOrDynamic\n for (const provider of dynamicRest.providers ?? []) {\n this.registerProvider(provider)\n }\n } else {\n this.logger.debug(`Module ${moduleClass.name} already registered, skipping`)\n }\n return\n }\n\n this.registeredClasses.add(moduleClass)\n this.logger.info(`Registering module: ${moduleClass.name}`)\n\n // First, register imported modules recursively\n for (const ImportedModule of options.imports ?? []) {\n this.register(ImportedModule)\n }\n\n // Register providers in container\n for (const provider of options.providers ?? []) {\n this.registerProvider(provider)\n }\n\n // Register controllers and collect them\n for (const controller of options.controllers ?? []) {\n this.container.register(controller)\n this.allControllers.push(controller)\n }\n\n // Register consumers as singletons by default and collect them\n for (const consumer of options.consumers ?? []) {\n this.container.register(consumer, Scope.Singleton)\n this.allConsumers.push(consumer)\n this.logger.info(`Collected consumer: ${consumer.name}`, { queueCount: this.allConsumers.length })\n }\n\n // Register jobs as singletons by default and collect them\n for (const job of options.jobs ?? []) {\n this.container.register(job, Scope.Singleton)\n this.allJobs.push(job)\n }\n\n this.modules.push({ moduleClass, options, instance: null })\n }\n\n /**\n * Register multiple modules in order\n */\n registerAll(modules: (ModuleClass | DynamicModule)[]): void {\n for (const module of modules) {\n this.register(module)\n }\n }\n\n /**\n * Initialize all modules (call configure and onInitialize hooks)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return\n\n this.logger.info('Initializing modules...')\n\n const context: ModuleContext = {\n container: this.container,\n logger: this.logger,\n }\n\n for (const registered of this.modules) {\n // Instantiate module class\n const instance = new registered.moduleClass()\n registered.instance = instance\n\n // Call onInitialize if implemented\n if (this.hasOnInitialize(instance)) {\n this.logger.info(`Initializing: ${registered.moduleClass.name}`)\n await instance.onInitialize(context)\n }\n }\n\n this.initialized = true\n this.logger.info('All modules initialized')\n }\n\n /**\n * Get all controllers registered from all modules\n */\n getAllControllers(): Constructor[] {\n return this.allControllers\n }\n\n /**\n * Get all consumers registered from all modules\n */\n getAllConsumers(): Constructor[] {\n return this.allConsumers\n }\n\n /**\n * Get all jobs registered from all modules\n */\n getAllJobs(): Constructor[] {\n return this.allJobs\n }\n\n /**\n * Get all listeners registered from all modules\n */\n getAllListeners(): Constructor[] {\n return this.allListeners\n }\n\n /**\n * Get all commands registered from all modules\n */\n getAllCommands(): Constructor[] {\n return this.allCommands\n }\n\n /**\n * Get all seeders registered from all modules\n */\n getAllSeeders(): Constructor[] {\n return this.allSeeders\n }\n\n /**\n * Get all Router configurations from modules implementing RouteConfigurable.\n * Runs configureRoutes() lazily on first call (deferred from initialize()).\n */\n getAllRouterConfigs(): { router: Router; controllers: Constructor[] }[] {\n if (this.allRouterConfigs.length === 0) {\n for (const { moduleClass, options, instance } of this.modules) {\n if (instance && this.hasRouteConfigurable(instance)) {\n this.logger.debug(`Configuring routes for: ${moduleClass.name}`)\n const router = new Router()\n instance.configureRoutes(router)\n const moduleControllers = options.controllers ?? []\n this.allRouterConfigs.push({ router, controllers: moduleControllers })\n }\n }\n }\n return this.allRouterConfigs\n }\n\n /**\n * Call `onException()` on all modules that implement the OnException interface.\n * Invoked by Application after the ExceptionHandler is resolved and `register()` is called.\n *\n * @param handler - The resolved ExceptionHandler instance\n */\n configureExceptionHandlers(handler: ExceptionHandler): void {\n for (const { moduleClass, instance } of this.modules) {\n if (instance && this.hasOnException(instance)) {\n this.logger.debug(`Configuring exception handlers for: ${moduleClass.name}`)\n instance.onException(handler)\n }\n }\n }\n\n /**\n * Shutdown all modules (call onShutdown hooks in reverse order)\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down modules...')\n\n const context: ModuleContext = {\n container: this.container,\n logger: this.logger,\n }\n\n // Reverse order for shutdown\n const reversed = [...this.modules].reverse()\n\n for (const { moduleClass, instance } of reversed) {\n if (instance && this.hasOnShutdown(instance)) {\n try {\n await instance.onShutdown(context)\n } catch (error) {\n this.logger.error(`Error shutting down ${moduleClass.name}:`, error as Error)\n }\n }\n }\n\n this.logger.info('All modules shut down')\n }\n\n /**\n * Type guard for RouteConfigurable\n */\n private hasRouteConfigurable(instance: unknown): instance is RouteConfigurable {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'configureRoutes' in instance &&\n typeof (instance as RouteConfigurable).configureRoutes === 'function'\n )\n }\n\n /**\n * Type guard for OnInitialize\n */\n private hasOnInitialize(instance: unknown): instance is OnInitialize {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'onInitialize' in instance &&\n typeof (instance as OnInitialize).onInitialize === 'function'\n )\n }\n\n /**\n * Type guard for OnShutdown\n */\n private hasOnShutdown(instance: unknown): instance is OnShutdown {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'onShutdown' in instance &&\n typeof (instance as OnShutdown).onShutdown === 'function'\n )\n }\n\n /**\n * Type guard for OnException\n */\n private hasOnException(instance: unknown): instance is OnException {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'onException' in instance &&\n typeof (instance as OnException).onException === 'function'\n )\n }\n\n /**\n * Resolve module class and options from static or dynamic module\n *\n * For DynamicModules, merges the decorator metadata (consumers, controllers, jobs)\n * with the DynamicModule options (providers, imports). This ensures modules using\n * forRoot/forRootAsync patterns still have their decorator-defined consumers registered.\n */\n private resolveModule(moduleOrDynamic: ModuleClass | DynamicModule): {\n moduleClass: Constructor\n options: ModuleOptions\n } {\n // DynamicModule (from forRoot/forRootAsync) - has module property\n if (this.isDynamicModule(moduleOrDynamic)) {\n const { module: moduleClass, ...dynamicRest } = moduleOrDynamic\n\n // Get decorator options and merge with dynamic options\n // This ensures consumers/controllers/jobs from @Module decorator are included\n const decoratorOptions = getModuleOptions(moduleClass) ?? {}\n const mergedOptions: ModuleOptions = {\n ...decoratorOptions,\n ...dynamicRest,\n // Merge arrays: decorator providers first, then dynamic providers\n providers: [...(decoratorOptions.providers ?? []), ...(dynamicRest.providers ?? [])],\n imports: [...(decoratorOptions.imports ?? [])],\n }\n\n return { moduleClass: moduleClass, options: mergedOptions }\n }\n\n // Static module (decorated with @Module)\n const moduleClass = moduleOrDynamic as Constructor\n const options = getModuleOptions(moduleClass) ?? {}\n return { moduleClass, options }\n }\n\n /**\n * Type guard for DynamicModule\n */\n private isDynamicModule(value: unknown): value is DynamicModule {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'module' in value && // Required property for dynamic modules\n typeof (value as DynamicModule).module === 'function'\n )\n }\n\n /**\n * Register a single provider in the container\n */\n private registerProvider(provider: Provider): void {\n if (typeof provider === 'function') {\n // Class-only provider - transient by default\n this.container.register(provider as Constructor)\n this.collectIfListener(provider as Constructor)\n this.collectIfCommand(provider as Constructor)\n this.collectIfSeeder(provider as Constructor)\n } else if ('useClass' in provider) {\n // ClassProvider with optional scope\n this.container.register(provider.provide, provider.useClass as Constructor, provider.scope)\n this.collectIfListener(provider.useClass as Constructor)\n this.collectIfCommand(provider.useClass as Constructor)\n this.collectIfSeeder(provider.useClass as Constructor)\n } else if ('useValue' in provider) {\n // ValueProvider - no scope needed (values are inherently singleton)\n this.container.registerValue(provider.provide, provider.useValue)\n } else if ('useFactory' in provider) {\n // FactoryProvider - use instancePerContainerCachingFactory to:\n // 1. Get the actual container at resolution time (global vs request)\n // 2. Cache result per container\n const { provide, useFactory, inject = [] } = provider\n this.container.getTsyringeContainer().register(provide, {\n useFactory: instancePerContainerCachingFactory((dependencyContainer) => {\n const deps = inject.map((token) => dependencyContainer.resolve(token))\n return useFactory(...deps)\n })\n })\n } else if ('useExisting' in provider) {\n // ExistingProvider - alias to another token\n this.container.registerExisting(provider.provide, provider.useExisting)\n }\n }\n\n /**\n * Check if a class is a `Command` and collect it for auto-wiring\n */\n private collectIfCommand(providerClass: Constructor): void {\n if (isCommand(providerClass) && !this.allCommands.includes(providerClass)) {\n injectable()(providerClass)\n this.allCommands.push(providerClass)\n this.logger.debug(`Collected command: ${providerClass.name}`)\n }\n }\n\n /**\n * Check if a class is a `Seeder` and collect it for auto-wiring\n */\n private collectIfSeeder(providerClass: Constructor): void {\n if (isSeeder(providerClass) && !this.allSeeders.includes(providerClass)) {\n this.allSeeders.push(providerClass)\n this.logger.debug(`Collected seeder: ${providerClass.name}`)\n }\n }\n\n /**\n * Check if a class is a `@Listener()` and collect it for auto-wiring\n */\n private collectIfListener(providerClass: Constructor): void {\n if (isListener(providerClass)) {\n // Re-register as singleton so the same instance is used across all event registrations\n this.container.register(providerClass, providerClass, Scope.Singleton)\n this.allListeners.push(providerClass)\n this.logger.debug(`Collected listener: ${providerClass.name}`)\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AAQA,IAAa,6BAAb,cAAgD,iBAAiB;CAC/D,YAAY,UAAmB;AAC7B,QACE,gCACA,YAAY,OAAO,yBACnB,EAAE,UAAU,KAAK,UAAU,SAAS,EAAE,CACvC;;;;;ACCL,MAAa,qBAAqB,OAAO,IAAI,yBAAyB;;;;;;;;;;;;;;;;AAyBtE,SAAgB,OAAO,SAAwB;AAC7C,SAAsE,WAAiC;AAErG,UAAQ,eAAe,oBAAoB,SAAS,OAAO;EAG3D,MAAM,kBAAkB,qBAAqB,QAAQ,aAAa,EAAE,CAAC;AAGrE,MAAI,gBAAgB,SAAS,EAC3B,UAAS,gBAAgB,CAAC,OAAO;AAGnC,SAAO;;;;;;AAOX,SAAgB,iBAAiB,QAAgD;AAC/E,QAAO,QAAQ,YAAY,oBAAoB,OAAO;;;;;AAMxD,SAAgB,cAAc,QAAwC;AACpE,QACE,OAAO,WAAW,cAClB,QAAQ,YAAY,oBAAoB,OAAO;;;;;;;;AAUnD,SAAS,qBAAqB,WAAwC;AACpE,QAAO,UAAU,KAAK,aAA4B;AAEhD,MAAI,OAAO,aAAa,WACtB,QAAO;GACL,OAAO;GACP,UAAU;GACX;AAIH,MAAI,cAAc,SAChB,QAAO;GACL,OAAO,SAAS;GAChB,UAAU,SAAS;GACnB,SAAS,SAAS,UAAU,KAAA,IACxB,EAAE,WAAW,SAAS,OAA+B,GACrD,KAAA;GACL;AAIH,MAAI,cAAc,SAChB,QAAO;GACL,OAAO,SAAS;GAChB,UAAU,SAAS;GACpB;AAMH,MAAI,gBAAgB,UAAU;GAC5B,MAAM,EAAE,SAAS,YAAY,SAAS,EAAE,KAAK;AAC7C,UAAO;IACL,OAAO;IACP,YAAY,oCAAoC,wBAAqD;AAEnG,YAAO,WAAW,GADL,OAAO,KAAK,UAAU,oBAAoB,QAAQ,MAAM,CAC5C,CAAC;MAC1B;IACH;;AAIH,MAAI,iBAAiB,SACnB,QAAO;GACL,OAAO,SAAS;GAChB,UAAU,SAAS;GACpB;AAIH,QAAM,IAAI,2BAA2B,SAAS;GAC9C;;;;;;;;;;AC7HJ,IAAa,gCAAb,cAAmD,iBAAiB;CAClE,YAAY,YAAoB,gBAAwB;AACtD,QACE,mCACA,YAAY,OAAO,6BACnB;GAAE;GAAY;GAAgB,CAC/B;;;;;;;;;;;;;;;ACFL,IAAa,8BAAb,cAAiD,iBAAiB;CAChE,YAAY,gBAAwB,QAAiB;AACnD,QAAM,iCAAiC,YAAY,OAAO,+BAA+B;GACvF;GACA;GACD,CAAC;;;;;;;;;;ACVN,IAAa,gCAAb,cAAmD,iBAAiB;CAClE,cAAc;AACZ,QACE,mCACA,YAAY,OAAO,oBACpB;;;;;;;;;;;;;;;;;ACEL,IAAa,gCAAb,cAAmD,iBAAiB;CAClE,YAAY,MAAc,QAAgB;AACxC,QACE,mCACA,YAAY,OAAO,4BACnB;GAAE;GAAM;GAAQ,CACjB;;;;;;;;;;;;;;;;;;;ACJL,IAAa,yBAAb,cAA4C,iBAAiB;CAC3D,YAAY,SAAiB;AAC3B,QACE,4BACA,YAAY,WAAW,oBACvB,EAAE,SAAS,CACZ;;;;;;;;;;;ACdL,IAAa,qBAAb,cAAwC,iBAAiB;CACvD,YAAY,MAAc,QAAgB;AACxC,QACE,wBACA,YAAY,SAAS,iBACrB;GAAE;GAAM;GAAQ,CACjB;;;;;;;;;;ACNL,IAAa,wBAAb,cAA2C,iBAAiB;CAC1D,YAAY,UAAoB;EAC9B,MAAM,SAAS,SAAS,OAAO,KAAK,SAA2B;GAC7D,MAAM,IAAI,KAAK,KAAK,IAAI;GACxB,SAAS,IAAI;GACb,MAAM,IAAI;GACX,EAAE;AAEH,QACE,2BACA,YAAY,WAAW,mBACvB,EAAE,QAAQ,CACX;;;;;;;;;;ACRL,IAAa,sBAAb,cAAyC,cAAc;CACrD,cAAc;AACZ,QAAM,KAAK,wBAAwB;;;;;;;;AASvC,IAAa,0BAAb,cAA6C,iBAAiB;CAC5D,YAAY,MAAc,iBAAyB,YAAoB;AACrE,QAAM,6BAA6B,YAAY,OAAO,sBAAsB;GAC1E;GACA;GACA;GACD,CAAC;;;;;;;;AAWN,IAAa,wBAAb,cAA2C,cAAc;CACvD,cAAc;AACZ,QAAM,KAAK,0BAA0B;;;;;;;;AASzC,IAAa,kCAAb,cAAqD,iBAAiB;CACpE,YAAY,UAAkB;AAC5B,QAAM,qCAAqC,YAAY,OAAO,8BAA8B,EAC1F,UACD,CAAC;;;;;;;;AASN,IAAa,yBAAb,cAA4C,iBAAiB;CAC3D,YAAY,OAAe,MAAc,MAAc;AACrD,QAAM,4BAA4B,YAAY,OAAO,qBAAqB;GACxE;GACA;GACA;GACD,CAAC;;;;;;;;;;AAcN,IAAa,0BAAb,cAA6C,iBAAiB;CAC5D,YAAY,UAAoB;EAC9B,MAAM,SAAS,SAAS,OAAO,KAAK,SAA2B;GAC7D,MAAM,IAAI,KAAK,KAAK,IAAI;GACxB,SAAS,IAAI;GACb,MAAM,IAAI;GACX,EAAE;AAEH,QACE,6BACA,YAAY,WAAW,qBACvB,EAAE,QAAQ,CACX;;;;;;;;AASL,IAAa,yBAAb,cAA4C,iBAAiB;CAC3D,YAAY,MAAc;AACxB,QAAM,4BAA4B,YAAY,OAAO,sBAAsB,EACzE,MACD,CAAC;;;;;;;;;AAYN,IAAa,sBAAb,cAAyC,iBAAiB;CACxD,cAAc;AACZ,QAAM,kCAAkC,YAAY,OAAO,oBAAoB;;;;;;;;;AAUnF,IAAa,yCAAb,cAA4D,iBAAiB;CAC3E,YAAY,gBAAwB;AAClC,QAAM,4CAA4C,YAAY,OAAO,uCAAuC,EAC1G,gBACD,CAAC;;;;;;;;;;;;;;;;;;AC3HN,MAAa,kBAAiC,OAAO,yBAAyB;;AAE9E,MAAa,YAA2B,OAAO,mBAAmB;;AAElE,MAAa,sBAAqC,OAAO,6BAA6B;;;;;;;;;;;;;;;ACoDtF,IAAa,SAAb,MAAa,OAAO;CAClB;CACA,gBAA8C,EAAE,YAAY,EAAE,EAAE;CAChE,UAA0C,EAAE;CAC5C,oBAAgE,EAAE;CAElE,YAAY,UAAU,OAAO;AAC3B,OAAK,WAAW;;;CAKlB,OAAO,MAAc,QAA+B;AAClD,OAAK,cAAc,SAAS;AAC5B,OAAK,cAAc,SAAS;AAC5B,SAAO;;;CAIT,OAAO,SAAuB;AAC5B,OAAK,cAAc,SAAS;AAC5B,SAAO;;;CAIT,KAAK,QAAsB;AACzB,OAAK,cAAc,OAAO;AAC1B,SAAO;;;CAIT,WAAW,GAAG,aAA8C;AAC1D,OAAK,cAAc,WAAW,KAAK,GAAG,YAAY;AAClD,SAAO;;;CAIT,QAAQ,SAAkC;AACxC,OAAK,cAAc,UAAU;AAC7B,SAAO;;;CAIT,aAAa,OAAO,MAAY;AAC9B,OAAK,cAAc,eAAe;AAClC,SAAO;;;;;;CAOT,IAAI,GAAG,aAA8C;AACnD,MAAI,KAAK,SACP,OAAM,IAAI,qBAAqB;AAEjC,OAAK,kBAAkB,KAAK,GAAG,YAAY;AAC3C,SAAO;;;;;;;CAQT,MAAM,aAA4B,UAAuD;EACvF,MAAM,cAAc,IAAI,OAAO,KAAK;AACpC,WAAS,YAAY;AAErB,OAAK,QAAQ,KAAK;GAChB,GAAG,YAAY;GACf;GACD,CAAC;AACF,SAAO;;CAKT,CAACA,mBAAyC;AACxC,SAAO,KAAK;;CAGd,CAACC,aAAqC;AACpC,SAAO,KAAK;;CAGd,CAACC,uBAA2D;AAC1D,SAAO,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;AC1GhB,IAAa,iBAAb,MAA4B;CAC1B,UAAsC,EAAE;CACxC,oCAA4B,IAAI,KAAkB;CAClD,cAAsB;CAGtB,iBAAwC,EAAE;CAC1C,eAAsC,EAAE;CACxC,UAAiC,EAAE;CACnC,eAAsC,EAAE;CACxC,cAAqC,EAAE;CACvC,aAAoC,EAAE;CACtC,mBAA6E,EAAE;CAE/E,YACE,WACA,QACA;AAFiB,OAAA,YAAA;AACA,OAAA,SAAA;;;;;;;CAQnB,SAAS,iBAAoD;EAC3D,MAAM,EAAE,aAAa,YAAY,KAAK,cAAc,gBAAgB;EACpE,MAAM,YAAY,KAAK,gBAAgB,gBAAgB;AAGvD,MAAI,KAAK,kBAAkB,IAAI,YAAY,EAAE;AAG3C,OAAI,WAAW;AACb,SAAK,OAAO,MAAM,UAAU,YAAY,KAAK,0DAA0D;IACvG,MAAM,EAAE,QAAQ,GAAG,GAAG,gBAAgB;AACtC,SAAK,MAAM,YAAY,YAAY,aAAa,EAAE,CAChD,MAAK,iBAAiB,SAAS;SAGjC,MAAK,OAAO,MAAM,UAAU,YAAY,KAAK,+BAA+B;AAE9E;;AAGF,OAAK,kBAAkB,IAAI,YAAY;AACvC,OAAK,OAAO,KAAK,uBAAuB,YAAY,OAAO;AAG3D,OAAK,MAAM,kBAAkB,QAAQ,WAAW,EAAE,CAChD,MAAK,SAAS,eAAe;AAI/B,OAAK,MAAM,YAAY,QAAQ,aAAa,EAAE,CAC5C,MAAK,iBAAiB,SAAS;AAIjC,OAAK,MAAM,cAAc,QAAQ,eAAe,EAAE,EAAE;AAClD,QAAK,UAAU,SAAS,WAAW;AACnC,QAAK,eAAe,KAAK,WAAW;;AAItC,OAAK,MAAM,YAAY,QAAQ,aAAa,EAAE,EAAE;AAC9C,QAAK,UAAU,SAAS,UAAU,MAAM,UAAU;AAClD,QAAK,aAAa,KAAK,SAAS;AAChC,QAAK,OAAO,KAAK,uBAAuB,SAAS,QAAQ,EAAE,YAAY,KAAK,aAAa,QAAQ,CAAC;;AAIpG,OAAK,MAAM,OAAO,QAAQ,QAAQ,EAAE,EAAE;AACpC,QAAK,UAAU,SAAS,KAAK,MAAM,UAAU;AAC7C,QAAK,QAAQ,KAAK,IAAI;;AAGxB,OAAK,QAAQ,KAAK;GAAE;GAAa;GAAS,UAAU;GAAM,CAAC;;;;;CAM7D,YAAY,SAAgD;AAC1D,OAAK,MAAM,UAAU,QACnB,MAAK,SAAS,OAAO;;;;;CAOzB,MAAM,aAA4B;AAChC,MAAI,KAAK,YAAa;AAEtB,OAAK,OAAO,KAAK,0BAA0B;EAE3C,MAAM,UAAyB;GAC7B,WAAW,KAAK;GAChB,QAAQ,KAAK;GACd;AAED,OAAK,MAAM,cAAc,KAAK,SAAS;GAErC,MAAM,WAAW,IAAI,WAAW,aAAa;AAC7C,cAAW,WAAW;AAGtB,OAAI,KAAK,gBAAgB,SAAS,EAAE;AAClC,SAAK,OAAO,KAAK,iBAAiB,WAAW,YAAY,OAAO;AAChE,UAAM,SAAS,aAAa,QAAQ;;;AAIxC,OAAK,cAAc;AACnB,OAAK,OAAO,KAAK,0BAA0B;;;;;CAM7C,oBAAmC;AACjC,SAAO,KAAK;;;;;CAMd,kBAAiC;AAC/B,SAAO,KAAK;;;;;CAMd,aAA4B;AAC1B,SAAO,KAAK;;;;;CAMd,kBAAiC;AAC/B,SAAO,KAAK;;;;;CAMd,iBAAgC;AAC9B,SAAO,KAAK;;;;;CAMd,gBAA+B;AAC7B,SAAO,KAAK;;;;;;CAOd,sBAAwE;AACtE,MAAI,KAAK,iBAAiB,WAAW;QAC9B,MAAM,EAAE,aAAa,SAAS,cAAc,KAAK,QACpD,KAAI,YAAY,KAAK,qBAAqB,SAAS,EAAE;AACnD,SAAK,OAAO,MAAM,2BAA2B,YAAY,OAAO;IAChE,MAAM,SAAS,IAAI,QAAQ;AAC3B,aAAS,gBAAgB,OAAO;IAChC,MAAM,oBAAoB,QAAQ,eAAe,EAAE;AACnD,SAAK,iBAAiB,KAAK;KAAE;KAAQ,aAAa;KAAmB,CAAC;;;AAI5E,SAAO,KAAK;;;;;;;;CASd,2BAA2B,SAAiC;AAC1D,OAAK,MAAM,EAAE,aAAa,cAAc,KAAK,QAC3C,KAAI,YAAY,KAAK,eAAe,SAAS,EAAE;AAC7C,QAAK,OAAO,MAAM,uCAAuC,YAAY,OAAO;AAC5E,YAAS,YAAY,QAAQ;;;;;;CAQnC,MAAM,WAA0B;AAC9B,OAAK,OAAO,KAAK,2BAA2B;EAE5C,MAAM,UAAyB;GAC7B,WAAW,KAAK;GAChB,QAAQ,KAAK;GACd;EAGD,MAAM,WAAW,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS;AAE5C,OAAK,MAAM,EAAE,aAAa,cAAc,SACtC,KAAI,YAAY,KAAK,cAAc,SAAS,CAC1C,KAAI;AACF,SAAM,SAAS,WAAW,QAAQ;WAC3B,OAAO;AACd,QAAK,OAAO,MAAM,uBAAuB,YAAY,KAAK,IAAI,MAAe;;AAKnF,OAAK,OAAO,KAAK,wBAAwB;;;;;CAM3C,qBAA6B,UAAkD;AAC7E,SACE,OAAO,aAAa,YACpB,aAAa,QACb,qBAAqB,YACrB,OAAQ,SAA+B,oBAAoB;;;;;CAO/D,gBAAwB,UAA6C;AACnE,SACE,OAAO,aAAa,YACpB,aAAa,QACb,kBAAkB,YAClB,OAAQ,SAA0B,iBAAiB;;;;;CAOvD,cAAsB,UAA2C;AAC/D,SACE,OAAO,aAAa,YACpB,aAAa,QACb,gBAAgB,YAChB,OAAQ,SAAwB,eAAe;;;;;CAOnD,eAAuB,UAA4C;AACjE,SACE,OAAO,aAAa,YACpB,aAAa,QACb,iBAAiB,YACjB,OAAQ,SAAyB,gBAAgB;;;;;;;;;CAWrD,cAAsB,iBAGpB;AAEA,MAAI,KAAK,gBAAgB,gBAAgB,EAAE;GACzC,MAAM,EAAE,QAAQ,aAAa,GAAG,gBAAgB;GAIhD,MAAM,mBAAmB,iBAAiB,YAAY,IAAI,EAAE;AAS5D,UAAO;IAAe;IAAa,SAAS;KAP1C,GAAG;KACH,GAAG;KAEH,WAAW,CAAC,GAAI,iBAAiB,aAAa,EAAE,EAAG,GAAI,YAAY,aAAa,EAAE,CAAE;KACpF,SAAS,CAAC,GAAI,iBAAiB,WAAW,EAAE,CAAE;KAGS;IAAE;;EAI7D,MAAM,cAAc;AAEpB,SAAO;GAAE;GAAa,SADN,iBAAiB,YAAY,IAAI,EAAE;GACpB;;;;;CAMjC,gBAAwB,OAAwC;AAC9D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,YAAY,SACZ,OAAQ,MAAwB,WAAW;;;;;CAO/C,iBAAyB,UAA0B;AACjD,MAAI,OAAO,aAAa,YAAY;AAElC,QAAK,UAAU,SAAS,SAAwB;AAChD,QAAK,kBAAkB,SAAwB;AAC/C,QAAK,iBAAiB,SAAwB;AAC9C,QAAK,gBAAgB,SAAwB;aACpC,cAAc,UAAU;AAEjC,QAAK,UAAU,SAAS,SAAS,SAAS,SAAS,UAAyB,SAAS,MAAM;AAC3F,QAAK,kBAAkB,SAAS,SAAwB;AACxD,QAAK,iBAAiB,SAAS,SAAwB;AACvD,QAAK,gBAAgB,SAAS,SAAwB;aAC7C,cAAc,SAEvB,MAAK,UAAU,cAAc,SAAS,SAAS,SAAS,SAAS;WACxD,gBAAgB,UAAU;GAInC,MAAM,EAAE,SAAS,YAAY,SAAS,EAAE,KAAK;AAC7C,QAAK,UAAU,sBAAsB,CAAC,SAAS,SAAS,EACtD,YAAY,oCAAoC,wBAAwB;AAEtE,WAAO,WAAW,GADL,OAAO,KAAK,UAAU,oBAAoB,QAAQ,MAAM,CAC5C,CAAC;KAC1B,EACH,CAAC;aACO,iBAAiB,SAE1B,MAAK,UAAU,iBAAiB,SAAS,SAAS,SAAS,YAAY;;;;;CAO3E,iBAAyB,eAAkC;AACzD,MAAI,UAAU,cAAc,IAAI,CAAC,KAAK,YAAY,SAAS,cAAc,EAAE;AACzE,eAAY,CAAC,cAAc;AAC3B,QAAK,YAAY,KAAK,cAAc;AACpC,QAAK,OAAO,MAAM,sBAAsB,cAAc,OAAO;;;;;;CAOjE,gBAAwB,eAAkC;AACxD,MAAI,SAAS,cAAc,IAAI,CAAC,KAAK,WAAW,SAAS,cAAc,EAAE;AACvE,QAAK,WAAW,KAAK,cAAc;AACnC,QAAK,OAAO,MAAM,qBAAqB,cAAc,OAAO;;;;;;CAOhE,kBAA0B,eAAkC;AAC1D,MAAI,WAAW,cAAc,EAAE;AAE7B,QAAK,UAAU,SAAS,eAAe,eAAe,MAAM,UAAU;AACtE,QAAK,aAAa,KAAK,cAAc;AACrC,QAAK,OAAO,MAAM,uBAAuB,cAAc,OAAO"}
@@ -1,6 +1,6 @@
1
- import { Pt as RouterEnv, at as DynamicModule, rt as AsyncModuleOptions } from "../index-BFCxSp_f.mjs";
2
- import { n as OpenAPIObject, r as PathItemObject } from "../index-NGxg-KP_.mjs";
3
- import { t as OpenAPIService } from "../openapi.service-DGnX3Fc4.mjs";
1
+ import { Xn as RouterEnv, hn as DynamicModule, pn as AsyncModuleOptions } from "../index-DPFqRs8L.mjs";
2
+ import { n as OpenAPIObject, r as PathItemObject } from "../index-B437eK7p.mjs";
3
+ import { t as OpenAPIService } from "../openapi.service-Bv_NioM9.mjs";
4
4
  import { MiddlewareHandler } from "hono/types";
5
5
 
6
6
  //#region src/openapi/types.d.ts
@@ -1,16 +1,3 @@
1
- import "../errors-DSKapqD8.mjs";
2
- import "../logger-CGT91VY6.mjs";
3
- import "../module-tUtyVJ5E.mjs";
4
- import "../events-CvUSgEuN.mjs";
5
- import "../middleware-Bl-b5pkt.mjs";
6
- import "../router-context-D9R1v2Ac.mjs";
7
- import "../colors-Y7WIFXs7.mjs";
8
- import "../command-B1CPgsrU.mjs";
9
- import "../is-command-DJVI6wEJ.mjs";
10
- import "../is-seeder-D5MIEcdz.mjs";
11
- import "../validation-DQTC259A.mjs";
12
- import { L as OpenAPIConfigService, _ as OpenAPIService, g as OpenAPIModule } from "../i18n.module-Dn9SrFdS.mjs";
13
- import { n as OPENAPI_TOKENS, t as OpenApiToolsService } from "../openapi-tools.service-B3TxYKoQ.mjs";
14
- import "../guards-DUk_Kzst.mjs";
15
- import "../gateway-context-CNOLkLUC.mjs";
1
+ import { A as OpenAPIModule, V as OpenAPIConfigService, j as OpenAPIService } from "../i18n.module-CI_prYFD.mjs";
2
+ import { n as OPENAPI_TOKENS, t as OpenApiToolsService } from "../openapi-tools.service-CYWGuhue.mjs";
16
3
  export { OPENAPI_TOKENS, OpenAPIConfigService, OpenAPIModule, OpenAPIService, OpenApiToolsService };
@@ -3,8 +3,11 @@
3
3
  * OpenAPI Module DI Tokens
4
4
  */
5
5
  const OPENAPI_TOKENS = {
6
+ /** Static options provided via forRoot() */
6
7
  Options: Symbol.for("stratal:openapi:options"),
8
+ /** Request-scoped config service that supports runtime overrides */
7
9
  ConfigService: Symbol.for("stratal:openapi:config:service"),
10
+ /** OpenAPI service that generates specs and serves endpoints */
8
11
  OpenAPIService: Symbol.for("stratal:openapi:service")
9
12
  };
10
13
  //#endregion
@@ -194,4 +197,4 @@ var OpenApiToolsService = class OpenApiToolsService {
194
197
  //#endregion
195
198
  export { OPENAPI_TOKENS as n, OpenApiToolsService as t };
196
199
 
197
- //# sourceMappingURL=openapi-tools.service-B3TxYKoQ.mjs.map
200
+ //# sourceMappingURL=openapi-tools.service-CYWGuhue.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-tools.service-B3TxYKoQ.mjs","names":[],"sources":["../src/openapi/openapi.tokens.ts","../src/openapi/services/openapi-tools.service.ts"],"sourcesContent":["/**\n * OpenAPI Module DI Tokens\n */\nexport const OPENAPI_TOKENS = {\n /** Static options provided via forRoot() */\n Options: Symbol.for('stratal:openapi:options'),\n\n /** Request-scoped config service that supports runtime overrides */\n ConfigService: Symbol.for('stratal:openapi:config:service'),\n\n /** OpenAPI service that generates specs and serves endpoints */\n OpenAPIService: Symbol.for('stratal:openapi:service'),\n} as const\n","import { type OpenAPIObject } from \"../../i18n/validation\"\nimport type { HttpMethod } from '../../router/types'\n\ntype JsonSchema = Record<string, unknown>\n\nexport interface ToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchema\n method: string\n path: string\n pathParams: string[]\n}\n\nexport interface ToolExecutionResult {\n status: number\n body: string\n headers: Record<string, string>\n}\n\nexport interface ToolFilter {\n tags?: string[]\n pathPrefix?: string\n}\n\nexport type Dispatcher = (method: string, url: string, options?: {\n body?: unknown\n headers?: Record<string, string>\n}) => Promise<Response>\n\ninterface OperationObject {\n operationId?: string\n summary?: string\n description?: string\n tags?: string[]\n parameters?: ParameterObject[]\n requestBody?: RequestBodyObject\n}\n\ninterface ParameterObject {\n name: string\n in: string\n required?: boolean\n schema?: JsonSchema\n description?: string\n}\n\ninterface RequestBodyObject {\n required?: boolean\n content?: Record<string, { schema?: JsonSchema }>\n}\n\n/**\n * Converts an OpenAPI 3.0 spec into callable tool definitions.\n *\n * Plain class (no DI) — reusable across MCP, CLI, and custom tooling.\n */\nexport class OpenApiToolsService {\n private static readonly HTTP_METHODS: Set<string> = new Set<HttpMethod>(['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'])\n\n private tools: ToolDefinition[] = []\n private toolMap = new Map<string, ToolDefinition>()\n private dispatcher?: Dispatcher\n\n private spec: OpenAPIObject\n\n constructor(spec: OpenAPIObject, options?: { dispatcher?: Dispatcher }) {\n this.spec = spec\n this.dispatcher = options?.dispatcher\n this.tools = this.buildTools()\n for (const tool of this.tools) {\n this.toolMap.set(tool.name, tool)\n }\n }\n\n getTools(filter?: ToolFilter): ToolDefinition[] {\n let tools = this.tools\n\n if (filter?.tags?.length) {\n const tagSet = new Set(filter.tags)\n tools = tools.filter((t) => {\n const op = this.getOperation(t.method, t.path)\n return op?.tags?.some((tag) => tagSet.has(tag)) ?? false\n })\n }\n\n if (filter?.pathPrefix) {\n const prefix = filter.pathPrefix\n tools = tools.filter((t) => t.path.startsWith(prefix))\n }\n\n return tools\n }\n\n getTool(name: string): ToolDefinition | undefined {\n return this.toolMap.get(name)\n }\n\n async executeTool(name: string, args: Record<string, unknown>): Promise<ToolExecutionResult> {\n const tool = this.toolMap.get(name)\n if (!tool) {\n throw new Error(`Tool not found: ${name}`)\n }\n if (!this.dispatcher) {\n throw new Error('No dispatcher configured')\n }\n\n // Interpolate path params\n let url = tool.path\n for (const param of tool.pathParams) {\n const value = args[`path_${param}`]\n if (value === undefined) {\n throw new Error(`Missing required path parameter: ${param}`)\n }\n url = url.replace(`{${param}}`, encodeURIComponent(value != null && typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean)))\n }\n\n // Collect query params\n const queryParts: string[] = []\n for (const key of Object.keys(args)) {\n if (key.startsWith('query_')) {\n const paramName = key.slice(6)\n const value = args[key]\n queryParts.push(`${encodeURIComponent(paramName)}=${encodeURIComponent(value != null && typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean))}`)\n }\n }\n if (queryParts.length > 0) {\n url += `?${queryParts.join('&')}`\n }\n\n const body = args.body\n const response = await this.dispatcher(\n tool.method.toUpperCase(),\n url,\n body !== undefined ? { body } : undefined,\n )\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n\n return {\n status: response.status,\n body: await response.text(),\n headers: responseHeaders,\n }\n }\n\n private buildTools(): ToolDefinition[] {\n const tools: ToolDefinition[] = []\n const paths = this.spec.paths\n\n for (const [path, pathItem] of Object.entries(paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!operation || typeof operation !== 'object') continue\n if (!OpenApiToolsService.HTTP_METHODS.has(method.toLowerCase())) continue\n\n const op = operation as OperationObject\n const name = op.operationId ?? this.generateName(method, path)\n const description = this.buildDescription(op, method, path)\n const pathItemParams = (pathItem as Record<string, unknown>).parameters as ParameterObject[] | undefined\n const mergedParameters = this.mergeParameters(pathItemParams, op.parameters)\n const { schema, pathParams } = this.buildInputSchema({ ...op, parameters: mergedParameters })\n\n tools.push({ name, description, inputSchema: schema, method: method.toUpperCase(), path, pathParams })\n }\n }\n\n return tools\n }\n\n private generateName(method: string, path: string): string {\n const snake = path\n .replace(/[{}]/g, '')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase()\n return `${method.toLowerCase()}_${snake}`\n }\n\n private buildDescription(op: OperationObject, method: string, path: string): string {\n if (op.summary && op.description) {\n return `${op.summary} — ${op.description}`\n }\n return op.summary ?? op.description ?? `${method.toUpperCase()} ${path}`\n }\n\n private buildInputSchema(op: OperationObject): { schema: JsonSchema; pathParams: string[] } {\n const properties: Record<string, JsonSchema> = {}\n const required: string[] = []\n const pathParams: string[] = []\n\n // Parameters (path + query)\n for (const param of op.parameters ?? []) {\n const resolvedParam = this.resolveRef(param) as ParameterObject\n const paramSchema = resolvedParam.schema ? this.resolveRef(resolvedParam.schema) as JsonSchema : { type: 'string' }\n\n if (resolvedParam.in === 'path') {\n pathParams.push(resolvedParam.name)\n const key = `path_${resolvedParam.name}`\n properties[key] = { ...paramSchema }\n if (resolvedParam.description) properties[key].description = resolvedParam.description\n required.push(key)\n } else if (resolvedParam.in === 'query') {\n const key = `query_${resolvedParam.name}`\n properties[key] = { ...paramSchema }\n if (resolvedParam.description) properties[key].description = resolvedParam.description\n if (resolvedParam.required) required.push(key)\n }\n }\n\n // Request body\n const resolvedBody = op.requestBody ? this.resolveRef(op.requestBody) as RequestBodyObject : undefined\n if (resolvedBody) {\n const jsonContent = resolvedBody.content?.['application/json']\n if (jsonContent?.schema) {\n properties.body = this.resolveRef(jsonContent.schema) as JsonSchema\n } else {\n properties.body = { type: 'object' }\n }\n const needsBody = resolvedBody.required === true\n if (needsBody) {\n required.push('body')\n }\n }\n\n const schema: JsonSchema = { type: 'object', properties }\n if (required.length > 0) {\n schema.required = required\n }\n\n return { schema, pathParams }\n }\n\n private mergeParameters(pathLevel?: ParameterObject[], opLevel?: ParameterObject[]): ParameterObject[] {\n const resolvedPathLevel = pathLevel?.map((p) => this.resolveRef(p) as ParameterObject)\n const resolvedOpLevel = opLevel?.map((p) => this.resolveRef(p) as ParameterObject)\n\n if (!resolvedPathLevel?.length) return resolvedOpLevel ?? []\n if (!resolvedOpLevel?.length) return resolvedPathLevel\n\n const opKeys = new Set(resolvedOpLevel.map((p) => `${p.in}:${p.name}`))\n const inherited = resolvedPathLevel.filter((p) => !opKeys.has(`${p.in}:${p.name}`))\n return [...inherited, ...resolvedOpLevel]\n }\n\n private resolveRef(obj: unknown, seen = new Set<string>()): unknown {\n if (!obj || typeof obj !== 'object') return obj\n const record = obj as Record<string, unknown>\n\n if (typeof record.$ref === 'string') {\n const refPath = record.$ref\n if (seen.has(refPath)) return obj\n seen.add(refPath)\n\n const resolved = this.lookupRef(refPath)\n if (!resolved) return obj\n return this.resolveRef(resolved, seen)\n }\n\n // Recursively walk all properties and resolve nested $refs\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(record)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item) => this.resolveRef(item, seen))\n } else if (value && typeof value === 'object') {\n result[key] = this.resolveRef(value, seen)\n } else {\n result[key] = value\n }\n }\n return result\n }\n\n private lookupRef(refPath: string): unknown {\n const components = this.spec.components as Record<string, Record<string, unknown>> | undefined\n if (!components) return undefined\n\n const match = /^#\\/components\\/(\\w+)\\/(.+)$/.exec(refPath)\n if (!match) return undefined\n\n const [, section, name] = match\n const sectionObj = components[section]\n if (typeof sectionObj !== 'object') return undefined\n return sectionObj[name]\n }\n\n private getOperation(method: string, path: string): OperationObject | undefined {\n const paths = this.spec.paths as Record<string, Record<string, unknown>> | undefined\n return paths?.[path]?.[method.toLowerCase()] as OperationObject | undefined\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openapi-tools.service-CYWGuhue.mjs","names":[],"sources":["../src/openapi/openapi.tokens.ts","../src/openapi/services/openapi-tools.service.ts"],"sourcesContent":["/**\n * OpenAPI Module DI Tokens\n */\nexport const OPENAPI_TOKENS = {\n /** Static options provided via forRoot() */\n Options: Symbol.for('stratal:openapi:options'),\n\n /** Request-scoped config service that supports runtime overrides */\n ConfigService: Symbol.for('stratal:openapi:config:service'),\n\n /** OpenAPI service that generates specs and serves endpoints */\n OpenAPIService: Symbol.for('stratal:openapi:service'),\n} as const\n","import { type OpenAPIObject } from \"../../i18n/validation\"\nimport type { HttpMethod } from '../../router/types'\n\ntype JsonSchema = Record<string, unknown>\n\nexport interface ToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchema\n method: string\n path: string\n pathParams: string[]\n}\n\nexport interface ToolExecutionResult {\n status: number\n body: string\n headers: Record<string, string>\n}\n\nexport interface ToolFilter {\n tags?: string[]\n pathPrefix?: string\n}\n\nexport type Dispatcher = (method: string, url: string, options?: {\n body?: unknown\n headers?: Record<string, string>\n}) => Promise<Response>\n\ninterface OperationObject {\n operationId?: string\n summary?: string\n description?: string\n tags?: string[]\n parameters?: ParameterObject[]\n requestBody?: RequestBodyObject\n}\n\ninterface ParameterObject {\n name: string\n in: string\n required?: boolean\n schema?: JsonSchema\n description?: string\n}\n\ninterface RequestBodyObject {\n required?: boolean\n content?: Record<string, { schema?: JsonSchema }>\n}\n\n/**\n * Converts an OpenAPI 3.0 spec into callable tool definitions.\n *\n * Plain class (no DI) — reusable across MCP, CLI, and custom tooling.\n */\nexport class OpenApiToolsService {\n private static readonly HTTP_METHODS: Set<string> = new Set<HttpMethod>(['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'])\n\n private tools: ToolDefinition[] = []\n private toolMap = new Map<string, ToolDefinition>()\n private dispatcher?: Dispatcher\n\n private spec: OpenAPIObject\n\n constructor(spec: OpenAPIObject, options?: { dispatcher?: Dispatcher }) {\n this.spec = spec\n this.dispatcher = options?.dispatcher\n this.tools = this.buildTools()\n for (const tool of this.tools) {\n this.toolMap.set(tool.name, tool)\n }\n }\n\n getTools(filter?: ToolFilter): ToolDefinition[] {\n let tools = this.tools\n\n if (filter?.tags?.length) {\n const tagSet = new Set(filter.tags)\n tools = tools.filter((t) => {\n const op = this.getOperation(t.method, t.path)\n return op?.tags?.some((tag) => tagSet.has(tag)) ?? false\n })\n }\n\n if (filter?.pathPrefix) {\n const prefix = filter.pathPrefix\n tools = tools.filter((t) => t.path.startsWith(prefix))\n }\n\n return tools\n }\n\n getTool(name: string): ToolDefinition | undefined {\n return this.toolMap.get(name)\n }\n\n async executeTool(name: string, args: Record<string, unknown>): Promise<ToolExecutionResult> {\n const tool = this.toolMap.get(name)\n if (!tool) {\n throw new Error(`Tool not found: ${name}`)\n }\n if (!this.dispatcher) {\n throw new Error('No dispatcher configured')\n }\n\n // Interpolate path params\n let url = tool.path\n for (const param of tool.pathParams) {\n const value = args[`path_${param}`]\n if (value === undefined) {\n throw new Error(`Missing required path parameter: ${param}`)\n }\n url = url.replace(`{${param}}`, encodeURIComponent(value != null && typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean)))\n }\n\n // Collect query params\n const queryParts: string[] = []\n for (const key of Object.keys(args)) {\n if (key.startsWith('query_')) {\n const paramName = key.slice(6)\n const value = args[key]\n queryParts.push(`${encodeURIComponent(paramName)}=${encodeURIComponent(value != null && typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean))}`)\n }\n }\n if (queryParts.length > 0) {\n url += `?${queryParts.join('&')}`\n }\n\n const body = args.body\n const response = await this.dispatcher(\n tool.method.toUpperCase(),\n url,\n body !== undefined ? { body } : undefined,\n )\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n\n return {\n status: response.status,\n body: await response.text(),\n headers: responseHeaders,\n }\n }\n\n private buildTools(): ToolDefinition[] {\n const tools: ToolDefinition[] = []\n const paths = this.spec.paths\n\n for (const [path, pathItem] of Object.entries(paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!operation || typeof operation !== 'object') continue\n if (!OpenApiToolsService.HTTP_METHODS.has(method.toLowerCase())) continue\n\n const op = operation as OperationObject\n const name = op.operationId ?? this.generateName(method, path)\n const description = this.buildDescription(op, method, path)\n const pathItemParams = (pathItem as Record<string, unknown>).parameters as ParameterObject[] | undefined\n const mergedParameters = this.mergeParameters(pathItemParams, op.parameters)\n const { schema, pathParams } = this.buildInputSchema({ ...op, parameters: mergedParameters })\n\n tools.push({ name, description, inputSchema: schema, method: method.toUpperCase(), path, pathParams })\n }\n }\n\n return tools\n }\n\n private generateName(method: string, path: string): string {\n const snake = path\n .replace(/[{}]/g, '')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase()\n return `${method.toLowerCase()}_${snake}`\n }\n\n private buildDescription(op: OperationObject, method: string, path: string): string {\n if (op.summary && op.description) {\n return `${op.summary} — ${op.description}`\n }\n return op.summary ?? op.description ?? `${method.toUpperCase()} ${path}`\n }\n\n private buildInputSchema(op: OperationObject): { schema: JsonSchema; pathParams: string[] } {\n const properties: Record<string, JsonSchema> = {}\n const required: string[] = []\n const pathParams: string[] = []\n\n // Parameters (path + query)\n for (const param of op.parameters ?? []) {\n const resolvedParam = this.resolveRef(param) as ParameterObject\n const paramSchema = resolvedParam.schema ? this.resolveRef(resolvedParam.schema) as JsonSchema : { type: 'string' }\n\n if (resolvedParam.in === 'path') {\n pathParams.push(resolvedParam.name)\n const key = `path_${resolvedParam.name}`\n properties[key] = { ...paramSchema }\n if (resolvedParam.description) properties[key].description = resolvedParam.description\n required.push(key)\n } else if (resolvedParam.in === 'query') {\n const key = `query_${resolvedParam.name}`\n properties[key] = { ...paramSchema }\n if (resolvedParam.description) properties[key].description = resolvedParam.description\n if (resolvedParam.required) required.push(key)\n }\n }\n\n // Request body\n const resolvedBody = op.requestBody ? this.resolveRef(op.requestBody) as RequestBodyObject : undefined\n if (resolvedBody) {\n const jsonContent = resolvedBody.content?.['application/json']\n if (jsonContent?.schema) {\n properties.body = this.resolveRef(jsonContent.schema) as JsonSchema\n } else {\n properties.body = { type: 'object' }\n }\n const needsBody = resolvedBody.required === true\n if (needsBody) {\n required.push('body')\n }\n }\n\n const schema: JsonSchema = { type: 'object', properties }\n if (required.length > 0) {\n schema.required = required\n }\n\n return { schema, pathParams }\n }\n\n private mergeParameters(pathLevel?: ParameterObject[], opLevel?: ParameterObject[]): ParameterObject[] {\n const resolvedPathLevel = pathLevel?.map((p) => this.resolveRef(p) as ParameterObject)\n const resolvedOpLevel = opLevel?.map((p) => this.resolveRef(p) as ParameterObject)\n\n if (!resolvedPathLevel?.length) return resolvedOpLevel ?? []\n if (!resolvedOpLevel?.length) return resolvedPathLevel\n\n const opKeys = new Set(resolvedOpLevel.map((p) => `${p.in}:${p.name}`))\n const inherited = resolvedPathLevel.filter((p) => !opKeys.has(`${p.in}:${p.name}`))\n return [...inherited, ...resolvedOpLevel]\n }\n\n private resolveRef(obj: unknown, seen = new Set<string>()): unknown {\n if (!obj || typeof obj !== 'object') return obj\n const record = obj as Record<string, unknown>\n\n if (typeof record.$ref === 'string') {\n const refPath = record.$ref\n if (seen.has(refPath)) return obj\n seen.add(refPath)\n\n const resolved = this.lookupRef(refPath)\n if (!resolved) return obj\n return this.resolveRef(resolved, seen)\n }\n\n // Recursively walk all properties and resolve nested $refs\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(record)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item) => this.resolveRef(item, seen))\n } else if (value && typeof value === 'object') {\n result[key] = this.resolveRef(value, seen)\n } else {\n result[key] = value\n }\n }\n return result\n }\n\n private lookupRef(refPath: string): unknown {\n const components = this.spec.components as Record<string, Record<string, unknown>> | undefined\n if (!components) return undefined\n\n const match = /^#\\/components\\/(\\w+)\\/(.+)$/.exec(refPath)\n if (!match) return undefined\n\n const [, section, name] = match\n const sectionObj = components[section]\n if (typeof sectionObj !== 'object') return undefined\n return sectionObj[name]\n }\n\n private getOperation(method: string, path: string): OperationObject | undefined {\n const paths = this.spec.paths as Record<string, Record<string, unknown>> | undefined\n return paths?.[path]?.[method.toLowerCase()] as OperationObject | undefined\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- import { Pt as RouterEnv, en as Container, wt as IController } from "./index-BFCxSp_f.mjs";
2
- import { t as Constructor } from "./types-DahElfUw.mjs";
3
- import { n as OpenAPIObject, t as OpenAPIHono } from "./index-NGxg-KP_.mjs";
1
+ import { Cr as Container, Xn as RouterEnv } from "./index-DPFqRs8L.mjs";
2
+ import { n as OpenAPIObject, t as OpenAPIHono } from "./index-B437eK7p.mjs";
4
3
 
5
4
  //#region src/openapi/services/openapi.service.d.ts
6
5
  /**
@@ -8,15 +7,17 @@ import { n as OpenAPIObject, t as OpenAPIHono } from "./index-NGxg-KP_.mjs";
8
7
  *
9
8
  * Generates OpenAPI specifications with support for:
10
9
  * - Runtime configuration via OpenAPIConfigService
11
- * - Route filtering via hideFromDocs and custom routeFilter
10
+ * - Route filtering via custom routeFilter
12
11
  * - i18n support for titles and descriptions
13
12
  * - Security scheme definitions
14
13
  *
14
+ * Hidden routes (hideFromDocs) are excluded at registration time via
15
+ * @hono/zod-openapi's `hide` option and don't appear in the spec.
16
+ *
15
17
  * Configuration is resolved per-request from OpenAPIConfigService,
16
18
  * allowing middleware to override config based on domain context.
17
19
  */
18
20
  declare class OpenAPIService {
19
- private routeInfoMap;
20
21
  /**
21
22
  * Generate a filtered OpenAPI spec using the user's config.
22
23
  * Usable from both HTTP handlers and CLI commands.
@@ -25,25 +26,16 @@ declare class OpenAPIService {
25
26
  /**
26
27
  * Setup OpenAPI documentation endpoints
27
28
  */
28
- setupEndpoints(app: OpenAPIHono<RouterEnv>, controllers: Constructor<IController>[], container: Container): void;
29
+ setupEndpoints(app: OpenAPIHono<RouterEnv>, container: Container): void;
29
30
  private nameLastHandler;
30
31
  /**
31
32
  * Get localized security scheme definitions
32
33
  */
33
34
  private getSecuritySchemeDefinitions;
34
35
  /**
35
- * Build route info map from controllers
36
- * Maps route prefixes to their hideFromDocs flag
37
- */
38
- private buildRouteInfoMap;
39
- /**
40
- * Filter OpenAPI paths based on hideFromDocs and custom routeFilter
36
+ * Filter OpenAPI paths using custom routeFilter
41
37
  */
42
38
  private filterRoutes;
43
- /**
44
- * Get route info by matching path against controller routes
45
- */
46
- private getRouteInfo;
47
39
  /**
48
40
  * Filter unreferenced schemas from OpenAPI spec
49
41
  */
@@ -55,4 +47,4 @@ declare class OpenAPIService {
55
47
  }
56
48
  //#endregion
57
49
  export { OpenAPIService as t };
58
- //# sourceMappingURL=openapi.service-DGnX3Fc4.d.mts.map
50
+ //# sourceMappingURL=openapi.service-Bv_NioM9.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.service-Bv_NioM9.d.mts","names":[],"sources":["../src/openapi/services/openapi.service.ts"],"mappings":";;;;;AA0BA;;;;;;;;;;;;;;cACa,cAAA;EAMH;;;;EAAR,OAAA,CAAQ,GAAA,EAAK,WAAA,CAAY,SAAA,GAAY,SAAA,EAAW,SAAA,GAAY,aAAA;EAqCxC;;;EAApB,cAAA,CAAe,GAAA,EAAK,WAAA,CAAY,SAAA,GAAY,SAAA,EAAW,SAAA;EAAA,QA4C/C,eAAA;EAAA;;;EAAA,QAQA,4BAAA;EA2EA;;;EAAA,QAjDA,YAAA;;;;UAoBA,aAAA;;;;UA6BA,iBAAA;AAAA"}
@@ -1,11 +1,9 @@
1
- import { en as Container } from "../index-BFCxSp_f.mjs";
2
- import { t as Constructor } from "../types-DahElfUw.mjs";
3
- import { t as CronManager } from "../cron-manager-D7imGwUT.mjs";
4
- import { t as ConsumerRegistry } from "../consumer-registry-Bymm6ff4.mjs";
5
- import { c as ParsedOption, i as CommandInput, l as ParsedSignature, o as CommandResult, s as ParsedArgument, t as Application, u as Quarry } from "../application-DfPtIzxF.mjs";
6
- import { t as ModuleRegistry } from "../module-registry-CmjBX6ol.mjs";
7
- import { t as OpenAPIService } from "../openapi.service-DGnX3Fc4.mjs";
8
- import { t as Command } from "../command-TnkPYWta.mjs";
1
+ import { $t as ModuleRegistry, Cr as Container, J as RouteRegistry, X as Application, cn as CommandResult, dn as ParsedSignature, fn as Quarry, ln as ParsedArgument, on as CommandInput, un as ParsedOption } from "../index-DPFqRs8L.mjs";
2
+ import { t as Constructor } from "../types-DIWemRad.mjs";
3
+ import { t as CronManager } from "../cron-manager-RuPtFVLy.mjs";
4
+ import { t as ConsumerRegistry } from "../consumer-registry-Doom7BEh.mjs";
5
+ import { t as OpenAPIService } from "../openapi.service-Bv_NioM9.mjs";
6
+ import { t as Command } from "../command-DsQq56Lp.mjs";
9
7
 
10
8
  //#region src/quarry/commands/api.command.d.ts
11
9
  declare class ApiCommand extends Command {
@@ -117,7 +115,7 @@ declare class McpToolsCommand extends Command {
117
115
  static command: string;
118
116
  static description: string;
119
117
  constructor(app: Application, openAPIService: OpenAPIService);
120
- handle(): number | undefined;
118
+ handle(): Promise<number | undefined>;
121
119
  }
122
120
  //#endregion
123
121
  //#region src/quarry/commands/queue-list.command.d.ts
@@ -130,12 +128,28 @@ declare class QueueListCommand extends Command {
130
128
  }
131
129
  //#endregion
132
130
  //#region src/quarry/commands/route-list.command.d.ts
131
+ /**
132
+ * List all registered routes from RouteRegistry.
133
+ *
134
+ * By default, hidden routes (hideFromDocs) are excluded.
135
+ * Use `--hidden` to include them.
136
+ *
137
+ * @example
138
+ * ```bash
139
+ * quarry route:list
140
+ * quarry route:list --method=GET
141
+ * quarry route:list --path=/users
142
+ * quarry route:list --name=users
143
+ * quarry route:list --hidden
144
+ * ```
145
+ */
133
146
  declare class RouteListCommand extends Command {
134
- private app;
147
+ private registry;
135
148
  static command: string;
136
149
  static description: string;
137
- constructor(app: Application);
150
+ constructor(registry: RouteRegistry);
138
151
  handle(): number | undefined;
152
+ private formatRow;
139
153
  }
140
154
  //#endregion
141
155
  //#region src/quarry/commands/schedule-list.command.d.ts
@@ -161,7 +175,7 @@ declare class CommandNotFoundError extends Error {
161
175
  *
162
176
  * Quarry catches this in `call()` and puts the message into `CommandResult.errors`.
163
177
  * Does NOT extend `ApplicationError` (which requires i18n keys + error codes).
164
- * Not routed through GlobalErrorHandler.
178
+ * Not routed through ExceptionHandler.
165
179
  */
166
180
  declare class CommandError extends Error {
167
181
  constructor(message: string);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/quarry/commands/api.command.ts","../../src/quarry/commands/event-list.command.ts","../../src/quarry/quarry-registry.ts","../../src/quarry/commands/help.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/schedule-list.command.ts","../../src/quarry/errors/command-not-found.error.ts","../../src/quarry/errors/command.error.ts","../../src/quarry/is-command.ts","../../src/quarry/signature-parser.ts","../../src/quarry/usage-generator.ts"],"mappings":";;;;;;;;;;cAMa,UAAA,SAAmB,OAAA;EAAA,QAKqB,GAAA;EAAA,OAJ5C,OAAA;EAAA,OACA,WAAA;EAAA,OACA,OAAA;cAE4C,GAAA,EAAK,WAAA;EAIlD,MAAA,CAAA,GAAU,OAAA;EAAA,QAUF,SAAA;AAAA;;;cCnBH,gBAAA,SAAyB,OAAA;EAAA,QAIkB,OAAA;EAAA,OAH/C,OAAA;EAAA,OACA,WAAA;cAE+C,OAAA,EAAS,cAAA;EAI/D,MAAA,CAAA;AAAA;;;;;;;;;;ADRF;;cEiBa,cAAA,YAA0B,MAAA;EAAA,iBAKqB,SAAA;EAAA,QAJlD,QAAA;EAAA,QACA,UAAA;EAAA,QACA,OAAA;cAEkD,SAAA,EAAW,SAAA;EFtBvC;;;;EE4BxB,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,aAAA;;;;EAiExD,GAAA,CAAI,IAAA;EFpFY;;;EE4FhB,GAAA,CAAI,IAAA,WAAe,WAAA,CAAY,OAAA;;;;EAQ/B,GAAA,CAAA,GAAO,GAAA,SAAY,WAAA,CAAY,OAAA;ED7GH;;;ECoH5B,IAAA,CAAA;IAAU,IAAA;IAAc,WAAA;IAAsB,OAAA;EAAA;EDhHiB;;;EC0IzD,SAAA,CAAU,OAAA;IAAY,UAAA;IAAqB,WAAA;IAAsB,aAAA;EAAA,IAA2B,OAAA;EA7HvF;;;EAwIL,KAAA,CAAM,IAAA,WAAe,OAAA;EA7HM;;;;EAiJjC,QAAA,CAAS,YAAA,EAAc,WAAA,CAAY,OAAA;EAAA,QAkC3B,WAAA;EAAA,QAMA,WAAA;EAAA,QAIA,aAAA;AAAA;;;cCzNG,WAAA,SAAoB,OAAA;EAAA,QAKe,cAAA;EAAA,OAJvC,OAAA;EAAA,OACA,WAAA;EAAA,OACA,OAAA;cAEuC,cAAA,EAAgB,cAAA;EAIxD,MAAA,CAAA,GAAU,OAAA;AAAA;;;cCJL,eAAA,SAAwB,OAAA;EAAA,QAKM,GAAA;EAAA,QACQ,cAAA;EAAA,OAL1C,OAAA;EAAA,OACA,WAAA;cAGkC,GAAA,EAAK,WAAA,EACG,cAAA,EAAgB,cAAA;EAK3D,MAAA,CAAA,GAAU,OAAA;AAAA;;;cCdL,eAAA,SAAwB,OAAA;EAAA,QAKM,GAAA;EAAA,QACQ,cAAA;EAAA,OAL1C,OAAA;EAAA,OACA,WAAA;cAGkC,GAAA,EAAK,WAAA,EACG,cAAA,EAAgB,cAAA;EAKjE,MAAA,CAAA;AAAA;;;cCdW,gBAAA,SAAyB,OAAA;EAAA,QAIoB,SAAA;EAAA,OAHjD,OAAA;EAAA,OACA,WAAA;cAEiD,SAAA,EAAW,gBAAA;EAInE,MAAA,CAAA;AAAA;;;cCRW,gBAAA,SAAyB,OAAA;EAAA,QAIe,GAAA;EAAA,OAH5C,OAAA;EAAA,OACA,WAAA;cAE4C,GAAA,EAAK,WAAA;EAIxD,MAAA,CAAA;AAAA;;;cCRW,mBAAA,SAA4B,OAAA;EAAA,QAIK,IAAA;EAAA,OAHrC,OAAA;EAAA,OACA,WAAA;cAEqC,IAAA,EAAM,WAAA;EAIlD,MAAA,CAAA;AAAA;;;;;;cCVW,oBAAA,SAA6B,KAAA;cAC5B,IAAA;AAAA;;;;;;;;;;cCGD,YAAA,SAAqB,KAAA;cACpB,OAAA;AAAA;;;;;;;;iBCAE,SAAA,CAAU,MAAA,EAAQ,WAAA;;;;;;;;;;;;;AXFlC;iBYQgB,cAAA,CAAe,SAAA,WAAoB,eAAA;;;;;;;;iBCNnC,aAAA,CAAc,SAAA,EAAW,eAAA,EAAiB,WAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/quarry/commands/api.command.ts","../../src/quarry/commands/event-list.command.ts","../../src/quarry/quarry-registry.ts","../../src/quarry/commands/help.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/schedule-list.command.ts","../../src/quarry/errors/command-not-found.error.ts","../../src/quarry/errors/command.error.ts","../../src/quarry/is-command.ts","../../src/quarry/signature-parser.ts","../../src/quarry/usage-generator.ts"],"mappings":";;;;;;;;cAMa,UAAA,SAAmB,OAAA;EAAA,QAKqB,GAAA;EAAA,OAJ5C,OAAA;EAAA,OACA,WAAA;EAAA,OACA,OAAA;cAE4C,GAAA,EAAK,WAAA;EAIlD,MAAA,CAAA,GAAU,OAAA;EAAA,QAUF,SAAA;AAAA;;;cCnBH,gBAAA,SAAyB,OAAA;EAAA,QAIkB,OAAA;EAAA,OAH/C,OAAA;EAAA,OACA,WAAA;cAE+C,OAAA,EAAS,cAAA;EAI/D,MAAA,CAAA;AAAA;;;;;;;ADRF;;;;;cEkBa,cAAA,YAA0B,MAAA;EAAA,iBAKqB,SAAA;EAAA,QAJlD,QAAA;EAAA,QACA,UAAA;EAAA,QACA,OAAA;cAEkD,SAAA,EAAW,SAAA;EFrB9D;;;;EE2BD,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,aAAA;EFpBlD;;;EEqFN,GAAA,CAAI,IAAA;EF3EmB;;;EEmFvB,GAAA,CAAI,IAAA,WAAe,WAAA,CAAY,OAAA;EDtGpB;;;EC8GX,GAAA,CAAA,GAAO,GAAA,SAAY,WAAA,CAAY,OAAA;ED9GK;;;ECqHpC,IAAA,CAAA;IAAU,IAAA;IAAc,WAAA;IAAsB,OAAA;EAAA;ED7GxC;;;ECuIA,SAAA,CAAU,OAAA;IAAY,UAAA;IAAqB,WAAA;IAAsB,aAAA;EAAA,IAA2B,OAAA;EAxH7B;;;EAmI/D,KAAA,CAAM,IAAA,WAAe,OAAA;EApDI;;;;EAwE/B,QAAA,CAAS,YAAA,EAAc,WAAA,CAAY,OAAA;EAAA,QAkC3B,WAAA;EAAA,QAQA,WAAA;EAAA,QAIA,aAAA;AAAA;;;cC5NG,WAAA,SAAoB,OAAA;EAAA,QAKe,cAAA;EAAA,OAJvC,OAAA;EAAA,OACA,WAAA;EAAA,OACA,OAAA;cAEuC,cAAA,EAAgB,cAAA;EAIxD,MAAA,CAAA,GAAU,OAAA;AAAA;;;cCJL,eAAA,SAAwB,OAAA;EAAA,QAKM,GAAA;EAAA,QACQ,cAAA;EAAA,OAL1C,OAAA;EAAA,OACA,WAAA;cAGkC,GAAA,EAAK,WAAA,EACG,cAAA,EAAgB,cAAA;EAK3D,MAAA,CAAA,GAAU,OAAA;AAAA;;;cCdL,eAAA,SAAwB,OAAA;EAAA,QAKM,GAAA;EAAA,QACQ,cAAA;EAAA,OAL1C,OAAA;EAAA,OACA,WAAA;cAGkC,GAAA,EAAK,WAAA,EACG,cAAA,EAAgB,cAAA;EAK3D,MAAA,CAAA,GAAU,OAAA;AAAA;;;cCdL,gBAAA,SAAyB,OAAA;EAAA,QAIoB,SAAA;EAAA,OAHjD,OAAA;EAAA,OACA,WAAA;cAEiD,SAAA,EAAW,gBAAA;EAInE,MAAA,CAAA;AAAA;;;;;;;;;ANPF;;;;;;;;;cOca,gBAAA,SAAyB,OAAA;EAAA,QAIqB,QAAA;EAAA,OAHlD,OAAA;EAAA,OACA,WAAA;cAEkD,QAAA,EAAU,aAAA;EAInE,MAAA,CAAA;EAAA,QAsCQ,SAAA;AAAA;;;cC7DG,mBAAA,SAA4B,OAAA;EAAA,QAIK,IAAA;EAAA,OAHrC,OAAA;EAAA,OACA,WAAA;cAEqC,IAAA,EAAM,WAAA;EAIlD,MAAA,CAAA;AAAA;;;;;;cCVW,oBAAA,SAA6B,KAAA;cAC5B,IAAA;AAAA;;;;;;;;;;cCGD,YAAA,SAAqB,KAAA;cACpB,OAAA;AAAA;;;;;;;;iBCAE,SAAA,CAAU,MAAA,EAAQ,WAAA;;;;;;;;;;AXFlC;;;;iBYQgB,cAAA,CAAe,SAAA,WAAoB,eAAA;;;;;;;;iBCNnC,aAAA,CAAc,SAAA,EAAW,eAAA,EAAiB,WAAA"}
@@ -1,9 +1,5 @@
1
- import "../logger-CGT91VY6.mjs";
2
- import "../events-CvUSgEuN.mjs";
3
- import "../colors-Y7WIFXs7.mjs";
4
- import { n as CommandError, t as Command } from "../command-B1CPgsrU.mjs";
5
- import { t as isCommand } from "../is-command-DJVI6wEJ.mjs";
6
- import "../openapi-tools.service-B3TxYKoQ.mjs";
7
- import { a as QueueListCommand, c as HelpCommand, d as ApiCommand, i as RouteListCommand, l as CommandNotFoundError, n as parseSignature, o as McpToolsCommand, r as ScheduleListCommand, s as McpServeCommand, t as QuarryRegistry, u as EventListCommand } from "../quarry-registry-B2rkO-JS.mjs";
8
- import { t as generateUsage } from "../usage-generator-CVIsENuE.mjs";
1
+ import { n as CommandError, t as Command } from "../command-BgSlsS4M.mjs";
2
+ import { t as isCommand } from "../is-command-C6a7WTPw.mjs";
3
+ import { a as QueueListCommand, c as HelpCommand, d as ApiCommand, i as RouteListCommand, l as CommandNotFoundError, n as parseSignature, o as McpToolsCommand, r as ScheduleListCommand, s as McpServeCommand, t as QuarryRegistry, u as EventListCommand } from "../quarry-registry-DFfRRkA7.mjs";
4
+ import { t as generateUsage } from "../usage-generator-MBcRo0Q2.mjs";
9
5
  export { ApiCommand, Command, CommandError, CommandNotFoundError, EventListCommand, HelpCommand, McpServeCommand, McpToolsCommand, QuarryRegistry, QueueListCommand, RouteListCommand, ScheduleListCommand, generateUsage, isCommand, parseSignature };
@@ -1,8 +1,9 @@
1
- import { a as __decorate, d as Transient, g as DI_TOKENS, o as __decorateParam, s as __decorateMetadata } from "./logger-CGT91VY6.mjs";
2
- import { r as getListenerHandlers } from "./events-CvUSgEuN.mjs";
3
- import { a as green, n as cyan, o as red, s as yellow, t as bold } from "./colors-Y7WIFXs7.mjs";
4
- import { n as CommandError, r as COMMAND_INTERNALS, t as Command } from "./command-B1CPgsrU.mjs";
5
- import { n as OPENAPI_TOKENS, t as OpenApiToolsService } from "./openapi-tools.service-B3TxYKoQ.mjs";
1
+ import { V as ROUTER_TOKENS, r as createCliExceptionContext } from "./errors-B4pYgYON.mjs";
2
+ import { a as __decorate, f as DI_TOKENS, o as __decorateParam, p as Transient, s as __decorateMetadata } from "./logger-V6Ms3QnQ.mjs";
3
+ import { r as getListenerHandlers } from "./events-COKixqnG.mjs";
4
+ import { a as green, n as cyan, o as red, s as yellow, t as bold } from "./colors-DJaRDXoS.mjs";
5
+ import { n as CommandError, r as COMMAND_INTERNALS, t as Command } from "./command-BgSlsS4M.mjs";
6
+ import { n as OPENAPI_TOKENS, t as OpenApiToolsService } from "./openapi-tools.service-CYWGuhue.mjs";
6
7
  import { inject } from "tsyringe";
7
8
  import { z } from "zod";
8
9
  //#region src/quarry/commands/api.command.ts
@@ -44,7 +45,7 @@ let ApiCommand = class ApiCommand extends Command {
44
45
  headers,
45
46
  body: data || void 0
46
47
  });
47
- const response = await this.app.hono.fetch(request, this.app.env);
48
+ const response = await (await this.app.ensureHono()).fetch(request, this.app.env);
48
49
  const body = await response.text();
49
50
  const statusText = `${response.status} ${response.statusText}`;
50
51
  let coloredStatus;
@@ -178,7 +179,8 @@ let McpServeCommand = class McpServeCommand extends Command {
178
179
  const colonIdx = h.indexOf(":");
179
180
  if (colonIdx > 0) headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim();
180
181
  }
181
- const spec = this.openAPIService.getSpec(this.app.hono, this.app.container);
182
+ const hono = await this.app.ensureHono();
183
+ const spec = this.openAPIService.getSpec(hono, this.app.container);
182
184
  const service = new OpenApiToolsService(spec, { dispatcher: baseUrl ? async (method, url, opts) => {
183
185
  const fullUrl = `${baseUrl}${url}`;
184
186
  try {
@@ -205,7 +207,7 @@ let McpServeCommand = class McpServeCommand extends Command {
205
207
  body: opts?.body !== void 0 ? JSON.stringify(opts.body) : void 0
206
208
  });
207
209
  try {
208
- return await this.app.hono.fetch(request, this.app.env);
210
+ return await hono.fetch(request, this.app.env);
209
211
  } catch (error) {
210
212
  throw new Error(`MCP dispatch failed: ${method} ${url} — ${error instanceof Error ? error.message : String(error)}`, { cause: error });
211
213
  }
@@ -266,10 +268,11 @@ let McpToolsCommand = class McpToolsCommand extends Command {
266
268
  this.app = app;
267
269
  this.openAPIService = openAPIService;
268
270
  }
269
- handle() {
271
+ async handle() {
270
272
  const tags = this.array("tag");
271
273
  const pathPrefix = this.string("path");
272
- const service = new OpenApiToolsService(this.openAPIService.getSpec(this.app.hono, this.app.container));
274
+ const hono = await this.app.ensureHono();
275
+ const service = new OpenApiToolsService(this.openAPIService.getSpec(hono, this.app.container));
273
276
  const filter = {
274
277
  tags: tags.length > 0 ? tags : void 0,
275
278
  pathPrefix: pathPrefix || void 0
@@ -320,24 +323,22 @@ QueueListCommand = __decorate([__decorateParam(0, inject(DI_TOKENS.ConsumerRegis
320
323
  //#endregion
321
324
  //#region src/quarry/commands/route-list.command.ts
322
325
  let RouteListCommand = class RouteListCommand extends Command {
323
- static command = "route:list {--method= : Filter by HTTP method} {--path= : Filter by path substring}";
326
+ static command = "route:list {--method= : Filter by HTTP method} {--path= : Filter by path substring} {--name= : Filter by route name} {--hidden : Include hidden routes}";
324
327
  static description = "List all registered routes";
325
- constructor(app) {
328
+ constructor(registry) {
326
329
  super();
327
- this.app = app;
330
+ this.registry = registry;
328
331
  }
329
332
  handle() {
330
333
  const methodFilter = this.string("method").toUpperCase();
331
334
  const pathFilter = this.string("path");
332
- const deduped = /* @__PURE__ */ new Map();
333
- for (const r of this.app.hono.routes) deduped.set(`${r.method}:${r.path}`, {
334
- method: r.method,
335
- path: r.path,
336
- name: r.handler.name
337
- });
338
- let routes = [...deduped.values()].filter((r) => r.name);
335
+ const nameFilter = this.string("name");
336
+ const showHidden = this.boolean("hidden");
337
+ let routes = this.registry.all();
338
+ if (!showHidden) routes = routes.filter((r) => !r.hidden);
339
339
  if (methodFilter) routes = routes.filter((r) => r.method.toUpperCase() === methodFilter);
340
340
  if (pathFilter) routes = routes.filter((r) => r.path.includes(pathFilter));
341
+ if (nameFilter) routes = routes.filter((r) => r.name?.includes(nameFilter));
341
342
  if (routes.length === 0) {
342
343
  this.info("No routes found");
343
344
  return 0;
@@ -345,21 +346,22 @@ let RouteListCommand = class RouteListCommand extends Command {
345
346
  this.table([
346
347
  "Method",
347
348
  "Path",
348
- "Action",
349
- "Type"
350
- ], routes.map((r) => {
351
- const isWs = r.name.startsWith("ws:");
352
- const action = r.name.replace(/^(http|ws):/, "");
353
- return [
354
- r.method.toUpperCase(),
355
- r.path,
356
- action || r.name,
357
- isWs ? "WS" : "HTTP"
358
- ];
359
- }));
349
+ "Name",
350
+ "Handler",
351
+ "Domain"
352
+ ], routes.map((r) => this.formatRow(r)));
353
+ }
354
+ formatRow(route) {
355
+ return [
356
+ route.method.toUpperCase(),
357
+ route.path,
358
+ route.name ?? "-",
359
+ `${route.controller}.${route.action}`,
360
+ route.domain ?? "-"
361
+ ];
360
362
  }
361
363
  };
362
- RouteListCommand = __decorate([__decorateParam(0, inject(DI_TOKENS.Application)), __decorateMetadata("design:paramtypes", [Object])], RouteListCommand);
364
+ RouteListCommand = __decorate([__decorateParam(0, inject(ROUTER_TOKENS.RouteRegistry)), __decorateMetadata("design:paramtypes", [Object])], RouteListCommand);
363
365
  //#endregion
364
366
  //#region src/quarry/commands/schedule-list.command.ts
365
367
  let ScheduleListCommand = class ScheduleListCommand extends Command {
@@ -378,7 +380,7 @@ let ScheduleListCommand = class ScheduleListCommand extends Command {
378
380
  const rows = [];
379
381
  for (const schedule of schedules) {
380
382
  const jobs = this.cron.getJobsForSchedule(schedule);
381
- for (const job of jobs) rows.push([schedule, job.constructor.name]);
383
+ for (const { jobClass } of jobs) rows.push([schedule, jobClass.name]);
382
384
  }
383
385
  this.table(["Schedule", "Job"], rows);
384
386
  }
@@ -566,7 +568,7 @@ let QuarryRegistry = class QuarryRegistry {
566
568
  errors: [error.message]
567
569
  };
568
570
  }
569
- const errorMessage = this.handleError(error);
571
+ const errorMessage = this.handleError(error, resolvedName);
570
572
  if (command) {
571
573
  const result = getCommandResult(command);
572
574
  return {
@@ -624,7 +626,7 @@ let QuarryRegistry = class QuarryRegistry {
624
626
  */
625
627
  async listUsage(options) {
626
628
  const commands = this.list();
627
- const { generateListing } = await import("./usage-generator-CVIsENuE.mjs").then((n) => n.n);
629
+ const { generateListing } = await import("./usage-generator-MBcRo0Q2.mjs").then((n) => n.n);
628
630
  return generateListing(commands, this.signatures, options);
629
631
  }
630
632
  /**
@@ -636,7 +638,7 @@ let QuarryRegistry = class QuarryRegistry {
636
638
  if (!CommandClass) throw new CommandNotFoundError(name);
637
639
  const signature = this.signatures.get(resolvedName);
638
640
  const staticCommand = CommandClass;
639
- const { generateUsage } = await import("./usage-generator-CVIsENuE.mjs").then((n) => n.n);
641
+ const { generateUsage } = await import("./usage-generator-MBcRo0Q2.mjs").then((n) => n.n);
640
642
  return generateUsage(signature, staticCommand.description);
641
643
  }
642
644
  /**
@@ -656,8 +658,11 @@ let QuarryRegistry = class QuarryRegistry {
656
658
  this.signatures.set(name, signature);
657
659
  if (staticCommand.aliases) for (const alias of staticCommand.aliases) this.aliases.set(alias, name);
658
660
  }
659
- handleError(error) {
660
- return this.container.resolve(DI_TOKENS.ErrorHandler).handle(error).message;
661
+ handleError(error, commandName) {
662
+ const handler = this.container.resolve(DI_TOKENS.ExceptionHandler);
663
+ const ctx = createCliExceptionContext(commandName);
664
+ handler.handle(error, ctx);
665
+ return error instanceof Error ? error.message : String(error);
661
666
  }
662
667
  resolveName(name) {
663
668
  return this.aliases.get(name) ?? name;
@@ -680,4 +685,4 @@ QuarryRegistry = __decorate([
680
685
  //#endregion
681
686
  export { QueueListCommand as a, HelpCommand as c, ApiCommand as d, RouteListCommand as i, CommandNotFoundError as l, parseSignature as n, McpToolsCommand as o, ScheduleListCommand as r, McpServeCommand as s, QuarryRegistry as t, EventListCommand as u };
682
687
 
683
- //# sourceMappingURL=quarry-registry-B2rkO-JS.mjs.map
688
+ //# sourceMappingURL=quarry-registry-DFfRRkA7.mjs.map