stratal 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{base-email.provider-CfQCA08m.mjs → base-email.provider-BWZHIjt8.mjs} +1 -1
- package/dist/{base-email.provider-CfQCA08m.mjs.map → base-email.provider-BWZHIjt8.mjs.map} +1 -1
- package/dist/bin/quarry.mjs +46 -109
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +6 -46
- package/dist/cache/index.d.mts.map +1 -1
- package/dist/cache/index.mjs +20 -67
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-e34gV6tz.d.mts} +8 -8
- package/dist/{cache.service-DsnKuNyO.d.mts.map → cache.service-e34gV6tz.d.mts.map} +1 -1
- package/dist/{cache.tokens-B7Rw1C9Q.mjs → cache.tokens-ovi_c52J.mjs} +1 -1
- package/dist/{cache.tokens-B7Rw1C9Q.mjs.map → cache.tokens-ovi_c52J.mjs.map} +1 -1
- package/dist/{colors-DJaRDXoS.mjs → colors-axmupKdp.mjs} +1 -1
- package/dist/{colors-DJaRDXoS.mjs.map → colors-axmupKdp.mjs.map} +1 -1
- package/dist/{command-BgSlsS4M.mjs → command-BU4ApTo5.mjs} +2 -3
- package/dist/command-BU4ApTo5.mjs.map +1 -0
- package/dist/{command-Cmmf0oHX.d.mts → command-wXfvHbBZ.d.mts} +3 -2
- package/dist/command-wXfvHbBZ.d.mts.map +1 -0
- package/dist/config/index.d.mts +24 -11
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +31 -57
- package/dist/config/index.mjs.map +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-DHQtypr1.d.mts} +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts.map → consumer-registry-DHQtypr1.d.mts.map} +1 -1
- package/dist/container-storage-GpNNz79X.mjs +52 -0
- package/dist/container-storage-GpNNz79X.mjs.map +1 -0
- package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-DIUazNU7.mjs} +8 -8
- package/dist/controller.decorator-DIUazNU7.mjs.map +1 -0
- package/dist/cron/index.d.mts +26 -5
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +1 -1
- package/dist/{cron-manager-DQSK8uoV.mjs → cron-manager-9bpN9bu4.mjs} +35 -15
- package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
- package/dist/{cron-manager-CmTimEjf.d.mts → cron-manager-CSTIBPcM.d.mts} +6 -13
- package/dist/cron-manager-CSTIBPcM.d.mts.map +1 -0
- package/dist/decorate-HgTKAYK8.mjs +16 -0
- package/dist/deep-merge-C8NgcXw4.mjs +18 -0
- package/dist/deep-merge-C8NgcXw4.mjs.map +1 -0
- package/dist/di/index.d.mts +2 -2
- package/dist/di/index.mjs +4 -3
- package/dist/di-BO1QIb5H.mjs +415 -0
- package/dist/di-BO1QIb5H.mjs.map +1 -0
- package/dist/email/index.d.mts +14 -89
- package/dist/email/index.d.mts.map +1 -1
- package/dist/email/index.mjs +25 -125
- package/dist/email/index.mjs.map +1 -1
- package/dist/en-BPP6h6y5.mjs +202 -0
- package/dist/en-BPP6h6y5.mjs.map +1 -0
- package/dist/{env-D1rcZ8_r.d.mts → env-DKSbuBi5.d.mts} +1 -1
- package/dist/env-DKSbuBi5.d.mts.map +1 -0
- package/dist/errors/index.d.mts +2 -2
- package/dist/errors/index.mjs +4 -2
- package/dist/errors-BBZTnjdq.mjs +333 -0
- package/dist/errors-BBZTnjdq.mjs.map +1 -0
- package/dist/events/index.d.mts +2 -2
- package/dist/events/index.d.mts.map +1 -1
- package/dist/events/index.mjs +1 -1
- package/dist/{events-CzCV8jI8.mjs → events-D1KdDaiP.mjs} +11 -11
- package/dist/events-D1KdDaiP.mjs.map +1 -0
- package/dist/exception-context-B4kM-M53.mjs +429 -0
- package/dist/exception-context-B4kM-M53.mjs.map +1 -0
- package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-CFe6a9gz.mjs} +19 -31
- package/dist/gateway-context-CFe6a9gz.mjs.map +1 -0
- package/dist/guards/index.d.mts +3 -3
- package/dist/guards/index.d.mts.map +1 -1
- package/dist/guards/index.mjs +1 -1
- package/dist/{guards-DU1_J9YA.mjs → guards-Ced-uNIF.mjs} +6 -5
- package/dist/guards-Ced-uNIF.mjs.map +1 -0
- package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-CdjKFJZZ.mjs} +7 -6
- package/dist/http-method.decorator-CdjKFJZZ.mjs.map +1 -0
- package/dist/i18n/index.d.mts +238 -3
- package/dist/i18n/index.d.mts.map +1 -0
- package/dist/i18n/index.mjs +39 -3
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/i18n/messages/en/index.d.mts +2 -2
- package/dist/i18n/messages/en/index.mjs +2 -2
- package/dist/i18n/utils/index.d.mts +4 -26
- package/dist/i18n/utils/index.d.mts.map +1 -1
- package/dist/i18n/utils/index.mjs +2 -2
- package/dist/i18n/validation/index.d.mts +3 -2
- package/dist/i18n/validation/index.mjs +4 -2
- package/dist/i18n.module-BlXrtAlV.mjs +219 -0
- package/dist/i18n.module-BlXrtAlV.mjs.map +1 -0
- package/dist/i18n.tokens-hwRpmjRq.mjs +19 -0
- package/dist/i18n.tokens-hwRpmjRq.mjs.map +1 -0
- package/dist/{index-7-hU3GTV.d.mts → index-B4UBK-2T.d.mts} +1 -1
- package/dist/{index-7-hU3GTV.d.mts.map → index-B4UBK-2T.d.mts.map} +1 -1
- package/dist/index-BtlE9RuO.d.mts +124 -0
- package/dist/index-BtlE9RuO.d.mts.map +1 -0
- package/dist/{index-DUzWs0z7.d.mts → index-CW1YHSft.d.mts} +71 -167
- package/dist/index-CW1YHSft.d.mts.map +1 -0
- package/dist/{index-ByOyTmqf.d.mts → index-DEncMcC6.d.mts} +554 -2237
- package/dist/index-DEncMcC6.d.mts.map +1 -0
- package/dist/index-Dj5IMwtr.d.mts +44 -0
- package/dist/index-Dj5IMwtr.d.mts.map +1 -0
- package/dist/{index-C1KvMncZ.d.mts → index-KMgSCSM7.d.mts} +3 -108
- package/dist/index-KMgSCSM7.d.mts.map +1 -0
- package/dist/index.d.mts +5 -43
- package/dist/index.mjs +1 -1
- package/dist/{is-command-C6a7WTPw.mjs → is-command-CX5rAfZW.mjs} +2 -2
- package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CX5rAfZW.mjs.map} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-CYCtELlm.mjs} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-CYCtELlm.mjs.map} +1 -1
- package/dist/logger/index.d.mts +2 -2
- package/dist/logger/index.mjs +170 -2
- package/dist/logger/index.mjs.map +1 -0
- package/dist/macroable/index.d.mts +1 -1
- package/dist/macroable/index.mjs +1 -1
- package/dist/{macroable-BmufBshB.mjs → macroable-DzlfzT50.mjs} +1 -1
- package/dist/{macroable-BmufBshB.mjs.map → macroable-DzlfzT50.mjs.map} +1 -1
- package/dist/metadata-BVkc4aUu.mjs +39 -0
- package/dist/metadata-BVkc4aUu.mjs.map +1 -0
- package/dist/module/index.d.mts +6 -24
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +2 -2
- package/dist/module-xYoHba6B.mjs +422 -0
- package/dist/module-xYoHba6B.mjs.map +1 -0
- package/dist/openapi/index.d.mts +3 -3
- package/dist/openapi/index.d.mts.map +1 -1
- package/dist/openapi/index.mjs +1 -2
- package/dist/openapi-C6lm0RmV.mjs +483 -0
- package/dist/openapi-C6lm0RmV.mjs.map +1 -0
- package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-CrLlsXAd.d.mts} +3 -3
- package/dist/openapi.service-CrLlsXAd.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +5 -163
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +5 -5
- package/dist/quarry/runner.d.mts +184 -0
- package/dist/quarry/runner.d.mts.map +1 -0
- package/dist/quarry/runner.mjs +775 -0
- package/dist/quarry/runner.mjs.map +1 -0
- package/dist/quarry-registry-D4hIGScf.d.mts +69 -0
- package/dist/quarry-registry-D4hIGScf.d.mts.map +1 -0
- package/dist/quarry-registry-DkraZNwn.mjs +311 -0
- package/dist/quarry-registry-DkraZNwn.mjs.map +1 -0
- package/dist/queue/index.d.mts +3 -3
- package/dist/queue/index.mjs +26 -28
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-BhCjZp6H.mjs → queue.module-DeWJ0tQM.mjs} +59 -113
- package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
- package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +5 -5
- package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
- package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-D69zdZbp.mjs} +6 -11
- package/dist/rate-limit.decorator-D69zdZbp.mjs.map +1 -0
- package/dist/rate-limiter/index.d.mts +11 -50
- package/dist/rate-limiter/index.d.mts.map +1 -1
- package/dist/rate-limiter/index.mjs +16 -30
- package/dist/rate-limiter/index.mjs.map +1 -1
- package/dist/{resend.provider-DB4IlFjG.mjs → resend.provider-Ur6tU7fK.mjs} +7 -7
- package/dist/resend.provider-Ur6tU7fK.mjs.map +1 -0
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +8 -7
- package/dist/{i18n.module-CzXLW9Hy.mjs → router-Cy6DjkvP.mjs} +171 -851
- package/dist/router-Cy6DjkvP.mjs.map +1 -0
- package/dist/seeder/index.d.mts +6 -11
- package/dist/seeder/index.d.mts.map +1 -1
- package/dist/seeder/index.mjs +3 -3
- package/dist/{seeder-zoEfEw9i.mjs → seeder-BADTig4n.mjs} +14 -22
- package/dist/seeder-BADTig4n.mjs.map +1 -0
- package/dist/{signed-url-BQPbv2In.mjs → signed-url-BqUqt5dF.mjs} +1 -1
- package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-BqUqt5dF.mjs.map} +1 -1
- package/dist/{smtp.provider-B6D7zuWX.mjs → smtp.provider-C129sNBT.mjs} +6 -6
- package/dist/smtp.provider-C129sNBT.mjs.map +1 -0
- package/dist/storage/index.d.mts +15 -39
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +3 -3
- package/dist/storage/providers/index.d.mts +2 -2
- package/dist/storage/providers/index.mjs +1 -1
- package/dist/{storage-D8CBP72Z.mjs → storage-BA3ppVYM.mjs} +65 -59
- package/dist/storage-BA3ppVYM.mjs.map +1 -0
- package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-DQMtT42e.d.mts} +2 -3
- package/dist/storage-provider.interface-DQMtT42e.d.mts.map +1 -0
- package/dist/storage.error-C6FY037a.mjs +8 -0
- package/dist/storage.error-C6FY037a.mjs.map +1 -0
- package/dist/{stratal-CNwpbSZl.mjs → stratal-Bdq4IdB3.mjs} +31 -185
- package/dist/stratal-Bdq4IdB3.mjs.map +1 -0
- package/dist/stratal-BsKmvP6J.d.mts +43 -0
- package/dist/stratal-BsKmvP6J.d.mts.map +1 -0
- package/dist/{types-cySNS_lp.d.mts → types-BaeHi67f.d.mts} +1 -1
- package/dist/types-BaeHi67f.d.mts.map +1 -0
- package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DTqaUMR9.mjs} +6 -3
- package/dist/usage-generator-DTqaUMR9.mjs.map +1 -0
- package/dist/validation-DUzcjb8Q.mjs +49 -0
- package/dist/validation-DUzcjb8Q.mjs.map +1 -0
- package/dist/validation.context-XTysWJ3b.mjs +117 -0
- package/dist/validation.context-XTysWJ3b.mjs.map +1 -0
- package/dist/websocket/index.d.mts +7 -14
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +2 -2
- package/dist/workers/index.d.mts +2 -2
- package/dist/workers/index.mjs +3 -2
- package/dist/workers/index.mjs.map +1 -1
- package/dist/{index-Bnpfq6uk.d.mts → zod-DvWTfRpI.d.mts} +58 -133
- package/dist/zod-DvWTfRpI.d.mts.map +1 -0
- package/dist/zod-hMa3rSHV.mjs +72 -0
- package/dist/zod-hMa3rSHV.mjs.map +1 -0
- package/package.json +10 -10
- package/dist/command-BgSlsS4M.mjs.map +0 -1
- package/dist/command-Cmmf0oHX.d.mts.map +0 -1
- package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
- package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
- package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
- package/dist/en-DSH_bhh6.mjs +0 -308
- package/dist/en-DSH_bhh6.mjs.map +0 -1
- package/dist/env-D1rcZ8_r.d.mts.map +0 -1
- package/dist/errors-COW9-Mar.mjs +0 -1739
- package/dist/errors-COW9-Mar.mjs.map +0 -1
- package/dist/errors-ORxu1-Bb.mjs +0 -74
- package/dist/errors-ORxu1-Bb.mjs.map +0 -1
- package/dist/events-CzCV8jI8.mjs.map +0 -1
- package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
- package/dist/guards-DU1_J9YA.mjs.map +0 -1
- package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
- package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
- package/dist/index-Bnpfq6uk.d.mts.map +0 -1
- package/dist/index-ByOyTmqf.d.mts.map +0 -1
- package/dist/index-C1KvMncZ.d.mts.map +0 -1
- package/dist/index-DBd_2wv8.d.mts +0 -263
- package/dist/index-DBd_2wv8.d.mts.map +0 -1
- package/dist/index-DUzWs0z7.d.mts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/logger-DlV7NtvD.mjs +0 -440
- package/dist/logger-DlV7NtvD.mjs.map +0 -1
- package/dist/module-BzLg57FK.mjs +0 -866
- package/dist/module-BzLg57FK.mjs.map +0 -1
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs +0 -200
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
- package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
- package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
- package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
- package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
- package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
- package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
- package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
- package/dist/seeder-zoEfEw9i.mjs.map +0 -1
- package/dist/setup-CefZKV_e.mjs +0 -37
- package/dist/setup-CefZKV_e.mjs.map +0 -1
- package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
- package/dist/storage-D8CBP72Z.mjs.map +0 -1
- package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
- package/dist/stratal-CNwpbSZl.mjs.map +0 -1
- package/dist/types-cySNS_lp.d.mts.map +0 -1
- package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
- package/dist/validation-DtJwAv7O.mjs +0 -248
- package/dist/validation-DtJwAv7O.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards-Ced-uNIF.mjs","names":[],"sources":["../src/guards/types.ts","../src/guards/use-guards.decorator.ts","../src/guards/guard-execution.service.ts"],"sourcesContent":["import type { RouterContext } from '../router'\nimport type { Constructor } from '../types'\n\n/**\n * Interface for guards that control access to routes\n *\n * Guards are executed after middlewares but before route handlers.\n * They determine if a request should be allowed to proceed.\n *\n * @example\n * ```typescript\n * class RoleGuard implements CanActivate {\n * constructor(private readonly role: string) {}\n *\n * async canActivate(context: RouterContext): Promise<boolean> {\n * const user = context.getUser()\n * return user?.roles.includes(this.role) ?? false\n * }\n * }\n * ```\n */\nexport interface CanActivate {\n /**\n * Determine if the request should be allowed\n *\n * @param context - Router context with request/response helpers\n * @returns true to allow, false to deny (throws 403)\n */\n canActivate(context: RouterContext): boolean | Promise<boolean>\n}\n\n/**\n * Type for guard class constructors\n */\nexport type GuardClass = Constructor<CanActivate>\n\n/**\n * Guard can be a class constructor or an instance\n * Instances are used for factory-created guards with configuration\n */\nexport type Guard = GuardClass | CanActivate\n\n/**\n * Options for AuthGuard factory\n */\nexport interface AuthGuardOptions {\n /**\n * Required permissions for authorization as `\"resource:action\"` strings.\n * If provided, permission check is performed after authentication.\n * If omitted, only authentication is required.\n *\n * Multiple permissions are combined with AND logic (all must be satisfied).\n *\n * @example\n * ```typescript\n * @UseGuards(AuthGuard({ permissions: 'posts:update' }))\n * @UseGuards(AuthGuard({ permissions: ['posts:update', 'posts:delete'] }))\n * @UseGuards(AuthGuard({ permissions: 'admin:access' }))\n * ```\n */\n permissions?: string | string[]\n}\n\n/**\n * Metadata stored by `@UseGuards` decorator\n */\nexport interface GuardMetadata {\n guards: Guard[]\n}\n\n/**\n * Metadata key for guard storage\n */\nexport const GUARD_METADATA_KEY = Symbol.for('stratal:guards')\n","import { defineMetadata, getMetadata } from '../di/metadata'\nimport { GUARD_METADATA_KEY, type Guard, type GuardMetadata } from './types'\n\n/**\n * UseGuards Decorator\n *\n * Applies one or more guards to a controller or method.\n * Guards are executed in order and all must pass for the request to proceed.\n *\n * **Execution Order:**\n * 1. Request → Global Middlewares → Route Middlewares\n * 2. **Guards (controller-level, then method-level)**\n * 3. Route Handler\n *\n * **Guard Resolution:**\n * - Guard classes are resolved from the request-scoped DI container\n * - Guard instances (from factory functions) are used directly\n *\n * @param guards - Guard classes or instances to apply\n *\n * @example Authentication only\n * ```typescript\n * @Controller('/api/v1/profile')\n * @UseGuards(AuthGuard())\n * export class ProfileController {\n * show() { } // Requires authentication\n * }\n * ```\n *\n * @example Authentication with permissions\n * ```typescript\n * @Controller('/api/v1/students')\n * @UseGuards(AuthGuard({ scopes: ['students:read'] }))\n * export class StudentsController {\n * index() { } // Requires 'students:read' permission\n * }\n * ```\n *\n * @example Method-level guards\n * ```typescript\n * @Controller('/api/v1/students')\n * @UseGuards(AuthGuard()) // Controller-level: auth only\n * export class StudentsController {\n * index() { } // Auth only (inherited)\n *\n * @UseGuards(AuthGuard({ scopes: ['students:create'] }))\n * create() { } // Auth + 'students:create' permission\n * }\n * ```\n *\n * @example Multiple guards\n * ```typescript\n * @UseGuards(AuthGuard(), RateLimitGuard(), CustomGuard())\n * export class SecureController {\n * // All guards must pass\n * }\n * ```\n */\nexport function UseGuards(...guards: Guard[]): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const metadata: GuardMetadata = { guards }\n\n if (propertyKey !== undefined) {\n // Method decorator - store on method\n defineMetadata(GUARD_METADATA_KEY, metadata, target, propertyKey)\n } else {\n // Class decorator - store on class\n defineMetadata(GUARD_METADATA_KEY, metadata, target)\n }\n }\n}\n\n/**\n * Get controller-level guard metadata\n *\n * @param target - Controller class\n * @returns Guard metadata or undefined if not decorated\n */\nexport function getControllerGuards(target: object): GuardMetadata | undefined {\n return getMetadata<GuardMetadata>(GUARD_METADATA_KEY, target)\n}\n\n/**\n * Get method-level guard metadata\n *\n * @param target - Controller prototype\n * @param propertyKey - Method name\n * @returns Guard metadata or undefined if not decorated\n */\nexport function getMethodGuards(target: object, propertyKey: string | symbol): GuardMetadata | undefined {\n return getMetadata<GuardMetadata>(GUARD_METADATA_KEY, target, propertyKey)\n}\n","import type { Container } from '../di'\nimport type { LoggerService } from '../logger'\nimport type { RouterContext } from '../router'\nimport type { CanActivate, Guard } from './types'\n\n/**\n * Guard Execution Service\n *\n * Executes guards for a route and determines if the request should proceed.\n * Guards are executed in order; all must pass for the request to proceed.\n */\nexport class GuardExecutionService {\n constructor(private readonly logger: LoggerService) { }\n\n /**\n * Execute all guards for a route\n *\n * @param guards - Array of guards (classes or instances)\n * @param context - Router context\n * @param container - Request-scoped DI container\n * @returns true if all guards pass\n * @throws Error from first failing guard\n */\n async executeGuards(\n guards: Guard[],\n context: RouterContext,\n container: Container\n ): Promise<boolean> {\n if (guards.length === 0) {\n return true\n }\n\n this.logger.debug('Executing guards', {\n guardCount: guards.length,\n path: context.c.req.path,\n method: context.c.req.method,\n })\n\n for (const guard of guards) {\n const guardInstance = this.resolveGuard(guard, container)\n const canActivate = await guardInstance.canActivate(context)\n\n if (!canActivate) {\n this.logger.debug('Guard denied access', {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- guard.constructor may be null at runtime\n guard: guard.constructor?.name || 'AnonymousGuard',\n path: context.c.req.path,\n })\n return false\n }\n }\n\n this.logger.debug('All guards passed', {\n guardCount: guards.length,\n path: context.c.req.path,\n })\n\n return true\n }\n\n /**\n * Resolve a guard to an instance\n *\n * @param guard - Guard class or instance\n * @param container - Request-scoped DI container\n * @returns Guard instance\n */\n private resolveGuard(guard: Guard, container: Container): CanActivate {\n // If already an instance (has canActivate method), use directly\n if (this.isGuardInstance(guard)) {\n return guard\n }\n\n // Otherwise, resolve from container\n return container.resolve<CanActivate>(guard)\n }\n\n /**\n * Type guard to check if value is a guard instance\n */\n private isGuardInstance(guard: Guard): guard is CanActivate {\n return (\n typeof guard === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typeof null === 'object', null check is required\n guard !== null &&\n 'canActivate' in guard &&\n typeof guard.canActivate === 'function'\n )\n }\n}\n"],"mappings":";;;;;AAyEA,MAAa,qBAAqB,OAAO,IAAI,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACf9D,SAAgB,UAAU,GAAG,QAAmD;CAC9E,QAAQ,QAAgB,gBAAkC;EACxD,MAAM,WAA0B,EAAE,QAAQ;EAE1C,IAAI,gBAAgB,KAAA,GAElB,eAAe,oBAAoB,UAAU,QAAQ,YAAY;OAGjE,eAAe,oBAAoB,UAAU,OAAO;;;;;;;;;AAW1D,SAAgB,oBAAoB,QAA2C;CAC7E,OAAO,YAA2B,oBAAoB,OAAO;;;;;;;;;AAU/D,SAAgB,gBAAgB,QAAgB,aAAyD;CACvG,OAAO,YAA2B,oBAAoB,QAAQ,YAAY;;;;;;;;;;AC/E5E,IAAa,wBAAb,MAAmC;CACJ;CAA7B,YAAY,QAAwC;EAAvB,KAAA,SAAA;;;;;;;;;;;CAW7B,MAAM,cACJ,QACA,SACA,WACkB;EAClB,IAAI,OAAO,WAAW,GACpB,OAAO;EAGT,KAAK,OAAO,MAAM,oBAAoB;GACpC,YAAY,OAAO;GACnB,MAAM,QAAQ,EAAE,IAAI;GACpB,QAAQ,QAAQ,EAAE,IAAI;GACvB,CAAC;EAEF,KAAK,MAAM,SAAS,QAIlB,IAAI,CAAC,MAHiB,KAAK,aAAa,OAAO,UACR,CAAC,YAAY,QAAQ,EAE1C;GAChB,KAAK,OAAO,MAAM,uBAAuB;IAEvC,OAAO,MAAM,aAAa,QAAQ;IAClC,MAAM,QAAQ,EAAE,IAAI;IACrB,CAAC;GACF,OAAO;;EAIX,KAAK,OAAO,MAAM,qBAAqB;GACrC,YAAY,OAAO;GACnB,MAAM,QAAQ,EAAE,IAAI;GACrB,CAAC;EAEF,OAAO;;;;;;;;;CAUT,aAAqB,OAAc,WAAmC;EAEpE,IAAI,KAAK,gBAAgB,MAAM,EAC7B,OAAO;EAIT,OAAO,UAAU,QAAqB,MAAM;;;;;CAM9C,gBAAwB,OAAoC;EAC1D,OACE,OAAO,UAAU,YAEjB,UAAU,QACV,iBAAiB,SACjB,OAAO,MAAM,gBAAgB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { n as getMetadata, t as defineMetadata } from "./metadata-BVkc4aUu.mjs";
|
|
2
|
+
import { u as ROUTE_METADATA_KEYS } from "./exception-context-B4kM-M53.mjs";
|
|
3
|
+
import { r as z } from "./zod-hMa3rSHV.mjs";
|
|
3
4
|
//#region src/router/decorators/http-method.decorator.ts
|
|
4
5
|
/**
|
|
5
6
|
* Creates an HTTP method decorator factory for the given HTTP method.
|
|
@@ -17,10 +18,10 @@ function createHttpMethodDecorator(method) {
|
|
|
17
18
|
path,
|
|
18
19
|
config: config ?? { response: z.any() }
|
|
19
20
|
};
|
|
20
|
-
|
|
21
|
-
const existing =
|
|
21
|
+
defineMetadata(ROUTE_METADATA_KEYS.ROUTE_CONFIG, metadata, target, propertyKey);
|
|
22
|
+
const existing = getMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, target) ?? [];
|
|
22
23
|
existing.push(propertyKey);
|
|
23
|
-
|
|
24
|
+
defineMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, existing, target);
|
|
24
25
|
return descriptor;
|
|
25
26
|
};
|
|
26
27
|
};
|
|
@@ -93,4 +94,4 @@ const All = createHttpMethodDecorator("all");
|
|
|
93
94
|
//#endregion
|
|
94
95
|
export { Post as a, Patch as i, Delete as n, Put as o, Get as r, All as t };
|
|
95
96
|
|
|
96
|
-
//# sourceMappingURL=http-method.decorator-
|
|
97
|
+
//# sourceMappingURL=http-method.decorator-CdjKFJZZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-method.decorator-CdjKFJZZ.mjs","names":[],"sources":["../src/router/decorators/http-method.decorator.ts"],"sourcesContent":["import { defineMetadata, getMetadata } from '../../di/metadata'\nimport { z } from '../../i18n/validation/zod'\nimport { ROUTE_METADATA_KEYS } from '../constants'\nimport type { ExplicitRouteMetadata, HttpMethod, RouteConfig } from '../types'\n\n/**\n * Creates an HTTP method decorator factory for the given HTTP method.\n *\n * The returned decorator stores {@link ExplicitRouteMetadata} on the method and\n * tracks the method name under {@link ROUTE_METADATA_KEYS.DECORATED_METHODS}\n * on the controller prototype so they can be discovered at registration time.\n */\nfunction createHttpMethodDecorator(method: HttpMethod) {\n return function (path: string, config?: RouteConfig) {\n return function (\n target: object,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const metadata: ExplicitRouteMetadata = {\n type: 'explicit',\n method,\n path,\n config: config ?? { response: z.any() },\n }\n\n defineMetadata(\n ROUTE_METADATA_KEYS.ROUTE_CONFIG,\n metadata,\n target,\n propertyKey\n )\n\n // Track this method as decorated on the prototype\n const existing: string[] =\n getMetadata<string[]>(ROUTE_METADATA_KEYS.DECORATED_METHODS, target) ?? []\n existing.push(propertyKey)\n defineMetadata(ROUTE_METADATA_KEYS.DECORATED_METHODS, existing, target)\n\n return descriptor\n }\n }\n}\n\n/**\n * Registers a GET route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration (response schema, body, params, etc.)\n *\n * @example\n * ```typescript\n * @Controller('/api/v1/users')\n * class UsersController {\n * @Get('/', { response: z.array(userSchema), summary: 'List users' })\n * async list(ctx: RouterContext) { ... }\n *\n * @Get('/:id', { params: z.object({ id: z.string().uuid() }), response: userSchema })\n * async getUser(ctx: RouterContext) { ... }\n * }\n * ```\n */\nexport const Get = createHttpMethodDecorator('get')\n\n/**\n * Registers a POST route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration (response schema, body, params, etc.)\n *\n * @example\n * ```typescript\n * @Controller('/api/v1/users')\n * class UsersController {\n * @Post('/', { body: createUserSchema, response: userSchema, statusCode: 201 })\n * async createUser(ctx: RouterContext) { ... }\n * }\n * ```\n */\nexport const Post = createHttpMethodDecorator('post')\n\n/**\n * Registers a PUT route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const Put = createHttpMethodDecorator('put')\n\n/**\n * Registers a PATCH route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const Patch = createHttpMethodDecorator('patch')\n\n/**\n * Registers a DELETE route on the controller method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const Delete = createHttpMethodDecorator('delete')\n\n/**\n * Registers an ALL (any HTTP method) route on the controller method.\n * Routes using @All are registered without OpenAPI validation\n * since OpenAPI does not support a catch-all HTTP method.\n *\n * @param path - Route path relative to the controller base path\n * @param config - Optional route configuration\n */\nexport const All = createHttpMethodDecorator('all')\n"],"mappings":";;;;;;;;;;;AAYA,SAAS,0BAA0B,QAAoB;CACrD,OAAO,SAAU,MAAc,QAAsB;EACnD,OAAO,SACL,QACA,aACA,YACA;GACA,MAAM,WAAkC;IACtC,MAAM;IACN;IACA;IACA,QAAQ,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE;IACxC;GAED,eACE,oBAAoB,cACpB,UACA,QACA,YACD;GAGD,MAAM,WACJ,YAAsB,oBAAoB,mBAAmB,OAAO,IAAI,EAAE;GAC5E,SAAS,KAAK,YAAY;GAC1B,eAAe,oBAAoB,mBAAmB,UAAU,OAAO;GAEvE,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuBb,MAAa,MAAM,0BAA0B,MAAM;;;;;;;;;;;;;;;;AAiBnD,MAAa,OAAO,0BAA0B,OAAO;;;;;;;AAQrD,MAAa,MAAM,0BAA0B,MAAM;;;;;;;AAQnD,MAAa,QAAQ,0BAA0B,QAAQ;;;;;;;AAQvD,MAAa,SAAS,0BAA0B,SAAS;;;;;;;;;AAUzD,MAAa,MAAM,0BAA0B,MAAM"}
|
package/dist/i18n/index.d.mts
CHANGED
|
@@ -1,3 +1,238 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { On as ModuleContext, jn as OnInitialize, wn as DynamicModule, xr as ApplicationError } from "../index-DEncMcC6.mjs";
|
|
2
|
+
import { _ as Prefixes, d as AppMessages, f as DeepKeys, g as MessageParams, h as MessageKeys, l as AppMessageKeys, m as MessageKeyPrefix, p as II18nService, u as AppMessageNamespaces, v as SystemMessageKeys } from "../zod-DvWTfRpI.mjs";
|
|
3
|
+
import { t as index_d_exports } from "../index-KMgSCSM7.mjs";
|
|
4
|
+
import { DetectorOptions } from "hono/language";
|
|
5
|
+
|
|
6
|
+
//#region src/i18n/i18n.error.d.ts
|
|
7
|
+
declare class I18nError extends ApplicationError {}
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/i18n/i18n.options.d.ts
|
|
10
|
+
/**
|
|
11
|
+
* Detection strategy for locale resolution
|
|
12
|
+
*
|
|
13
|
+
* - `'cookie'` — reads from the `locale` cookie (default)
|
|
14
|
+
* - `'header'` — reads from the `Accept-Language` header
|
|
15
|
+
* - `'querystring'` — reads from the `?locale=` query parameter
|
|
16
|
+
* - `'path'` — reads from the first URL path segment (e.g., `/en/api/users`)
|
|
17
|
+
*/
|
|
18
|
+
type DetectionStrategy = 'cookie' | 'header' | 'querystring' | 'path';
|
|
19
|
+
interface BaseDetection {
|
|
20
|
+
/** Set to false to disable language detection entirely. @default true */
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Language detection options (discriminated by strategy)
|
|
25
|
+
*
|
|
26
|
+
* @example Cookie detection (default)
|
|
27
|
+
* ```typescript
|
|
28
|
+
* { strategy: 'cookie' }
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example Header detection
|
|
32
|
+
* ```typescript
|
|
33
|
+
* { strategy: 'header' }
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @example Path detection
|
|
37
|
+
* ```typescript
|
|
38
|
+
* { strategy: 'path' }
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example Disable detection
|
|
42
|
+
* ```typescript
|
|
43
|
+
* { enabled: false }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
type LanguageDetectionOptions = (BaseDetection & {
|
|
47
|
+
strategy?: 'cookie';
|
|
48
|
+
cookieOptions?: DetectorOptions['cookieOptions'];
|
|
49
|
+
}) | (BaseDetection & {
|
|
50
|
+
strategy: 'header';
|
|
51
|
+
}) | (BaseDetection & {
|
|
52
|
+
strategy: 'querystring';
|
|
53
|
+
}) | (BaseDetection & {
|
|
54
|
+
strategy: 'path';
|
|
55
|
+
/**
|
|
56
|
+
* Controls whether the default locale gets a URL path prefix.
|
|
57
|
+
*
|
|
58
|
+
* - `false` (default) — The default locale has no prefix (`/users`), other locales
|
|
59
|
+
* are prefixed (`/fr/users`). Requests to the prefixed default locale (`/en/users`) return 404.
|
|
60
|
+
* - `'redirect'` — Same as `false`, but requests to the prefixed default locale
|
|
61
|
+
* (`/en/users`) are 301-redirected to the unprefixed path (`/users`).
|
|
62
|
+
* - `true` — All locales are prefixed (`/en/users`, `/fr/users`).
|
|
63
|
+
*
|
|
64
|
+
* @default false
|
|
65
|
+
*/
|
|
66
|
+
prefixDefaultLocale?: false | true | 'redirect';
|
|
67
|
+
}) | {
|
|
68
|
+
enabled: false;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Options for configuring the I18n module
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* I18nModule.forRoot({
|
|
76
|
+
* defaultLocale: 'en',
|
|
77
|
+
* fallbackLocale: 'en',
|
|
78
|
+
* locales: ['en', 'fr'],
|
|
79
|
+
* detection: { strategy: 'header' },
|
|
80
|
+
* })
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
interface I18nModuleOptions {
|
|
84
|
+
/**
|
|
85
|
+
* Default locale for the application
|
|
86
|
+
* @default 'en'
|
|
87
|
+
*/
|
|
88
|
+
defaultLocale?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Fallback locale when translation is missing
|
|
91
|
+
* @default 'en'
|
|
92
|
+
*/
|
|
93
|
+
fallbackLocale?: string;
|
|
94
|
+
/**
|
|
95
|
+
* List of supported locales
|
|
96
|
+
* Request locales not in this list will fall back to defaultLocale
|
|
97
|
+
*/
|
|
98
|
+
locales?: string[];
|
|
99
|
+
/**
|
|
100
|
+
* Language detection configuration
|
|
101
|
+
* Controls how the locale is extracted from incoming requests
|
|
102
|
+
*/
|
|
103
|
+
detection?: LanguageDetectionOptions;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolved options with all defaults applied
|
|
107
|
+
* Used internally by I18n services
|
|
108
|
+
*/
|
|
109
|
+
interface ResolvedI18nOptions {
|
|
110
|
+
defaultLocale: string;
|
|
111
|
+
fallbackLocale: string;
|
|
112
|
+
locales: string[];
|
|
113
|
+
detection: {
|
|
114
|
+
enabled: boolean;
|
|
115
|
+
strategy: DetectionStrategy; /** Resolved value of the path detection `prefixDefaultLocale` option. Only meaningful when `strategy` is `'path'`. */
|
|
116
|
+
prefixDefaultLocale: false | true | 'redirect';
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve I18n options with defaults
|
|
121
|
+
*/
|
|
122
|
+
declare function resolveI18nOptions(options?: I18nModuleOptions): ResolvedI18nOptions;
|
|
123
|
+
/**
|
|
124
|
+
* Build Hono languageDetector options from I18n module options
|
|
125
|
+
*/
|
|
126
|
+
declare function buildDetectorOptions(options?: I18nModuleOptions): Partial<DetectorOptions>;
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/i18n/i18n.module.d.ts
|
|
129
|
+
declare class I18nModule implements OnInitialize {
|
|
130
|
+
onInitialize(_context: ModuleContext): void;
|
|
131
|
+
static forRoot(options?: I18nModuleOptions): DynamicModule;
|
|
132
|
+
static registerMessages(messages: Record<string, Record<string, unknown>>): DynamicModule;
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/i18n/i18n.tokens.d.ts
|
|
136
|
+
/**
|
|
137
|
+
* I18n Module DI Tokens
|
|
138
|
+
* Symbol-based tokens to avoid string collisions
|
|
139
|
+
*/
|
|
140
|
+
declare const I18N_TOKENS: {
|
|
141
|
+
/** MessageLoaderService - loads and caches locale messages */readonly MessageLoader: symbol; /** I18nService - request-scoped translation service */
|
|
142
|
+
readonly I18nService: symbol; /** I18nModuleOptions - configuration options from forRoot() */
|
|
143
|
+
readonly Options: symbol; /** MessageRegistry - singleton accumulator for registerMessages() contributions */
|
|
144
|
+
readonly MessageRegistry: symbol;
|
|
145
|
+
};
|
|
146
|
+
//#endregion
|
|
147
|
+
//#region src/i18n/messages/index.d.ts
|
|
148
|
+
/**
|
|
149
|
+
* All locale messages
|
|
150
|
+
* Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)
|
|
151
|
+
*/
|
|
152
|
+
declare const messages: {
|
|
153
|
+
readonly en: typeof index_d_exports;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Type for all messages
|
|
157
|
+
*/
|
|
158
|
+
type Messages = typeof messages;
|
|
159
|
+
/**
|
|
160
|
+
* Get messages for all locales
|
|
161
|
+
*/
|
|
162
|
+
declare function getMessages(): Record<string, Record<string, unknown>>;
|
|
163
|
+
/**
|
|
164
|
+
* Get available locales
|
|
165
|
+
*/
|
|
166
|
+
declare function getLocales(): string[];
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region src/i18n/services/message-registry.d.ts
|
|
169
|
+
/**
|
|
170
|
+
* Message Registry
|
|
171
|
+
*
|
|
172
|
+
* Accumulates i18n messages from multiple `I18nModule.registerMessages()` calls.
|
|
173
|
+
* Messages are collected statically (at module import time) and deep-merged
|
|
174
|
+
* when `getMergedMessages()` is called by `MessageLoaderService`.
|
|
175
|
+
*
|
|
176
|
+
* Later registrations override earlier ones at leaf level.
|
|
177
|
+
*/
|
|
178
|
+
declare class MessageRegistry {
|
|
179
|
+
/**
|
|
180
|
+
* Add messages (called statically by I18nModule.registerMessages)
|
|
181
|
+
*/
|
|
182
|
+
static addMessages(messages: Record<string, Record<string, unknown>>): void;
|
|
183
|
+
/**
|
|
184
|
+
* Get all messages deep-merged in registration order
|
|
185
|
+
*/
|
|
186
|
+
getMergedMessages(): Record<string, Record<string, unknown>>;
|
|
187
|
+
/**
|
|
188
|
+
* Reset registry (for testing)
|
|
189
|
+
* @internal
|
|
190
|
+
*/
|
|
191
|
+
static reset(): void;
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
//#region src/i18n/services/message-loader.service.d.ts
|
|
195
|
+
declare class MessageLoaderService {
|
|
196
|
+
private readonly registry;
|
|
197
|
+
private readonly options?;
|
|
198
|
+
private readonly cache;
|
|
199
|
+
private readonly compiledCache;
|
|
200
|
+
private readonly locales;
|
|
201
|
+
private readonly defaultLocale;
|
|
202
|
+
constructor(registry: MessageRegistry, options?: I18nModuleOptions | undefined);
|
|
203
|
+
translate(locale: string, key: string, params?: Record<string, unknown>): string;
|
|
204
|
+
getMessages(locale: string): Record<string, unknown>;
|
|
205
|
+
getAvailableLocales(): string[];
|
|
206
|
+
isLocaleSupported(locale: string): boolean;
|
|
207
|
+
getDefaultLocale(): string;
|
|
208
|
+
getFilteredMessages(locale: string, options?: {
|
|
209
|
+
only?: MessageKeyPrefix[];
|
|
210
|
+
}): Record<string, string>;
|
|
211
|
+
private getCompiledMessages;
|
|
212
|
+
private flattenMessages;
|
|
213
|
+
}
|
|
214
|
+
//#endregion
|
|
215
|
+
//#region src/i18n/with-i18n.d.ts
|
|
216
|
+
/**
|
|
217
|
+
* Translate a message key using I18nService from the DI container.
|
|
218
|
+
*
|
|
219
|
+
* Works in both request scope (uses the request's detected locale) and
|
|
220
|
+
* global scope (defaults to 'en'). Can be used anywhere — services,
|
|
221
|
+
* middleware, error handlers, cron jobs, queue consumers, etc.
|
|
222
|
+
*
|
|
223
|
+
* @param key - Message key (e.g., 'common.welcome', 'errors.notFound')
|
|
224
|
+
* @param params - Optional interpolation parameters
|
|
225
|
+
* @returns Translated string, or the key itself if no container is available
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* import { withI18n } from 'stratal/i18n'
|
|
230
|
+
*
|
|
231
|
+
* const message = withI18n('errors.notFound')
|
|
232
|
+
* const greeting = withI18n('common.welcome', { name: 'Alice' })
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
declare function withI18n(key: MessageKeys, params?: MessageParams): string;
|
|
236
|
+
//#endregion
|
|
237
|
+
export { AppMessageKeys, AppMessageNamespaces, AppMessages, DeepKeys, DetectionStrategy, I18N_TOKENS, I18nError, I18nModule, I18nModuleOptions, II18nService, LanguageDetectionOptions, MessageKeyPrefix, MessageKeys, MessageLoaderService, MessageParams, MessageRegistry, type Messages, Prefixes, ResolvedI18nOptions, SystemMessageKeys, buildDetectorOptions, getLocales, getMessages, messages, resolveI18nOptions, withI18n };
|
|
238
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/i18n/i18n.error.ts","../../src/i18n/i18n.options.ts","../../src/i18n/i18n.module.ts","../../src/i18n/i18n.tokens.ts","../../src/i18n/messages/index.ts","../../src/i18n/services/message-registry.ts","../../src/i18n/services/message-loader.service.ts","../../src/i18n/with-i18n.ts"],"mappings":";;;;;;cAEa,SAAA,SAAkB,gBAAA;;;;;;;;;ACgB/B;;KAAY,iBAAA;AAAA,UAEF,aAAA;EAFmB;EAI3B,OAAA;AAAA;;;;AA0BF;;;;;;;;;;;;;;;;;;;;KAAY,wBAAA,IACP,aAAA;EAAkB,QAAA;EAAqB,aAAA,GAAgB,eAAA;AAAA,MACvD,aAAA;EAAkB,QAAA;AAAA,MAClB,aAAA;EAAkB,QAAA;AAAA,MAClB,aAAA;EACD,QAAA;EAwCF;;;;;;AAmBF;;;;;EA/CI,mBAAA;AAAA;EAEE,OAAA;AAAA;;;;;;AA4DN;;;;;;;;UA7CiB,iBAAA;EAiED;;;;EA5Dd,aAAA;EA4DiE;;;;EAtDjE,cAAA;EAsDiE;;;;EAhDjE,OAAA;;;ACzFF;;ED+FE,SAAA,GAAY,wBAAA;AAAA;;;;;UAOG,mBAAA;EACf,aAAA;EACA,cAAA;EACA,OAAA;EACA,SAAA;IACE,OAAA;IACA,QAAA,EAAU,iBAAA,ECpGC;IDsGX,mBAAA;EAAA;AAAA;;;;iBAOY,kBAAA,CAAmB,OAAA,GAAU,iBAAA,GAAoB,mBAAA;;;;iBAoBjD,oBAAA,CAAqB,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,eAAA;;;cClI9D,UAAA,YAAsB,YAAA;EACjC,YAAA,CAAa,QAAA,EAAU,aAAA;EAAA,OAIhB,OAAA,CAAQ,OAAA,GAAS,iBAAA,GAAyB,aAAA;EAAA,OAS1C,gBAAA,CAAiB,QAAA,EAAU,MAAA,SAAe,MAAA,qBAA2B,aAAA;AAAA;;;;;;;cC1BjE,WAAA;gGHHU;EAAA,8BAAQ;EAAA;;;;;;;;;cIWlB,QAAA;EAAA,oBAA0B,eAAA;AAAA;AHKvC;;;AAAA,KGAY,QAAA,UAAkB,QAAA;;AHA8C;;iBGK5D,WAAA,CAAA,GAAe,MAAA,SAAe,MAAA;;;AHyB9C;iBGlBgB,UAAA,CAAA;;;;;;;;;AJ5BhB;;;cK+Ba,eAAA;EL/BkC;;;EAAA,OKmCtC,WAAA,CAAY,QAAA,EAAU,MAAA,SAAe,MAAA;EJnBlC;;;EI4BV,iBAAA,CAAA,GAAqB,MAAA,SAAe,MAAA;EJ5BT;AAA+C;;;EAA/C,OI+CpB,KAAA,CAAA;AAAA;;;cCpDI,oBAAA;EAAA,iBAO6C,QAAA;EAAA,iBAErC,OAAA;EAAA,iBARF,KAAA;EAAA,iBACA,aAAA;EAAA,iBACA,OAAA;EAAA,iBACA,aAAA;cAGuC,QAAA,EAAU,eAAA,EAE/C,OAAA,GAAU,iBAAA;EAwB7B,SAAA,CAAU,MAAA,UAAgB,GAAA,UAAa,MAAA,GAAS,MAAA;EAOhD,WAAA,CAAY,MAAA,WAAiB,MAAA;EAI7B,mBAAA,CAAA;EAIA,iBAAA,CAAkB,MAAA;EAIlB,gBAAA,CAAA;EAIA,mBAAA,CACE,MAAA,UACA,OAAA;IAAY,IAAA,GAAO,gBAAA;EAAA,IAClB,MAAA;EAAA,QAeK,mBAAA;EAAA,QAmBA,eAAA;AAAA;;;;;;;;ANxGV;;;;;;;;ACgBA;;;;;AAA4E;iBMK5D,QAAA,CAAS,GAAA,EAAK,WAAA,EAAa,MAAA,GAAS,aAAA"}
|
package/dist/i18n/index.mjs
CHANGED
|
@@ -1,3 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import { a as ApplicationError, n as getContainer } from "../container-storage-GpNNz79X.mjs";
|
|
2
|
+
import "../errors-BBZTnjdq.mjs";
|
|
3
|
+
import { t as I18N_TOKENS } from "../i18n.tokens-hwRpmjRq.mjs";
|
|
4
|
+
import { c as buildDetectorOptions, l as resolveI18nOptions } from "../router-Cy6DjkvP.mjs";
|
|
5
|
+
import { a as getMessages, i as getLocales, n as MessageRegistry, o as messages, r as MessageLoaderService, t as I18nModule } from "../i18n.module-BlXrtAlV.mjs";
|
|
6
|
+
//#region src/i18n/i18n.error.ts
|
|
7
|
+
var I18nError = class extends ApplicationError {};
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/i18n/with-i18n.ts
|
|
10
|
+
/**
|
|
11
|
+
* Translate a message key using I18nService from the DI container.
|
|
12
|
+
*
|
|
13
|
+
* Works in both request scope (uses the request's detected locale) and
|
|
14
|
+
* global scope (defaults to 'en'). Can be used anywhere — services,
|
|
15
|
+
* middleware, error handlers, cron jobs, queue consumers, etc.
|
|
16
|
+
*
|
|
17
|
+
* @param key - Message key (e.g., 'common.welcome', 'errors.notFound')
|
|
18
|
+
* @param params - Optional interpolation parameters
|
|
19
|
+
* @returns Translated string, or the key itself if no container is available
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import { withI18n } from 'stratal/i18n'
|
|
24
|
+
*
|
|
25
|
+
* const message = withI18n('errors.notFound')
|
|
26
|
+
* const greeting = withI18n('common.welcome', { name: 'Alice' })
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function withI18n(key, params) {
|
|
30
|
+
try {
|
|
31
|
+
return getContainer().resolve(I18N_TOKENS.I18nService).t(key, params);
|
|
32
|
+
} catch {
|
|
33
|
+
return key;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { I18N_TOKENS, I18nError, I18nModule, MessageLoaderService, MessageRegistry, buildDetectorOptions, getLocales, getMessages, messages, resolveI18nOptions, withI18n };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/i18n/i18n.error.ts","../../src/i18n/with-i18n.ts"],"sourcesContent":["import { ApplicationError } from '../errors'\n\nexport class I18nError extends ApplicationError {}\n","import { getContainer } from '../di/container-storage'\nimport { I18N_TOKENS } from './i18n.tokens'\nimport type { II18nService, MessageKeys, MessageParams } from './i18n.types'\n\n/**\n * Translate a message key using I18nService from the DI container.\n *\n * Works in both request scope (uses the request's detected locale) and\n * global scope (defaults to 'en'). Can be used anywhere — services,\n * middleware, error handlers, cron jobs, queue consumers, etc.\n *\n * @param key - Message key (e.g., 'common.welcome', 'errors.notFound')\n * @param params - Optional interpolation parameters\n * @returns Translated string, or the key itself if no container is available\n *\n * @example\n * ```typescript\n * import { withI18n } from 'stratal/i18n'\n *\n * const message = withI18n('errors.notFound')\n * const greeting = withI18n('common.welcome', { name: 'Alice' })\n * ```\n */\nexport function withI18n(key: MessageKeys, params?: MessageParams): string {\n try {\n const container = getContainer()\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n return i18n.t(key, params)\n } catch {\n return key\n }\n}\n"],"mappings":";;;;;;AAEA,IAAa,YAAb,cAA+B,iBAAiB;;;;;;;;;;;;;;;;;;;;;;ACqBhD,SAAgB,SAAS,KAAkB,QAAgC;CACzE,IAAI;EAGF,OAFkB,cACI,CAAC,QAAsB,YAAY,YAC9C,CAAC,EAAE,KAAK,OAAO;SACpB;EACN,OAAO"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { common, emails,
|
|
1
|
+
import { a as common, i as emails, n as zodI18n, r as validation } from "../../../index-KMgSCSM7.mjs";
|
|
2
|
+
export { common, emails, validation, zodI18n };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { common, emails,
|
|
1
|
+
import { a as common, i as emails, n as zodI18n, r as validation } from "../../../en-BPP6h6y5.mjs";
|
|
2
|
+
export { common, emails, validation, zodI18n };
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
//#region src/i18n/utils/
|
|
1
|
+
//#region src/i18n/utils/deep-merge.d.ts
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Registers a JIT (Just-In-Time) message compiler for @intlify/core-base
|
|
6
|
-
* that works in Cloudflare Workers edge runtime.
|
|
7
|
-
*
|
|
8
|
-
* This must be called ONCE at application startup, before any I18nService instances are created.
|
|
3
|
+
* Deep merge two objects. Source values override target at leaf level.
|
|
9
4
|
*/
|
|
10
|
-
|
|
11
|
-
* Setup JIT message compiler for i18n
|
|
12
|
-
*
|
|
13
|
-
* Registers a message compiler that uses JIT compilation mode.
|
|
14
|
-
* In @intlify/core-base v10+, JIT mode is enabled by default, which generates
|
|
15
|
-
* AST (Abstract Syntax Tree) instead of JavaScript code, making it compatible
|
|
16
|
-
* with CSP-restricted environments like Cloudflare Workers.
|
|
17
|
-
*
|
|
18
|
-
* **IMPORTANT:** Call this function once at application startup before creating
|
|
19
|
-
* any I18nService instances. Safe to call multiple times (only registers once).
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```typescript
|
|
23
|
-
* // In application entry point (before app.initialize())
|
|
24
|
-
* setupI18nCompiler()
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
declare function setupI18nCompiler(): void;
|
|
5
|
+
declare function deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown>;
|
|
28
6
|
//#endregion
|
|
29
|
-
export {
|
|
7
|
+
export { deepMerge };
|
|
30
8
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/i18n/utils/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/i18n/utils/deep-merge.ts"],"mappings":";;AAGA;;iBAAgB,SAAA,CACd,MAAA,EAAQ,MAAA,mBACR,MAAA,EAAQ,MAAA,oBACP,MAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
export {
|
|
1
|
+
import { t as deepMerge } from "../../deep-merge-C8NgcXw4.mjs";
|
|
2
|
+
export { deepMerge };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as z, b as cuid2, c as ZodCustomIssue, i as ZodError, n as OpenAPIObject, r as PathItemObject, s as I18nErrorMetadata, t as OpenAPIHono, y as CUID2_REGEX } from "../../zod-DvWTfRpI.mjs";
|
|
2
|
+
import { n as withZodI18n, t as zodErrorMap } from "../../index-Dj5IMwtr.mjs";
|
|
2
3
|
export * from "@hono/zod-openapi";
|
|
3
4
|
export * from "zod";
|
|
4
|
-
export { CUID2_REGEX,
|
|
5
|
+
export { CUID2_REGEX, I18nErrorMetadata, OpenAPIHono, OpenAPIObject, PathItemObject, ZodCustomIssue, ZodError, cuid2, withZodI18n, z, zodErrorMap };
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { a as CUID2_REGEX,
|
|
1
|
+
import { a as CUID2_REGEX, n as ZodError, o as cuid2, r as z, t as OpenAPIHono } from "../../zod-hMa3rSHV.mjs";
|
|
2
|
+
import { t as zodErrorMap } from "../../validation.context-XTysWJ3b.mjs";
|
|
3
|
+
import { t as withZodI18n } from "../../validation-DUzcjb8Q.mjs";
|
|
2
4
|
export * from "@hono/zod-openapi";
|
|
3
|
-
export { CUID2_REGEX, OpenAPIHono, ZodError,
|
|
5
|
+
export { CUID2_REGEX, OpenAPIHono, ZodError, cuid2, withZodI18n, z, zodErrorMap };
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { l as Request, m as inject, o as ROUTER_TOKENS, u as Singleton } from "./di-BO1QIb5H.mjs";
|
|
2
|
+
import { n as __decorateParam, t as __decorate } from "./decorate-HgTKAYK8.mjs";
|
|
3
|
+
import { f as Module } from "./module-xYoHba6B.mjs";
|
|
4
|
+
import { t as I18N_TOKENS } from "./i18n.tokens-hwRpmjRq.mjs";
|
|
5
|
+
import { r as z } from "./zod-hMa3rSHV.mjs";
|
|
6
|
+
import "./router-Cy6DjkvP.mjs";
|
|
7
|
+
import { t as en_exports } from "./en-BPP6h6y5.mjs";
|
|
8
|
+
import { t as deepMerge } from "./deep-merge-C8NgcXw4.mjs";
|
|
9
|
+
import { t as zodErrorMap } from "./validation.context-XTysWJ3b.mjs";
|
|
10
|
+
import IntlMessageFormat from "intl-messageformat";
|
|
11
|
+
//#region src/i18n/services/i18n.service.ts
|
|
12
|
+
let I18nService = class I18nService {
|
|
13
|
+
loader;
|
|
14
|
+
routerContext;
|
|
15
|
+
constructor(loader, routerContext) {
|
|
16
|
+
this.loader = loader;
|
|
17
|
+
this.routerContext = routerContext;
|
|
18
|
+
}
|
|
19
|
+
t(key, params) {
|
|
20
|
+
return this.loader.translate(this.getLocale(), key, params);
|
|
21
|
+
}
|
|
22
|
+
getLocale() {
|
|
23
|
+
return this.routerContext?.getLocale() ?? "en";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
I18nService = __decorate([
|
|
27
|
+
Request(I18N_TOKENS.I18nService),
|
|
28
|
+
__decorateParam(0, inject(I18N_TOKENS.MessageLoader)),
|
|
29
|
+
__decorateParam(1, inject(ROUTER_TOKENS.RouterContext, { isOptional: true }))
|
|
30
|
+
], I18nService);
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/i18n/messages/index.ts
|
|
33
|
+
/**
|
|
34
|
+
* Core Messages
|
|
35
|
+
*
|
|
36
|
+
* Messages used by packages/modules infrastructure.
|
|
37
|
+
* These are automatically merged with application-specific messages.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* All locale messages
|
|
41
|
+
* Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)
|
|
42
|
+
*/
|
|
43
|
+
const messages = { en: en_exports };
|
|
44
|
+
/**
|
|
45
|
+
* Get messages for all locales
|
|
46
|
+
*/
|
|
47
|
+
function getMessages() {
|
|
48
|
+
return messages;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get available locales
|
|
52
|
+
*/
|
|
53
|
+
function getLocales() {
|
|
54
|
+
return Object.keys(messages);
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/i18n/services/message-loader.service.ts
|
|
58
|
+
let MessageLoaderService = class MessageLoaderService {
|
|
59
|
+
registry;
|
|
60
|
+
options;
|
|
61
|
+
cache;
|
|
62
|
+
compiledCache;
|
|
63
|
+
locales;
|
|
64
|
+
defaultLocale;
|
|
65
|
+
constructor(registry, options) {
|
|
66
|
+
this.registry = registry;
|
|
67
|
+
this.options = options;
|
|
68
|
+
this.defaultLocale = this.options?.defaultLocale ?? "en";
|
|
69
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
70
|
+
this.compiledCache = /* @__PURE__ */ new Map();
|
|
71
|
+
const coreMessages = getMessages();
|
|
72
|
+
const coreLocales = getLocales();
|
|
73
|
+
const registryMessages = this.registry.getMergedMessages();
|
|
74
|
+
const registryLocales = Object.keys(registryMessages);
|
|
75
|
+
const allLocales = [...new Set([...coreLocales, ...registryLocales])];
|
|
76
|
+
this.locales = allLocales;
|
|
77
|
+
for (const locale of allLocales) {
|
|
78
|
+
const merged = deepMerge(coreMessages[locale] ?? {}, registryMessages[locale] ?? {});
|
|
79
|
+
this.cache.set(locale, merged);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
translate(locale, key, params) {
|
|
83
|
+
const fn = this.getCompiledMessages(locale)[key];
|
|
84
|
+
if (!fn) return key;
|
|
85
|
+
return fn(params);
|
|
86
|
+
}
|
|
87
|
+
getMessages(locale) {
|
|
88
|
+
return this.cache.get(locale) ?? this.cache.get(this.defaultLocale) ?? {};
|
|
89
|
+
}
|
|
90
|
+
getAvailableLocales() {
|
|
91
|
+
return this.locales;
|
|
92
|
+
}
|
|
93
|
+
isLocaleSupported(locale) {
|
|
94
|
+
return this.cache.has(locale);
|
|
95
|
+
}
|
|
96
|
+
getDefaultLocale() {
|
|
97
|
+
return this.defaultLocale;
|
|
98
|
+
}
|
|
99
|
+
getFilteredMessages(locale, options) {
|
|
100
|
+
const messages = this.getMessages(locale);
|
|
101
|
+
const flattened = this.flattenMessages(messages);
|
|
102
|
+
if (!options?.only?.length) return flattened;
|
|
103
|
+
const result = {};
|
|
104
|
+
for (const [key, value] of Object.entries(flattened)) if (options.only.some((prefix) => key === prefix || key.startsWith(`${prefix}.`))) result[key] = value;
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
getCompiledMessages(locale) {
|
|
108
|
+
const effectiveLocale = this.cache.has(locale) ? locale : this.defaultLocale;
|
|
109
|
+
const cached = this.compiledCache.get(effectiveLocale);
|
|
110
|
+
if (cached) return cached;
|
|
111
|
+
const messages = this.cache.get(effectiveLocale) ?? {};
|
|
112
|
+
const flattened = this.flattenMessages(messages);
|
|
113
|
+
const compiled = {};
|
|
114
|
+
for (const [key, value] of Object.entries(flattened)) {
|
|
115
|
+
const msg = new IntlMessageFormat(value, effectiveLocale);
|
|
116
|
+
compiled[key] = (params) => String(msg.format(params));
|
|
117
|
+
}
|
|
118
|
+
this.compiledCache.set(effectiveLocale, compiled);
|
|
119
|
+
return compiled;
|
|
120
|
+
}
|
|
121
|
+
flattenMessages(messages, prefix = "") {
|
|
122
|
+
const result = {};
|
|
123
|
+
for (const key of Object.keys(messages)) {
|
|
124
|
+
const value = messages[key];
|
|
125
|
+
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
126
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) Object.assign(result, this.flattenMessages(value, newKey));
|
|
127
|
+
else result[newKey] = String(value);
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
MessageLoaderService = __decorate([
|
|
133
|
+
Singleton(I18N_TOKENS.MessageLoader),
|
|
134
|
+
__decorateParam(0, inject(I18N_TOKENS.MessageRegistry)),
|
|
135
|
+
__decorateParam(1, inject(I18N_TOKENS.Options, { isOptional: true }))
|
|
136
|
+
], MessageLoaderService);
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region src/i18n/services/message-registry.ts
|
|
139
|
+
/**
|
|
140
|
+
* Global key for the shared contributions array.
|
|
141
|
+
*
|
|
142
|
+
* When stratal is installed via portal/symlink (e.g., in monorepos), bundlers
|
|
143
|
+
* like esbuild may inline multiple copies of this module. Each copy gets its
|
|
144
|
+
* own static class fields, so messages registered by one copy are invisible
|
|
145
|
+
* to another. Using a `Symbol.for()` key on `globalThis` ensures all copies
|
|
146
|
+
* share the same contributions array.
|
|
147
|
+
*/
|
|
148
|
+
const CONTRIBUTIONS_KEY = Symbol.for("stratal:i18n:message-registry:contributions");
|
|
149
|
+
function getContributions() {
|
|
150
|
+
const g = globalThis;
|
|
151
|
+
g[CONTRIBUTIONS_KEY] ??= [];
|
|
152
|
+
return g[CONTRIBUTIONS_KEY];
|
|
153
|
+
}
|
|
154
|
+
let MessageRegistry = class MessageRegistry {
|
|
155
|
+
/**
|
|
156
|
+
* Add messages (called statically by I18nModule.registerMessages)
|
|
157
|
+
*/
|
|
158
|
+
static addMessages(messages) {
|
|
159
|
+
if (Boolean(messages) && typeof messages === "object" && Object.keys(messages).length > 0) getContributions().push(messages);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get all messages deep-merged in registration order
|
|
163
|
+
*/
|
|
164
|
+
getMergedMessages() {
|
|
165
|
+
const merged = {};
|
|
166
|
+
for (const contribution of getContributions()) for (const locale of Object.keys(contribution)) merged[locale] = deepMerge(merged[locale] ?? {}, contribution[locale]);
|
|
167
|
+
return merged;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Reset registry (for testing)
|
|
171
|
+
* @internal
|
|
172
|
+
*/
|
|
173
|
+
static reset() {
|
|
174
|
+
globalThis[CONTRIBUTIONS_KEY] = [];
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
MessageRegistry = __decorate([Singleton(I18N_TOKENS.MessageRegistry)], MessageRegistry);
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/i18n/i18n.module.ts
|
|
180
|
+
var _I18nModule;
|
|
181
|
+
let I18nModule = _I18nModule = class I18nModule {
|
|
182
|
+
onInitialize(_context) {
|
|
183
|
+
z.config({ customError: zodErrorMap });
|
|
184
|
+
}
|
|
185
|
+
static forRoot(options = {}) {
|
|
186
|
+
return {
|
|
187
|
+
module: _I18nModule,
|
|
188
|
+
providers: [{
|
|
189
|
+
provide: I18N_TOKENS.Options,
|
|
190
|
+
useValue: options
|
|
191
|
+
}]
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
static registerMessages(messages) {
|
|
195
|
+
MessageRegistry.addMessages(messages);
|
|
196
|
+
return {
|
|
197
|
+
module: _I18nModule,
|
|
198
|
+
providers: []
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
I18nModule = _I18nModule = __decorate([Module({ providers: [
|
|
203
|
+
{
|
|
204
|
+
provide: I18N_TOKENS.MessageRegistry,
|
|
205
|
+
useClass: MessageRegistry
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
provide: I18N_TOKENS.MessageLoader,
|
|
209
|
+
useClass: MessageLoaderService
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
provide: I18N_TOKENS.I18nService,
|
|
213
|
+
useClass: I18nService
|
|
214
|
+
}
|
|
215
|
+
] })], I18nModule);
|
|
216
|
+
//#endregion
|
|
217
|
+
export { getMessages as a, getLocales as i, MessageRegistry as n, messages as o, MessageLoaderService as r, I18nModule as t };
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=i18n.module-BlXrtAlV.mjs.map
|