stratal 0.0.13 → 0.0.15
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.
- package/dist/application-Du0d8O_e.d.mts +116 -0
- package/dist/application-Du0d8O_e.d.mts.map +1 -0
- package/dist/base-email.provider-CNwsPbwm.mjs +42 -0
- package/dist/base-email.provider-CNwsPbwm.mjs.map +1 -0
- package/dist/bin/cloudflare-workers-loader.mjs +34 -0
- package/dist/bin/cloudflare-workers-loader.mjs.map +1 -0
- package/dist/bin/quarry.mjs +164 -0
- package/dist/bin/quarry.mjs.map +1 -0
- package/dist/cache/index.d.mts +219 -0
- package/dist/cache/index.d.mts.map +1 -0
- package/dist/cache/index.mjs +251 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/chunk-D1SwGrFN.mjs +27 -0
- package/dist/command-DG_u5ob2.mjs +192 -0
- package/dist/command-DG_u5ob2.mjs.map +1 -0
- package/dist/command-DcebcSrL.d.mts +120 -0
- package/dist/command-DcebcSrL.d.mts.map +1 -0
- package/dist/config/index.d.mts +273 -0
- package/dist/config/index.d.mts.map +1 -0
- package/dist/config/index.mjs +239 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/cron/index.d.mts +128 -0
- package/dist/cron/index.d.mts.map +1 -0
- package/dist/cron/index.mjs +5 -0
- package/dist/cron-manager-BRh86QCS.mjs +107 -0
- package/dist/cron-manager-BRh86QCS.mjs.map +1 -0
- package/dist/decorate-D5j-d9_z.mjs +171 -0
- package/dist/decorate-D5j-d9_z.mjs.map +1 -0
- package/dist/di/index.d.mts +2 -0
- package/dist/di/index.mjs +4 -0
- package/dist/email/index.d.mts +532 -0
- package/dist/email/index.d.mts.map +1 -0
- package/dist/email/index.mjs +480 -0
- package/dist/email/index.mjs.map +1 -0
- package/dist/en-uVIaxFXR.mjs +319 -0
- package/dist/en-uVIaxFXR.mjs.map +1 -0
- package/dist/errors/index.d.mts +2 -0
- package/dist/errors/index.mjs +4 -0
- package/dist/errors-CtCi1wn6.mjs +707 -0
- package/dist/errors-CtCi1wn6.mjs.map +1 -0
- package/dist/events/index.d.mts +210 -0
- package/dist/events/index.d.mts.map +1 -0
- package/dist/events/index.mjs +4 -0
- package/dist/events-CXl-o1Ad.mjs +191 -0
- package/dist/events-CXl-o1Ad.mjs.map +1 -0
- package/dist/gateway-context-90CQEQDR.mjs +226 -0
- package/dist/gateway-context-90CQEQDR.mjs.map +1 -0
- package/dist/guards/index.d.mts +172 -0
- package/dist/guards/index.d.mts.map +1 -0
- package/dist/guards/index.mjs +2 -0
- package/dist/guards-DMbsAxSX.mjs +151 -0
- package/dist/guards-DMbsAxSX.mjs.map +1 -0
- package/dist/i18n/index.d.mts +3 -0
- package/dist/i18n/index.mjs +15 -0
- package/dist/i18n/messages/en/index.d.mts +2 -0
- package/dist/i18n/messages/en/index.mjs +2 -0
- package/dist/i18n/validation/index.d.mts +4 -0
- package/dist/i18n/validation/index.mjs +3 -0
- package/dist/i18n.module-qNrpIVts.mjs +1791 -0
- package/dist/i18n.module-qNrpIVts.mjs.map +1 -0
- package/dist/index-CSuHOJc3.d.mts +319 -0
- package/dist/index-CSuHOJc3.d.mts.map +1 -0
- package/dist/index-Cfkie8JM.d.mts +263 -0
- package/dist/index-Cfkie8JM.d.mts.map +1 -0
- package/dist/index-CpAN9ENH.d.mts +185 -0
- package/dist/index-CpAN9ENH.d.mts.map +1 -0
- package/dist/index-D69rxo8H.d.mts +2616 -0
- package/dist/index-D69rxo8H.d.mts.map +1 -0
- package/dist/index-H-Su81aK.d.mts +632 -0
- package/dist/index-H-Su81aK.d.mts.map +1 -0
- package/dist/index.d.mts +41 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +20 -0
- package/dist/is-command-MZDCH-0T.mjs +14 -0
- package/dist/is-command-MZDCH-0T.mjs.map +1 -0
- package/dist/is-seeder-BN9Ej1r7.mjs +28 -0
- package/dist/is-seeder-BN9Ej1r7.mjs.map +1 -0
- package/dist/logger/index.d.mts +2 -0
- package/dist/logger/index.mjs +3 -0
- package/dist/logger-BR1-s1Um.mjs +252 -0
- package/dist/logger-BR1-s1Um.mjs.map +1 -0
- package/dist/middleware/index.d.mts +2 -0
- package/dist/middleware/index.mjs +6 -0
- package/dist/middleware-iRhNjsPH.mjs +362 -0
- package/dist/middleware-iRhNjsPH.mjs.map +1 -0
- package/dist/module/index.d.mts +148 -0
- package/dist/module/index.d.mts.map +1 -0
- package/dist/module/index.mjs +11 -0
- package/dist/module-BH7t7BGG.mjs +370 -0
- package/dist/module-BH7t7BGG.mjs.map +1 -0
- package/dist/openapi/index.d.mts +202 -0
- package/dist/openapi/index.d.mts.map +1 -0
- package/dist/openapi/index.mjs +15 -0
- package/dist/quarry/index.d.mts +112 -0
- package/dist/quarry/index.d.mts.map +1 -0
- package/dist/quarry/index.mjs +6 -0
- package/dist/quarry-registry-BPmKVjhG.mjs +302 -0
- package/dist/quarry-registry-BPmKVjhG.mjs.map +1 -0
- package/dist/queue/index.d.mts +2 -0
- package/dist/queue/index.mjs +84 -0
- package/dist/queue/index.mjs.map +1 -0
- package/dist/queue.module-BdXWUvIM.mjs +403 -0
- package/dist/queue.module-BdXWUvIM.mjs.map +1 -0
- package/dist/resend.provider-CQT5be5E.mjs +70 -0
- package/dist/resend.provider-CQT5be5E.mjs.map +1 -0
- package/dist/router/index.d.mts +2 -0
- package/dist/router/index.mjs +15 -0
- package/dist/router-context-BLn4PrRG.mjs +264 -0
- package/dist/router-context-BLn4PrRG.mjs.map +1 -0
- package/dist/seeder/index.d.mts +77 -0
- package/dist/seeder/index.d.mts.map +1 -0
- package/dist/seeder/index.mjs +7 -0
- package/dist/seeder-DatfjJvU.mjs +132 -0
- package/dist/seeder-DatfjJvU.mjs.map +1 -0
- package/dist/smtp.provider-Cj7BUFbJ.mjs +78 -0
- package/dist/smtp.provider-Cj7BUFbJ.mjs.map +1 -0
- package/dist/storage/index.d.mts +743 -0
- package/dist/storage/index.d.mts.map +1 -0
- package/dist/storage/index.mjs +13 -0
- package/dist/storage-BtcfgibD.mjs +787 -0
- package/dist/storage-BtcfgibD.mjs.map +1 -0
- package/dist/stratal-Cm0Yy8v4.mjs +305 -0
- package/dist/stratal-Cm0Yy8v4.mjs.map +1 -0
- package/dist/{types.d.ts → types-Cu4jkeiH.d.mts} +5 -2
- package/dist/types-Cu4jkeiH.d.mts.map +1 -0
- package/dist/types-N84Ak6YT.d.mts +64 -0
- package/dist/types-N84Ak6YT.d.mts.map +1 -0
- package/dist/usage-generator-BTZDk5zx.mjs +75 -0
- package/dist/usage-generator-BTZDk5zx.mjs.map +1 -0
- package/dist/validation-Dbt-snjx.mjs +194 -0
- package/dist/validation-Dbt-snjx.mjs.map +1 -0
- package/dist/websocket/index.d.mts +168 -0
- package/dist/websocket/index.d.mts.map +1 -0
- package/dist/websocket/index.mjs +6 -0
- package/dist/workers/index.d.mts +90 -0
- package/dist/workers/index.d.mts.map +1 -0
- package/dist/workers/index.mjs +122 -0
- package/dist/workers/index.mjs.map +1 -0
- package/package.json +98 -28
- package/dist/application.d.ts +0 -101
- package/dist/application.d.ts.map +0 -1
- package/dist/application.js +0 -230
- package/dist/application.js.map +0 -1
- package/dist/cache/cache.module.d.ts +0 -14
- package/dist/cache/cache.module.d.ts.map +0 -1
- package/dist/cache/cache.module.js +0 -32
- package/dist/cache/cache.module.js.map +0 -1
- package/dist/cache/cache.tokens.d.ts +0 -5
- package/dist/cache/cache.tokens.d.ts.map +0 -1
- package/dist/cache/cache.tokens.js +0 -4
- package/dist/cache/cache.tokens.js.map +0 -1
- package/dist/cache/errors/cache-delete.error.d.ts +0 -11
- package/dist/cache/errors/cache-delete.error.d.ts.map +0 -1
- package/dist/cache/errors/cache-delete.error.js +0 -14
- package/dist/cache/errors/cache-delete.error.js.map +0 -1
- package/dist/cache/errors/cache-get.error.d.ts +0 -11
- package/dist/cache/errors/cache-get.error.d.ts.map +0 -1
- package/dist/cache/errors/cache-get.error.js +0 -14
- package/dist/cache/errors/cache-get.error.js.map +0 -1
- package/dist/cache/errors/cache-list.error.d.ts +0 -10
- package/dist/cache/errors/cache-list.error.d.ts.map +0 -1
- package/dist/cache/errors/cache-list.error.js +0 -13
- package/dist/cache/errors/cache-list.error.js.map +0 -1
- package/dist/cache/errors/cache-put.error.d.ts +0 -11
- package/dist/cache/errors/cache-put.error.d.ts.map +0 -1
- package/dist/cache/errors/cache-put.error.js +0 -14
- package/dist/cache/errors/cache-put.error.js.map +0 -1
- package/dist/cache/errors/index.d.ts +0 -5
- package/dist/cache/errors/index.d.ts.map +0 -1
- package/dist/cache/errors/index.js +0 -5
- package/dist/cache/errors/index.js.map +0 -1
- package/dist/cache/index.d.ts +0 -5
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -5
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/services/cache.service.d.ts +0 -152
- package/dist/cache/services/cache.service.d.ts.map +0 -1
- package/dist/cache/services/cache.service.js +0 -223
- package/dist/cache/services/cache.service.js.map +0 -1
- package/dist/cache/services/index.d.ts +0 -2
- package/dist/cache/services/index.d.ts.map +0 -1
- package/dist/cache/services/index.js +0 -2
- package/dist/cache/services/index.js.map +0 -1
- package/dist/config/config.module.d.ts +0 -79
- package/dist/config/config.module.d.ts.map +0 -1
- package/dist/config/config.module.js +0 -121
- package/dist/config/config.module.js.map +0 -1
- package/dist/config/config.tokens.d.ts +0 -4
- package/dist/config/config.tokens.d.ts.map +0 -1
- package/dist/config/config.tokens.js +0 -4
- package/dist/config/config.tokens.js.map +0 -1
- package/dist/config/config.types.d.ts +0 -68
- package/dist/config/config.types.d.ts.map +0 -1
- package/dist/config/config.types.js +0 -9
- package/dist/config/config.types.js.map +0 -1
- package/dist/config/errors/config-module-not-initialized.error.d.ts +0 -10
- package/dist/config/errors/config-module-not-initialized.error.d.ts.map +0 -1
- package/dist/config/errors/config-module-not-initialized.error.js +0 -12
- package/dist/config/errors/config-module-not-initialized.error.js.map +0 -1
- package/dist/config/errors/config-not-initialized.error.d.ts +0 -12
- package/dist/config/errors/config-not-initialized.error.d.ts.map +0 -1
- package/dist/config/errors/config-not-initialized.error.js +0 -15
- package/dist/config/errors/config-not-initialized.error.js.map +0 -1
- package/dist/config/errors/index.d.ts +0 -3
- package/dist/config/errors/index.d.ts.map +0 -1
- package/dist/config/errors/index.js +0 -3
- package/dist/config/errors/index.js.map +0 -1
- package/dist/config/index.d.ts +0 -7
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -9
- package/dist/config/index.js.map +0 -1
- package/dist/config/register-as.d.ts +0 -62
- package/dist/config/register-as.d.ts.map +0 -1
- package/dist/config/register-as.js +0 -48
- package/dist/config/register-as.js.map +0 -1
- package/dist/config/services/config.service.d.ts +0 -59
- package/dist/config/services/config.service.d.ts.map +0 -1
- package/dist/config/services/config.service.js +0 -140
- package/dist/config/services/config.service.js.map +0 -1
- package/dist/cron/cron-job.d.ts +0 -54
- package/dist/cron/cron-job.d.ts.map +0 -1
- package/dist/cron/cron-job.js +0 -2
- package/dist/cron/cron-job.js.map +0 -1
- package/dist/cron/cron-manager.d.ts +0 -60
- package/dist/cron/cron-manager.d.ts.map +0 -1
- package/dist/cron/cron-manager.js +0 -120
- package/dist/cron/cron-manager.js.map +0 -1
- package/dist/cron/errors/cron-execution.error.d.ts +0 -10
- package/dist/cron/errors/cron-execution.error.d.ts.map +0 -1
- package/dist/cron/errors/cron-execution.error.js +0 -17
- package/dist/cron/errors/cron-execution.error.js.map +0 -1
- package/dist/cron/index.d.ts +0 -4
- package/dist/cron/index.d.ts.map +0 -1
- package/dist/cron/index.js +0 -3
- package/dist/cron/index.js.map +0 -1
- package/dist/di/conditional-binding-builder.d.ts +0 -93
- package/dist/di/conditional-binding-builder.d.ts.map +0 -1
- package/dist/di/conditional-binding-builder.js +0 -115
- package/dist/di/conditional-binding-builder.js.map +0 -1
- package/dist/di/container.d.ts +0 -131
- package/dist/di/container.d.ts.map +0 -1
- package/dist/di/container.js +0 -177
- package/dist/di/container.js.map +0 -1
- package/dist/di/decorators/inject-param.decorator.d.ts +0 -67
- package/dist/di/decorators/inject-param.decorator.d.ts.map +0 -1
- package/dist/di/decorators/inject-param.decorator.js +0 -53
- package/dist/di/decorators/inject-param.decorator.js.map +0 -1
- package/dist/di/decorators.d.ts +0 -57
- package/dist/di/decorators.d.ts.map +0 -1
- package/dist/di/decorators.js +0 -74
- package/dist/di/decorators.js.map +0 -1
- package/dist/di/errors/conditional-binding-fallback.error.d.ts +0 -16
- package/dist/di/errors/conditional-binding-fallback.error.d.ts.map +0 -1
- package/dist/di/errors/conditional-binding-fallback.error.js +0 -19
- package/dist/di/errors/conditional-binding-fallback.error.js.map +0 -1
- package/dist/di/errors/index.d.ts +0 -3
- package/dist/di/errors/index.d.ts.map +0 -1
- package/dist/di/errors/index.js +0 -3
- package/dist/di/errors/index.js.map +0 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.d.ts +0 -11
- package/dist/di/errors/request-scope-operation-not-allowed.error.d.ts.map +0 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.js +0 -14
- package/dist/di/errors/request-scope-operation-not-allowed.error.js.map +0 -1
- package/dist/di/index.d.ts +0 -12
- package/dist/di/index.d.ts.map +0 -1
- package/dist/di/index.js +0 -10
- package/dist/di/index.js.map +0 -1
- package/dist/di/tokens.d.ts +0 -26
- package/dist/di/tokens.d.ts.map +0 -1
- package/dist/di/tokens.js +0 -29
- package/dist/di/tokens.js.map +0 -1
- package/dist/di/types.d.ts +0 -56
- package/dist/di/types.d.ts.map +0 -1
- package/dist/di/types.js +0 -34
- package/dist/di/types.js.map +0 -1
- package/dist/email/consumers/email.consumer.d.ts +0 -43
- package/dist/email/consumers/email.consumer.d.ts.map +0 -1
- package/dist/email/consumers/email.consumer.js +0 -129
- package/dist/email/consumers/email.consumer.js.map +0 -1
- package/dist/email/consumers/index.d.ts +0 -2
- package/dist/email/consumers/index.d.ts.map +0 -1
- package/dist/email/consumers/index.js +0 -2
- package/dist/email/consumers/index.js.map +0 -1
- package/dist/email/contracts/email-attachment.d.ts +0 -61
- package/dist/email/contracts/email-attachment.d.ts.map +0 -1
- package/dist/email/contracts/email-attachment.js +0 -58
- package/dist/email/contracts/email-attachment.js.map +0 -1
- package/dist/email/contracts/email-message.contract.d.ts +0 -58
- package/dist/email/contracts/email-message.contract.d.ts.map +0 -1
- package/dist/email/contracts/email-message.contract.js +0 -62
- package/dist/email/contracts/email-message.contract.js.map +0 -1
- package/dist/email/contracts/index.d.ts +0 -4
- package/dist/email/contracts/index.d.ts.map +0 -1
- package/dist/email/contracts/index.js +0 -4
- package/dist/email/contracts/index.js.map +0 -1
- package/dist/email/contracts/send-email.input.d.ts +0 -72
- package/dist/email/contracts/send-email.input.d.ts.map +0 -1
- package/dist/email/contracts/send-email.input.js +0 -28
- package/dist/email/contracts/send-email.input.js.map +0 -1
- package/dist/email/email.module.d.ts +0 -122
- package/dist/email/email.module.d.ts.map +0 -1
- package/dist/email/email.module.js +0 -129
- package/dist/email/email.module.js.map +0 -1
- package/dist/email/email.tokens.d.ts +0 -33
- package/dist/email/email.tokens.d.ts.map +0 -1
- package/dist/email/email.tokens.js +0 -33
- package/dist/email/email.tokens.js.map +0 -1
- package/dist/email/errors/email-provider-not-supported.error.d.ts +0 -13
- package/dist/email/errors/email-provider-not-supported.error.d.ts.map +0 -1
- package/dist/email/errors/email-provider-not-supported.error.js +0 -15
- package/dist/email/errors/email-provider-not-supported.error.js.map +0 -1
- package/dist/email/errors/email-resend-api-failed.error.d.ts +0 -13
- package/dist/email/errors/email-resend-api-failed.error.d.ts.map +0 -1
- package/dist/email/errors/email-resend-api-failed.error.js +0 -15
- package/dist/email/errors/email-resend-api-failed.error.js.map +0 -1
- package/dist/email/errors/email-smtp-connection-failed.error.d.ts +0 -13
- package/dist/email/errors/email-smtp-connection-failed.error.d.ts.map +0 -1
- package/dist/email/errors/email-smtp-connection-failed.error.js +0 -15
- package/dist/email/errors/email-smtp-connection-failed.error.js.map +0 -1
- package/dist/email/errors/index.d.ts +0 -7
- package/dist/email/errors/index.d.ts.map +0 -1
- package/dist/email/errors/index.js +0 -7
- package/dist/email/errors/index.js.map +0 -1
- package/dist/email/errors/resend-api-key-missing.error.d.ts +0 -13
- package/dist/email/errors/resend-api-key-missing.error.d.ts.map +0 -1
- package/dist/email/errors/resend-api-key-missing.error.js +0 -15
- package/dist/email/errors/resend-api-key-missing.error.js.map +0 -1
- package/dist/email/errors/smtp-configuration-missing.error.d.ts +0 -13
- package/dist/email/errors/smtp-configuration-missing.error.d.ts.map +0 -1
- package/dist/email/errors/smtp-configuration-missing.error.js +0 -15
- package/dist/email/errors/smtp-configuration-missing.error.js.map +0 -1
- package/dist/email/errors/smtp-host-missing.error.d.ts +0 -13
- package/dist/email/errors/smtp-host-missing.error.d.ts.map +0 -1
- package/dist/email/errors/smtp-host-missing.error.js +0 -15
- package/dist/email/errors/smtp-host-missing.error.js.map +0 -1
- package/dist/email/index.d.ts +0 -6
- package/dist/email/index.d.ts.map +0 -1
- package/dist/email/index.js +0 -8
- package/dist/email/index.js.map +0 -1
- package/dist/email/providers/base-email.provider.d.ts +0 -22
- package/dist/email/providers/base-email.provider.d.ts.map +0 -1
- package/dist/email/providers/base-email.provider.js +0 -43
- package/dist/email/providers/base-email.provider.js.map +0 -1
- package/dist/email/providers/email-provider.interface.d.ts +0 -66
- package/dist/email/providers/email-provider.interface.d.ts.map +0 -1
- package/dist/email/providers/email-provider.interface.js +0 -2
- package/dist/email/providers/email-provider.interface.js.map +0 -1
- package/dist/email/providers/index.d.ts +0 -5
- package/dist/email/providers/index.d.ts.map +0 -1
- package/dist/email/providers/index.js +0 -5
- package/dist/email/providers/index.js.map +0 -1
- package/dist/email/providers/resend.provider.d.ts +0 -26
- package/dist/email/providers/resend.provider.d.ts.map +0 -1
- package/dist/email/providers/resend.provider.js +0 -84
- package/dist/email/providers/resend.provider.js.map +0 -1
- package/dist/email/providers/smtp.provider.d.ts +0 -25
- package/dist/email/providers/smtp.provider.d.ts.map +0 -1
- package/dist/email/providers/smtp.provider.js +0 -86
- package/dist/email/providers/smtp.provider.js.map +0 -1
- package/dist/email/services/email-provider-factory.d.ts +0 -24
- package/dist/email/services/email-provider-factory.d.ts.map +0 -1
- package/dist/email/services/email-provider-factory.js +0 -59
- package/dist/email/services/email-provider-factory.js.map +0 -1
- package/dist/email/services/email.service.d.ts +0 -51
- package/dist/email/services/email.service.d.ts.map +0 -1
- package/dist/email/services/email.service.js +0 -75
- package/dist/email/services/email.service.js.map +0 -1
- package/dist/email/services/index.d.ts +0 -3
- package/dist/email/services/index.d.ts.map +0 -1
- package/dist/email/services/index.js +0 -3
- package/dist/email/services/index.js.map +0 -1
- package/dist/env.d.ts +0 -21
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js +0 -2
- package/dist/env.js.map +0 -1
- package/dist/errors/application-error.d.ts +0 -87
- package/dist/errors/application-error.d.ts.map +0 -1
- package/dist/errors/application-error.js +0 -130
- package/dist/errors/application-error.js.map +0 -1
- package/dist/errors/error-codes.d.ts +0 -202
- package/dist/errors/error-codes.d.ts.map +0 -1
- package/dist/errors/error-codes.js +0 -184
- package/dist/errors/error-codes.js.map +0 -1
- package/dist/errors/error-response.d.ts +0 -32
- package/dist/errors/error-response.d.ts.map +0 -1
- package/dist/errors/error-response.js +0 -14
- package/dist/errors/error-response.js.map +0 -1
- package/dist/errors/get-http-status.d.ts +0 -12
- package/dist/errors/get-http-status.d.ts.map +0 -1
- package/dist/errors/get-http-status.js +0 -62
- package/dist/errors/get-http-status.js.map +0 -1
- package/dist/errors/global-error-handler.d.ts +0 -81
- package/dist/errors/global-error-handler.d.ts.map +0 -1
- package/dist/errors/global-error-handler.js +0 -176
- package/dist/errors/global-error-handler.js.map +0 -1
- package/dist/errors/index.d.ts +0 -10
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -10
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/internal-error.d.ts +0 -16
- package/dist/errors/internal-error.d.ts.map +0 -1
- package/dist/errors/internal-error.js +0 -19
- package/dist/errors/internal-error.js.map +0 -1
- package/dist/errors/is-application-error.d.ts +0 -9
- package/dist/errors/is-application-error.d.ts.map +0 -1
- package/dist/errors/is-application-error.js +0 -11
- package/dist/errors/is-application-error.js.map +0 -1
- package/dist/errors/request-container-not-initialized.error.d.ts +0 -12
- package/dist/errors/request-container-not-initialized.error.d.ts.map +0 -1
- package/dist/errors/request-container-not-initialized.error.js +0 -15
- package/dist/errors/request-container-not-initialized.error.js.map +0 -1
- package/dist/errors/stratal-not-initialized.error.d.ts +0 -11
- package/dist/errors/stratal-not-initialized.error.d.ts.map +0 -1
- package/dist/errors/stratal-not-initialized.error.js +0 -14
- package/dist/errors/stratal-not-initialized.error.js.map +0 -1
- package/dist/events/constants.d.ts +0 -11
- package/dist/events/constants.d.ts.map +0 -1
- package/dist/events/constants.js +0 -11
- package/dist/events/constants.js.map +0 -1
- package/dist/events/decorators/index.d.ts +0 -3
- package/dist/events/decorators/index.d.ts.map +0 -1
- package/dist/events/decorators/index.js +0 -3
- package/dist/events/decorators/index.js.map +0 -1
- package/dist/events/decorators/listener.decorator.d.ts +0 -24
- package/dist/events/decorators/listener.decorator.d.ts.map +0 -1
- package/dist/events/decorators/listener.decorator.js +0 -33
- package/dist/events/decorators/listener.decorator.js.map +0 -1
- package/dist/events/decorators/on.decorator.d.ts +0 -28
- package/dist/events/decorators/on.decorator.d.ts.map +0 -1
- package/dist/events/decorators/on.decorator.js +0 -41
- package/dist/events/decorators/on.decorator.js.map +0 -1
- package/dist/events/event-registry.d.ts +0 -26
- package/dist/events/event-registry.d.ts.map +0 -1
- package/dist/events/event-registry.js +0 -156
- package/dist/events/event-registry.js.map +0 -1
- package/dist/events/index.d.ts +0 -5
- package/dist/events/index.d.ts.map +0 -1
- package/dist/events/index.js +0 -4
- package/dist/events/index.js.map +0 -1
- package/dist/events/types.d.ts +0 -116
- package/dist/events/types.d.ts.map +0 -1
- package/dist/events/types.js +0 -23
- package/dist/events/types.js.map +0 -1
- package/dist/execution-context.d.ts +0 -4
- package/dist/execution-context.d.ts.map +0 -1
- package/dist/execution-context.js +0 -2
- package/dist/execution-context.js.map +0 -1
- package/dist/guards/guard-execution.service.d.ts +0 -37
- package/dist/guards/guard-execution.service.d.ts.map +0 -1
- package/dist/guards/guard-execution.service.js +0 -74
- package/dist/guards/guard-execution.service.js.map +0 -1
- package/dist/guards/index.d.ts +0 -12
- package/dist/guards/index.d.ts.map +0 -1
- package/dist/guards/index.js +0 -12
- package/dist/guards/index.js.map +0 -1
- package/dist/guards/types.d.ts +0 -60
- package/dist/guards/types.d.ts.map +0 -1
- package/dist/guards/types.js +0 -5
- package/dist/guards/types.js.map +0 -1
- package/dist/guards/use-guards.decorator.d.ts +0 -73
- package/dist/guards/use-guards.decorator.d.ts.map +0 -1
- package/dist/guards/use-guards.decorator.js +0 -89
- package/dist/guards/use-guards.decorator.js.map +0 -1
- package/dist/i18n/errors/index.d.ts +0 -6
- package/dist/i18n/errors/index.d.ts.map +0 -1
- package/dist/i18n/errors/index.js +0 -6
- package/dist/i18n/errors/index.js.map +0 -1
- package/dist/i18n/errors/locale-not-supported.error.d.ts +0 -12
- package/dist/i18n/errors/locale-not-supported.error.d.ts.map +0 -1
- package/dist/i18n/errors/locale-not-supported.error.js +0 -15
- package/dist/i18n/errors/locale-not-supported.error.js.map +0 -1
- package/dist/i18n/errors/translation-missing.error.d.ts +0 -12
- package/dist/i18n/errors/translation-missing.error.d.ts.map +0 -1
- package/dist/i18n/errors/translation-missing.error.js +0 -14
- package/dist/i18n/errors/translation-missing.error.js.map +0 -1
- package/dist/i18n/i18n.module.d.ts +0 -60
- package/dist/i18n/i18n.module.d.ts.map +0 -1
- package/dist/i18n/i18n.module.js +0 -103
- package/dist/i18n/i18n.module.js.map +0 -1
- package/dist/i18n/i18n.options.d.ts +0 -60
- package/dist/i18n/i18n.options.d.ts.map +0 -1
- package/dist/i18n/i18n.options.js +0 -18
- package/dist/i18n/i18n.options.js.map +0 -1
- package/dist/i18n/i18n.tokens.d.ts +0 -13
- package/dist/i18n/i18n.tokens.d.ts.map +0 -1
- package/dist/i18n/i18n.tokens.js +0 -13
- package/dist/i18n/i18n.tokens.js.map +0 -1
- package/dist/i18n/i18n.types.d.ts +0 -78
- package/dist/i18n/i18n.types.d.ts.map +0 -1
- package/dist/i18n/i18n.types.js +0 -8
- package/dist/i18n/i18n.types.js.map +0 -1
- package/dist/i18n/index.d.ts +0 -12
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js +0 -12
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/messages/en/common.d.ts +0 -19
- package/dist/i18n/messages/en/common.d.ts.map +0 -1
- package/dist/i18n/messages/en/common.js +0 -19
- package/dist/i18n/messages/en/common.js.map +0 -1
- package/dist/i18n/messages/en/emails.d.ts +0 -12
- package/dist/i18n/messages/en/emails.d.ts.map +0 -1
- package/dist/i18n/messages/en/emails.js +0 -12
- package/dist/i18n/messages/en/emails.js.map +0 -1
- package/dist/i18n/messages/en/errors.d.ts +0 -113
- package/dist/i18n/messages/en/errors.d.ts.map +0 -1
- package/dist/i18n/messages/en/errors.js +0 -130
- package/dist/i18n/messages/en/errors.js.map +0 -1
- package/dist/i18n/messages/en/index.d.ts +0 -13
- package/dist/i18n/messages/en/index.d.ts.map +0 -1
- package/dist/i18n/messages/en/index.js +0 -13
- package/dist/i18n/messages/en/index.js.map +0 -1
- package/dist/i18n/messages/en/validation.d.ts +0 -38
- package/dist/i18n/messages/en/validation.d.ts.map +0 -1
- package/dist/i18n/messages/en/validation.js +0 -38
- package/dist/i18n/messages/en/validation.js.map +0 -1
- package/dist/i18n/messages/en/zod.d.ts +0 -125
- package/dist/i18n/messages/en/zod.d.ts.map +0 -1
- package/dist/i18n/messages/en/zod.js +0 -132
- package/dist/i18n/messages/en/zod.js.map +0 -1
- package/dist/i18n/messages/index.d.ts +0 -27
- package/dist/i18n/messages/index.d.ts.map +0 -1
- package/dist/i18n/messages/index.js +0 -25
- package/dist/i18n/messages/index.js.map +0 -1
- package/dist/i18n/middleware/i18n-context.middleware.d.ts +0 -15
- package/dist/i18n/middleware/i18n-context.middleware.d.ts.map +0 -1
- package/dist/i18n/middleware/i18n-context.middleware.js +0 -42
- package/dist/i18n/middleware/i18n-context.middleware.js.map +0 -1
- package/dist/i18n/middleware/index.d.ts +0 -6
- package/dist/i18n/middleware/index.d.ts.map +0 -1
- package/dist/i18n/middleware/index.js +0 -6
- package/dist/i18n/middleware/index.js.map +0 -1
- package/dist/i18n/middleware/locale-extraction.middleware.d.ts +0 -19
- package/dist/i18n/middleware/locale-extraction.middleware.d.ts.map +0 -1
- package/dist/i18n/middleware/locale-extraction.middleware.js +0 -49
- package/dist/i18n/middleware/locale-extraction.middleware.js.map +0 -1
- package/dist/i18n/services/i18n.service.d.ts +0 -50
- package/dist/i18n/services/i18n.service.d.ts.map +0 -1
- package/dist/i18n/services/i18n.service.js +0 -82
- package/dist/i18n/services/i18n.service.js.map +0 -1
- package/dist/i18n/services/message-loader.service.d.ts +0 -65
- package/dist/i18n/services/message-loader.service.d.ts.map +0 -1
- package/dist/i18n/services/message-loader.service.js +0 -175
- package/dist/i18n/services/message-loader.service.js.map +0 -1
- package/dist/i18n/setup.d.ts +0 -27
- package/dist/i18n/setup.d.ts.map +0 -1
- package/dist/i18n/setup.js +0 -40
- package/dist/i18n/setup.js.map +0 -1
- package/dist/i18n/validation/index.d.ts +0 -9
- package/dist/i18n/validation/index.d.ts.map +0 -1
- package/dist/i18n/validation/index.js +0 -10
- package/dist/i18n/validation/index.js.map +0 -1
- package/dist/i18n/validation/validation.context.d.ts +0 -34
- package/dist/i18n/validation/validation.context.d.ts.map +0 -1
- package/dist/i18n/validation/validation.context.js +0 -42
- package/dist/i18n/validation/validation.context.js.map +0 -1
- package/dist/i18n/validation/validation.error-map.d.ts +0 -8
- package/dist/i18n/validation/validation.error-map.d.ts.map +0 -1
- package/dist/i18n/validation/validation.error-map.js +0 -158
- package/dist/i18n/validation/validation.error-map.js.map +0 -1
- package/dist/i18n/validation/validation.types.d.ts +0 -44
- package/dist/i18n/validation/validation.types.d.ts.map +0 -1
- package/dist/i18n/validation/validation.types.js +0 -2
- package/dist/i18n/validation/validation.types.js.map +0 -1
- package/dist/i18n/validation/with-i18n.d.ts +0 -29
- package/dist/i18n/validation/with-i18n.d.ts.map +0 -1
- package/dist/i18n/validation/with-i18n.js +0 -40
- package/dist/i18n/validation/with-i18n.js.map +0 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/logger/contracts/index.d.ts +0 -4
- package/dist/logger/contracts/index.d.ts.map +0 -1
- package/dist/logger/contracts/index.js +0 -4
- package/dist/logger/contracts/index.js.map +0 -1
- package/dist/logger/contracts/log-context.d.ts +0 -14
- package/dist/logger/contracts/log-context.d.ts.map +0 -1
- package/dist/logger/contracts/log-context.js +0 -2
- package/dist/logger/contracts/log-context.js.map +0 -1
- package/dist/logger/contracts/log-entry.d.ts +0 -17
- package/dist/logger/contracts/log-entry.d.ts.map +0 -1
- package/dist/logger/contracts/log-entry.js +0 -2
- package/dist/logger/contracts/log-entry.js.map +0 -1
- package/dist/logger/contracts/log-level.d.ts +0 -16
- package/dist/logger/contracts/log-level.d.ts.map +0 -1
- package/dist/logger/contracts/log-level.js +0 -22
- package/dist/logger/contracts/log-level.js.map +0 -1
- package/dist/logger/formatters/formatter.interface.d.ts +0 -14
- package/dist/logger/formatters/formatter.interface.d.ts.map +0 -1
- package/dist/logger/formatters/formatter.interface.js +0 -2
- package/dist/logger/formatters/formatter.interface.js.map +0 -1
- package/dist/logger/formatters/index.d.ts +0 -4
- package/dist/logger/formatters/index.d.ts.map +0 -1
- package/dist/logger/formatters/index.js +0 -4
- package/dist/logger/formatters/index.js.map +0 -1
- package/dist/logger/formatters/json-formatter.d.ts +0 -21
- package/dist/logger/formatters/json-formatter.d.ts.map +0 -1
- package/dist/logger/formatters/json-formatter.js +0 -27
- package/dist/logger/formatters/json-formatter.js.map +0 -1
- package/dist/logger/formatters/pretty-formatter.d.ts +0 -18
- package/dist/logger/formatters/pretty-formatter.d.ts.map +0 -1
- package/dist/logger/formatters/pretty-formatter.js +0 -41
- package/dist/logger/formatters/pretty-formatter.js.map +0 -1
- package/dist/logger/index.d.ts +0 -7
- package/dist/logger/index.d.ts.map +0 -1
- package/dist/logger/index.js +0 -10
- package/dist/logger/index.js.map +0 -1
- package/dist/logger/logger.tokens.d.ts +0 -29
- package/dist/logger/logger.tokens.d.ts.map +0 -1
- package/dist/logger/logger.tokens.js +0 -29
- package/dist/logger/logger.tokens.js.map +0 -1
- package/dist/logger/services/index.d.ts +0 -2
- package/dist/logger/services/index.d.ts.map +0 -1
- package/dist/logger/services/index.js +0 -2
- package/dist/logger/services/index.js.map +0 -1
- package/dist/logger/services/logger.service.d.ts +0 -73
- package/dist/logger/services/logger.service.d.ts.map +0 -1
- package/dist/logger/services/logger.service.js +0 -156
- package/dist/logger/services/logger.service.js.map +0 -1
- package/dist/logger/transports/base-transport.d.ts +0 -24
- package/dist/logger/transports/base-transport.d.ts.map +0 -1
- package/dist/logger/transports/base-transport.js +0 -23
- package/dist/logger/transports/base-transport.js.map +0 -1
- package/dist/logger/transports/console-transport.d.ts +0 -19
- package/dist/logger/transports/console-transport.d.ts.map +0 -1
- package/dist/logger/transports/console-transport.js +0 -53
- package/dist/logger/transports/console-transport.js.map +0 -1
- package/dist/logger/transports/index.d.ts +0 -4
- package/dist/logger/transports/index.d.ts.map +0 -1
- package/dist/logger/transports/index.js +0 -4
- package/dist/logger/transports/index.js.map +0 -1
- package/dist/logger/transports/transport.interface.d.ts +0 -21
- package/dist/logger/transports/transport.interface.d.ts.map +0 -1
- package/dist/logger/transports/transport.interface.js +0 -2
- package/dist/logger/transports/transport.interface.js.map +0 -1
- package/dist/middleware/index.d.ts +0 -24
- package/dist/middleware/index.d.ts.map +0 -1
- package/dist/middleware/index.js +0 -23
- package/dist/middleware/index.js.map +0 -1
- package/dist/middleware/middleware-configuration.service.d.ts +0 -70
- package/dist/middleware/middleware-configuration.service.d.ts.map +0 -1
- package/dist/middleware/middleware-configuration.service.js +0 -239
- package/dist/middleware/middleware-configuration.service.js.map +0 -1
- package/dist/middleware/middleware-consumer.d.ts +0 -57
- package/dist/middleware/middleware-consumer.d.ts.map +0 -1
- package/dist/middleware/middleware-consumer.js +0 -130
- package/dist/middleware/middleware-consumer.js.map +0 -1
- package/dist/middleware/types.d.ts +0 -96
- package/dist/middleware/types.d.ts.map +0 -1
- package/dist/middleware/types.js +0 -2
- package/dist/middleware/types.js.map +0 -1
- package/dist/module/errors/index.d.ts +0 -5
- package/dist/module/errors/index.d.ts.map +0 -1
- package/dist/module/errors/index.js +0 -5
- package/dist/module/errors/index.js.map +0 -1
- package/dist/module/errors/invalid-module-provider.error.d.ts +0 -11
- package/dist/module/errors/invalid-module-provider.error.d.ts.map +0 -1
- package/dist/module/errors/invalid-module-provider.error.js +0 -13
- package/dist/module/errors/invalid-module-provider.error.js.map +0 -1
- package/dist/module/errors/module-already-registered.error.d.ts +0 -11
- package/dist/module/errors/module-already-registered.error.d.ts.map +0 -1
- package/dist/module/errors/module-already-registered.error.js +0 -13
- package/dist/module/errors/module-already-registered.error.js.map +0 -1
- package/dist/module/errors/module-circular-dependency.error.d.ts +0 -11
- package/dist/module/errors/module-circular-dependency.error.d.ts.map +0 -1
- package/dist/module/errors/module-circular-dependency.error.js +0 -14
- package/dist/module/errors/module-circular-dependency.error.js.map +0 -1
- package/dist/module/errors/module-dependency-not-found.error.d.ts +0 -11
- package/dist/module/errors/module-dependency-not-found.error.d.ts.map +0 -1
- package/dist/module/errors/module-dependency-not-found.error.js +0 -13
- package/dist/module/errors/module-dependency-not-found.error.js.map +0 -1
- package/dist/module/index.d.ts +0 -4
- package/dist/module/index.d.ts.map +0 -1
- package/dist/module/index.js +0 -7
- package/dist/module/index.js.map +0 -1
- package/dist/module/module-registry.d.ts +0 -110
- package/dist/module/module-registry.d.ts.map +0 -1
- package/dist/module/module-registry.js +0 -299
- package/dist/module/module-registry.js.map +0 -1
- package/dist/module/module.decorator.d.ts +0 -34
- package/dist/module/module.decorator.d.ts.map +0 -1
- package/dist/module/module.decorator.js +0 -107
- package/dist/module/module.decorator.js.map +0 -1
- package/dist/module/types.d.ts +0 -240
- package/dist/module/types.d.ts.map +0 -1
- package/dist/module/types.js +0 -8
- package/dist/module/types.js.map +0 -1
- package/dist/openapi/index.d.ts +0 -5
- package/dist/openapi/index.d.ts.map +0 -1
- package/dist/openapi/index.js +0 -7
- package/dist/openapi/index.js.map +0 -1
- package/dist/openapi/openapi.module.d.ts +0 -52
- package/dist/openapi/openapi.module.d.ts.map +0 -1
- package/dist/openapi/openapi.module.js +0 -109
- package/dist/openapi/openapi.module.js.map +0 -1
- package/dist/openapi/openapi.tokens.d.ts +0 -12
- package/dist/openapi/openapi.tokens.d.ts.map +0 -1
- package/dist/openapi/openapi.tokens.js +0 -12
- package/dist/openapi/openapi.tokens.js.map +0 -1
- package/dist/openapi/services/index.d.ts +0 -3
- package/dist/openapi/services/index.d.ts.map +0 -1
- package/dist/openapi/services/index.js +0 -3
- package/dist/openapi/services/index.js.map +0 -1
- package/dist/openapi/services/openapi-config.service.d.ts +0 -43
- package/dist/openapi/services/openapi-config.service.d.ts.map +0 -1
- package/dist/openapi/services/openapi-config.service.js +0 -98
- package/dist/openapi/services/openapi-config.service.js.map +0 -1
- package/dist/openapi/services/openapi.service.d.ts +0 -52
- package/dist/openapi/services/openapi.service.d.ts.map +0 -1
- package/dist/openapi/services/openapi.service.js +0 -231
- package/dist/openapi/services/openapi.service.js.map +0 -1
- package/dist/openapi/types.d.ts +0 -84
- package/dist/openapi/types.d.ts.map +0 -1
- package/dist/openapi/types.js +0 -2
- package/dist/openapi/types.js.map +0 -1
- package/dist/queue/consumer-registry.d.ts +0 -77
- package/dist/queue/consumer-registry.d.ts.map +0 -1
- package/dist/queue/consumer-registry.js +0 -110
- package/dist/queue/consumer-registry.js.map +0 -1
- package/dist/queue/decorators/index.d.ts +0 -2
- package/dist/queue/decorators/index.d.ts.map +0 -1
- package/dist/queue/decorators/index.js +0 -2
- package/dist/queue/decorators/index.js.map +0 -1
- package/dist/queue/decorators/inject-queue.decorator.d.ts +0 -31
- package/dist/queue/decorators/inject-queue.decorator.d.ts.map +0 -1
- package/dist/queue/decorators/inject-queue.decorator.js +0 -33
- package/dist/queue/decorators/inject-queue.decorator.js.map +0 -1
- package/dist/queue/errors/index.d.ts +0 -3
- package/dist/queue/errors/index.d.ts.map +0 -1
- package/dist/queue/errors/index.js +0 -3
- package/dist/queue/errors/index.js.map +0 -1
- package/dist/queue/errors/queue-binding-not-found.error.d.ts +0 -12
- package/dist/queue/errors/queue-binding-not-found.error.d.ts.map +0 -1
- package/dist/queue/errors/queue-binding-not-found.error.js +0 -14
- package/dist/queue/errors/queue-binding-not-found.error.js.map +0 -1
- package/dist/queue/errors/queue-provider-not-supported.error.d.ts +0 -13
- package/dist/queue/errors/queue-provider-not-supported.error.d.ts.map +0 -1
- package/dist/queue/errors/queue-provider-not-supported.error.js +0 -15
- package/dist/queue/errors/queue-provider-not-supported.error.js.map +0 -1
- package/dist/queue/index.d.ts +0 -14
- package/dist/queue/index.d.ts.map +0 -1
- package/dist/queue/index.js +0 -21
- package/dist/queue/index.js.map +0 -1
- package/dist/queue/providers/cloudflare-queue.provider.d.ts +0 -42
- package/dist/queue/providers/cloudflare-queue.provider.d.ts.map +0 -1
- package/dist/queue/providers/cloudflare-queue.provider.js +0 -73
- package/dist/queue/providers/cloudflare-queue.provider.js.map +0 -1
- package/dist/queue/providers/index.d.ts +0 -4
- package/dist/queue/providers/index.d.ts.map +0 -1
- package/dist/queue/providers/index.js +0 -4
- package/dist/queue/providers/index.js.map +0 -1
- package/dist/queue/providers/queue-provider.interface.d.ts +0 -34
- package/dist/queue/providers/queue-provider.interface.d.ts.map +0 -1
- package/dist/queue/providers/queue-provider.interface.js +0 -2
- package/dist/queue/providers/queue-provider.interface.js.map +0 -1
- package/dist/queue/providers/sync-queue.provider.d.ts +0 -48
- package/dist/queue/providers/sync-queue.provider.d.ts.map +0 -1
- package/dist/queue/providers/sync-queue.provider.js +0 -89
- package/dist/queue/providers/sync-queue.provider.js.map +0 -1
- package/dist/queue/queue-consumer.d.ts +0 -62
- package/dist/queue/queue-consumer.d.ts.map +0 -1
- package/dist/queue/queue-consumer.js +0 -2
- package/dist/queue/queue-consumer.js.map +0 -1
- package/dist/queue/queue-manager.d.ts +0 -36
- package/dist/queue/queue-manager.d.ts.map +0 -1
- package/dist/queue/queue-manager.js +0 -80
- package/dist/queue/queue-manager.js.map +0 -1
- package/dist/queue/queue-name.d.ts +0 -50
- package/dist/queue/queue-name.d.ts.map +0 -1
- package/dist/queue/queue-name.js +0 -21
- package/dist/queue/queue-name.js.map +0 -1
- package/dist/queue/queue-registry.d.ts +0 -46
- package/dist/queue/queue-registry.d.ts.map +0 -1
- package/dist/queue/queue-registry.js +0 -78
- package/dist/queue/queue-registry.js.map +0 -1
- package/dist/queue/queue-sender.d.ts +0 -38
- package/dist/queue/queue-sender.d.ts.map +0 -1
- package/dist/queue/queue-sender.interface.d.ts +0 -46
- package/dist/queue/queue-sender.interface.d.ts.map +0 -1
- package/dist/queue/queue-sender.interface.js +0 -2
- package/dist/queue/queue-sender.interface.js.map +0 -1
- package/dist/queue/queue-sender.js +0 -54
- package/dist/queue/queue-sender.js.map +0 -1
- package/dist/queue/queue.module.d.ts +0 -80
- package/dist/queue/queue.module.d.ts.map +0 -1
- package/dist/queue/queue.module.js +0 -113
- package/dist/queue/queue.module.js.map +0 -1
- package/dist/queue/queue.tokens.d.ts +0 -7
- package/dist/queue/queue.tokens.d.ts.map +0 -1
- package/dist/queue/queue.tokens.js +0 -6
- package/dist/queue/queue.tokens.js.map +0 -1
- package/dist/queue/services/index.d.ts +0 -2
- package/dist/queue/services/index.d.ts.map +0 -1
- package/dist/queue/services/index.js +0 -2
- package/dist/queue/services/index.js.map +0 -1
- package/dist/queue/services/queue-provider-factory.d.ts +0 -41
- package/dist/queue/services/queue-provider-factory.d.ts.map +0 -1
- package/dist/queue/services/queue-provider-factory.js +0 -78
- package/dist/queue/services/queue-provider-factory.js.map +0 -1
- package/dist/router/constants.d.ts +0 -87
- package/dist/router/constants.d.ts.map +0 -1
- package/dist/router/constants.js +0 -69
- package/dist/router/constants.js.map +0 -1
- package/dist/router/controller.d.ts +0 -56
- package/dist/router/controller.d.ts.map +0 -1
- package/dist/router/controller.js +0 -2
- package/dist/router/controller.js.map +0 -1
- package/dist/router/decorators/controller.decorator.d.ts +0 -46
- package/dist/router/decorators/controller.decorator.d.ts.map +0 -1
- package/dist/router/decorators/controller.decorator.js +0 -70
- package/dist/router/decorators/controller.decorator.js.map +0 -1
- package/dist/router/decorators/http-method.decorator.d.ts +0 -83
- package/dist/router/decorators/http-method.decorator.d.ts.map +0 -1
- package/dist/router/decorators/http-method.decorator.js +0 -113
- package/dist/router/decorators/http-method.decorator.js.map +0 -1
- package/dist/router/decorators/index.d.ts +0 -4
- package/dist/router/decorators/index.d.ts.map +0 -1
- package/dist/router/decorators/index.js +0 -6
- package/dist/router/decorators/index.js.map +0 -1
- package/dist/router/decorators/route.decorator.d.ts +0 -90
- package/dist/router/decorators/route.decorator.d.ts.map +0 -1
- package/dist/router/decorators/route.decorator.js +0 -102
- package/dist/router/decorators/route.decorator.js.map +0 -1
- package/dist/router/errors/controller-method-not-found.error.d.ts +0 -11
- package/dist/router/errors/controller-method-not-found.error.d.ts.map +0 -1
- package/dist/router/errors/controller-method-not-found.error.js +0 -13
- package/dist/router/errors/controller-method-not-found.error.js.map +0 -1
- package/dist/router/errors/controller-registration.error.d.ts +0 -15
- package/dist/router/errors/controller-registration.error.d.ts.map +0 -1
- package/dist/router/errors/controller-registration.error.js +0 -20
- package/dist/router/errors/controller-registration.error.js.map +0 -1
- package/dist/router/errors/hono-app-already-configured.error.d.ts +0 -10
- package/dist/router/errors/hono-app-already-configured.error.d.ts.map +0 -1
- package/dist/router/errors/hono-app-already-configured.error.js +0 -12
- package/dist/router/errors/hono-app-already-configured.error.js.map +0 -1
- package/dist/router/errors/index.d.ts +0 -8
- package/dist/router/errors/index.d.ts.map +0 -1
- package/dist/router/errors/index.js +0 -8
- package/dist/router/errors/index.js.map +0 -1
- package/dist/router/errors/openapi-route-registration.error.d.ts +0 -17
- package/dist/router/errors/openapi-route-registration.error.d.ts.map +0 -1
- package/dist/router/errors/openapi-route-registration.error.js +0 -19
- package/dist/router/errors/openapi-route-registration.error.js.map +0 -1
- package/dist/router/errors/openapi-validation.error.d.ts +0 -19
- package/dist/router/errors/openapi-validation.error.d.ts.map +0 -1
- package/dist/router/errors/openapi-validation.error.js +0 -21
- package/dist/router/errors/openapi-validation.error.js.map +0 -1
- package/dist/router/errors/route-not-found.error.d.ts +0 -11
- package/dist/router/errors/route-not-found.error.d.ts.map +0 -1
- package/dist/router/errors/route-not-found.error.js +0 -13
- package/dist/router/errors/route-not-found.error.js.map +0 -1
- package/dist/router/errors/schema-validation.error.d.ts +0 -11
- package/dist/router/errors/schema-validation.error.d.ts.map +0 -1
- package/dist/router/errors/schema-validation.error.js +0 -17
- package/dist/router/errors/schema-validation.error.js.map +0 -1
- package/dist/router/hono-app.d.ts +0 -38
- package/dist/router/hono-app.d.ts.map +0 -1
- package/dist/router/hono-app.js +0 -126
- package/dist/router/hono-app.js.map +0 -1
- package/dist/router/index.d.ts +0 -16
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/index.js +0 -21
- package/dist/router/index.js.map +0 -1
- package/dist/router/middleware/index.d.ts +0 -2
- package/dist/router/middleware/index.d.ts.map +0 -1
- package/dist/router/middleware/index.js +0 -4
- package/dist/router/middleware/index.js.map +0 -1
- package/dist/router/middleware/logger.middleware.d.ts +0 -19
- package/dist/router/middleware/logger.middleware.d.ts.map +0 -1
- package/dist/router/middleware/logger.middleware.js +0 -32
- package/dist/router/middleware/logger.middleware.js.map +0 -1
- package/dist/router/middleware.interface.d.ts +0 -38
- package/dist/router/middleware.interface.d.ts.map +0 -1
- package/dist/router/middleware.interface.js +0 -2
- package/dist/router/middleware.interface.js.map +0 -1
- package/dist/router/router-context.d.ts +0 -143
- package/dist/router/router-context.d.ts.map +0 -1
- package/dist/router/router-context.js +0 -179
- package/dist/router/router-context.js.map +0 -1
- package/dist/router/router.tokens.d.ts +0 -11
- package/dist/router/router.tokens.d.ts.map +0 -1
- package/dist/router/router.tokens.js +0 -11
- package/dist/router/router.tokens.js.map +0 -1
- package/dist/router/schemas/common.schemas.d.ts +0 -148
- package/dist/router/schemas/common.schemas.d.ts.map +0 -1
- package/dist/router/schemas/common.schemas.js +0 -88
- package/dist/router/schemas/common.schemas.js.map +0 -1
- package/dist/router/schemas/index.d.ts +0 -2
- package/dist/router/schemas/index.d.ts.map +0 -1
- package/dist/router/schemas/index.js +0 -2
- package/dist/router/schemas/index.js.map +0 -1
- package/dist/router/services/index.d.ts +0 -6
- package/dist/router/services/index.d.ts.map +0 -1
- package/dist/router/services/index.js +0 -6
- package/dist/router/services/index.js.map +0 -1
- package/dist/router/services/route-registration.service.d.ts +0 -129
- package/dist/router/services/route-registration.service.d.ts.map +0 -1
- package/dist/router/services/route-registration.service.js +0 -700
- package/dist/router/services/route-registration.service.js.map +0 -1
- package/dist/router/types.d.ts +0 -187
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -2
- package/dist/router/types.js.map +0 -1
- package/dist/storage/contracts/delete-file.input.d.ts +0 -7
- package/dist/storage/contracts/delete-file.input.d.ts.map +0 -1
- package/dist/storage/contracts/delete-file.input.js +0 -6
- package/dist/storage/contracts/delete-file.input.js.map +0 -1
- package/dist/storage/contracts/download-result.d.ts +0 -28
- package/dist/storage/contracts/download-result.d.ts.map +0 -1
- package/dist/storage/contracts/download-result.js +0 -2
- package/dist/storage/contracts/download-result.js.map +0 -1
- package/dist/storage/contracts/file-exists.input.d.ts +0 -7
- package/dist/storage/contracts/file-exists.input.d.ts.map +0 -1
- package/dist/storage/contracts/file-exists.input.js +0 -6
- package/dist/storage/contracts/file-exists.input.js.map +0 -1
- package/dist/storage/contracts/get-presigned-url.input.d.ts +0 -26
- package/dist/storage/contracts/get-presigned-url.input.d.ts.map +0 -1
- package/dist/storage/contracts/get-presigned-url.input.js +0 -14
- package/dist/storage/contracts/get-presigned-url.input.js.map +0 -1
- package/dist/storage/contracts/index.d.ts +0 -6
- package/dist/storage/contracts/index.d.ts.map +0 -1
- package/dist/storage/contracts/index.js +0 -6
- package/dist/storage/contracts/index.js.map +0 -1
- package/dist/storage/contracts/upload-file.input.d.ts +0 -34
- package/dist/storage/contracts/upload-file.input.d.ts.map +0 -1
- package/dist/storage/contracts/upload-file.input.js +0 -10
- package/dist/storage/contracts/upload-file.input.js.map +0 -1
- package/dist/storage/dom.polyfill.d.ts +0 -2
- package/dist/storage/dom.polyfill.d.ts.map +0 -1
- package/dist/storage/dom.polyfill.js +0 -30
- package/dist/storage/dom.polyfill.js.map +0 -1
- package/dist/storage/errors/disk-not-configured.error.d.ts +0 -5
- package/dist/storage/errors/disk-not-configured.error.d.ts.map +0 -1
- package/dist/storage/errors/disk-not-configured.error.js +0 -7
- package/dist/storage/errors/disk-not-configured.error.js.map +0 -1
- package/dist/storage/errors/file-not-found.error.d.ts +0 -5
- package/dist/storage/errors/file-not-found.error.d.ts.map +0 -1
- package/dist/storage/errors/file-not-found.error.js +0 -8
- package/dist/storage/errors/file-not-found.error.js.map +0 -1
- package/dist/storage/errors/file-too-large.error.d.ts +0 -5
- package/dist/storage/errors/file-too-large.error.d.ts.map +0 -1
- package/dist/storage/errors/file-too-large.error.js +0 -11
- package/dist/storage/errors/file-too-large.error.js.map +0 -1
- package/dist/storage/errors/index.d.ts +0 -9
- package/dist/storage/errors/index.d.ts.map +0 -1
- package/dist/storage/errors/index.js +0 -9
- package/dist/storage/errors/index.js.map +0 -1
- package/dist/storage/errors/invalid-disk.error.d.ts +0 -5
- package/dist/storage/errors/invalid-disk.error.d.ts.map +0 -1
- package/dist/storage/errors/invalid-disk.error.js +0 -8
- package/dist/storage/errors/invalid-disk.error.js.map +0 -1
- package/dist/storage/errors/invalid-file-type.error.d.ts +0 -5
- package/dist/storage/errors/invalid-file-type.error.d.ts.map +0 -1
- package/dist/storage/errors/invalid-file-type.error.js +0 -10
- package/dist/storage/errors/invalid-file-type.error.js.map +0 -1
- package/dist/storage/errors/presigned-url-invalid-expiry.error.d.ts +0 -5
- package/dist/storage/errors/presigned-url-invalid-expiry.error.d.ts.map +0 -1
- package/dist/storage/errors/presigned-url-invalid-expiry.error.js +0 -12
- package/dist/storage/errors/presigned-url-invalid-expiry.error.js.map +0 -1
- package/dist/storage/errors/storage-provider-not-supported.error.d.ts +0 -5
- package/dist/storage/errors/storage-provider-not-supported.error.d.ts.map +0 -1
- package/dist/storage/errors/storage-provider-not-supported.error.js +0 -8
- package/dist/storage/errors/storage-provider-not-supported.error.js.map +0 -1
- package/dist/storage/errors/storage-response-body-missing.error.d.ts +0 -5
- package/dist/storage/errors/storage-response-body-missing.error.d.ts.map +0 -1
- package/dist/storage/errors/storage-response-body-missing.error.js +0 -8
- package/dist/storage/errors/storage-response-body-missing.error.js.map +0 -1
- package/dist/storage/index.d.ts +0 -15
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -18
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/providers/s3-multipart-provider.interface.d.ts +0 -194
- package/dist/storage/providers/s3-multipart-provider.interface.d.ts.map +0 -1
- package/dist/storage/providers/s3-multipart-provider.interface.js +0 -2
- package/dist/storage/providers/s3-multipart-provider.interface.js.map +0 -1
- package/dist/storage/providers/s3-storage.provider.d.ts +0 -77
- package/dist/storage/providers/s3-storage.provider.d.ts.map +0 -1
- package/dist/storage/providers/s3-storage.provider.js +0 -310
- package/dist/storage/providers/s3-storage.provider.js.map +0 -1
- package/dist/storage/providers/storage-provider.interface.d.ts +0 -58
- package/dist/storage/providers/storage-provider.interface.d.ts.map +0 -1
- package/dist/storage/providers/storage-provider.interface.js +0 -2
- package/dist/storage/providers/storage-provider.interface.js.map +0 -1
- package/dist/storage/services/storage-manager.service.d.ts +0 -48
- package/dist/storage/services/storage-manager.service.d.ts.map +0 -1
- package/dist/storage/services/storage-manager.service.js +0 -111
- package/dist/storage/services/storage-manager.service.js.map +0 -1
- package/dist/storage/services/storage.service.d.ts +0 -137
- package/dist/storage/services/storage.service.d.ts.map +0 -1
- package/dist/storage/services/storage.service.js +0 -229
- package/dist/storage/services/storage.service.js.map +0 -1
- package/dist/storage/storage.module.d.ts +0 -52
- package/dist/storage/storage.module.d.ts.map +0 -1
- package/dist/storage/storage.module.js +0 -81
- package/dist/storage/storage.module.js.map +0 -1
- package/dist/storage/storage.tokens.d.ts +0 -10
- package/dist/storage/storage.tokens.d.ts.map +0 -1
- package/dist/storage/storage.tokens.js +0 -10
- package/dist/storage/storage.tokens.js.map +0 -1
- package/dist/storage/types.d.ts +0 -31
- package/dist/storage/types.d.ts.map +0 -1
- package/dist/storage/types.js +0 -2
- package/dist/storage/types.js.map +0 -1
- package/dist/stratal.d.ts +0 -39
- package/dist/stratal.d.ts.map +0 -1
- package/dist/stratal.js +0 -77
- package/dist/stratal.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/websocket/decorators/gateway.decorator.d.ts +0 -39
- package/dist/websocket/decorators/gateway.decorator.d.ts.map +0 -1
- package/dist/websocket/decorators/gateway.decorator.js +0 -55
- package/dist/websocket/decorators/gateway.decorator.js.map +0 -1
- package/dist/websocket/decorators/index.d.ts +0 -3
- package/dist/websocket/decorators/index.d.ts.map +0 -1
- package/dist/websocket/decorators/index.js +0 -3
- package/dist/websocket/decorators/index.js.map +0 -1
- package/dist/websocket/decorators/ws-event.decorator.d.ts +0 -59
- package/dist/websocket/decorators/ws-event.decorator.d.ts.map +0 -1
- package/dist/websocket/decorators/ws-event.decorator.js +0 -94
- package/dist/websocket/decorators/ws-event.decorator.js.map +0 -1
- package/dist/websocket/errors/websocket-body-not-available.error.d.ts +0 -5
- package/dist/websocket/errors/websocket-body-not-available.error.d.ts.map +0 -1
- package/dist/websocket/errors/websocket-body-not-available.error.js +0 -7
- package/dist/websocket/errors/websocket-body-not-available.error.js.map +0 -1
- package/dist/websocket/errors/websocket-duplicate-event-handler.error.d.ts +0 -5
- package/dist/websocket/errors/websocket-duplicate-event-handler.error.d.ts.map +0 -1
- package/dist/websocket/errors/websocket-duplicate-event-handler.error.js +0 -7
- package/dist/websocket/errors/websocket-duplicate-event-handler.error.js.map +0 -1
- package/dist/websocket/gateway-context.d.ts +0 -51
- package/dist/websocket/gateway-context.d.ts.map +0 -1
- package/dist/websocket/gateway-context.js +0 -66
- package/dist/websocket/gateway-context.js.map +0 -1
- package/dist/websocket/index.d.ts +0 -7
- package/dist/websocket/index.d.ts.map +0 -1
- package/dist/websocket/index.js +0 -5
- package/dist/websocket/index.js.map +0 -1
- package/dist/websocket/types.d.ts +0 -7
- package/dist/websocket/types.d.ts.map +0 -1
- package/dist/websocket/types.js +0 -2
- package/dist/websocket/types.js.map +0 -1
- package/dist/workers/index.d.ts +0 -5
- package/dist/workers/index.d.ts.map +0 -1
- package/dist/workers/index.js +0 -5
- package/dist/workers/index.js.map +0 -1
- package/dist/workers/run-in-scope.d.ts +0 -9
- package/dist/workers/run-in-scope.d.ts.map +0 -1
- package/dist/workers/run-in-scope.js +0 -13
- package/dist/workers/run-in-scope.js.map +0 -1
- package/dist/workers/stratal-durable-object.d.ts +0 -28
- package/dist/workers/stratal-durable-object.d.ts.map +0 -1
- package/dist/workers/stratal-durable-object.js +0 -34
- package/dist/workers/stratal-durable-object.js.map +0 -1
- package/dist/workers/stratal-worker-entrypoint.d.ts +0 -27
- package/dist/workers/stratal-worker-entrypoint.d.ts.map +0 -1
- package/dist/workers/stratal-worker-entrypoint.js +0 -28
- package/dist/workers/stratal-worker-entrypoint.js.map +0 -1
- package/dist/workers/stratal-workflow.d.ts +0 -27
- package/dist/workers/stratal-workflow.d.ts.map +0 -1
- package/dist/workers/stratal-workflow.js +0 -28
- package/dist/workers/stratal-workflow.js.map +0 -1
|
@@ -0,0 +1,1791 @@
|
|
|
1
|
+
import { S as ApplicationError, b as ERROR_CODES, o as I18N_TOKENS, s as Scope, v as ROUTER_TOKENS, y as getHttpStatus } from "./errors-CtCi1wn6.mjs";
|
|
2
|
+
import { i as Transient, l as DI_TOKENS, n as __decorateParam, r as __decorateMetadata, s as getMethodInjections, t as __decorate } from "./decorate-D5j-d9_z.mjs";
|
|
3
|
+
import { r as Module } from "./module-BH7t7BGG.mjs";
|
|
4
|
+
import { i as getControllerRoute, r as getControllerOptions, t as MiddlewareConfigurationService } from "./middleware-iRhNjsPH.mjs";
|
|
5
|
+
import { a as ROUTER_CONTEXT_KEYS, c as VERSION_NEUTRAL, i as METHOD_STATUS_CODES, n as DEFAULT_CONTENT_TYPE, o as ROUTE_METADATA_KEYS, r as HTTP_METHODS, s as SECURITY_SCHEMES, t as RouterContext } from "./router-context-BLn4PrRG.mjs";
|
|
6
|
+
import { i as z, o as backendErrorMap, r as validation_exports, s as runWithErrorMapContext, t as OpenAPIHono } from "./validation-Dbt-snjx.mjs";
|
|
7
|
+
import { t as en_exports } from "./en-uVIaxFXR.mjs";
|
|
8
|
+
import { i as getMethodGuards, r as getControllerGuards, t as GuardExecutionService } from "./guards-DMbsAxSX.mjs";
|
|
9
|
+
import { c as getWsOnMessageMethod, d as isGateway, o as getWsOnCloseMethod, s as getWsOnErrorMethod, t as GatewayContext } from "./gateway-context-90CQEQDR.mjs";
|
|
10
|
+
import { inject } from "tsyringe";
|
|
11
|
+
import { compile, createCoreContext, registerMessageCompiler, translate } from "@intlify/core-base";
|
|
12
|
+
import { swaggerUI } from "@hono/swagger-ui";
|
|
13
|
+
//#region src/i18n/middleware/i18n-context.middleware.ts
|
|
14
|
+
/**
|
|
15
|
+
* I18n Context Middleware
|
|
16
|
+
*
|
|
17
|
+
* Sets up AsyncLocalStorage context for Zod i18n validation.
|
|
18
|
+
* Must run after LocaleExtractionMiddleware sets the locale.
|
|
19
|
+
*/
|
|
20
|
+
let I18nContextMiddleware = class I18nContextMiddleware {
|
|
21
|
+
constructor(i18n) {
|
|
22
|
+
this.i18n = i18n;
|
|
23
|
+
}
|
|
24
|
+
async handle(ctx, next) {
|
|
25
|
+
await runWithErrorMapContext({
|
|
26
|
+
t: (key, params) => this.i18n.t(key, params),
|
|
27
|
+
locale: ctx.getLocale()
|
|
28
|
+
}, () => next());
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
I18nContextMiddleware = __decorate([
|
|
32
|
+
Transient(),
|
|
33
|
+
__decorateParam(0, inject(I18N_TOKENS.I18nService)),
|
|
34
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
35
|
+
], I18nContextMiddleware);
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/i18n/middleware/locale-extraction.middleware.ts
|
|
38
|
+
/**
|
|
39
|
+
* Locale Extraction Middleware
|
|
40
|
+
*
|
|
41
|
+
* Extracts locale from X-Locale header and sets it on RouterContext.
|
|
42
|
+
* Validates against available locales from MessageLoaderService.
|
|
43
|
+
*/
|
|
44
|
+
let LocaleExtractionMiddleware = class LocaleExtractionMiddleware {
|
|
45
|
+
constructor(loader) {
|
|
46
|
+
this.loader = loader;
|
|
47
|
+
}
|
|
48
|
+
async handle(ctx, next) {
|
|
49
|
+
const locale = this.extractLocale(ctx);
|
|
50
|
+
ctx.setLocale(locale);
|
|
51
|
+
await next();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract and validate locale from X-Locale header
|
|
55
|
+
*/
|
|
56
|
+
extractLocale(ctx) {
|
|
57
|
+
const requestedLocale = ctx.header("x-locale")?.toLowerCase();
|
|
58
|
+
if (requestedLocale && this.loader.isLocaleSupported(requestedLocale)) return requestedLocale;
|
|
59
|
+
return this.loader.getDefaultLocale();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
LocaleExtractionMiddleware = __decorate([
|
|
63
|
+
Transient(),
|
|
64
|
+
__decorateParam(0, inject(I18N_TOKENS.MessageLoader)),
|
|
65
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
66
|
+
], LocaleExtractionMiddleware);
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/openapi/openapi.tokens.ts
|
|
69
|
+
/**
|
|
70
|
+
* OpenAPI Module DI Tokens
|
|
71
|
+
*/
|
|
72
|
+
const OPENAPI_TOKENS = {
|
|
73
|
+
Options: Symbol.for("stratal:openapi:options"),
|
|
74
|
+
ConfigService: Symbol.for("stratal:openapi:config:service"),
|
|
75
|
+
OpenAPIService: Symbol.for("stratal:openapi:service")
|
|
76
|
+
};
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src/openapi/services/openapi-config.service.ts
|
|
79
|
+
let OpenAPIConfigService = class OpenAPIConfigService {
|
|
80
|
+
overrides = [];
|
|
81
|
+
constructor(baseOptions) {
|
|
82
|
+
this.baseOptions = baseOptions;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Add configuration override for this request
|
|
86
|
+
* Overrides are merged in the order they are added
|
|
87
|
+
*/
|
|
88
|
+
override(config) {
|
|
89
|
+
this.overrides.push(config);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get effective configuration (base merged with all overrides)
|
|
93
|
+
*/
|
|
94
|
+
getEffectiveConfig() {
|
|
95
|
+
let effective = {
|
|
96
|
+
jsonPath: this.baseOptions?.jsonPath ?? "/api/openapi.json",
|
|
97
|
+
ui: this.baseOptions?.ui,
|
|
98
|
+
info: {
|
|
99
|
+
title: this.baseOptions?.info?.title ?? "API",
|
|
100
|
+
version: this.baseOptions?.info?.version ?? "1.0.0",
|
|
101
|
+
description: this.baseOptions?.info?.description
|
|
102
|
+
},
|
|
103
|
+
securitySchemes: this.baseOptions?.securitySchemes
|
|
104
|
+
};
|
|
105
|
+
for (const override of this.overrides) effective = this.mergeConfig(effective, override);
|
|
106
|
+
return effective;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Merge override into effective config
|
|
110
|
+
* Info is shallow-merged, routeFilter is replaced
|
|
111
|
+
*/
|
|
112
|
+
mergeConfig(base, override) {
|
|
113
|
+
return {
|
|
114
|
+
...base,
|
|
115
|
+
info: {
|
|
116
|
+
...base.info,
|
|
117
|
+
...override.info && {
|
|
118
|
+
title: override.info.title ?? base.info.title,
|
|
119
|
+
version: override.info.version ?? base.info.version,
|
|
120
|
+
description: override.info.description ?? base.info.description
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
routeFilter: override.routeFilter ?? base.routeFilter
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
OpenAPIConfigService = __decorate([
|
|
128
|
+
Transient(OPENAPI_TOKENS.ConfigService),
|
|
129
|
+
__decorateParam(0, inject(OPENAPI_TOKENS.Options, { isOptional: true })),
|
|
130
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
131
|
+
], OpenAPIConfigService);
|
|
132
|
+
//#endregion
|
|
133
|
+
//#region src/i18n/messages/index.ts
|
|
134
|
+
/**
|
|
135
|
+
* Core Messages
|
|
136
|
+
*
|
|
137
|
+
* Messages used by packages/modules infrastructure.
|
|
138
|
+
* These are automatically merged with application-specific messages.
|
|
139
|
+
*/
|
|
140
|
+
/**
|
|
141
|
+
* All locale messages
|
|
142
|
+
* Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)
|
|
143
|
+
*/
|
|
144
|
+
const messages = { en: en_exports };
|
|
145
|
+
/**
|
|
146
|
+
* Get messages for all locales
|
|
147
|
+
*/
|
|
148
|
+
function getMessages() {
|
|
149
|
+
return messages;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get available locales
|
|
153
|
+
*/
|
|
154
|
+
function getLocales() {
|
|
155
|
+
return Object.keys(messages);
|
|
156
|
+
}
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/i18n/setup.ts
|
|
159
|
+
/**
|
|
160
|
+
* I18n Setup - Message Compiler Registration
|
|
161
|
+
*
|
|
162
|
+
* Registers a JIT (Just-In-Time) message compiler for @intlify/core-base
|
|
163
|
+
* that works in Cloudflare Workers edge runtime.
|
|
164
|
+
*
|
|
165
|
+
* This must be called ONCE at application startup, before any I18nService instances are created.
|
|
166
|
+
*/
|
|
167
|
+
let isRegistered = false;
|
|
168
|
+
/**
|
|
169
|
+
* Setup JIT message compiler for i18n
|
|
170
|
+
*
|
|
171
|
+
* Registers a message compiler that uses JIT compilation mode.
|
|
172
|
+
* In @intlify/core-base v10+, JIT mode is enabled by default, which generates
|
|
173
|
+
* AST (Abstract Syntax Tree) instead of JavaScript code, making it compatible
|
|
174
|
+
* with CSP-restricted environments like Cloudflare Workers.
|
|
175
|
+
*
|
|
176
|
+
* **IMPORTANT:** Call this function once at application startup before creating
|
|
177
|
+
* any I18nService instances. Safe to call multiple times (only registers once).
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* // In application entry point (before app.initialize())
|
|
182
|
+
* setupI18nCompiler()
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
function setupI18nCompiler() {
|
|
186
|
+
if (isRegistered) return;
|
|
187
|
+
registerMessageCompiler(compile);
|
|
188
|
+
isRegistered = true;
|
|
189
|
+
}
|
|
190
|
+
//#endregion
|
|
191
|
+
//#region src/i18n/i18n.options.ts
|
|
192
|
+
/**
|
|
193
|
+
* Resolve I18n options with defaults
|
|
194
|
+
*/
|
|
195
|
+
function resolveI18nOptions(options) {
|
|
196
|
+
return {
|
|
197
|
+
defaultLocale: options?.defaultLocale ?? "en",
|
|
198
|
+
fallbackLocale: options?.fallbackLocale ?? "en",
|
|
199
|
+
locales: options?.locales ?? ["en"],
|
|
200
|
+
messages: options?.messages ?? {}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/i18n/errors/locale-not-supported.error.ts
|
|
205
|
+
/**
|
|
206
|
+
* Locale Not Supported Error
|
|
207
|
+
* Thrown when an unsupported locale is requested
|
|
208
|
+
*
|
|
209
|
+
* HTTP Status: 500 Internal Server Error
|
|
210
|
+
* Error Code: 9301
|
|
211
|
+
*/
|
|
212
|
+
var LocaleNotSupportedError = class extends ApplicationError {
|
|
213
|
+
constructor(locale, supportedLocales) {
|
|
214
|
+
super("errors.localeNotSupported", ERROR_CODES.I18N.LOCALE_NOT_SUPPORTED, {
|
|
215
|
+
locale,
|
|
216
|
+
supportedLocales: supportedLocales.join(", ")
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
//#endregion
|
|
221
|
+
//#region src/i18n/errors/translation-missing.error.ts
|
|
222
|
+
/**
|
|
223
|
+
* Translation Missing Error
|
|
224
|
+
* Thrown when a translation key is missing from all locales
|
|
225
|
+
*
|
|
226
|
+
* HTTP Status: 500 Internal Server Error
|
|
227
|
+
* Error Code: 9300
|
|
228
|
+
*/
|
|
229
|
+
var TranslationMissingError = class extends ApplicationError {
|
|
230
|
+
constructor(key, locale) {
|
|
231
|
+
super("errors.translationMissing", ERROR_CODES.I18N.TRANSLATION_MISSING, {
|
|
232
|
+
key,
|
|
233
|
+
locale
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
//#endregion
|
|
238
|
+
//#region src/router/decorators/http-method.decorator.ts
|
|
239
|
+
/**
|
|
240
|
+
* Creates an HTTP method decorator factory for the given HTTP method.
|
|
241
|
+
*
|
|
242
|
+
* The returned decorator stores {@link HttpRouteMetadata} on the method and
|
|
243
|
+
* tracks the method name under {@link ROUTE_METADATA_KEYS.HTTP_DECORATED_METHODS}
|
|
244
|
+
* on the controller prototype so they can be discovered at registration time.
|
|
245
|
+
*/
|
|
246
|
+
function createHttpMethodDecorator(method) {
|
|
247
|
+
return function(path, config) {
|
|
248
|
+
return function(target, propertyKey, descriptor) {
|
|
249
|
+
const metadata = {
|
|
250
|
+
method,
|
|
251
|
+
path,
|
|
252
|
+
config: config ?? { response: z.any() }
|
|
253
|
+
};
|
|
254
|
+
Reflect.defineMetadata(ROUTE_METADATA_KEYS.HTTP_ROUTE_CONFIG, metadata, target, propertyKey);
|
|
255
|
+
const existing = Reflect.getOwnMetadata(ROUTE_METADATA_KEYS.HTTP_DECORATED_METHODS, target) ?? [];
|
|
256
|
+
existing.push(propertyKey);
|
|
257
|
+
Reflect.defineMetadata(ROUTE_METADATA_KEYS.HTTP_DECORATED_METHODS, existing, target);
|
|
258
|
+
return descriptor;
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Registers a GET route on the controller method.
|
|
264
|
+
*
|
|
265
|
+
* @param path - Route path relative to the controller base path
|
|
266
|
+
* @param config - Optional route configuration (response schema, body, params, etc.)
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```typescript
|
|
270
|
+
* @Controller('/api/v1/users')
|
|
271
|
+
* class UsersController {
|
|
272
|
+
* @Get('/', { response: z.array(userSchema), summary: 'List users' })
|
|
273
|
+
* async list(ctx: RouterContext) { ... }
|
|
274
|
+
*
|
|
275
|
+
* @Get('/:id', { params: z.object({ id: z.string().uuid() }), response: userSchema })
|
|
276
|
+
* async getUser(ctx: RouterContext) { ... }
|
|
277
|
+
* }
|
|
278
|
+
* ```
|
|
279
|
+
*/
|
|
280
|
+
const Get = createHttpMethodDecorator("get");
|
|
281
|
+
/**
|
|
282
|
+
* Registers a POST route on the controller method.
|
|
283
|
+
*
|
|
284
|
+
* @param path - Route path relative to the controller base path
|
|
285
|
+
* @param config - Optional route configuration (response schema, body, params, etc.)
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```typescript
|
|
289
|
+
* @Controller('/api/v1/users')
|
|
290
|
+
* class UsersController {
|
|
291
|
+
* @Post('/', { body: createUserSchema, response: userSchema, statusCode: 201 })
|
|
292
|
+
* async createUser(ctx: RouterContext) { ... }
|
|
293
|
+
* }
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
const Post = createHttpMethodDecorator("post");
|
|
297
|
+
/**
|
|
298
|
+
* Registers a PUT route on the controller method.
|
|
299
|
+
*
|
|
300
|
+
* @param path - Route path relative to the controller base path
|
|
301
|
+
* @param config - Optional route configuration
|
|
302
|
+
*/
|
|
303
|
+
const Put = createHttpMethodDecorator("put");
|
|
304
|
+
/**
|
|
305
|
+
* Registers a PATCH route on the controller method.
|
|
306
|
+
*
|
|
307
|
+
* @param path - Route path relative to the controller base path
|
|
308
|
+
* @param config - Optional route configuration
|
|
309
|
+
*/
|
|
310
|
+
const Patch = createHttpMethodDecorator("patch");
|
|
311
|
+
/**
|
|
312
|
+
* Registers a DELETE route on the controller method.
|
|
313
|
+
*
|
|
314
|
+
* @param path - Route path relative to the controller base path
|
|
315
|
+
* @param config - Optional route configuration
|
|
316
|
+
*/
|
|
317
|
+
const Delete = createHttpMethodDecorator("delete");
|
|
318
|
+
/**
|
|
319
|
+
* Registers an ALL (any HTTP method) route on the controller method.
|
|
320
|
+
* Routes using @All are automatically hidden from OpenAPI documentation
|
|
321
|
+
* since OpenAPI does not support a catch-all HTTP method.
|
|
322
|
+
*
|
|
323
|
+
* @param path - Route path relative to the controller base path
|
|
324
|
+
* @param config - Optional route configuration
|
|
325
|
+
*/
|
|
326
|
+
const All = createHttpMethodDecorator("all");
|
|
327
|
+
/**
|
|
328
|
+
* Get the HTTP route metadata from a controller method decorated with
|
|
329
|
+
* @Get, @Post, @Put, @Patch, @Delete, or @All.
|
|
330
|
+
*
|
|
331
|
+
* @param target - Controller prototype
|
|
332
|
+
* @param methodName - Name of the method
|
|
333
|
+
* @returns HTTP route metadata or undefined if not decorated
|
|
334
|
+
*/
|
|
335
|
+
function getHttpRouteMetadata(target, methodName) {
|
|
336
|
+
return Reflect.getMetadata(ROUTE_METADATA_KEYS.HTTP_ROUTE_CONFIG, target, methodName);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get all methods decorated with HTTP method decorators from a controller class.
|
|
340
|
+
*
|
|
341
|
+
* @param ControllerClass - Controller class
|
|
342
|
+
* @returns Array of method names that have HTTP route metadata
|
|
343
|
+
*/
|
|
344
|
+
function getHttpDecoratedMethods(ControllerClass) {
|
|
345
|
+
const prototype = ControllerClass.prototype;
|
|
346
|
+
return Reflect.getOwnMetadata(ROUTE_METADATA_KEYS.HTTP_DECORATED_METHODS, prototype) ?? [];
|
|
347
|
+
}
|
|
348
|
+
//#endregion
|
|
349
|
+
//#region src/router/decorators/route.decorator.ts
|
|
350
|
+
/**
|
|
351
|
+
* Decorator to add OpenAPI metadata to a controller method using convention-based routing.
|
|
352
|
+
*
|
|
353
|
+
* **Cannot be mixed with HTTP method decorators** (`@Get`, `@Post`, `@Put`, `@Patch`,
|
|
354
|
+
* `@Delete`, `@All`) in the same controller. Use one pattern or the other.
|
|
355
|
+
*
|
|
356
|
+
* Stores route configuration (schemas, response, tags, security) in metadata.
|
|
357
|
+
* HTTP method, path, and success status code are auto-derived from the method name:
|
|
358
|
+
* - index() → GET /base-path → 200
|
|
359
|
+
* - show() → GET /base-path/:id → 200
|
|
360
|
+
* - create() → POST /base-path → 201
|
|
361
|
+
* - update() → PUT /base-path/:id → 200
|
|
362
|
+
* - patch() → PATCH /base-path/:id → 200
|
|
363
|
+
* - destroy() → DELETE /base-path/:id → 200
|
|
364
|
+
*
|
|
365
|
+
* @param config - Route configuration (schemas, response, tags, security)
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* ```typescript
|
|
369
|
+
* @Controller('/api/v1/notes', {
|
|
370
|
+
* tags: ['Notes'],
|
|
371
|
+
* security: ['bearerAuth']
|
|
372
|
+
* })
|
|
373
|
+
* export class NotesController implements Controller {
|
|
374
|
+
* @Route({
|
|
375
|
+
* body: createNoteSchema,
|
|
376
|
+
* response: noteSchema, // 201 auto-derived from 'create' method
|
|
377
|
+
* tags: ['Mutations'],
|
|
378
|
+
* description: 'Create a new note'
|
|
379
|
+
* })
|
|
380
|
+
* async create(ctx: RouterContext): Promise<Response> {
|
|
381
|
+
* // POST /api/v1/notes (auto-derived from method name)
|
|
382
|
+
* // Body schema: createNoteSchema (auto-validated)
|
|
383
|
+
* // Response: 201 → noteSchema (status auto-derived)
|
|
384
|
+
* // Tags: ['Notes', 'Mutations'] (merged with controller)
|
|
385
|
+
* // Security: ['bearerAuth'] (inherited from controller)
|
|
386
|
+
* const body = ctx.body()
|
|
387
|
+
* const note = await this.notesService.create(body)
|
|
388
|
+
* return ctx.json(note, 201)
|
|
389
|
+
* }
|
|
390
|
+
*
|
|
391
|
+
* @Route({
|
|
392
|
+
* query: paginationSchema,
|
|
393
|
+
* response: z.array(noteSchema) // 200 auto-derived from 'index' method
|
|
394
|
+
* })
|
|
395
|
+
* async index(ctx: RouterContext): Promise<Response> {
|
|
396
|
+
* // GET /api/v1/notes (auto-derived)
|
|
397
|
+
* // Query params auto-validated
|
|
398
|
+
* const notes = await this.notesService.list()
|
|
399
|
+
* return ctx.json(notes)
|
|
400
|
+
* }
|
|
401
|
+
*
|
|
402
|
+
* @Route({
|
|
403
|
+
* params: z.object({ id: z.string().uuid() }),
|
|
404
|
+
* response: {
|
|
405
|
+
* schema: noteSchema,
|
|
406
|
+
* description: 'Note details'
|
|
407
|
+
* },
|
|
408
|
+
* security: [] // Override to make public
|
|
409
|
+
* })
|
|
410
|
+
* async show(ctx: RouterContext): Promise<Response> {
|
|
411
|
+
* // GET /api/v1/notes/:id (auto-derived)
|
|
412
|
+
* // URL params auto-validated
|
|
413
|
+
* // Response: 200 → noteSchema (status auto-derived)
|
|
414
|
+
* // Security: [] (public route, override controller security)
|
|
415
|
+
* const id = ctx.param('id')
|
|
416
|
+
* const note = await this.notesService.findById(id)
|
|
417
|
+
* return ctx.json(note)
|
|
418
|
+
* }
|
|
419
|
+
* }
|
|
420
|
+
* ```
|
|
421
|
+
*/
|
|
422
|
+
function Route(config) {
|
|
423
|
+
return function(target, propertyKey, descriptor) {
|
|
424
|
+
Reflect.defineMetadata(ROUTE_METADATA_KEYS.ROUTE_CONFIG, config, target, propertyKey);
|
|
425
|
+
return descriptor;
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Get the route configuration from a controller method
|
|
430
|
+
*
|
|
431
|
+
* @param target - Controller instance or prototype
|
|
432
|
+
* @param methodName - Name of the method
|
|
433
|
+
* @returns Route configuration or undefined if not decorated
|
|
434
|
+
*/
|
|
435
|
+
function getRouteConfig(target, methodName) {
|
|
436
|
+
return Reflect.getMetadata(ROUTE_METADATA_KEYS.ROUTE_CONFIG, target, methodName);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Get all methods with @Route() decorator from a controller
|
|
440
|
+
*
|
|
441
|
+
* @param ControllerClass - Controller class
|
|
442
|
+
* @returns Array of method names that have route config
|
|
443
|
+
*/
|
|
444
|
+
function getDecoratedMethods(ControllerClass) {
|
|
445
|
+
const prototype = ControllerClass.prototype;
|
|
446
|
+
return Object.getOwnPropertyNames(prototype).filter((name) => name !== "constructor" && typeof prototype[name] === "function").filter((methodName) => Reflect.hasMetadata(ROUTE_METADATA_KEYS.ROUTE_CONFIG, prototype, methodName));
|
|
447
|
+
}
|
|
448
|
+
//#endregion
|
|
449
|
+
//#region src/openapi/services/openapi.service.ts
|
|
450
|
+
let OpenAPIService = class OpenAPIService {
|
|
451
|
+
routeInfoMap = /* @__PURE__ */ new Map();
|
|
452
|
+
constructor(configService) {
|
|
453
|
+
this.configService = configService;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Setup OpenAPI documentation endpoints
|
|
457
|
+
*/
|
|
458
|
+
setupEndpoints(app, controllers) {
|
|
459
|
+
this.buildRouteInfoMap(controllers);
|
|
460
|
+
const config = this.configService.getEffectiveConfig();
|
|
461
|
+
app.get(config.jsonPath, (c) => {
|
|
462
|
+
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
463
|
+
const i18n = requestContainer.resolve(I18N_TOKENS.I18nService);
|
|
464
|
+
const effectiveConfig = requestContainer.resolve(OPENAPI_TOKENS.ConfigService).getEffectiveConfig();
|
|
465
|
+
const url = new URL(c.req.raw.url);
|
|
466
|
+
const fullSpec = app.getOpenAPIDocument({
|
|
467
|
+
openapi: "3.0.0",
|
|
468
|
+
info: {
|
|
469
|
+
version: effectiveConfig.info.version,
|
|
470
|
+
title: effectiveConfig.info.title,
|
|
471
|
+
description: effectiveConfig.info.description
|
|
472
|
+
},
|
|
473
|
+
servers: [{
|
|
474
|
+
url: `${url.protocol}//${url.host}`,
|
|
475
|
+
description: i18n.t("common.api.serverDescription")
|
|
476
|
+
}]
|
|
477
|
+
});
|
|
478
|
+
fullSpec.components ??= {};
|
|
479
|
+
fullSpec.components.securitySchemes = this.getSecuritySchemeDefinitions(i18n);
|
|
480
|
+
fullSpec.paths = this.filterRoutes(fullSpec.paths, effectiveConfig);
|
|
481
|
+
if (fullSpec.components.schemas) fullSpec.components.schemas = this.filterSchemas(fullSpec);
|
|
482
|
+
return c.json(fullSpec);
|
|
483
|
+
});
|
|
484
|
+
if (config.ui !== false) {
|
|
485
|
+
const uiPath = config.ui?.path ?? "/api/docs";
|
|
486
|
+
const uiRenderer = config.ui?.renderer;
|
|
487
|
+
app.get(uiPath, (c, next) => {
|
|
488
|
+
const effectiveConfig = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER).resolve(OPENAPI_TOKENS.ConfigService).getEffectiveConfig();
|
|
489
|
+
const uiContext = {
|
|
490
|
+
specUrl: effectiveConfig.jsonPath,
|
|
491
|
+
title: effectiveConfig.info.title
|
|
492
|
+
};
|
|
493
|
+
if (uiRenderer) return uiRenderer(uiContext)(c, next);
|
|
494
|
+
return swaggerUI({ url: uiContext.specUrl })(c, next);
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Get localized security scheme definitions
|
|
500
|
+
*/
|
|
501
|
+
getSecuritySchemeDefinitions(i18n) {
|
|
502
|
+
return {
|
|
503
|
+
[SECURITY_SCHEMES.BEARER_AUTH]: {
|
|
504
|
+
type: "http",
|
|
505
|
+
scheme: "bearer",
|
|
506
|
+
bearerFormat: "JWT",
|
|
507
|
+
description: i18n.t("common.api.security.bearerAuth")
|
|
508
|
+
},
|
|
509
|
+
[SECURITY_SCHEMES.API_KEY]: {
|
|
510
|
+
type: "apiKey",
|
|
511
|
+
in: "header",
|
|
512
|
+
name: "X-API-Key",
|
|
513
|
+
description: i18n.t("common.api.security.apiKey")
|
|
514
|
+
},
|
|
515
|
+
[SECURITY_SCHEMES.SESSION_COOKIE]: {
|
|
516
|
+
type: "apiKey",
|
|
517
|
+
in: "cookie",
|
|
518
|
+
name: "session",
|
|
519
|
+
description: i18n.t("common.api.security.sessionCookie")
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Build route info map from controllers
|
|
525
|
+
* Maps route prefixes to their hideFromDocs flag
|
|
526
|
+
*/
|
|
527
|
+
buildRouteInfoMap(controllers) {
|
|
528
|
+
for (const ControllerClass of controllers) {
|
|
529
|
+
const route = getControllerRoute(ControllerClass);
|
|
530
|
+
const options = getControllerOptions(ControllerClass);
|
|
531
|
+
if (route) this.routeInfoMap.set(route, { hideFromDocs: options?.hideFromDocs ?? false });
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Filter OpenAPI paths based on hideFromDocs and custom routeFilter
|
|
536
|
+
*/
|
|
537
|
+
filterRoutes(paths, config) {
|
|
538
|
+
const filteredPaths = {};
|
|
539
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
540
|
+
if (this.getRouteInfo(path).hideFromDocs) continue;
|
|
541
|
+
if (config.routeFilter) {
|
|
542
|
+
if (!config.routeFilter(path, pathItem)) continue;
|
|
543
|
+
}
|
|
544
|
+
filteredPaths[path] = pathItem;
|
|
545
|
+
}
|
|
546
|
+
return filteredPaths;
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Get route info by matching path against controller routes
|
|
550
|
+
*/
|
|
551
|
+
getRouteInfo(path) {
|
|
552
|
+
for (const [route, info] of this.routeInfoMap.entries()) if (path === route || path.startsWith(`${route}/`)) return info;
|
|
553
|
+
return { hideFromDocs: false };
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Filter unreferenced schemas from OpenAPI spec
|
|
557
|
+
*/
|
|
558
|
+
filterSchemas(spec) {
|
|
559
|
+
const referencedSchemas = /* @__PURE__ */ new Set();
|
|
560
|
+
this.collectSchemaRefs(spec.paths, referencedSchemas);
|
|
561
|
+
const filteredSchemas = {};
|
|
562
|
+
const components = spec.components;
|
|
563
|
+
if (components?.schemas) {
|
|
564
|
+
for (const [schemaName, schemaValue] of Object.entries(components.schemas)) if (referencedSchemas.has(schemaName)) {
|
|
565
|
+
filteredSchemas[schemaName] = schemaValue;
|
|
566
|
+
this.collectSchemaRefs(schemaValue, referencedSchemas);
|
|
567
|
+
}
|
|
568
|
+
for (const [schemaName, schemaValue] of Object.entries(components.schemas)) if (referencedSchemas.has(schemaName) && !filteredSchemas[schemaName]) filteredSchemas[schemaName] = schemaValue;
|
|
569
|
+
}
|
|
570
|
+
return filteredSchemas;
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Recursively collect all schema references from an object
|
|
574
|
+
*/
|
|
575
|
+
collectSchemaRefs(obj, refs) {
|
|
576
|
+
if (!obj || typeof obj !== "object") return;
|
|
577
|
+
const record = obj;
|
|
578
|
+
if (record.$ref && typeof record.$ref === "string") {
|
|
579
|
+
const match = /^#\/components\/schemas\/(.+)$/.exec(record.$ref);
|
|
580
|
+
if (match) refs.add(match[1]);
|
|
581
|
+
}
|
|
582
|
+
if (Array.isArray(obj)) for (const item of obj) this.collectSchemaRefs(item, refs);
|
|
583
|
+
else for (const value of Object.values(record)) this.collectSchemaRefs(value, refs);
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
OpenAPIService = __decorate([
|
|
587
|
+
Transient(OPENAPI_TOKENS.OpenAPIService),
|
|
588
|
+
__decorateParam(0, inject(OPENAPI_TOKENS.ConfigService)),
|
|
589
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
590
|
+
], OpenAPIService);
|
|
591
|
+
//#endregion
|
|
592
|
+
//#region src/openapi/openapi.module.ts
|
|
593
|
+
/**
|
|
594
|
+
* OpenAPI Module
|
|
595
|
+
*
|
|
596
|
+
* Provides configurable OpenAPI documentation endpoints with runtime override support.
|
|
597
|
+
*
|
|
598
|
+
* Features:
|
|
599
|
+
* - Configurable paths for /openapi.json and /docs
|
|
600
|
+
* - Runtime config overrides via middleware
|
|
601
|
+
* - i18n support for titles and descriptions
|
|
602
|
+
* - Route filtering via hideFromDocs and custom routeFilter
|
|
603
|
+
*
|
|
604
|
+
* @example Basic usage
|
|
605
|
+
* ```typescript
|
|
606
|
+
* @Module({
|
|
607
|
+
* imports: [
|
|
608
|
+
* OpenAPIModule.forRoot({
|
|
609
|
+
* info: { title: 'My API', version: '1.0.0' }
|
|
610
|
+
* })
|
|
611
|
+
* ]
|
|
612
|
+
* })
|
|
613
|
+
* export class AppModule {}
|
|
614
|
+
* ```
|
|
615
|
+
*
|
|
616
|
+
* @example With runtime override in middleware
|
|
617
|
+
* ```typescript
|
|
618
|
+
* // In RouteAccessMiddleware
|
|
619
|
+
* constructor(
|
|
620
|
+
* @inject(OPENAPI_TOKENS.ConfigService) private openAPIConfig: IOpenAPIConfigService
|
|
621
|
+
* ) {}
|
|
622
|
+
*
|
|
623
|
+
* async handle(ctx, next) {
|
|
624
|
+
* this.openAPIConfig.override({
|
|
625
|
+
* info: { title: 'Custom API' },
|
|
626
|
+
* routeFilter: (path) => this.shouldInclude(path)
|
|
627
|
+
* })
|
|
628
|
+
* await next()
|
|
629
|
+
* }
|
|
630
|
+
* ```
|
|
631
|
+
*/
|
|
632
|
+
var _OpenAPIModule;
|
|
633
|
+
/** Default options when none provided */
|
|
634
|
+
const DEFAULT_OPTIONS = {
|
|
635
|
+
jsonPath: "/api/openapi.json",
|
|
636
|
+
info: {
|
|
637
|
+
title: "API",
|
|
638
|
+
version: "1.0.0"
|
|
639
|
+
}
|
|
640
|
+
};
|
|
641
|
+
let OpenAPIModule = _OpenAPIModule = class OpenAPIModule {
|
|
642
|
+
/**
|
|
643
|
+
* Configure OpenAPI module with static options
|
|
644
|
+
*
|
|
645
|
+
* @param options - OpenAPI configuration (paths, info, security schemes)
|
|
646
|
+
* @returns DynamicModule with options provider
|
|
647
|
+
*/
|
|
648
|
+
static forRoot(options = {}) {
|
|
649
|
+
const mergedOptions = {
|
|
650
|
+
...DEFAULT_OPTIONS,
|
|
651
|
+
...options,
|
|
652
|
+
info: {
|
|
653
|
+
...DEFAULT_OPTIONS.info,
|
|
654
|
+
...options.info,
|
|
655
|
+
title: options.info?.title ?? DEFAULT_OPTIONS.info?.title ?? "API",
|
|
656
|
+
version: options.info?.version ?? DEFAULT_OPTIONS.info?.version ?? "1.0.0"
|
|
657
|
+
}
|
|
658
|
+
};
|
|
659
|
+
return {
|
|
660
|
+
module: _OpenAPIModule,
|
|
661
|
+
providers: [{
|
|
662
|
+
provide: OPENAPI_TOKENS.Options,
|
|
663
|
+
useValue: mergedOptions
|
|
664
|
+
}]
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
static forRootAsync(options) {
|
|
668
|
+
return {
|
|
669
|
+
module: _OpenAPIModule,
|
|
670
|
+
providers: [{
|
|
671
|
+
provide: OPENAPI_TOKENS.Options,
|
|
672
|
+
useFactory: options.useFactory,
|
|
673
|
+
inject: options.inject
|
|
674
|
+
}]
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
};
|
|
678
|
+
OpenAPIModule = _OpenAPIModule = __decorate([Module({ providers: [{
|
|
679
|
+
provide: OPENAPI_TOKENS.ConfigService,
|
|
680
|
+
useClass: OpenAPIConfigService,
|
|
681
|
+
scope: Scope.Request
|
|
682
|
+
}, {
|
|
683
|
+
provide: OPENAPI_TOKENS.OpenAPIService,
|
|
684
|
+
useClass: OpenAPIService
|
|
685
|
+
}] })], OpenAPIModule);
|
|
686
|
+
//#endregion
|
|
687
|
+
//#region src/router/errors/controller-method-not-found.error.ts
|
|
688
|
+
/**
|
|
689
|
+
* ControllerMethodNotFoundError
|
|
690
|
+
*
|
|
691
|
+
* Thrown when a controller method is registered but doesn't exist on the controller instance.
|
|
692
|
+
* This typically indicates a mismatch between route registration and controller implementation.
|
|
693
|
+
*/
|
|
694
|
+
var ControllerMethodNotFoundError = class extends ApplicationError {
|
|
695
|
+
constructor(methodName, controllerName) {
|
|
696
|
+
super("errors.controllerMethodNotFound", ERROR_CODES.ROUTER.CONTROLLER_METHOD_NOT_FOUND, {
|
|
697
|
+
methodName,
|
|
698
|
+
controllerName
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
//#endregion
|
|
703
|
+
//#region src/router/errors/hono-app-already-configured.error.ts
|
|
704
|
+
/**
|
|
705
|
+
* Error thrown when HonoApp.configure() is called more than once.
|
|
706
|
+
*
|
|
707
|
+
* HonoApp can only be configured a single time during application bootstrap.
|
|
708
|
+
*/
|
|
709
|
+
var HonoAppAlreadyConfiguredError = class extends ApplicationError {
|
|
710
|
+
constructor() {
|
|
711
|
+
super("errors.honoAppAlreadyConfigured", ERROR_CODES.SYSTEM.CONFIGURATION_ERROR);
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
//#endregion
|
|
715
|
+
//#region src/router/errors/controller-registration.error.ts
|
|
716
|
+
/**
|
|
717
|
+
* Error thrown when a controller fails to register
|
|
718
|
+
*
|
|
719
|
+
* This typically happens when:
|
|
720
|
+
* - Controller is missing the `@Controller` decorator
|
|
721
|
+
* - Controller route metadata is not set
|
|
722
|
+
* - Controller class name is invalid
|
|
723
|
+
*
|
|
724
|
+
* Error Code: 9005
|
|
725
|
+
*/
|
|
726
|
+
var ControllerRegistrationError = class extends ApplicationError {
|
|
727
|
+
constructor(controllerName, reason) {
|
|
728
|
+
super("errors.controllerRegistration", ERROR_CODES.ROUTER.CONTROLLER_REGISTRATION_ERROR, {
|
|
729
|
+
controllerName,
|
|
730
|
+
reason
|
|
731
|
+
});
|
|
732
|
+
}
|
|
733
|
+
};
|
|
734
|
+
//#endregion
|
|
735
|
+
//#region src/router/errors/openapi-route-registration.error.ts
|
|
736
|
+
/**
|
|
737
|
+
* OpenAPIRouteRegistrationError
|
|
738
|
+
*
|
|
739
|
+
* Thrown when an OpenAPI route fails to register properly
|
|
740
|
+
* This indicates a configuration issue with route decorators or metadata
|
|
741
|
+
* Uses i18n key for localized error messages
|
|
742
|
+
*
|
|
743
|
+
* @example
|
|
744
|
+
* ```typescript
|
|
745
|
+
* throw new OpenAPIRouteRegistrationError('/api/v1/users', 'Missing response schema')
|
|
746
|
+
* ```
|
|
747
|
+
*/
|
|
748
|
+
var OpenAPIRouteRegistrationError = class extends ApplicationError {
|
|
749
|
+
constructor(path, reason) {
|
|
750
|
+
super("errors.openapiRouteRegistration", ERROR_CODES.ROUTER.OPENAPI_ROUTE_REGISTRATION, {
|
|
751
|
+
path,
|
|
752
|
+
reason
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
};
|
|
756
|
+
//#endregion
|
|
757
|
+
//#region src/router/errors/openapi-validation.error.ts
|
|
758
|
+
/**
|
|
759
|
+
* OpenAPIValidationError
|
|
760
|
+
*
|
|
761
|
+
* Thrown when OpenAPI request/response validation fails
|
|
762
|
+
* Uses i18n key for localized error messages
|
|
763
|
+
*
|
|
764
|
+
* HTTP Status: 400 Bad Request
|
|
765
|
+
* Error Code: 1004
|
|
766
|
+
*
|
|
767
|
+
* @example
|
|
768
|
+
* ```typescript
|
|
769
|
+
* throw new OpenAPIValidationError('Request body missing required field: email')
|
|
770
|
+
* ```
|
|
771
|
+
*/
|
|
772
|
+
var OpenAPIValidationError = class extends ApplicationError {
|
|
773
|
+
constructor(details) {
|
|
774
|
+
super("errors.openapiValidation", ERROR_CODES.VALIDATION.REQUEST_VALIDATION, { details });
|
|
775
|
+
}
|
|
776
|
+
};
|
|
777
|
+
//#endregion
|
|
778
|
+
//#region src/router/errors/route-not-found.error.ts
|
|
779
|
+
/**
|
|
780
|
+
* Error thrown when a requested route is not found
|
|
781
|
+
*
|
|
782
|
+
* HTTP Status: 404 Not Found
|
|
783
|
+
* Error Code: 4004
|
|
784
|
+
*/
|
|
785
|
+
var RouteNotFoundError = class extends ApplicationError {
|
|
786
|
+
constructor(path, method) {
|
|
787
|
+
super("errors.routeNotFound", ERROR_CODES.RESOURCE.ROUTE_NOT_FOUND, {
|
|
788
|
+
path,
|
|
789
|
+
method
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
};
|
|
793
|
+
//#endregion
|
|
794
|
+
//#region src/router/errors/schema-validation.error.ts
|
|
795
|
+
/**
|
|
796
|
+
* SchemaValidationError
|
|
797
|
+
*
|
|
798
|
+
* Thrown when Zod schema validation fails
|
|
799
|
+
*/
|
|
800
|
+
var SchemaValidationError = class extends ApplicationError {
|
|
801
|
+
constructor(zodError) {
|
|
802
|
+
const issues = zodError.issues.map((err) => ({
|
|
803
|
+
path: err.path.join("."),
|
|
804
|
+
message: err.message,
|
|
805
|
+
code: err.code
|
|
806
|
+
}));
|
|
807
|
+
super("errors.schemaValidation", ERROR_CODES.VALIDATION.SCHEMA_VALIDATION, { issues });
|
|
808
|
+
}
|
|
809
|
+
};
|
|
810
|
+
//#endregion
|
|
811
|
+
//#region src/router/middleware/logger.middleware.ts
|
|
812
|
+
/**
|
|
813
|
+
* Create a Hono middleware that logs HTTP requests using our Logger service
|
|
814
|
+
*
|
|
815
|
+
* Logs request method, path, status code, and duration in milliseconds.
|
|
816
|
+
* Format: [HTTP] METHOD /path -> STATUS (duration ms)
|
|
817
|
+
*
|
|
818
|
+
* @param logger - Logger service instance
|
|
819
|
+
* @returns Hono middleware handler
|
|
820
|
+
*
|
|
821
|
+
* @example
|
|
822
|
+
* ```typescript
|
|
823
|
+
* const logger = container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)
|
|
824
|
+
* app.use('*', createLoggerMiddleware(logger))
|
|
825
|
+
* ```
|
|
826
|
+
*/
|
|
827
|
+
function createLoggerMiddleware(logger) {
|
|
828
|
+
return async (c, next) => {
|
|
829
|
+
const start = Date.now();
|
|
830
|
+
const method = c.req.method;
|
|
831
|
+
const path = c.req.path;
|
|
832
|
+
await next();
|
|
833
|
+
const duration = Date.now() - start;
|
|
834
|
+
const status = c.res.status;
|
|
835
|
+
logger.info(`[HTTP] ${method} ${path} -> ${status}`, {
|
|
836
|
+
method,
|
|
837
|
+
path,
|
|
838
|
+
status,
|
|
839
|
+
duration
|
|
840
|
+
});
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
//#endregion
|
|
844
|
+
//#region src/router/schemas/common.schemas.ts
|
|
845
|
+
/**
|
|
846
|
+
* Common OpenAPI Schemas
|
|
847
|
+
*
|
|
848
|
+
* Reusable schema definitions for common API patterns:
|
|
849
|
+
* - Error responses
|
|
850
|
+
* - Pagination
|
|
851
|
+
* - Common parameters
|
|
852
|
+
*/
|
|
853
|
+
/**
|
|
854
|
+
* Generic error response schema
|
|
855
|
+
* Used for all error responses (4xx, 5xx)
|
|
856
|
+
* Matches ApplicationError.toErrorResponse() structure
|
|
857
|
+
*/
|
|
858
|
+
const errorResponseSchema = z.object({
|
|
859
|
+
code: z.number().int().describe("Application error code"),
|
|
860
|
+
message: z.string().describe("Human-readable error message"),
|
|
861
|
+
timestamp: z.string().datetime().describe("ISO timestamp when error occurred"),
|
|
862
|
+
metadata: z.record(z.string(), z.unknown()).optional().describe("Additional error context"),
|
|
863
|
+
stack: z.string().optional().describe("Stack trace (development only)")
|
|
864
|
+
}).openapi("ErrorResponse");
|
|
865
|
+
/**
|
|
866
|
+
* Validation error response schema
|
|
867
|
+
* Used for 400 Bad Request with validation failures
|
|
868
|
+
* Matches ApplicationError.toErrorResponse() structure with validation-specific metadata
|
|
869
|
+
*/
|
|
870
|
+
const validationErrorResponseSchema = z.object({
|
|
871
|
+
code: z.number().int().describe("Application error code"),
|
|
872
|
+
message: z.string().describe("Human-readable error message"),
|
|
873
|
+
timestamp: z.string().datetime().describe("ISO timestamp when error occurred"),
|
|
874
|
+
metadata: z.object({ issues: z.array(z.object({
|
|
875
|
+
path: z.string().describe("Field path that failed validation"),
|
|
876
|
+
message: z.string().describe("Validation failure message"),
|
|
877
|
+
code: z.string().describe("Zod validation error code")
|
|
878
|
+
})) }).describe("Validation error details"),
|
|
879
|
+
stack: z.string().optional().describe("Stack trace (development only)")
|
|
880
|
+
}).openapi("ValidationErrorResponse");
|
|
881
|
+
/**
|
|
882
|
+
* Pagination query parameters schema
|
|
883
|
+
* Used for list endpoints
|
|
884
|
+
*/
|
|
885
|
+
const paginationQuerySchema = z.object({
|
|
886
|
+
page: z.coerce.number().int().positive().default(1).describe("Page number (1-indexed)"),
|
|
887
|
+
limit: z.coerce.number().int().positive().max(100).default(20).describe("Items per page (max 100)")
|
|
888
|
+
}).openapi("PaginationQuery");
|
|
889
|
+
/**
|
|
890
|
+
* Paginated response wrapper schema
|
|
891
|
+
* Generic wrapper for paginated list responses
|
|
892
|
+
*/
|
|
893
|
+
const paginatedResponseSchema = (itemSchema) => z.object({
|
|
894
|
+
data: z.array(itemSchema).describe("Array of items for current page"),
|
|
895
|
+
pagination: z.object({
|
|
896
|
+
page: z.number().int().positive().describe("Current page number"),
|
|
897
|
+
limit: z.number().int().positive().describe("Items per page"),
|
|
898
|
+
total: z.number().int().nonnegative().describe("Total number of items"),
|
|
899
|
+
totalPages: z.number().int().nonnegative().describe("Total number of pages")
|
|
900
|
+
})
|
|
901
|
+
});
|
|
902
|
+
/**
|
|
903
|
+
* UUID parameter schema
|
|
904
|
+
* Used for :id parameters in RESTful routes
|
|
905
|
+
*/
|
|
906
|
+
const uuidParamSchema = z.object({ id: z.string().uuid().describe("Resource UUID") }).openapi("UUIDParam");
|
|
907
|
+
/**
|
|
908
|
+
* Success message response schema
|
|
909
|
+
* Used for operations that don't return data (e.g., DELETE)
|
|
910
|
+
*/
|
|
911
|
+
const successMessageSchema = z.object({
|
|
912
|
+
message: z.string().describe("Success message"),
|
|
913
|
+
data: z.record(z.string(), z.unknown()).optional().describe("Optional additional data")
|
|
914
|
+
}).openapi("SuccessMessage");
|
|
915
|
+
/**
|
|
916
|
+
* Common HTTP status error schemas
|
|
917
|
+
* Pre-configured for standard error responses
|
|
918
|
+
*/
|
|
919
|
+
const commonErrorSchemas = {
|
|
920
|
+
400: {
|
|
921
|
+
schema: validationErrorResponseSchema,
|
|
922
|
+
description: "Validation error"
|
|
923
|
+
},
|
|
924
|
+
401: {
|
|
925
|
+
schema: errorResponseSchema,
|
|
926
|
+
description: "Unauthorized"
|
|
927
|
+
},
|
|
928
|
+
403: {
|
|
929
|
+
schema: errorResponseSchema,
|
|
930
|
+
description: "Forbidden"
|
|
931
|
+
},
|
|
932
|
+
404: {
|
|
933
|
+
schema: errorResponseSchema,
|
|
934
|
+
description: "Not found"
|
|
935
|
+
},
|
|
936
|
+
409: {
|
|
937
|
+
schema: errorResponseSchema,
|
|
938
|
+
description: "Conflict"
|
|
939
|
+
},
|
|
940
|
+
500: {
|
|
941
|
+
schema: errorResponseSchema,
|
|
942
|
+
description: "Internal server error"
|
|
943
|
+
}
|
|
944
|
+
};
|
|
945
|
+
//#endregion
|
|
946
|
+
//#region src/router/services/route-registration.service.ts
|
|
947
|
+
const invokeHandler = (instance, method, ...args) => {
|
|
948
|
+
try {
|
|
949
|
+
return Promise.resolve(instance[method](...args));
|
|
950
|
+
} catch (err) {
|
|
951
|
+
return Promise.reject(err);
|
|
952
|
+
}
|
|
953
|
+
};
|
|
954
|
+
/**
|
|
955
|
+
* Route registration service
|
|
956
|
+
* Manages controller and route registration with OpenAPI support
|
|
957
|
+
*
|
|
958
|
+
* Responsibilities:
|
|
959
|
+
* - Register RESTful controllers with OpenAPI metadata
|
|
960
|
+
* - Auto-derive HTTP methods/paths from controller method names
|
|
961
|
+
* - Build OpenAPI route configurations with guard execution
|
|
962
|
+
* - Validate all controllers have access decorators (strict mode)
|
|
963
|
+
* - Create controller handlers with DI resolution
|
|
964
|
+
*/
|
|
965
|
+
var RouteRegistrationService = class {
|
|
966
|
+
controllerClasses = /* @__PURE__ */ new Map();
|
|
967
|
+
constructor(logger, versioningOptions = null) {
|
|
968
|
+
this.logger = logger;
|
|
969
|
+
this.versioningOptions = versioningOptions;
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Configure router with controllers
|
|
973
|
+
*
|
|
974
|
+
* @param app - OpenAPIHono application instance
|
|
975
|
+
* @param controllers - Array of controller classes from modules
|
|
976
|
+
*/
|
|
977
|
+
async configure(app, controllers) {
|
|
978
|
+
this.logger.info("Registering controllers", { controllerCount: controllers.length });
|
|
979
|
+
const sortedControllers = [...controllers].sort((a, b) => {
|
|
980
|
+
const aHasHandle = "handle" in a.prototype;
|
|
981
|
+
const bHasHandle = "handle" in b.prototype;
|
|
982
|
+
if (aHasHandle && !bHasHandle) return 1;
|
|
983
|
+
if (!aHasHandle && bHasHandle) return -1;
|
|
984
|
+
return 0;
|
|
985
|
+
});
|
|
986
|
+
const gateways = [];
|
|
987
|
+
const regulars = [];
|
|
988
|
+
for (const c of sortedControllers) if (isGateway(c)) gateways.push(c);
|
|
989
|
+
else regulars.push(c);
|
|
990
|
+
for (const GatewayClass of gateways) await this.registerGateway(app, GatewayClass);
|
|
991
|
+
for (const ControllerClass of regulars) this.registerController(app, ControllerClass);
|
|
992
|
+
this.logger.info("Controller registration complete");
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* Register a WebSocket gateway
|
|
996
|
+
* Applies versioning and guards, then registers an upgradeWebSocket handler
|
|
997
|
+
*/
|
|
998
|
+
async registerGateway(app, GatewayClass) {
|
|
999
|
+
const route = getControllerRoute(GatewayClass);
|
|
1000
|
+
if (!route) throw new ControllerRegistrationError(GatewayClass.name, "Missing @Gateway decorator or route metadata");
|
|
1001
|
+
const controllerOpts = getControllerOptions(GatewayClass);
|
|
1002
|
+
const paths = this.versioningOptions ? this.resolveVersionedPaths(route, controllerOpts) : [route];
|
|
1003
|
+
for (const fullPath of paths) await this.registerGatewayRoute(app, GatewayClass, fullPath);
|
|
1004
|
+
}
|
|
1005
|
+
/**
|
|
1006
|
+
* Register a single WebSocket gateway route
|
|
1007
|
+
*/
|
|
1008
|
+
async registerGatewayRoute(app, GatewayClass, fullPath) {
|
|
1009
|
+
const controllerGuards = getControllerGuards(GatewayClass)?.guards ?? [];
|
|
1010
|
+
const { upgradeWebSocket } = await import("hono/cloudflare-workers");
|
|
1011
|
+
const onMsgMethod = getWsOnMessageMethod(GatewayClass);
|
|
1012
|
+
const onCloseMethod = getWsOnCloseMethod(GatewayClass);
|
|
1013
|
+
const onErrMethod = getWsOnErrorMethod(GatewayClass);
|
|
1014
|
+
const wsHandler = upgradeWebSocket((c) => {
|
|
1015
|
+
const gateway = new RouterContext(c).getContainer().resolve(GatewayClass);
|
|
1016
|
+
const events = {};
|
|
1017
|
+
const bindWsHandler = (method, onCatch) => {
|
|
1018
|
+
return (evt, ws) => {
|
|
1019
|
+
const ctx = new GatewayContext(c, ws);
|
|
1020
|
+
c.executionCtx.waitUntil(invokeHandler(gateway, method, evt, ctx).catch((err) => {
|
|
1021
|
+
this.logger.error(`WebSocket ${method} handler error`, {
|
|
1022
|
+
gateway: GatewayClass.name,
|
|
1023
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1024
|
+
});
|
|
1025
|
+
onCatch?.(err, ws);
|
|
1026
|
+
}));
|
|
1027
|
+
};
|
|
1028
|
+
};
|
|
1029
|
+
if (onMsgMethod) events.onMessage = bindWsHandler(onMsgMethod, (_err, ws) => ws.close(1011, "Internal Error"));
|
|
1030
|
+
if (onCloseMethod) events.onClose = bindWsHandler(onCloseMethod);
|
|
1031
|
+
if (onErrMethod) events.onError = bindWsHandler(onErrMethod);
|
|
1032
|
+
return events;
|
|
1033
|
+
});
|
|
1034
|
+
this.logger.info("Registering WebSocket gateway", {
|
|
1035
|
+
gateway: GatewayClass.name,
|
|
1036
|
+
path: fullPath
|
|
1037
|
+
});
|
|
1038
|
+
const handlers = [];
|
|
1039
|
+
if (controllerGuards.length > 0) {
|
|
1040
|
+
this.logger.info("Gateway guards", {
|
|
1041
|
+
gateway: GatewayClass.name,
|
|
1042
|
+
path: fullPath,
|
|
1043
|
+
guardCount: controllerGuards.length
|
|
1044
|
+
});
|
|
1045
|
+
handlers.push(this.createGuardMiddleware(controllerGuards));
|
|
1046
|
+
}
|
|
1047
|
+
handlers.push(wsHandler);
|
|
1048
|
+
app.get(fullPath, ...handlers);
|
|
1049
|
+
}
|
|
1050
|
+
/**
|
|
1051
|
+
* Register a single controller with all its routes
|
|
1052
|
+
* Validates that controller has access decorator (strict mode)
|
|
1053
|
+
*/
|
|
1054
|
+
registerController(app, ControllerClass) {
|
|
1055
|
+
const route = getControllerRoute(ControllerClass);
|
|
1056
|
+
if (!route) throw new ControllerRegistrationError(ControllerClass.name, "Missing @Controller decorator or route metadata");
|
|
1057
|
+
const className = ControllerClass.name;
|
|
1058
|
+
this.controllerClasses.set(className, ControllerClass);
|
|
1059
|
+
const prototype = ControllerClass.prototype;
|
|
1060
|
+
const controllerOpts = getControllerOptions(ControllerClass);
|
|
1061
|
+
if (prototype.handle) {
|
|
1062
|
+
if (!this.versioningOptions) this.registerWildcardRoute(app, ControllerClass, route);
|
|
1063
|
+
else for (const versionedRoute of this.resolveVersionedPaths(route, controllerOpts)) this.registerWildcardRoute(app, ControllerClass, versionedRoute);
|
|
1064
|
+
return;
|
|
1065
|
+
}
|
|
1066
|
+
const decoratedMethods = getDecoratedMethods(ControllerClass);
|
|
1067
|
+
const httpDecoratedMethods = getHttpDecoratedMethods(ControllerClass);
|
|
1068
|
+
if (decoratedMethods.length > 0 && httpDecoratedMethods.length > 0) throw new ControllerRegistrationError(ControllerClass.name, "Cannot mix @Route() with HTTP method decorators (@Get, @Post, etc.) in the same controller. Use one pattern or the other.");
|
|
1069
|
+
if (!this.versioningOptions) {
|
|
1070
|
+
this.dispatchRoutes(app, ControllerClass, route, decoratedMethods, httpDecoratedMethods, controllerOpts, prototype);
|
|
1071
|
+
return;
|
|
1072
|
+
}
|
|
1073
|
+
for (const versionedRoute of this.resolveVersionedPaths(route, controllerOpts)) this.dispatchRoutes(app, ControllerClass, versionedRoute, decoratedMethods, httpDecoratedMethods, controllerOpts, prototype);
|
|
1074
|
+
}
|
|
1075
|
+
/**
|
|
1076
|
+
* Dispatch route registration based on decorator type
|
|
1077
|
+
*/
|
|
1078
|
+
dispatchRoutes(app, ControllerClass, path, decoratedMethods, httpDecoratedMethods, controllerOpts, prototype) {
|
|
1079
|
+
if (httpDecoratedMethods.length > 0) this.registerHttpRoutes(app, ControllerClass, path, httpDecoratedMethods, controllerOpts);
|
|
1080
|
+
else if (decoratedMethods.length > 0) this.registerOpenAPIRoutes(app, ControllerClass, path, decoratedMethods, controllerOpts);
|
|
1081
|
+
else this.registerRESTfulRoutes(app, ControllerClass, path, prototype);
|
|
1082
|
+
}
|
|
1083
|
+
/**
|
|
1084
|
+
* Resolve versioned paths for a controller based on versioning configuration.
|
|
1085
|
+
*
|
|
1086
|
+
* @param basePath - The base path from @Controller decorator
|
|
1087
|
+
* @param controllerOpts - Controller options (may contain version)
|
|
1088
|
+
* @returns Array of resolved paths (with version prefix if applicable)
|
|
1089
|
+
*/
|
|
1090
|
+
resolveVersionedPaths(basePath, controllerOpts) {
|
|
1091
|
+
if (!this.versioningOptions) return [basePath];
|
|
1092
|
+
const version = controllerOpts?.version;
|
|
1093
|
+
if (version === VERSION_NEUTRAL) return [basePath];
|
|
1094
|
+
const prefix = this.versioningOptions.prefix ?? "v";
|
|
1095
|
+
if (version !== void 0) return (Array.isArray(version) ? version : [version]).map((v) => `/${prefix}${v}${basePath}`);
|
|
1096
|
+
if (this.versioningOptions.defaultVersion !== void 0) return (Array.isArray(this.versioningOptions.defaultVersion) ? this.versioningOptions.defaultVersion : [this.versioningOptions.defaultVersion]).map((v) => `/${prefix}${v}${basePath}`);
|
|
1097
|
+
return [basePath];
|
|
1098
|
+
}
|
|
1099
|
+
/**
|
|
1100
|
+
* Create a guard execution middleware
|
|
1101
|
+
*
|
|
1102
|
+
* This middleware executes all guards for a route before the handler.
|
|
1103
|
+
* Guards are executed in order; all must pass for the request to proceed.
|
|
1104
|
+
*
|
|
1105
|
+
* @param guards - Array of guards to execute
|
|
1106
|
+
* @returns Hono middleware function
|
|
1107
|
+
*/
|
|
1108
|
+
createGuardMiddleware(guards) {
|
|
1109
|
+
const guardService = new GuardExecutionService(this.logger);
|
|
1110
|
+
return async (c, next) => {
|
|
1111
|
+
const ctx = new RouterContext(c);
|
|
1112
|
+
const container = ctx.getContainer();
|
|
1113
|
+
await guardService.executeGuards(guards, ctx, container);
|
|
1114
|
+
await next();
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
/**
|
|
1118
|
+
* Register wildcard route for non-RESTful controllers
|
|
1119
|
+
*/
|
|
1120
|
+
registerWildcardRoute(app, ControllerClass, route) {
|
|
1121
|
+
this.logger.info(`Registering wildcard route`, {
|
|
1122
|
+
controller: ControllerClass.name,
|
|
1123
|
+
route: `${route}/:path{.+}`,
|
|
1124
|
+
method: "ALL"
|
|
1125
|
+
});
|
|
1126
|
+
const handler = this.createControllerHandler(ControllerClass, "handle");
|
|
1127
|
+
app.all(route, handler);
|
|
1128
|
+
app.all(`${route}/:path{.+}`, handler);
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Register OpenAPI routes with metadata
|
|
1132
|
+
*/
|
|
1133
|
+
registerOpenAPIRoutes(app, ControllerClass, route, decoratedMethods, controllerOpts) {
|
|
1134
|
+
const className = ControllerClass.name;
|
|
1135
|
+
const prototype = ControllerClass.prototype;
|
|
1136
|
+
const controllerHidden = controllerOpts?.hideFromDocs ?? false;
|
|
1137
|
+
const controllerGuards = getControllerGuards(ControllerClass)?.guards ?? [];
|
|
1138
|
+
for (const methodName of decoratedMethods) {
|
|
1139
|
+
const routeConfig = getRouteConfig(prototype, methodName);
|
|
1140
|
+
if (!routeConfig) continue;
|
|
1141
|
+
const derived = this.deriveHttpMethodAndPath(methodName, route);
|
|
1142
|
+
if (!derived) {
|
|
1143
|
+
this.logger.warn(`Cannot derive HTTP method/path for ${className}.${methodName}`);
|
|
1144
|
+
continue;
|
|
1145
|
+
}
|
|
1146
|
+
if (routeConfig.hideFromDocs ?? controllerHidden) {
|
|
1147
|
+
this.logger.info(`Registering hidden route (no OpenAPI)`, {
|
|
1148
|
+
controller: className,
|
|
1149
|
+
method: derived.method.toUpperCase(),
|
|
1150
|
+
path: derived.path,
|
|
1151
|
+
methodName
|
|
1152
|
+
});
|
|
1153
|
+
this.registerRouteWithoutOpenAPI(app, ControllerClass, methodName, derived);
|
|
1154
|
+
continue;
|
|
1155
|
+
}
|
|
1156
|
+
const methodGuards = getMethodGuards(prototype, methodName)?.guards ?? [];
|
|
1157
|
+
const allGuards = [...controllerGuards, ...methodGuards];
|
|
1158
|
+
if (allGuards.length > 0) this.logger.info(`Route guards`, {
|
|
1159
|
+
controller: className,
|
|
1160
|
+
method: derived.method.toUpperCase(),
|
|
1161
|
+
path: derived.path,
|
|
1162
|
+
methodName,
|
|
1163
|
+
guardCount: allGuards.length
|
|
1164
|
+
});
|
|
1165
|
+
const metadata = this.mergeMetadata(controllerOpts, routeConfig, ControllerClass, methodName);
|
|
1166
|
+
const openApiRoute = this.buildOpenAPIRoute(derived.method, derived.path, routeConfig, metadata, allGuards, methodName);
|
|
1167
|
+
this.logger.info(`Registering OpenAPI route`, {
|
|
1168
|
+
controller: className,
|
|
1169
|
+
method: derived.method.toUpperCase(),
|
|
1170
|
+
path: derived.path,
|
|
1171
|
+
methodName,
|
|
1172
|
+
tags: metadata.tags
|
|
1173
|
+
});
|
|
1174
|
+
app.openapi(openApiRoute, async (c) => {
|
|
1175
|
+
const ctx = new RouterContext(c);
|
|
1176
|
+
const requestContainer = ctx.getContainer();
|
|
1177
|
+
const controller = requestContainer.resolve(ControllerClass);
|
|
1178
|
+
const method = controller[methodName];
|
|
1179
|
+
if (typeof method === "function") {
|
|
1180
|
+
const injectedArgs = this.resolveMethodInjections(prototype, methodName, requestContainer);
|
|
1181
|
+
return await method.call(controller, ctx, ...injectedArgs);
|
|
1182
|
+
}
|
|
1183
|
+
throw new ControllerMethodNotFoundError(methodName, className);
|
|
1184
|
+
});
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
/**
|
|
1188
|
+
* Register routes using HTTP method decorators (@Get, @Post, etc.)
|
|
1189
|
+
* These use explicit method + path instead of convention-based derivation
|
|
1190
|
+
*/
|
|
1191
|
+
registerHttpRoutes(app, ControllerClass, basePath, httpDecoratedMethods, controllerOpts) {
|
|
1192
|
+
const className = ControllerClass.name;
|
|
1193
|
+
const prototype = ControllerClass.prototype;
|
|
1194
|
+
const controllerHidden = controllerOpts?.hideFromDocs ?? false;
|
|
1195
|
+
const controllerGuards = getControllerGuards(ControllerClass)?.guards ?? [];
|
|
1196
|
+
for (const methodName of httpDecoratedMethods) {
|
|
1197
|
+
const httpMeta = getHttpRouteMetadata(prototype, methodName);
|
|
1198
|
+
if (!httpMeta) continue;
|
|
1199
|
+
const fullPath = this.joinPaths(basePath, httpMeta.path);
|
|
1200
|
+
const routeConfig = httpMeta.config;
|
|
1201
|
+
const hideFromDocs = routeConfig.hideFromDocs ?? controllerHidden;
|
|
1202
|
+
if (httpMeta.method === "all" || hideFromDocs) {
|
|
1203
|
+
this.logger.info(`Registering route (no OpenAPI)`, {
|
|
1204
|
+
controller: className,
|
|
1205
|
+
method: httpMeta.method.toUpperCase(),
|
|
1206
|
+
path: fullPath,
|
|
1207
|
+
methodName
|
|
1208
|
+
});
|
|
1209
|
+
this.registerRouteWithoutOpenAPI(app, ControllerClass, methodName, {
|
|
1210
|
+
method: httpMeta.method,
|
|
1211
|
+
path: fullPath
|
|
1212
|
+
});
|
|
1213
|
+
continue;
|
|
1214
|
+
}
|
|
1215
|
+
const methodGuards = getMethodGuards(prototype, methodName)?.guards ?? [];
|
|
1216
|
+
const allGuards = [...controllerGuards, ...methodGuards];
|
|
1217
|
+
if (allGuards.length > 0) this.logger.info(`Route guards`, {
|
|
1218
|
+
controller: className,
|
|
1219
|
+
method: httpMeta.method.toUpperCase(),
|
|
1220
|
+
path: fullPath,
|
|
1221
|
+
methodName,
|
|
1222
|
+
guardCount: allGuards.length
|
|
1223
|
+
});
|
|
1224
|
+
const metadata = this.mergeMetadata(controllerOpts, routeConfig, ControllerClass, methodName);
|
|
1225
|
+
const statusCode = routeConfig.statusCode ?? 200;
|
|
1226
|
+
const openApiRoute = this.buildOpenAPIRoute(httpMeta.method, fullPath, routeConfig, metadata, allGuards, void 0, statusCode);
|
|
1227
|
+
this.logger.info(`Registering OpenAPI route`, {
|
|
1228
|
+
controller: className,
|
|
1229
|
+
method: httpMeta.method.toUpperCase(),
|
|
1230
|
+
path: fullPath,
|
|
1231
|
+
methodName,
|
|
1232
|
+
tags: metadata.tags
|
|
1233
|
+
});
|
|
1234
|
+
app.openapi(openApiRoute, async (c) => {
|
|
1235
|
+
const ctx = new RouterContext(c);
|
|
1236
|
+
const requestContainer = ctx.getContainer();
|
|
1237
|
+
const controller = requestContainer.resolve(ControllerClass);
|
|
1238
|
+
const method = controller[methodName];
|
|
1239
|
+
if (typeof method === "function") {
|
|
1240
|
+
const injectedArgs = this.resolveMethodInjections(prototype, methodName, requestContainer);
|
|
1241
|
+
return await method.call(controller, ctx, ...injectedArgs);
|
|
1242
|
+
}
|
|
1243
|
+
throw new ControllerMethodNotFoundError(methodName, className);
|
|
1244
|
+
});
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
/**
|
|
1248
|
+
* Join a base path and a route path, normalizing slashes
|
|
1249
|
+
*/
|
|
1250
|
+
joinPaths(basePath, routePath) {
|
|
1251
|
+
if (routePath === "/") return basePath;
|
|
1252
|
+
return basePath + routePath;
|
|
1253
|
+
}
|
|
1254
|
+
/**
|
|
1255
|
+
* Register route without OpenAPI metadata (for hidden routes)
|
|
1256
|
+
* Route is functional but won't appear in documentation
|
|
1257
|
+
*/
|
|
1258
|
+
registerRouteWithoutOpenAPI(app, ControllerClass, methodName, derived) {
|
|
1259
|
+
const prototype = ControllerClass.prototype;
|
|
1260
|
+
const handler = async (c) => {
|
|
1261
|
+
const ctx = new RouterContext(c);
|
|
1262
|
+
const requestContainer = ctx.getContainer();
|
|
1263
|
+
const controller = requestContainer.resolve(ControllerClass);
|
|
1264
|
+
const method = controller[methodName];
|
|
1265
|
+
if (typeof method === "function") {
|
|
1266
|
+
const injectedArgs = this.resolveMethodInjections(prototype, methodName, requestContainer);
|
|
1267
|
+
return await method.call(controller, ctx, ...injectedArgs);
|
|
1268
|
+
}
|
|
1269
|
+
throw new ControllerMethodNotFoundError(methodName, ControllerClass.name);
|
|
1270
|
+
};
|
|
1271
|
+
switch (derived.method) {
|
|
1272
|
+
case "get":
|
|
1273
|
+
app.get(derived.path, handler);
|
|
1274
|
+
break;
|
|
1275
|
+
case "post":
|
|
1276
|
+
app.post(derived.path, handler);
|
|
1277
|
+
break;
|
|
1278
|
+
case "put":
|
|
1279
|
+
app.put(derived.path, handler);
|
|
1280
|
+
break;
|
|
1281
|
+
case "patch":
|
|
1282
|
+
app.patch(derived.path, handler);
|
|
1283
|
+
break;
|
|
1284
|
+
case "delete":
|
|
1285
|
+
app.delete(derived.path, handler);
|
|
1286
|
+
break;
|
|
1287
|
+
case "all":
|
|
1288
|
+
app.all(derived.path, handler);
|
|
1289
|
+
break;
|
|
1290
|
+
default:
|
|
1291
|
+
app.all(derived.path, handler);
|
|
1292
|
+
break;
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
/**
|
|
1296
|
+
* Register traditional RESTful routes without OpenAPI
|
|
1297
|
+
*/
|
|
1298
|
+
registerRESTfulRoutes(app, ControllerClass, route, prototype) {
|
|
1299
|
+
if (prototype.index) app.get(route, this.createControllerHandler(ControllerClass, "index"));
|
|
1300
|
+
if (prototype.show) app.get(`${route}/:id`, this.createControllerHandler(ControllerClass, "show"));
|
|
1301
|
+
if (prototype.create) app.post(route, this.createControllerHandler(ControllerClass, "create"));
|
|
1302
|
+
if (prototype.update) app.put(`${route}/:id`, this.createControllerHandler(ControllerClass, "update"));
|
|
1303
|
+
if (prototype.patch) app.patch(`${route}/:id`, this.createControllerHandler(ControllerClass, "patch"));
|
|
1304
|
+
if (prototype.destroy) app.delete(`${route}/:id`, this.createControllerHandler(ControllerClass, "destroy"));
|
|
1305
|
+
}
|
|
1306
|
+
/**
|
|
1307
|
+
* Auto-derive HTTP method and path from controller method name
|
|
1308
|
+
* Uses HTTP_METHODS constant for RESTful convention mapping
|
|
1309
|
+
*/
|
|
1310
|
+
deriveHttpMethodAndPath(methodName, basePath) {
|
|
1311
|
+
if (!(methodName in HTTP_METHODS)) return null;
|
|
1312
|
+
const mapping = HTTP_METHODS[methodName];
|
|
1313
|
+
return {
|
|
1314
|
+
method: mapping.method,
|
|
1315
|
+
path: basePath + mapping.path
|
|
1316
|
+
};
|
|
1317
|
+
}
|
|
1318
|
+
/**
|
|
1319
|
+
* Merge controller-level and route-level metadata
|
|
1320
|
+
* Tags are merged (appended), security is merged (union)
|
|
1321
|
+
* Guards automatically add sessionCookie security if present
|
|
1322
|
+
*/
|
|
1323
|
+
mergeMetadata(controllerOpts, routeConfig, ControllerClass, methodName) {
|
|
1324
|
+
const tags = [...controllerOpts?.tags ?? [], ...routeConfig.tags ?? []];
|
|
1325
|
+
const prototype = ControllerClass.prototype;
|
|
1326
|
+
const hasMethodGuards = (getMethodGuards(prototype, methodName)?.guards.length ?? 0) > 0;
|
|
1327
|
+
const hasControllerGuards = (getControllerGuards(ControllerClass)?.guards.length ?? 0) > 0;
|
|
1328
|
+
const requiresAuth = hasMethodGuards || hasControllerGuards;
|
|
1329
|
+
let security = [];
|
|
1330
|
+
if (routeConfig.security !== void 0) security = [...controllerOpts?.security ?? [], ...routeConfig.security];
|
|
1331
|
+
else if (controllerOpts?.security) security = controllerOpts.security;
|
|
1332
|
+
if (requiresAuth && !security.includes(SECURITY_SCHEMES.SESSION_COOKIE)) security.push(SECURITY_SCHEMES.SESSION_COOKIE);
|
|
1333
|
+
return {
|
|
1334
|
+
tags,
|
|
1335
|
+
security: security.length > 0 ? security.map((scheme) => ({ [scheme]: [] })) : []
|
|
1336
|
+
};
|
|
1337
|
+
}
|
|
1338
|
+
/**
|
|
1339
|
+
* Build OpenAPI route configuration from metadata
|
|
1340
|
+
* Creates a route definition compatible with @hono/zod-openapi
|
|
1341
|
+
* Includes guard execution for proper access control
|
|
1342
|
+
*
|
|
1343
|
+
* Execution order: Global middlewares → Guards → Handler
|
|
1344
|
+
*/
|
|
1345
|
+
buildOpenAPIRoute(method, path, routeConfig, metadata, guards, methodName, statusCodeOverride) {
|
|
1346
|
+
try {
|
|
1347
|
+
const route = {
|
|
1348
|
+
method,
|
|
1349
|
+
path,
|
|
1350
|
+
request: {},
|
|
1351
|
+
responses: {}
|
|
1352
|
+
};
|
|
1353
|
+
if (guards.length > 0) route.middleware = [this.createGuardMiddleware(guards)];
|
|
1354
|
+
if (routeConfig.body) {
|
|
1355
|
+
const bodySchema = this.isRouteBodyObject(routeConfig.body) ? routeConfig.body.schema : routeConfig.body;
|
|
1356
|
+
const bodyContentType = this.isRouteBodyObject(routeConfig.body) ? routeConfig.body.contentType ?? "application/json" : DEFAULT_CONTENT_TYPE;
|
|
1357
|
+
route.request = {
|
|
1358
|
+
...route.request,
|
|
1359
|
+
body: { content: { [bodyContentType]: { schema: bodySchema } } }
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
if (routeConfig.query) route.request = {
|
|
1363
|
+
...route.request,
|
|
1364
|
+
query: routeConfig.query
|
|
1365
|
+
};
|
|
1366
|
+
if (routeConfig.params) route.request = {
|
|
1367
|
+
...route.request,
|
|
1368
|
+
params: routeConfig.params
|
|
1369
|
+
};
|
|
1370
|
+
const successStatus = statusCodeOverride ?? (methodName && METHOD_STATUS_CODES[methodName]) ?? 200;
|
|
1371
|
+
const responses = {};
|
|
1372
|
+
const responseDef = routeConfig.response;
|
|
1373
|
+
if (responseDef) if (typeof responseDef === "object" && "schema" in responseDef) responses[successStatus] = {
|
|
1374
|
+
content: { [responseDef.contentType ?? "application/json"]: { schema: responseDef.schema } },
|
|
1375
|
+
description: responseDef.description ?? `Response ${successStatus}`
|
|
1376
|
+
};
|
|
1377
|
+
else responses[successStatus] = {
|
|
1378
|
+
content: { [DEFAULT_CONTENT_TYPE]: { schema: responseDef } },
|
|
1379
|
+
description: `Response ${successStatus}`
|
|
1380
|
+
};
|
|
1381
|
+
for (const [statusStr, schema] of Object.entries(commonErrorSchemas)) {
|
|
1382
|
+
const status = parseInt(statusStr);
|
|
1383
|
+
responses[status] ??= schema;
|
|
1384
|
+
}
|
|
1385
|
+
route.responses = responses;
|
|
1386
|
+
if (metadata.tags.length > 0) route.tags = metadata.tags;
|
|
1387
|
+
if (metadata.security.length > 0) route.security = metadata.security;
|
|
1388
|
+
if (routeConfig.description) route.description = routeConfig.description;
|
|
1389
|
+
if (routeConfig.summary) route.summary = routeConfig.summary;
|
|
1390
|
+
return (0, validation_exports.createRoute)(route);
|
|
1391
|
+
} catch (error) {
|
|
1392
|
+
throw new OpenAPIRouteRegistrationError(path, error instanceof Error ? error.message : String(error));
|
|
1393
|
+
}
|
|
1394
|
+
}
|
|
1395
|
+
/**
|
|
1396
|
+
* Check if a body definition is a RouteBodyObject (has schema key) vs bare ZodType
|
|
1397
|
+
*/
|
|
1398
|
+
isRouteBodyObject(body) {
|
|
1399
|
+
return typeof body === "object" && "schema" in body;
|
|
1400
|
+
}
|
|
1401
|
+
/**
|
|
1402
|
+
* Resolve method parameter injections from the container
|
|
1403
|
+
*
|
|
1404
|
+
* @param prototype - Controller prototype
|
|
1405
|
+
* @param methodName - Method name to get injections for
|
|
1406
|
+
* @param container - Request-scoped container
|
|
1407
|
+
* @returns Array of resolved dependencies in parameter order
|
|
1408
|
+
*/
|
|
1409
|
+
resolveMethodInjections(prototype, methodName, container) {
|
|
1410
|
+
const injections = getMethodInjections(prototype, methodName);
|
|
1411
|
+
if (!injections.length) return [];
|
|
1412
|
+
return injections.map((inj) => container.resolve(inj.token));
|
|
1413
|
+
}
|
|
1414
|
+
/**
|
|
1415
|
+
* Create controller handler that resolves controller from request-scoped container
|
|
1416
|
+
* This ensures each request gets a fresh controller with request-scoped context
|
|
1417
|
+
*/
|
|
1418
|
+
createControllerHandler(ControllerClass, methodName) {
|
|
1419
|
+
return async (c) => {
|
|
1420
|
+
this.logger.info("Handler invoked", {
|
|
1421
|
+
path: c.req.path,
|
|
1422
|
+
method: c.req.method,
|
|
1423
|
+
controller: ControllerClass.name,
|
|
1424
|
+
methodName
|
|
1425
|
+
});
|
|
1426
|
+
try {
|
|
1427
|
+
const ctx = new RouterContext(c);
|
|
1428
|
+
const requestContainer = ctx.getContainer();
|
|
1429
|
+
const controller = requestContainer.resolve(ControllerClass);
|
|
1430
|
+
const method = controller[methodName];
|
|
1431
|
+
if (typeof method === "function") {
|
|
1432
|
+
const injectedArgs = this.resolveMethodInjections(ControllerClass.prototype, methodName, requestContainer);
|
|
1433
|
+
return await method.apply(controller, [ctx, ...injectedArgs]);
|
|
1434
|
+
}
|
|
1435
|
+
throw new ControllerMethodNotFoundError(methodName, ControllerClass.name);
|
|
1436
|
+
} catch (error) {
|
|
1437
|
+
this.logger.error("Error in controller handler", {
|
|
1438
|
+
controller: ControllerClass.name,
|
|
1439
|
+
methodName,
|
|
1440
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1441
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
1442
|
+
});
|
|
1443
|
+
throw error;
|
|
1444
|
+
}
|
|
1445
|
+
};
|
|
1446
|
+
}
|
|
1447
|
+
};
|
|
1448
|
+
//#endregion
|
|
1449
|
+
//#region src/router/hono-app.ts
|
|
1450
|
+
const isMiddlewareClass = (arg) => typeof arg === "function" && arg.prototype && "handle" in arg.prototype;
|
|
1451
|
+
/**
|
|
1452
|
+
* HonoApp — extends OpenAPIHono with Stratal-specific setup
|
|
1453
|
+
*
|
|
1454
|
+
* Absorbs all Hono-related setup from the former RouterService and RequestScopeService:
|
|
1455
|
+
* - Request scope middleware (child container per request)
|
|
1456
|
+
* - Global middleware (CORS, logging, error handling)
|
|
1457
|
+
* - defaultHook for validation errors
|
|
1458
|
+
* - `use()` overload for Stratal middleware classes
|
|
1459
|
+
* - `configure()` for module middleware, OpenAPI, routes, and 404
|
|
1460
|
+
*/
|
|
1461
|
+
var HonoApp = class extends OpenAPIHono {
|
|
1462
|
+
configured = false;
|
|
1463
|
+
_container;
|
|
1464
|
+
_logger;
|
|
1465
|
+
/**
|
|
1466
|
+
* Reference to the original Hono `use` implementation.
|
|
1467
|
+
* Captured in constructor after super() sets it as an instance property.
|
|
1468
|
+
* Used by private methods to register middleware without going through the override.
|
|
1469
|
+
*/
|
|
1470
|
+
nativeUse;
|
|
1471
|
+
constructor(container, logger) {
|
|
1472
|
+
super({ defaultHook: (result, c) => {
|
|
1473
|
+
if (!result.success) {
|
|
1474
|
+
const errorHandler = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER).resolve(DI_TOKENS.ErrorHandler);
|
|
1475
|
+
const validationError = new SchemaValidationError(result.error);
|
|
1476
|
+
const errorResponse = errorHandler.handle(validationError);
|
|
1477
|
+
return c.json(errorResponse, getHttpStatus(errorResponse.code));
|
|
1478
|
+
}
|
|
1479
|
+
} });
|
|
1480
|
+
this._container = container;
|
|
1481
|
+
this._logger = logger;
|
|
1482
|
+
this.nativeUse = this.use;
|
|
1483
|
+
this.use = ((...args) => {
|
|
1484
|
+
if (isMiddlewareClass(args[0])) {
|
|
1485
|
+
this.applyMiddlewareClasses("*", args);
|
|
1486
|
+
return this;
|
|
1487
|
+
}
|
|
1488
|
+
if (typeof args[0] === "string" && args.length > 1 && isMiddlewareClass(args[1])) {
|
|
1489
|
+
this.applyMiddlewareClasses(args[0], args.slice(1));
|
|
1490
|
+
return this;
|
|
1491
|
+
}
|
|
1492
|
+
return this.nativeUse(...args);
|
|
1493
|
+
});
|
|
1494
|
+
this.setupRequestScope();
|
|
1495
|
+
this.setupGlobalMiddleware();
|
|
1496
|
+
}
|
|
1497
|
+
/**
|
|
1498
|
+
* Configure module middleware, OpenAPI endpoints, controller routes, and 404 handler.
|
|
1499
|
+
* Called once by Application.initialize().
|
|
1500
|
+
*/
|
|
1501
|
+
async configure(middlewareConfigs, controllers, versioningOptions) {
|
|
1502
|
+
if (this.configured) throw new HonoAppAlreadyConfiguredError();
|
|
1503
|
+
new MiddlewareConfigurationService(this._logger, versioningOptions ?? null).applyMiddlewares(this, middlewareConfigs, controllers, this._container);
|
|
1504
|
+
this._container.resolve(OPENAPI_TOKENS.OpenAPIService).setupEndpoints(this, controllers);
|
|
1505
|
+
await new RouteRegistrationService(this._logger, versioningOptions ?? null).configure(this, controllers);
|
|
1506
|
+
this.notFound((c) => {
|
|
1507
|
+
throw new RouteNotFoundError(c.req.path, c.req.method);
|
|
1508
|
+
});
|
|
1509
|
+
this.configured = true;
|
|
1510
|
+
}
|
|
1511
|
+
setupRequestScope() {
|
|
1512
|
+
this.nativeUse("*", async (c, next) => {
|
|
1513
|
+
const routerContext = new RouterContext(c);
|
|
1514
|
+
const requestContainer = this._container.createRequestScope(routerContext);
|
|
1515
|
+
c.set(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER, requestContainer);
|
|
1516
|
+
try {
|
|
1517
|
+
await next();
|
|
1518
|
+
} finally {
|
|
1519
|
+
await requestContainer.dispose();
|
|
1520
|
+
}
|
|
1521
|
+
});
|
|
1522
|
+
}
|
|
1523
|
+
setupGlobalMiddleware() {
|
|
1524
|
+
this.nativeUse("*", createLoggerMiddleware(this._logger));
|
|
1525
|
+
this.onError((err, c) => {
|
|
1526
|
+
const errorResponse = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER).resolve(DI_TOKENS.ErrorHandler).handle(err);
|
|
1527
|
+
return c.json(errorResponse, getHttpStatus(errorResponse.code));
|
|
1528
|
+
});
|
|
1529
|
+
}
|
|
1530
|
+
applyMiddlewareClasses(path, classes) {
|
|
1531
|
+
this.nativeUse(path, async (c, next) => {
|
|
1532
|
+
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
1533
|
+
const ctx = new RouterContext(c);
|
|
1534
|
+
let current = next;
|
|
1535
|
+
for (let i = classes.length - 1; i >= 0; i--) {
|
|
1536
|
+
const prevNext = current;
|
|
1537
|
+
const middleware = requestContainer.resolve(classes[i]);
|
|
1538
|
+
current = () => middleware.handle(ctx, prevNext);
|
|
1539
|
+
}
|
|
1540
|
+
await current();
|
|
1541
|
+
});
|
|
1542
|
+
return this;
|
|
1543
|
+
}
|
|
1544
|
+
};
|
|
1545
|
+
//#endregion
|
|
1546
|
+
//#region src/i18n/services/i18n.service.ts
|
|
1547
|
+
/**
|
|
1548
|
+
* I18n Service
|
|
1549
|
+
*
|
|
1550
|
+
* Request-scoped service for translations.
|
|
1551
|
+
* Injects RouterContext to access request-specific locale.
|
|
1552
|
+
* Uses pre-built CoreContext from MessageLoaderService (singleton) for zero-cost lookups.
|
|
1553
|
+
*/
|
|
1554
|
+
var _ref;
|
|
1555
|
+
let I18nService = class I18nService {
|
|
1556
|
+
constructor(loader, routerContext) {
|
|
1557
|
+
this.loader = loader;
|
|
1558
|
+
this.routerContext = routerContext;
|
|
1559
|
+
}
|
|
1560
|
+
/**
|
|
1561
|
+
* Translate a message key
|
|
1562
|
+
*
|
|
1563
|
+
* @param key - Message key (e.g., 'common.actions.save')
|
|
1564
|
+
* @param params - Optional parameters for interpolation
|
|
1565
|
+
* @returns Translated string
|
|
1566
|
+
*/
|
|
1567
|
+
t(key, params) {
|
|
1568
|
+
const context = this.loader.getCoreContext(this.getLocale());
|
|
1569
|
+
const result = params !== void 0 ? translate(context, key, params) : translate(context, key);
|
|
1570
|
+
return typeof result === "string" ? result : key;
|
|
1571
|
+
}
|
|
1572
|
+
/**
|
|
1573
|
+
* Get current locale
|
|
1574
|
+
*
|
|
1575
|
+
* @returns Current locale code from RouterContext or default locale
|
|
1576
|
+
*/
|
|
1577
|
+
getLocale() {
|
|
1578
|
+
return this.routerContext?.getLocale() ?? "en";
|
|
1579
|
+
}
|
|
1580
|
+
};
|
|
1581
|
+
I18nService = __decorate([
|
|
1582
|
+
Transient(I18N_TOKENS.I18nService),
|
|
1583
|
+
__decorateParam(0, inject(I18N_TOKENS.MessageLoader)),
|
|
1584
|
+
__decorateParam(1, inject(ROUTER_TOKENS.RouterContext, { isOptional: true })),
|
|
1585
|
+
__decorateMetadata("design:paramtypes", [Object, typeof (_ref = typeof RouterContext !== "undefined" && RouterContext) === "function" ? _ref : Object])
|
|
1586
|
+
], I18nService);
|
|
1587
|
+
//#endregion
|
|
1588
|
+
//#region src/i18n/services/message-loader.service.ts
|
|
1589
|
+
let MessageLoaderService = class MessageLoaderService {
|
|
1590
|
+
cache;
|
|
1591
|
+
contextCache;
|
|
1592
|
+
locales;
|
|
1593
|
+
defaultLocale;
|
|
1594
|
+
constructor(options) {
|
|
1595
|
+
this.options = options;
|
|
1596
|
+
this.defaultLocale = this.options?.defaultLocale ?? "en";
|
|
1597
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
1598
|
+
this.contextCache = /* @__PURE__ */ new Map();
|
|
1599
|
+
const coreMessages = getMessages();
|
|
1600
|
+
const coreLocales = getLocales();
|
|
1601
|
+
const appMessages = this.options?.messages ?? {};
|
|
1602
|
+
const appLocales = Object.keys(appMessages);
|
|
1603
|
+
const allLocales = [...new Set([...coreLocales, ...appLocales])];
|
|
1604
|
+
this.locales = allLocales;
|
|
1605
|
+
for (const locale of allLocales) {
|
|
1606
|
+
const coreLocaleMessages = coreMessages[locale] ?? {};
|
|
1607
|
+
const appLocaleMessages = appMessages[locale] ?? {};
|
|
1608
|
+
const merged = this.deepMerge(coreLocaleMessages, appLocaleMessages);
|
|
1609
|
+
this.cache.set(locale, merged);
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
/**
|
|
1613
|
+
* Get CoreContext for a locale (lazily built and cached on first access)
|
|
1614
|
+
* Falls back to default locale if locale not found
|
|
1615
|
+
*
|
|
1616
|
+
* @param locale - Locale code
|
|
1617
|
+
* @returns Cached CoreContext ready for translation
|
|
1618
|
+
*/
|
|
1619
|
+
getCoreContext(locale) {
|
|
1620
|
+
const cached = this.contextCache.get(locale);
|
|
1621
|
+
if (cached) return cached;
|
|
1622
|
+
const effectiveLocale = this.cache.has(locale) ? locale : this.defaultLocale;
|
|
1623
|
+
const cachedEffective = this.contextCache.get(effectiveLocale);
|
|
1624
|
+
if (cachedEffective) return cachedEffective;
|
|
1625
|
+
const messages = this.cache.get(effectiveLocale) ?? {};
|
|
1626
|
+
const flattened = this.flattenMessages(messages);
|
|
1627
|
+
const ctx = createCoreContext({
|
|
1628
|
+
locale: effectiveLocale,
|
|
1629
|
+
messages: { [effectiveLocale]: flattened },
|
|
1630
|
+
missingWarn: false,
|
|
1631
|
+
fallbackWarn: false
|
|
1632
|
+
});
|
|
1633
|
+
this.contextCache.set(effectiveLocale, ctx);
|
|
1634
|
+
return ctx;
|
|
1635
|
+
}
|
|
1636
|
+
/**
|
|
1637
|
+
* Get messages for a specific locale
|
|
1638
|
+
* Falls back to default locale if locale not found
|
|
1639
|
+
*
|
|
1640
|
+
* @param locale - Locale code
|
|
1641
|
+
* @returns Message object for the locale
|
|
1642
|
+
*/
|
|
1643
|
+
getMessages(locale) {
|
|
1644
|
+
const msgs = this.cache.get(locale);
|
|
1645
|
+
if (!msgs) return this.cache.get(this.defaultLocale) ?? {};
|
|
1646
|
+
return msgs;
|
|
1647
|
+
}
|
|
1648
|
+
/**
|
|
1649
|
+
* Get list of available locale codes
|
|
1650
|
+
*
|
|
1651
|
+
* @returns Array of locale codes
|
|
1652
|
+
*/
|
|
1653
|
+
getAvailableLocales() {
|
|
1654
|
+
return this.locales;
|
|
1655
|
+
}
|
|
1656
|
+
/**
|
|
1657
|
+
* Check if a locale is supported
|
|
1658
|
+
*
|
|
1659
|
+
* @param locale - Locale code to check
|
|
1660
|
+
* @returns true if locale is supported
|
|
1661
|
+
*/
|
|
1662
|
+
isLocaleSupported(locale) {
|
|
1663
|
+
return this.cache.has(locale);
|
|
1664
|
+
}
|
|
1665
|
+
/**
|
|
1666
|
+
* Get default locale
|
|
1667
|
+
*
|
|
1668
|
+
* @returns Default locale code
|
|
1669
|
+
*/
|
|
1670
|
+
getDefaultLocale() {
|
|
1671
|
+
return this.defaultLocale;
|
|
1672
|
+
}
|
|
1673
|
+
/**
|
|
1674
|
+
* Flatten nested messages to dot-notation
|
|
1675
|
+
*
|
|
1676
|
+
* Converts { auth: { login: { title: 'Sign In' } } }
|
|
1677
|
+
* to { 'auth.login.title': 'Sign In' }
|
|
1678
|
+
*/
|
|
1679
|
+
flattenMessages(messages, prefix = "") {
|
|
1680
|
+
const result = {};
|
|
1681
|
+
for (const key of Object.keys(messages)) {
|
|
1682
|
+
const value = messages[key];
|
|
1683
|
+
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
1684
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) Object.assign(result, this.flattenMessages(value, newKey));
|
|
1685
|
+
else result[newKey] = String(value);
|
|
1686
|
+
}
|
|
1687
|
+
return result;
|
|
1688
|
+
}
|
|
1689
|
+
/**
|
|
1690
|
+
* Deep merge two objects
|
|
1691
|
+
* App messages override core messages at leaf level
|
|
1692
|
+
*/
|
|
1693
|
+
deepMerge(target, source) {
|
|
1694
|
+
const result = { ...target };
|
|
1695
|
+
for (const key of Object.keys(source)) {
|
|
1696
|
+
const targetValue = target[key];
|
|
1697
|
+
const sourceValue = source[key];
|
|
1698
|
+
if (typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue) && typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue)) result[key] = this.deepMerge(targetValue, sourceValue);
|
|
1699
|
+
else result[key] = sourceValue;
|
|
1700
|
+
}
|
|
1701
|
+
return result;
|
|
1702
|
+
}
|
|
1703
|
+
};
|
|
1704
|
+
MessageLoaderService = __decorate([
|
|
1705
|
+
Transient(I18N_TOKENS.MessageLoader),
|
|
1706
|
+
__decorateParam(0, inject(I18N_TOKENS.Options, { isOptional: true })),
|
|
1707
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
1708
|
+
], MessageLoaderService);
|
|
1709
|
+
//#endregion
|
|
1710
|
+
//#region src/i18n/i18n.module.ts
|
|
1711
|
+
/**
|
|
1712
|
+
* I18n Module
|
|
1713
|
+
*
|
|
1714
|
+
* Core infrastructure module for internationalization.
|
|
1715
|
+
* Provides message translation and locale handling.
|
|
1716
|
+
*
|
|
1717
|
+
* @example Default usage (system messages only)
|
|
1718
|
+
* ```typescript
|
|
1719
|
+
* // In Application.ts - I18nModule is already included in core modules
|
|
1720
|
+
* // Works with system messages and 'en' default locale
|
|
1721
|
+
* ```
|
|
1722
|
+
*
|
|
1723
|
+
* @example With app-specific configuration
|
|
1724
|
+
* ```typescript
|
|
1725
|
+
* // In apps/backend/src/app.module.ts
|
|
1726
|
+
* import { i18nConfig } from './i18n'
|
|
1727
|
+
*
|
|
1728
|
+
* @Module({
|
|
1729
|
+
* imports: [I18nModule.forRoot(i18nConfig)],
|
|
1730
|
+
* })
|
|
1731
|
+
* export class AppModule {}
|
|
1732
|
+
* ```
|
|
1733
|
+
*/
|
|
1734
|
+
var _I18nModule;
|
|
1735
|
+
setupI18nCompiler();
|
|
1736
|
+
z.config({ customError: backendErrorMap });
|
|
1737
|
+
let I18nModule = _I18nModule = class I18nModule {
|
|
1738
|
+
/**
|
|
1739
|
+
* Configure I18n with app-specific options
|
|
1740
|
+
*
|
|
1741
|
+
* Use this method in AppModule to provide custom locale configuration
|
|
1742
|
+
* and app-specific messages that merge with system messages.
|
|
1743
|
+
*
|
|
1744
|
+
* @param options - I18n configuration options
|
|
1745
|
+
* @returns Dynamic module with options provider
|
|
1746
|
+
*
|
|
1747
|
+
* @example
|
|
1748
|
+
* ```typescript
|
|
1749
|
+
* // apps/backend/src/i18n/index.ts
|
|
1750
|
+
* export const i18nConfig: I18nModuleOptions = {
|
|
1751
|
+
* defaultLocale: 'en',
|
|
1752
|
+
* fallbackLocale: 'en',
|
|
1753
|
+
* locales: ['en', 'fr'],
|
|
1754
|
+
* messages: appMessages
|
|
1755
|
+
* }
|
|
1756
|
+
*
|
|
1757
|
+
* // apps/backend/src/app.module.ts
|
|
1758
|
+
* @Module({
|
|
1759
|
+
* imports: [I18nModule.forRoot(i18nConfig)],
|
|
1760
|
+
* })
|
|
1761
|
+
* export class AppModule {}
|
|
1762
|
+
* ```
|
|
1763
|
+
*/
|
|
1764
|
+
static forRoot(options = {}) {
|
|
1765
|
+
return {
|
|
1766
|
+
module: _I18nModule,
|
|
1767
|
+
providers: [{
|
|
1768
|
+
provide: I18N_TOKENS.Options,
|
|
1769
|
+
useValue: options
|
|
1770
|
+
}]
|
|
1771
|
+
};
|
|
1772
|
+
}
|
|
1773
|
+
/**
|
|
1774
|
+
* Configure middleware for locale extraction and i18n context
|
|
1775
|
+
*/
|
|
1776
|
+
configure(consumer) {
|
|
1777
|
+
consumer.apply(LocaleExtractionMiddleware, I18nContextMiddleware).forRoutes("*");
|
|
1778
|
+
}
|
|
1779
|
+
};
|
|
1780
|
+
I18nModule = _I18nModule = __decorate([Module({ providers: [{
|
|
1781
|
+
provide: I18N_TOKENS.MessageLoader,
|
|
1782
|
+
useClass: MessageLoaderService,
|
|
1783
|
+
scope: Scope.Singleton
|
|
1784
|
+
}, {
|
|
1785
|
+
provide: I18N_TOKENS.I18nService,
|
|
1786
|
+
useClass: I18nService
|
|
1787
|
+
}] })], I18nModule);
|
|
1788
|
+
//#endregion
|
|
1789
|
+
export { LocaleNotSupportedError as A, Get as C, getHttpDecoratedMethods as D, Put as E, messages as F, OpenAPIConfigService as I, OPENAPI_TOKENS as L, setupI18nCompiler as M, getLocales as N, getHttpRouteMetadata as O, getMessages as P, LocaleExtractionMiddleware as R, Delete as S, Post as T, OpenAPIService as _, errorResponseSchema as a, getRouteConfig as b, successMessageSchema as c, RouteNotFoundError as d, OpenAPIValidationError as f, OpenAPIModule as g, HonoAppAlreadyConfiguredError as h, commonErrorSchemas as i, resolveI18nOptions as j, TranslationMissingError as k, uuidParamSchema as l, ControllerRegistrationError as m, HonoApp as n, paginatedResponseSchema as o, OpenAPIRouteRegistrationError as p, RouteRegistrationService as r, paginationQuerySchema as s, I18nModule as t, validationErrorResponseSchema as u, Route as v, Patch as w, All as x, getDecoratedMethods as y, I18nContextMiddleware as z };
|
|
1790
|
+
|
|
1791
|
+
//# sourceMappingURL=i18n.module-qNrpIVts.mjs.map
|