stratal 0.0.24 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/cache/index.d.mts +1 -1
  2. package/dist/cache/index.mjs +2 -2
  3. package/dist/{command-CPhFHjG3.d.mts → command-4HnKnC-G.d.mts} +2 -2
  4. package/dist/{command-CPhFHjG3.d.mts.map → command-4HnKnC-G.d.mts.map} +1 -1
  5. package/dist/config/index.d.mts +1 -1
  6. package/dist/config/index.mjs +2 -2
  7. package/dist/{controller.decorator-C5UVeJS3.mjs → controller.decorator-DKeZ71aP.mjs} +3 -3
  8. package/dist/{controller.decorator-C5UVeJS3.mjs.map → controller.decorator-DKeZ71aP.mjs.map} +1 -1
  9. package/dist/cron/index.d.mts +1 -1
  10. package/dist/cron/index.mjs +1 -1
  11. package/dist/{cron.module-Bgzq5hiT.mjs → cron.module-DgxLe8Xy.mjs} +3 -3
  12. package/dist/{cron.module-Bgzq5hiT.mjs.map → cron.module-DgxLe8Xy.mjs.map} +1 -1
  13. package/dist/di/index.d.mts +1 -1
  14. package/dist/di/index.mjs +1 -1
  15. package/dist/{di-DseMn-z9.mjs → di-B0NXIdRF.mjs} +17 -1
  16. package/dist/di-B0NXIdRF.mjs.map +1 -0
  17. package/dist/email/index.d.mts +2 -2
  18. package/dist/email/index.mjs +3 -3
  19. package/dist/errors/index.d.mts +1 -1
  20. package/dist/errors/index.mjs +2 -2
  21. package/dist/{errors-mXYxG0XB.mjs → errors-EUtwVfNm.mjs} +3 -3
  22. package/dist/{errors-mXYxG0XB.mjs.map → errors-EUtwVfNm.mjs.map} +1 -1
  23. package/dist/events/index.d.mts +8 -0
  24. package/dist/events/index.d.mts.map +1 -1
  25. package/dist/events/index.mjs +1 -1
  26. package/dist/{events-BXJGZjpG.mjs → events-zbCMY_Gf.mjs} +5 -2
  27. package/dist/events-zbCMY_Gf.mjs.map +1 -0
  28. package/dist/{exception-context-kEoMFwze.mjs → exception-context-Bd5Hk2c_.mjs} +2 -2
  29. package/dist/{exception-context-kEoMFwze.mjs.map → exception-context-Bd5Hk2c_.mjs.map} +1 -1
  30. package/dist/{gateway-context-TMu_AlJt.mjs → gateway-context-I0tKgGfh.mjs} +4 -4
  31. package/dist/{gateway-context-TMu_AlJt.mjs.map → gateway-context-I0tKgGfh.mjs.map} +1 -1
  32. package/dist/guards/index.d.mts +1 -1
  33. package/dist/{hono-app-CvV3hOfT.mjs → hono-app-C7-1m9eK.mjs} +6 -6
  34. package/dist/{hono-app-CvV3hOfT.mjs.map → hono-app-C7-1m9eK.mjs.map} +1 -1
  35. package/dist/{http-method.decorator-ByWZb9DO.mjs → http-method.decorator-xCuGoZPC.mjs} +2 -2
  36. package/dist/{http-method.decorator-ByWZb9DO.mjs.map → http-method.decorator-xCuGoZPC.mjs.map} +1 -1
  37. package/dist/i18n/index.d.mts +1 -1
  38. package/dist/i18n/index.mjs +3 -3
  39. package/dist/{i18n.module-DRQAZoSZ.mjs → i18n.module-JOPUNpvi.mjs} +3 -3
  40. package/dist/{i18n.module-DRQAZoSZ.mjs.map → i18n.module-JOPUNpvi.mjs.map} +1 -1
  41. package/dist/{index-B5JBRcWD.d.mts → index-BPJSBHhq.d.mts} +2 -2
  42. package/dist/{index-B5JBRcWD.d.mts.map → index-BPJSBHhq.d.mts.map} +1 -1
  43. package/dist/{index-B_JoEl3V.d.mts → index-C_t8VVQD.d.mts} +12 -1
  44. package/dist/index-C_t8VVQD.d.mts.map +1 -0
  45. package/dist/index.d.mts +3 -3
  46. package/dist/index.mjs +2 -2
  47. package/dist/{lazy-module-loader-Ib383jH_.d.mts → lazy-module-loader-DZQxOgRZ.d.mts} +2 -2
  48. package/dist/{lazy-module-loader-Ib383jH_.d.mts.map → lazy-module-loader-DZQxOgRZ.d.mts.map} +1 -1
  49. package/dist/{locale-path.service-D-dHiIPc.mjs → locale-path.service-DzA01Kvc.mjs} +3 -3
  50. package/dist/{locale-path.service-D-dHiIPc.mjs.map → locale-path.service-DzA01Kvc.mjs.map} +1 -1
  51. package/dist/{locale-url.service-C2EWmGdq.mjs → locale-url.service-DwTXZid3.mjs} +2 -2
  52. package/dist/{locale-url.service-C2EWmGdq.mjs.map → locale-url.service-DwTXZid3.mjs.map} +1 -1
  53. package/dist/logger/index.mjs +1 -1
  54. package/dist/module/index.d.mts +2 -2
  55. package/dist/module/index.mjs +2 -2
  56. package/dist/{module-registry-Dm-pqHd3.mjs → module-registry-MfWmniZ7.mjs} +4 -4
  57. package/dist/{module-registry-Dm-pqHd3.mjs.map → module-registry-MfWmniZ7.mjs.map} +1 -1
  58. package/dist/openapi/index.d.mts +2 -2
  59. package/dist/openapi/index.mjs +1 -1
  60. package/dist/{openapi-CstuTM8S.mjs → openapi-BKDwQKh-.mjs} +3 -3
  61. package/dist/{openapi-CstuTM8S.mjs.map → openapi-BKDwQKh-.mjs.map} +1 -1
  62. package/dist/{openapi.service-YhTiJ1bO.d.mts → openapi.service-CM40bnBB.d.mts} +2 -2
  63. package/dist/{openapi.service-YhTiJ1bO.d.mts.map → openapi.service-CM40bnBB.d.mts.map} +1 -1
  64. package/dist/quarry/index.d.mts +3 -3
  65. package/dist/quarry/index.mjs +1 -1
  66. package/dist/quarry/runner.d.mts +6 -6
  67. package/dist/quarry/runner.mjs +5 -5
  68. package/dist/{quarry-registry-CXg0RFXq.d.mts → quarry-registry-CsStq0DB.d.mts} +3 -3
  69. package/dist/{quarry-registry-CXg0RFXq.d.mts.map → quarry-registry-CsStq0DB.d.mts.map} +1 -1
  70. package/dist/{quarry.module-BuRPGMDm.mjs → quarry.module-BOgcNJMU.mjs} +3 -3
  71. package/dist/{quarry.module-BuRPGMDm.mjs.map → quarry.module-BOgcNJMU.mjs.map} +1 -1
  72. package/dist/queue/index.d.mts +1 -1
  73. package/dist/queue/index.mjs +2 -2
  74. package/dist/{queue.module-nddvxzCB.mjs → queue.module-DSAH88gZ.mjs} +3 -3
  75. package/dist/{queue.module-nddvxzCB.mjs.map → queue.module-DSAH88gZ.mjs.map} +1 -1
  76. package/dist/{r2-storage.provider-DCxQt9dD.mjs → r2-storage.provider-BJ4j23W6.mjs} +2 -2
  77. package/dist/{r2-storage.provider-DCxQt9dD.mjs.map → r2-storage.provider-BJ4j23W6.mjs.map} +1 -1
  78. package/dist/{rate-limit.decorator-BPAie_p3.mjs → rate-limit.decorator-B35jBEVD.mjs} +2 -2
  79. package/dist/{rate-limit.decorator-BPAie_p3.mjs.map → rate-limit.decorator-B35jBEVD.mjs.map} +1 -1
  80. package/dist/rate-limiter/index.d.mts +1 -1
  81. package/dist/rate-limiter/index.mjs +3 -3
  82. package/dist/{route-registration.service-D6vSwiKP.mjs → route-registration.service-HN8WgIis.mjs} +9 -9
  83. package/dist/{route-registration.service-D6vSwiKP.mjs.map → route-registration.service-HN8WgIis.mjs.map} +1 -1
  84. package/dist/{route-registry-CYqLp2Nj.mjs → route-registry-CtW26Suv.mjs} +3 -3
  85. package/dist/{route-registry-CYqLp2Nj.mjs.map → route-registry-CtW26Suv.mjs.map} +1 -1
  86. package/dist/router/index.d.mts +1 -1
  87. package/dist/router/index.mjs +13 -13
  88. package/dist/{router-CWGBD-Bg.mjs → router-OCnf4VB6.mjs} +13 -13
  89. package/dist/{router-CWGBD-Bg.mjs.map → router-OCnf4VB6.mjs.map} +1 -1
  90. package/dist/{router-resolver-D4YlPNlm.mjs → router-resolver-CMNuw-s0.mjs} +2 -2
  91. package/dist/{router-resolver-D4YlPNlm.mjs.map → router-resolver-CMNuw-s0.mjs.map} +1 -1
  92. package/dist/seeder/index.d.mts +2 -2
  93. package/dist/seeder/index.mjs +3 -3
  94. package/dist/{seeder-7ubkms-Y.mjs → seeder-DI-rUoZx.mjs} +4 -4
  95. package/dist/{seeder-7ubkms-Y.mjs.map → seeder-DI-rUoZx.mjs.map} +1 -1
  96. package/dist/{seeder-registry-CyUmKsJq.mjs → seeder-registry-B5FwBeCU.mjs} +3 -3
  97. package/dist/{seeder-registry-CyUmKsJq.mjs.map → seeder-registry-B5FwBeCU.mjs.map} +1 -1
  98. package/dist/{seeder.module-CYYwk3Qk.mjs → seeder.module-DaY0RYoB.mjs} +2 -2
  99. package/dist/{seeder.module-CYYwk3Qk.mjs.map → seeder.module-DaY0RYoB.mjs.map} +1 -1
  100. package/dist/storage/index.d.mts +1 -1
  101. package/dist/storage/index.mjs +2 -2
  102. package/dist/storage/providers/index.mjs +1 -1
  103. package/dist/{storage-MDZypIE9.mjs → storage-BE6-kzaN.mjs} +7 -7
  104. package/dist/{storage-MDZypIE9.mjs.map → storage-BE6-kzaN.mjs.map} +1 -1
  105. package/dist/{storage.error-Dnib4VHc.mjs → storage.error-Dai3rShJ.mjs} +2 -2
  106. package/dist/{storage.error-Dnib4VHc.mjs.map → storage.error-Dai3rShJ.mjs.map} +1 -1
  107. package/dist/{stratal-DwDJPY9N.d.mts → stratal-Bmc6WT3k.d.mts} +2 -2
  108. package/dist/{stratal-DwDJPY9N.d.mts.map → stratal-Bmc6WT3k.d.mts.map} +1 -1
  109. package/dist/{stratal-DL9M38_s.mjs → stratal-DtAj21uF.mjs} +21 -20
  110. package/dist/stratal-DtAj21uF.mjs.map +1 -0
  111. package/dist/{uri-h7Q8Jug9.mjs → uri-h6ITRpqr.mjs} +3 -3
  112. package/dist/{uri-h7Q8Jug9.mjs.map → uri-h6ITRpqr.mjs.map} +1 -1
  113. package/dist/{versioning.service-C6aHky8-.mjs → versioning.service-B4rtmgMQ.mjs} +3 -3
  114. package/dist/{versioning.service-C6aHky8-.mjs.map → versioning.service-B4rtmgMQ.mjs.map} +1 -1
  115. package/dist/websocket/index.d.mts +1 -1
  116. package/dist/websocket/index.mjs +1 -1
  117. package/dist/workers/index.d.mts +1 -1
  118. package/dist/workers/index.mjs +2 -2
  119. package/package.json +1 -1
  120. package/dist/di-DseMn-z9.mjs.map +0 -1
  121. package/dist/events-BXJGZjpG.mjs.map +0 -1
  122. package/dist/index-B_JoEl3V.d.mts.map +0 -1
  123. package/dist/stratal-DL9M38_s.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"uri-h7Q8Jug9.mjs","names":[],"sources":["../src/router/uri.ts"],"sourcesContent":["import type { Application } from '../application';\nimport { inject } from '../di';\nimport { Request } from '../di/decorators';\nimport { DI_TOKENS } from '../di/tokens';\nimport { applyLocalePrefix } from './locale-url';\nimport type { RouteName, RouteParams } from './route-map';\nimport type { RegisteredRoute, RouteRegistry } from './route-registry';\nimport type { RouterContext } from './router-context';\nimport { RouterError } from './router.error';\nimport { ROUTER_TOKENS } from './router.tokens';\nimport type { LocalePathService } from './services/locale-path.service';\nimport { signUrl, verifySignedUrl, type SignedUrlOptions } from './signed-url';\nimport { applyTrailingSlash } from './trailing-slash';\nimport type { LocaleUrlConfig, TrailingSlashMode } from './types';\n\n/**\n * Options for URL generation methods.\n */\nexport interface UriOptions {\n /** Generate absolute URL (scheme + host). Defaults to false. */\n absolute?: boolean\n}\n\n/**\n * Options for signed URL generation methods.\n */\nexport interface SignedUriOptions extends UriOptions, SignedUrlOptions { }\n\n/**\n * Encode a value for use as a path parameter.\n *\n * Splits on `/` and encodes each segment with `encodeURIComponent`, so callers\n * can pass slash-containing values for catch-all params (e.g. `:slug{.+}`) and\n * still get a usable URL — `'auth/login'` becomes `'auth/login'`, not\n * `'auth%2Flogin'`. Single segments behave exactly like `encodeURIComponent`.\n */\nfunction encodePathParam(value: string): string {\n return value.split('/').map(encodeURIComponent).join('/')\n}\n\n/**\n * Build a URL from a registered route, filling path/domain params and appending extras as query string.\n *\n * Pure function — no request context needed. Used by both the `Uri` class and the standalone `route()` function.\n *\n * @param route - The registered route to build a URL for\n * @param name - Route name (used in error messages)\n * @param params - Path params, domain params, and extra query params\n * @returns Relative URL string (or absolute with domain prefix if route has a domain pattern)\n *\n * @throws RouterError if a required path or domain param is missing\n */\nexport function buildRouteUrl(\n route: RegisteredRoute,\n name: string,\n params?: Record<string, string>,\n localeConfig?: LocaleUrlConfig,\n): string {\n const allParams = { ...params }\n const consumedKeys = new Set<string>()\n let url = route.path\n\n if (allParams.locale && route.localePaths?.length) {\n url = applyLocalePrefix(url, allParams.locale, localeConfig)\n consumedKeys.add('locale')\n }\n\n // Fill path :param placeholders (handles optional regex constraints like :locale{en|de|fr})\n for (const paramName of route.paramNames) {\n const value = allParams[paramName]\n if (value === undefined) {\n throw new RouterError(`Missing required route parameter \"${paramName}\" for route \"${name}\" (path: ${route.path})`)\n }\n url = url.replace(\n new RegExp(`:${paramName}(\\\\{[^}]*\\\\})?`),\n encodePathParam(value),\n )\n consumedKeys.add(paramName)\n }\n\n // Build domain if present\n let domain: string | undefined\n if (route.domain) {\n domain = route.domain\n for (const domainParam of route.domainParamNames) {\n const value = allParams[domainParam]\n if (value === undefined) {\n throw new RouterError(`Missing required domain parameter \"${domainParam}\" for route \"${name}\" (domain: ${route.domain})`)\n }\n domain = domain.replace(`{${domainParam}}`, encodeURIComponent(value))\n consumedKeys.add(domainParam)\n }\n }\n\n // Remaining params (not consumed by path or domain) become query string\n const queryEntries = Object.entries(allParams).filter(([key]) => !consumedKeys.has(key))\n if (queryEntries.length > 0) {\n const queryString = queryEntries\n .filter(([, value]) => Boolean(value))\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n url = `${url}${queryString.length ? `?${queryString}` : ''}`\n }\n\n // Prepend domain if present\n if (domain) {\n url = `https://${domain}${url}`\n }\n\n return url\n}\n\n/**\n * URL generation service for named routes, signed URLs, and request URL access.\n *\n * Registered as request-scoped in the container — has access to the current request\n * via RouterContext for features like `current()`, `full()`, and signed URLs.\n *\n * @example\n * ```typescript\n * // In a controller:\n * const uri = ctx.getContainer().resolve<Uri>(ROUTER_TOKENS.Uri)\n * uri.route('users.show', { id: '1' })\n * uri.current()\n * await uri.signedRoute('unsubscribe', { user: '1' }, { expiresIn: 3600 })\n *\n * // Set defaults (e.g., in middleware):\n * uri.defaults({ locale: 'en' })\n * uri.route('posts.index') // auto-fills :locale param\n * ```\n */\n@Request(ROUTER_TOKENS.Uri)\nexport class Uri {\n private _defaults: Record<string, string> = {}\n private readonly trailingSlash: TrailingSlashMode\n private readonly localeConfig: LocaleUrlConfig\n\n constructor(\n @inject(ROUTER_TOKENS.RouteRegistry) private readonly registry: RouteRegistry,\n @inject(ROUTER_TOKENS.RouterContext) private readonly routerContext: RouterContext,\n @inject(DI_TOKENS.Application) application: Application,\n @inject(ROUTER_TOKENS.LocalePathService) localePathService: LocalePathService,\n ) {\n this.trailingSlash = application.config.trailingSlash ?? 'ignore'\n this.localeConfig = {\n defaultLocale: localePathService.localePathConfig?.defaultLocale ?? null,\n prefixDefaultLocale: localePathService.prefixDefaultLocale,\n }\n }\n\n /**\n * Set default URL parameters for this request.\n * Applied to all subsequent `route()` calls — explicit params override defaults.\n *\n * @param params - Default parameters (e.g., `{ locale: 'en' }`)\n */\n defaults(params: Record<string, string>): void {\n this._defaults = { ...this._defaults, ...params }\n }\n\n /**\n * Read the currently configured default URL parameters.\n *\n * Used by frameworks that need to share these with the client (e.g. the\n * Inertia adapter ships them as a shared prop so `route()` calls in the\n * browser auto-fill the same sticky params as the server).\n */\n getDefaults(): Record<string, string> {\n return { ...this._defaults }\n }\n\n /**\n * Generate a URL from a named route.\n *\n * Keys matching `:param` placeholders fill the path.\n * Domain params (`{tenant}`) are consumed from the same object.\n * Extra keys become query string parameters.\n * Default params (from `defaults()`) are merged — explicit params override.\n *\n * @param name - Named route identifier\n * @param params - Route params + domain params + extra query params\n * @param options - URL generation options\n * @returns Generated URL string\n *\n * @throws RouterError if route name not found or required params missing\n */\n route<N extends RouteName>(name: N, params?: RouteParams<N>, options?: UriOptions): string {\n const registeredRoute = this.registry.get(name)\n if (!registeredRoute) {\n throw new RouterError(`Route name \"${name}\" was not found in the registry`)\n }\n\n const mergedParams = { ...this._defaults, ...params } as Record<string, string>\n let url = applyTrailingSlash(buildRouteUrl(registeredRoute, name, mergedParams, this.localeConfig), this.trailingSlash)\n\n if (options?.absolute && !url.startsWith('http')) {\n const origin = new URL(this.routerContext.c.req.url).origin\n url = `${origin}${url}`\n }\n\n return url\n }\n\n /**\n * Generate a signed URL from a named route.\n *\n * @param name - Named route identifier\n * @param params - Route params + domain params + extra query params\n * @param options - Signing options (e.g., expiresIn) and URL options\n * @returns Signed URL string with signature query param\n *\n * @throws Error if APP_SECRET environment variable is not set\n */\n async signedRoute<N extends RouteName>(name: N, params?: RouteParams<N>, options?: SignedUriOptions): Promise<string> {\n const url = this.route(name, params, options)\n const secret = this.getAppSecret()\n return signUrl(url, secret, options)\n }\n\n /**\n * Generate a temporary signed URL from a named route.\n *\n * @param name - Named route identifier\n * @param expiresIn - Time-to-live in seconds\n * @param params - Route params + domain params + extra query params\n * @param options - URL generation options\n * @returns Signed URL string with signature and expires query params\n *\n * @throws Error if APP_SECRET environment variable is not set\n */\n async temporarySignedRoute<N extends RouteName>(name: N, expiresIn: number, params?: RouteParams<N>, options?: UriOptions): Promise<string> {\n return this.signedRoute(name, params, { ...options, expiresIn })\n }\n\n /**\n * Check if the current request has a valid signature.\n *\n * @returns true if the URL signature is valid and not expired\n */\n async hasValidSignature(): Promise<boolean> {\n const secret = (this.routerContext.c.env as unknown as Record<string, string>).APP_SECRET\n if (!secret) return false\n return verifySignedUrl(this.routerContext.c.req.url, secret)\n }\n\n /**\n * Get the current request URL pathname (without query string).\n */\n current(): string {\n const parsed = new URL(this.routerContext.c.req.url)\n return applyTrailingSlash(parsed.pathname, this.trailingSlash)\n }\n\n /**\n * Get the current request URL with query string (pathname + search).\n */\n full(): string {\n const parsed = new URL(this.routerContext.c.req.url)\n return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash)\n }\n\n /**\n * Get the previous request URL from the Referer header.\n *\n * @param fallback - URL to return if no Referer header (default: '/')\n */\n previous(fallback = '/'): string {\n return this.routerContext.c.req.header('referer') ?? fallback\n }\n\n /**\n * Get the previous request URL pathname (no query string or host) from the Referer header.\n *\n * @param fallback - Path to return if no Referer header (default: '/')\n */\n previousPath(fallback = '/'): string {\n const referer = this.routerContext.c.req.header('referer')\n if (!referer) return fallback\n\n try {\n const parsed = new URL(referer)\n return parsed.pathname\n } catch {\n return referer\n }\n }\n\n /**\n * Build a URL to a raw path (not a named route) with optional query params.\n *\n * @param path - URL path (e.g., '/users')\n * @param queryParams - Query parameters to append\n * @param options - URL generation options\n */\n to(path: string, queryParams?: Record<string, string>, options?: UriOptions): string {\n let url = applyTrailingSlash(path, this.trailingSlash)\n\n if (queryParams) {\n const entries = Object.entries(queryParams)\n if (entries.length > 0) {\n const queryString = entries\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n url = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`\n }\n }\n\n if (options?.absolute && !url.startsWith('http')) {\n const origin = new URL(this.routerContext.c.req.url).origin\n url = `${origin}${url}`\n }\n\n return url\n }\n\n /**\n * Build a URL with query string parameters. Merges with existing query params in path.\n *\n * @param path - URL path, may already contain query params\n * @param queryParams - Query parameters to merge (new values override existing)\n */\n query(path: string, queryParams: Record<string, string>): string {\n const parsed = new URL(path, 'https://placeholder.local')\n for (const [key, value] of Object.entries(queryParams)) {\n parsed.searchParams.set(key, value)\n }\n return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash)\n }\n\n private getAppSecret(): string {\n const secret = this.routerContext.c.env.APP_SECRET\n if (!secret) {\n throw new Error('APP_SECRET environment variable is required for signed URLs')\n }\n return secret\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoCA,SAAS,gBAAgB,OAAuB;CAC9C,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,kBAAkB,EAAE,KAAK,GAAG;AAC1D;;;;;;;;;;;;;AAcA,SAAgB,cACd,OACA,MACA,QACA,cACQ;CACR,MAAM,YAAY,EAAE,GAAG,OAAO;CAC9B,MAAM,+BAAe,IAAI,IAAY;CACrC,IAAI,MAAM,MAAM;CAEhB,IAAI,UAAU,UAAU,MAAM,aAAa,QAAQ;EACjD,MAAM,kBAAkB,KAAK,UAAU,QAAQ,YAAY;EAC3D,aAAa,IAAI,QAAQ;CAC3B;CAGA,KAAK,MAAM,aAAa,MAAM,YAAY;EACxC,MAAM,QAAQ,UAAU;EACxB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,YAAY,qCAAqC,UAAU,eAAe,KAAK,WAAW,MAAM,KAAK,EAAE;EAEnH,MAAM,IAAI,QACR,IAAI,OAAO,IAAI,UAAU,eAAe,GACxC,gBAAgB,KAAK,CACvB;EACA,aAAa,IAAI,SAAS;CAC5B;CAGA,IAAI;CACJ,IAAI,MAAM,QAAQ;EAChB,SAAS,MAAM;EACf,KAAK,MAAM,eAAe,MAAM,kBAAkB;GAChD,MAAM,QAAQ,UAAU;GACxB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,YAAY,sCAAsC,YAAY,eAAe,KAAK,aAAa,MAAM,OAAO,EAAE;GAE1H,SAAS,OAAO,QAAQ,IAAI,YAAY,IAAI,mBAAmB,KAAK,CAAC;GACrE,aAAa,IAAI,WAAW;EAC9B;CACF;CAGA,MAAM,eAAe,OAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,aAAa,IAAI,GAAG,CAAC;CACvF,IAAI,aAAa,SAAS,GAAG;EAC3B,MAAM,cAAc,aACjB,QAAQ,GAAG,WAAW,QAAQ,KAAK,CAAC,EACpC,KAAK,CAAC,KAAK,WAAW,GAAG,mBAAmB,GAAG,EAAE,GAAG,mBAAmB,KAAK,GAAG,EAC/E,KAAK,GAAG;EACX,MAAM,GAAG,MAAM,YAAY,SAAS,IAAI,gBAAgB;CAC1D;CAGA,IAAI,QACF,MAAM,WAAW,SAAS;CAG5B,OAAO;AACT;AAsBO,IAAA,MAAA,MAAM,IAAI;CAMyC;CACA;CANxD,YAA4C,CAAC;CAC7C;CACA;CAEA,YACE,UACA,eACA,aACA,mBACA;EAJsD,KAAA,WAAA;EACA,KAAA,gBAAA;EAItD,KAAK,gBAAgB,YAAY,OAAO,iBAAiB;EACzD,KAAK,eAAe;GAClB,eAAe,kBAAkB,kBAAkB,iBAAiB;GACpE,qBAAqB,kBAAkB;EACzC;CACF;;;;;;;CAQA,SAAS,QAAsC;EAC7C,KAAK,YAAY;GAAE,GAAG,KAAK;GAAW,GAAG;EAAO;CAClD;;;;;;;;CASA,cAAsC;EACpC,OAAO,EAAE,GAAG,KAAK,UAAU;CAC7B;;;;;;;;;;;;;;;;CAiBA,MAA2B,MAAS,QAAyB,SAA8B;EACzF,MAAM,kBAAkB,KAAK,SAAS,IAAI,IAAI;EAC9C,IAAI,CAAC,iBACH,MAAM,IAAI,YAAY,eAAe,KAAK,gCAAgC;EAI5E,IAAI,MAAM,mBAAmB,cAAc,iBAAiB,MAAM;GAD3C,GAAG,KAAK;GAAW,GAAG;EACgC,GAAG,KAAK,YAAY,GAAG,KAAK,aAAa;EAEtH,IAAI,SAAS,YAAY,CAAC,IAAI,WAAW,MAAM,GAE7C,MAAM,GADS,IAAI,IAAI,KAAK,cAAc,EAAE,IAAI,GAAG,EAAE,SACnC;EAGpB,OAAO;CACT;;;;;;;;;;;CAYA,MAAM,YAAiC,MAAS,QAAyB,SAA6C;EAGpH,OAAO,QAFK,KAAK,MAAM,MAAM,QAAQ,OAEpB,GADF,KAAK,aACK,GAAG,OAAO;CACrC;;;;;;;;;;;;CAaA,MAAM,qBAA0C,MAAS,WAAmB,QAAyB,SAAuC;EAC1I,OAAO,KAAK,YAAY,MAAM,QAAQ;GAAE,GAAG;GAAS;EAAU,CAAC;CACjE;;;;;;CAOA,MAAM,oBAAsC;EAC1C,MAAM,SAAU,KAAK,cAAc,EAAE,IAA0C;EAC/E,IAAI,CAAC,QAAQ,OAAO;EACpB,OAAO,gBAAgB,KAAK,cAAc,EAAE,IAAI,KAAK,MAAM;CAC7D;;;;CAKA,UAAkB;EAEhB,OAAO,mBAAmB,IADP,IAAI,KAAK,cAAc,EAAE,IAAI,GACjB,EAAE,UAAU,KAAK,aAAa;CAC/D;;;;CAKA,OAAe;EACb,MAAM,SAAS,IAAI,IAAI,KAAK,cAAc,EAAE,IAAI,GAAG;EACnD,OAAO,mBAAmB,GAAG,OAAO,WAAW,OAAO,UAAU,KAAK,aAAa;CACpF;;;;;;CAOA,SAAS,WAAW,KAAa;EAC/B,OAAO,KAAK,cAAc,EAAE,IAAI,OAAO,SAAS,KAAK;CACvD;;;;;;CAOA,aAAa,WAAW,KAAa;EACnC,MAAM,UAAU,KAAK,cAAc,EAAE,IAAI,OAAO,SAAS;EACzD,IAAI,CAAC,SAAS,OAAO;EAErB,IAAI;GAEF,OAAO,IADY,IAAI,OACX,EAAE;EAChB,QAAQ;GACN,OAAO;EACT;CACF;;;;;;;;CASA,GAAG,MAAc,aAAsC,SAA8B;EACnF,IAAI,MAAM,mBAAmB,MAAM,KAAK,aAAa;EAErD,IAAI,aAAa;GACf,MAAM,UAAU,OAAO,QAAQ,WAAW;GAC1C,IAAI,QAAQ,SAAS,GAAG;IACtB,MAAM,cAAc,QACjB,KAAK,CAAC,KAAK,WAAW,GAAG,mBAAmB,GAAG,EAAE,GAAG,mBAAmB,KAAK,GAAG,EAC/E,KAAK,GAAG;IACX,MAAM,IAAI,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,GAAG;GAChE;EACF;EAEA,IAAI,SAAS,YAAY,CAAC,IAAI,WAAW,MAAM,GAE7C,MAAM,GADS,IAAI,IAAI,KAAK,cAAc,EAAE,IAAI,GAAG,EAAE,SACnC;EAGpB,OAAO;CACT;;;;;;;CAQA,MAAM,MAAc,aAA6C;EAC/D,MAAM,SAAS,IAAI,IAAI,MAAM,2BAA2B;EACxD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,GACnD,OAAO,aAAa,IAAI,KAAK,KAAK;EAEpC,OAAO,mBAAmB,GAAG,OAAO,WAAW,OAAO,UAAU,KAAK,aAAa;CACpF;CAEA,eAA+B;EAC7B,MAAM,SAAS,KAAK,cAAc,EAAE,IAAI;EACxC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,6DAA6D;EAE/E,OAAO;CACT;AACF;;CA7MC,QAAQ,cAAc,GAAG;oBAOrB,OAAO,cAAc,aAAa,CAAA;oBAClC,OAAO,cAAc,aAAa,CAAA;oBAClC,OAAO,UAAU,WAAW,CAAA;oBAC5B,OAAO,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"uri-h6ITRpqr.mjs","names":[],"sources":["../src/router/uri.ts"],"sourcesContent":["import type { Application } from '../application';\nimport { inject } from '../di';\nimport { Request } from '../di/decorators';\nimport { DI_TOKENS } from '../di/tokens';\nimport { applyLocalePrefix } from './locale-url';\nimport type { RouteName, RouteParams } from './route-map';\nimport type { RegisteredRoute, RouteRegistry } from './route-registry';\nimport type { RouterContext } from './router-context';\nimport { RouterError } from './router.error';\nimport { ROUTER_TOKENS } from './router.tokens';\nimport type { LocalePathService } from './services/locale-path.service';\nimport { signUrl, verifySignedUrl, type SignedUrlOptions } from './signed-url';\nimport { applyTrailingSlash } from './trailing-slash';\nimport type { LocaleUrlConfig, TrailingSlashMode } from './types';\n\n/**\n * Options for URL generation methods.\n */\nexport interface UriOptions {\n /** Generate absolute URL (scheme + host). Defaults to false. */\n absolute?: boolean\n}\n\n/**\n * Options for signed URL generation methods.\n */\nexport interface SignedUriOptions extends UriOptions, SignedUrlOptions { }\n\n/**\n * Encode a value for use as a path parameter.\n *\n * Splits on `/` and encodes each segment with `encodeURIComponent`, so callers\n * can pass slash-containing values for catch-all params (e.g. `:slug{.+}`) and\n * still get a usable URL — `'auth/login'` becomes `'auth/login'`, not\n * `'auth%2Flogin'`. Single segments behave exactly like `encodeURIComponent`.\n */\nfunction encodePathParam(value: string): string {\n return value.split('/').map(encodeURIComponent).join('/')\n}\n\n/**\n * Build a URL from a registered route, filling path/domain params and appending extras as query string.\n *\n * Pure function — no request context needed. Used by both the `Uri` class and the standalone `route()` function.\n *\n * @param route - The registered route to build a URL for\n * @param name - Route name (used in error messages)\n * @param params - Path params, domain params, and extra query params\n * @returns Relative URL string (or absolute with domain prefix if route has a domain pattern)\n *\n * @throws RouterError if a required path or domain param is missing\n */\nexport function buildRouteUrl(\n route: RegisteredRoute,\n name: string,\n params?: Record<string, string>,\n localeConfig?: LocaleUrlConfig,\n): string {\n const allParams = { ...params }\n const consumedKeys = new Set<string>()\n let url = route.path\n\n if (allParams.locale && route.localePaths?.length) {\n url = applyLocalePrefix(url, allParams.locale, localeConfig)\n consumedKeys.add('locale')\n }\n\n // Fill path :param placeholders (handles optional regex constraints like :locale{en|de|fr})\n for (const paramName of route.paramNames) {\n const value = allParams[paramName]\n if (value === undefined) {\n throw new RouterError(`Missing required route parameter \"${paramName}\" for route \"${name}\" (path: ${route.path})`)\n }\n url = url.replace(\n new RegExp(`:${paramName}(\\\\{[^}]*\\\\})?`),\n encodePathParam(value),\n )\n consumedKeys.add(paramName)\n }\n\n // Build domain if present\n let domain: string | undefined\n if (route.domain) {\n domain = route.domain\n for (const domainParam of route.domainParamNames) {\n const value = allParams[domainParam]\n if (value === undefined) {\n throw new RouterError(`Missing required domain parameter \"${domainParam}\" for route \"${name}\" (domain: ${route.domain})`)\n }\n domain = domain.replace(`{${domainParam}}`, encodeURIComponent(value))\n consumedKeys.add(domainParam)\n }\n }\n\n // Remaining params (not consumed by path or domain) become query string\n const queryEntries = Object.entries(allParams).filter(([key]) => !consumedKeys.has(key))\n if (queryEntries.length > 0) {\n const queryString = queryEntries\n .filter(([, value]) => Boolean(value))\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n url = `${url}${queryString.length ? `?${queryString}` : ''}`\n }\n\n // Prepend domain if present\n if (domain) {\n url = `https://${domain}${url}`\n }\n\n return url\n}\n\n/**\n * URL generation service for named routes, signed URLs, and request URL access.\n *\n * Registered as request-scoped in the container — has access to the current request\n * via RouterContext for features like `current()`, `full()`, and signed URLs.\n *\n * @example\n * ```typescript\n * // In a controller:\n * const uri = ctx.getContainer().resolve<Uri>(ROUTER_TOKENS.Uri)\n * uri.route('users.show', { id: '1' })\n * uri.current()\n * await uri.signedRoute('unsubscribe', { user: '1' }, { expiresIn: 3600 })\n *\n * // Set defaults (e.g., in middleware):\n * uri.defaults({ locale: 'en' })\n * uri.route('posts.index') // auto-fills :locale param\n * ```\n */\n@Request(ROUTER_TOKENS.Uri)\nexport class Uri {\n private _defaults: Record<string, string> = {}\n private readonly trailingSlash: TrailingSlashMode\n private readonly localeConfig: LocaleUrlConfig\n\n constructor(\n @inject(ROUTER_TOKENS.RouteRegistry) private readonly registry: RouteRegistry,\n @inject(ROUTER_TOKENS.RouterContext) private readonly routerContext: RouterContext,\n @inject(DI_TOKENS.Application) application: Application,\n @inject(ROUTER_TOKENS.LocalePathService) localePathService: LocalePathService,\n ) {\n this.trailingSlash = application.config.trailingSlash ?? 'ignore'\n this.localeConfig = {\n defaultLocale: localePathService.localePathConfig?.defaultLocale ?? null,\n prefixDefaultLocale: localePathService.prefixDefaultLocale,\n }\n }\n\n /**\n * Set default URL parameters for this request.\n * Applied to all subsequent `route()` calls — explicit params override defaults.\n *\n * @param params - Default parameters (e.g., `{ locale: 'en' }`)\n */\n defaults(params: Record<string, string>): void {\n this._defaults = { ...this._defaults, ...params }\n }\n\n /**\n * Read the currently configured default URL parameters.\n *\n * Used by frameworks that need to share these with the client (e.g. the\n * Inertia adapter ships them as a shared prop so `route()` calls in the\n * browser auto-fill the same sticky params as the server).\n */\n getDefaults(): Record<string, string> {\n return { ...this._defaults }\n }\n\n /**\n * Generate a URL from a named route.\n *\n * Keys matching `:param` placeholders fill the path.\n * Domain params (`{tenant}`) are consumed from the same object.\n * Extra keys become query string parameters.\n * Default params (from `defaults()`) are merged — explicit params override.\n *\n * @param name - Named route identifier\n * @param params - Route params + domain params + extra query params\n * @param options - URL generation options\n * @returns Generated URL string\n *\n * @throws RouterError if route name not found or required params missing\n */\n route<N extends RouteName>(name: N, params?: RouteParams<N>, options?: UriOptions): string {\n const registeredRoute = this.registry.get(name)\n if (!registeredRoute) {\n throw new RouterError(`Route name \"${name}\" was not found in the registry`)\n }\n\n const mergedParams = { ...this._defaults, ...params } as Record<string, string>\n let url = applyTrailingSlash(buildRouteUrl(registeredRoute, name, mergedParams, this.localeConfig), this.trailingSlash)\n\n if (options?.absolute && !url.startsWith('http')) {\n const origin = new URL(this.routerContext.c.req.url).origin\n url = `${origin}${url}`\n }\n\n return url\n }\n\n /**\n * Generate a signed URL from a named route.\n *\n * @param name - Named route identifier\n * @param params - Route params + domain params + extra query params\n * @param options - Signing options (e.g., expiresIn) and URL options\n * @returns Signed URL string with signature query param\n *\n * @throws Error if APP_SECRET environment variable is not set\n */\n async signedRoute<N extends RouteName>(name: N, params?: RouteParams<N>, options?: SignedUriOptions): Promise<string> {\n const url = this.route(name, params, options)\n const secret = this.getAppSecret()\n return signUrl(url, secret, options)\n }\n\n /**\n * Generate a temporary signed URL from a named route.\n *\n * @param name - Named route identifier\n * @param expiresIn - Time-to-live in seconds\n * @param params - Route params + domain params + extra query params\n * @param options - URL generation options\n * @returns Signed URL string with signature and expires query params\n *\n * @throws Error if APP_SECRET environment variable is not set\n */\n async temporarySignedRoute<N extends RouteName>(name: N, expiresIn: number, params?: RouteParams<N>, options?: UriOptions): Promise<string> {\n return this.signedRoute(name, params, { ...options, expiresIn })\n }\n\n /**\n * Check if the current request has a valid signature.\n *\n * @returns true if the URL signature is valid and not expired\n */\n async hasValidSignature(): Promise<boolean> {\n const secret = (this.routerContext.c.env as unknown as Record<string, string>).APP_SECRET\n if (!secret) return false\n return verifySignedUrl(this.routerContext.c.req.url, secret)\n }\n\n /**\n * Get the current request URL pathname (without query string).\n */\n current(): string {\n const parsed = new URL(this.routerContext.c.req.url)\n return applyTrailingSlash(parsed.pathname, this.trailingSlash)\n }\n\n /**\n * Get the current request URL with query string (pathname + search).\n */\n full(): string {\n const parsed = new URL(this.routerContext.c.req.url)\n return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash)\n }\n\n /**\n * Get the previous request URL from the Referer header.\n *\n * @param fallback - URL to return if no Referer header (default: '/')\n */\n previous(fallback = '/'): string {\n return this.routerContext.c.req.header('referer') ?? fallback\n }\n\n /**\n * Get the previous request URL pathname (no query string or host) from the Referer header.\n *\n * @param fallback - Path to return if no Referer header (default: '/')\n */\n previousPath(fallback = '/'): string {\n const referer = this.routerContext.c.req.header('referer')\n if (!referer) return fallback\n\n try {\n const parsed = new URL(referer)\n return parsed.pathname\n } catch {\n return referer\n }\n }\n\n /**\n * Build a URL to a raw path (not a named route) with optional query params.\n *\n * @param path - URL path (e.g., '/users')\n * @param queryParams - Query parameters to append\n * @param options - URL generation options\n */\n to(path: string, queryParams?: Record<string, string>, options?: UriOptions): string {\n let url = applyTrailingSlash(path, this.trailingSlash)\n\n if (queryParams) {\n const entries = Object.entries(queryParams)\n if (entries.length > 0) {\n const queryString = entries\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n url = url.includes('?') ? `${url}&${queryString}` : `${url}?${queryString}`\n }\n }\n\n if (options?.absolute && !url.startsWith('http')) {\n const origin = new URL(this.routerContext.c.req.url).origin\n url = `${origin}${url}`\n }\n\n return url\n }\n\n /**\n * Build a URL with query string parameters. Merges with existing query params in path.\n *\n * @param path - URL path, may already contain query params\n * @param queryParams - Query parameters to merge (new values override existing)\n */\n query(path: string, queryParams: Record<string, string>): string {\n const parsed = new URL(path, 'https://placeholder.local')\n for (const [key, value] of Object.entries(queryParams)) {\n parsed.searchParams.set(key, value)\n }\n return applyTrailingSlash(`${parsed.pathname}${parsed.search}`, this.trailingSlash)\n }\n\n private getAppSecret(): string {\n const secret = this.routerContext.c.env.APP_SECRET\n if (!secret) {\n throw new Error('APP_SECRET environment variable is required for signed URLs')\n }\n return secret\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./chunk-BBjsoOtd.mjs";
2
- import { d as inject, r as DI_TOKENS, s as Singleton } from "./di-DseMn-z9.mjs";
2
+ import { d as inject, r as DI_TOKENS, s as Singleton } from "./di-B0NXIdRF.mjs";
3
3
  import { n as __decorateParam, t as __decorate } from "./decorate-CuAoSZvs.mjs";
4
- import { f as VERSION_NEUTRAL } from "./exception-context-kEoMFwze.mjs";
4
+ import { f as VERSION_NEUTRAL } from "./exception-context-Bd5Hk2c_.mjs";
5
5
  //#region src/router/services/versioning.service.ts
6
6
  var versioning_service_exports = /* @__PURE__ */ __exportAll({ VersioningService: () => VersioningService });
7
7
  let VersioningService = class VersioningService {
@@ -33,4 +33,4 @@ VersioningService = __decorate([Singleton(), __decorateParam(0, inject(DI_TOKENS
33
33
  //#endregion
34
34
  export { versioning_service_exports as n, VersioningService as t };
35
35
 
36
- //# sourceMappingURL=versioning.service-C6aHky8-.mjs.map
36
+ //# sourceMappingURL=versioning.service-B4rtmgMQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"versioning.service-C6aHky8-.mjs","names":[],"sources":["../src/router/services/versioning.service.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport { DI_TOKENS } from '../../di/tokens'\nimport type { Application } from '../../application'\nimport { VERSION_NEUTRAL } from '../constants'\nimport type { VersioningOptions } from '../types'\n\n/**\n * Resolves version prefixes for route paths.\n *\n * Handles VERSION_NEUTRAL, multi-version arrays, default version fallback,\n * and configurable prefix (default: 'v').\n *\n * Registered as a singleton in the container.\n */\n@Singleton()\nexport class VersioningService {\n private readonly options: VersioningOptions | null\n\n constructor(@inject(DI_TOKENS.Application) app: Application) {\n this.options = app.config.versioning ?? null\n }\n\n /** Whether versioning is enabled */\n get enabled(): boolean {\n return this.options !== null\n }\n\n /**\n * Resolve versioned paths for a base path.\n *\n * @param basePath - The base path (e.g., '/users')\n * @param version - Explicit version from controller/router config\n * @returns Array of versioned path strings (e.g., ['/v1/users', '/v2/users'])\n */\n resolve(basePath: string, version?: string | string[] | typeof VERSION_NEUTRAL): string[] {\n // Versioning disabled — return base path as-is\n if (!this.options) {\n return [basePath]\n }\n\n // VERSION_NEUTRAL — explicitly opt out of versioning\n if (version === VERSION_NEUTRAL) {\n return [basePath]\n }\n\n const prefix = this.options.prefix ?? 'v'\n\n // Explicit version(s) on the controller/router\n if (version !== undefined) {\n const versions = Array.isArray(version) ? version : [version]\n return versions.map(v => `/${prefix}${v}${basePath}`)\n }\n\n // No explicit version — apply defaultVersion if set\n if (this.options.defaultVersion !== undefined) {\n const defaults = Array.isArray(this.options.defaultVersion)\n ? this.options.defaultVersion\n : [this.options.defaultVersion]\n return defaults.map(v => `/${prefix}${v}${basePath}`)\n }\n\n // Versioning enabled but no version and no default — no prefix\n return [basePath]\n }\n}\n"],"mappings":";;;;;;AAgBO,IAAA,oBAAA,MAAM,kBAAkB;CAC7B;CAEA,YAAY,KAAiD;EAC3D,KAAK,UAAU,IAAI,OAAO,cAAc;CAC1C;;CAGA,IAAI,UAAmB;EACrB,OAAO,KAAK,YAAY;CAC1B;;;;;;;;CASA,QAAQ,UAAkB,SAAgE;EAExF,IAAI,CAAC,KAAK,SACR,OAAO,CAAC,QAAQ;EAIlB,IAAI,YAAY,iBACd,OAAO,CAAC,QAAQ;EAGlB,MAAM,SAAS,KAAK,QAAQ,UAAU;EAGtC,IAAI,YAAY,KAAA,GAEd,QADiB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAC5C,KAAI,MAAK,IAAI,SAAS,IAAI,UAAU;EAItD,IAAI,KAAK,QAAQ,mBAAmB,KAAA,GAIlC,QAHiB,MAAM,QAAQ,KAAK,QAAQ,cAAc,IACtD,KAAK,QAAQ,iBACb,CAAC,KAAK,QAAQ,cAAc,GAChB,KAAI,MAAK,IAAI,SAAS,IAAI,UAAU;EAItD,OAAO,CAAC,QAAQ;CAClB;AACF;gCAlDC,UAAU,GAAA,gBAAA,GAII,OAAO,UAAU,WAAW,CAAA,CAAA,GAAA,iBAAA"}
1
+ {"version":3,"file":"versioning.service-B4rtmgMQ.mjs","names":[],"sources":["../src/router/services/versioning.service.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport { DI_TOKENS } from '../../di/tokens'\nimport type { Application } from '../../application'\nimport { VERSION_NEUTRAL } from '../constants'\nimport type { VersioningOptions } from '../types'\n\n/**\n * Resolves version prefixes for route paths.\n *\n * Handles VERSION_NEUTRAL, multi-version arrays, default version fallback,\n * and configurable prefix (default: 'v').\n *\n * Registered as a singleton in the container.\n */\n@Singleton()\nexport class VersioningService {\n private readonly options: VersioningOptions | null\n\n constructor(@inject(DI_TOKENS.Application) app: Application) {\n this.options = app.config.versioning ?? null\n }\n\n /** Whether versioning is enabled */\n get enabled(): boolean {\n return this.options !== null\n }\n\n /**\n * Resolve versioned paths for a base path.\n *\n * @param basePath - The base path (e.g., '/users')\n * @param version - Explicit version from controller/router config\n * @returns Array of versioned path strings (e.g., ['/v1/users', '/v2/users'])\n */\n resolve(basePath: string, version?: string | string[] | typeof VERSION_NEUTRAL): string[] {\n // Versioning disabled — return base path as-is\n if (!this.options) {\n return [basePath]\n }\n\n // VERSION_NEUTRAL — explicitly opt out of versioning\n if (version === VERSION_NEUTRAL) {\n return [basePath]\n }\n\n const prefix = this.options.prefix ?? 'v'\n\n // Explicit version(s) on the controller/router\n if (version !== undefined) {\n const versions = Array.isArray(version) ? version : [version]\n return versions.map(v => `/${prefix}${v}${basePath}`)\n }\n\n // No explicit version — apply defaultVersion if set\n if (this.options.defaultVersion !== undefined) {\n const defaults = Array.isArray(this.options.defaultVersion)\n ? this.options.defaultVersion\n : [this.options.defaultVersion]\n return defaults.map(v => `/${prefix}${v}${basePath}`)\n }\n\n // Versioning enabled but no version and no default — no prefix\n return [basePath]\n }\n}\n"],"mappings":";;;;;;AAgBO,IAAA,oBAAA,MAAM,kBAAkB;CAC7B;CAEA,YAAY,KAAiD;EAC3D,KAAK,UAAU,IAAI,OAAO,cAAc;CAC1C;;CAGA,IAAI,UAAmB;EACrB,OAAO,KAAK,YAAY;CAC1B;;;;;;;;CASA,QAAQ,UAAkB,SAAgE;EAExF,IAAI,CAAC,KAAK,SACR,OAAO,CAAC,QAAQ;EAIlB,IAAI,YAAY,iBACd,OAAO,CAAC,QAAQ;EAGlB,MAAM,SAAS,KAAK,QAAQ,UAAU;EAGtC,IAAI,YAAY,KAAA,GAEd,QADiB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,GAC5C,KAAI,MAAK,IAAI,SAAS,IAAI,UAAU;EAItD,IAAI,KAAK,QAAQ,mBAAmB,KAAA,GAIlC,QAHiB,MAAM,QAAQ,KAAK,QAAQ,cAAc,IACtD,KAAK,QAAQ,iBACb,CAAC,KAAK,QAAQ,cAAc,GAChB,KAAI,MAAK,IAAI,SAAS,IAAI,UAAU;EAItD,OAAO,CAAC,QAAQ;CAClB;AACF;gCAlDC,UAAU,GAAA,gBAAA,GAII,OAAO,UAAU,WAAW,CAAA,CAAA,GAAA,iBAAA"}
@@ -1,4 +1,4 @@
1
- import { Dr as ApplicationError, Yn as ControllerOptions, nt as ContextQueryResult, or as RouterEnv, rt as RouterContext } from "../index-B_JoEl3V.mjs";
1
+ import { Dr as ApplicationError, Yn as ControllerOptions, nt as ContextQueryResult, or as RouterEnv, rt as RouterContext } from "../index-C_t8VVQD.mjs";
2
2
  import { t as Constructor } from "../types-CmV_9xBD.mjs";
3
3
  import { Context } from "hono";
4
4
  import { WSContext, WSContext as WSContext$1, WSEvents, WSMessageReceive, WSReadyState, WSReadyState as WSReadyState$1 } from "hono/ws";
@@ -1,2 +1,2 @@
1
- import { a as getWsOnCloseMethod, c as WebSocketError, i as OnMessage, l as Gateway, n as OnClose, o as getWsOnErrorMethod, r as OnError, s as getWsOnMessageMethod, t as GatewayContext, u as isGateway } from "../gateway-context-TMu_AlJt.mjs";
1
+ import { a as getWsOnCloseMethod, c as WebSocketError, i as OnMessage, l as Gateway, n as OnClose, o as getWsOnErrorMethod, r as OnError, s as getWsOnMessageMethod, t as GatewayContext, u as isGateway } from "../gateway-context-I0tKgGfh.mjs";
2
2
  export { Gateway, GatewayContext, OnClose, OnError, OnMessage, WebSocketError, getWsOnCloseMethod, getWsOnErrorMethod, getWsOnMessageMethod, isGateway };
@@ -1,4 +1,4 @@
1
- import { Y as Container } from "../index-B_JoEl3V.mjs";
1
+ import { Y as Container } from "../index-C_t8VVQD.mjs";
2
2
  import { t as StratalEnv } from "../env-ug22bJj7.mjs";
3
3
  import { DurableObject, WorkerEntrypoint, WorkflowEntrypoint } from "cloudflare:workers";
4
4
 
@@ -1,5 +1,5 @@
1
- import { r as DI_TOKENS } from "../di-DseMn-z9.mjs";
2
- import { t as Stratal } from "../stratal-DL9M38_s.mjs";
1
+ import { r as DI_TOKENS } from "../di-B0NXIdRF.mjs";
2
+ import { t as Stratal } from "../stratal-DtAj21uF.mjs";
3
3
  import { DurableObject, WorkerEntrypoint, WorkflowEntrypoint } from "cloudflare:workers";
4
4
  //#region src/workers/run-in-scope.ts
5
5
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stratal",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "A modular Cloudflare Workers framework with dependency injection, queue-based events, and type-safe configuration",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"version":3,"file":"di-DseMn-z9.mjs","names":["g"],"sources":["../src/router/router.tokens.ts","../src/di/container.error.ts","../src/di/conditional-binding-builder.ts","../src/di/types.ts","../src/di/decorators/inject-param.decorator.ts","../src/di/decorators/inject.decorator.ts","../src/di/decorators.ts","../src/di/lazy.ts","../src/di/tokens.ts","../src/di/container.ts"],"sourcesContent":["/**\n * Dependency injection tokens for the router system\n */\nexport const ROUTER_TOKENS = {\n /**\n * Token for RouterContext (request-scoped)\n * Contains Hono context wrapper with helper methods\n */\n RouterContext: Symbol.for('stratal:router:context'),\n\n /**\n * Token for RouteRegistry (singleton)\n * Central registry of all application routes — source of truth for route:list, route:types, URL generation\n */\n RouteRegistry: Symbol.for('stratal:router:route-registry'),\n\n /**\n * Token for VersioningService (singleton)\n * Resolves version prefixes for route paths\n */\n VersioningService: Symbol.for('stratal:router:versioning-service'),\n\n /**\n * Token for LocalePathService (singleton)\n * Resolves locale path variants and computes LocalePathConfig\n */\n LocalePathService: Symbol.for('stratal:router:locale-path-service'),\n\n /**\n * Token for LocaleUrlService (singleton)\n * Ergonomic wrapper around the pure locale-url helpers — applies, strips,\n * and tests locale prefixes against the resolved LocalePathService config.\n */\n LocaleUrlService: Symbol.for('stratal:router:locale-url-service'),\n\n /**\n * Token for RouterResolver (singleton, may be null)\n * Internal resolver that computes effective Router config per controller\n */\n RouterResolver: Symbol.for('stratal:router:router-resolver'),\n\n /**\n * Token for HonoApp (singleton)\n * The Hono application instance with Stratal-specific setup\n */\n HonoApp: Symbol.for('stratal:router:hono-app'),\n\n /**\n * Token for Uri (request-scoped)\n * URL generation service — route URLs, signed URLs, current/previous URL access\n */\n Uri: Symbol.for('stratal:router:uri'),\n} as const\n","import { ApplicationError } from '../errors/application-error';\n\nexport class ContainerError extends ApplicationError {\n}\n","import type { Container } from './container'\nimport { ContainerError } from './container.error'\nimport type { InjectionToken, WhenOptions } from './types'\nimport type { Constructor } from '../types'\n\nexport interface PredicateContainer {\n resolve<T>(token: InjectionToken<T>): T\n isRegistered<T>(token: InjectionToken<T>): boolean\n}\n\nexport interface ConditionalBindingBuilder {\n use<T extends object>(token: InjectionToken<T>): ConditionalBindingUse<T>\n}\n\nexport interface ConditionalBindingUse<T extends object> {\n give(implementation: Constructor<T>): ConditionalBindingGive<T>\n}\n\nexport interface ConditionalBindingGive<T extends object> {\n otherwise(implementation: Constructor<T>): void\n}\n\nexport class ConditionalBindingBuilderImpl implements ConditionalBindingBuilder {\n constructor(\n private readonly container: Container,\n private readonly predicate: (container: PredicateContainer) => boolean,\n private readonly options: WhenOptions,\n ) {}\n\n use<T extends object>(token: InjectionToken<T>): ConditionalBindingUse<T> {\n return new ConditionalBindingUseImpl<T>(\n this.container,\n this.predicate,\n this.options,\n token,\n )\n }\n}\n\nclass ConditionalBindingUseImpl<T extends object> implements ConditionalBindingUse<T> {\n constructor(\n private readonly container: Container,\n private readonly predicate: (container: PredicateContainer) => boolean,\n private readonly options: WhenOptions,\n private readonly token: InjectionToken<T>,\n ) {}\n\n give(trueImpl: Constructor<T>): ConditionalBindingGive<T> {\n this.registerConditional(trueImpl, undefined)\n\n return {\n otherwise: (falseImpl: Constructor<T>) => {\n this.registerConditional(trueImpl, falseImpl)\n },\n }\n }\n\n private registerConditional(trueImpl: Constructor<T>, falseImpl: Constructor<T> | undefined): void {\n const { predicate, container, options, token } = this\n let cachedResult: boolean | undefined\n\n // Register both implementations so the container can instantiate them\n container.register(trueImpl)\n if (falseImpl) container.register(falseImpl)\n\n container.registerFactory(token, (c) => {\n let result: boolean\n if (options.cache && cachedResult !== undefined) {\n result = cachedResult\n } else {\n result = predicate(c)\n if (options.cache) cachedResult = result\n }\n\n if (result) {\n return c.resolve(trueImpl as unknown as InjectionToken<T>)\n }\n\n if (falseImpl) {\n return c.resolve(falseImpl as unknown as InjectionToken<T>)\n }\n\n const tokenStr = typeof token === 'symbol'\n ? (token.description ?? 'unknown')\n : typeof token === 'function'\n ? token.name\n : typeof token === 'string'\n ? token\n : 'lazy'\n throw new ContainerError(`No fallback registered for conditional binding \"${tokenStr}\". Use .otherwise() or register a default implementation.`)\n })\n }\n}\n","import type { Constructor } from '../types'\nimport type { LazyToken } from './lazy'\n\nexport type InjectionToken<T = unknown> = Constructor<T> | string | symbol | LazyToken<T>\n\nexport enum Scope {\n Transient = 0,\n Singleton = 1,\n Request = 2,\n}\n\nexport interface WhenOptions {\n cache?: boolean\n}\n\nexport type ExtensionDecorator<T> = (service: T, container: ContainerLike) => T\n\nexport interface ContainerLike {\n resolve<T>(token: InjectionToken<T>): T\n}\n","import type { InjectionToken } from '../types'\nimport { defineMetadata, getMetadata } from '../metadata'\n\nexport const INJECT_PARAM_METADATA_KEY = Symbol.for('stratal:inject:param')\n\nexport interface ParamInjection {\n index: number\n token: InjectionToken\n}\n\nexport function InjectParam<T>(token: InjectionToken<T>): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (propertyKey === undefined) {\n throw new Error('@InjectParam can only be used on method parameters, not constructor parameters')\n }\n\n const existing = getMetadata<ParamInjection[]>(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? []\n existing.push({ index: parameterIndex, token })\n defineMetadata(INJECT_PARAM_METADATA_KEY, existing, target, propertyKey)\n }\n}\n\nexport function getMethodInjections(target: object, propertyKey: string | symbol): ParamInjection[] {\n const injections = getMetadata<ParamInjection[]>(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? []\n return injections.sort((a, b) => a.index - b.index)\n}\n","import type { InjectionToken } from '../types'\n\ninterface InjectionEntry {\n token: InjectionToken\n optional: boolean\n}\n\nconst INJECTION_TOKENS_KEY = Symbol.for('stratal:di:injection-tokens')\nconst g = globalThis as Record<symbol, unknown>\nconst INJECTION_TOKENS: WeakMap<object, Map<number, InjectionEntry>> =\n (g[INJECTION_TOKENS_KEY] as WeakMap<object, Map<number, InjectionEntry>>) ??\n (g[INJECTION_TOKENS_KEY] = new WeakMap<object, Map<number, InjectionEntry>>())\n\nexport function inject<T>(\n token: InjectionToken<T>,\n options?: { isOptional?: boolean },\n): ParameterDecorator {\n return (target: object, _propertyKey: string | symbol | undefined, parameterIndex: number) => {\n let params = INJECTION_TOKENS.get(target)\n if (!params) {\n params = new Map()\n INJECTION_TOKENS.set(target, params)\n }\n params.set(parameterIndex, { token, optional: options?.isOptional ?? false })\n }\n}\n\nexport function getInjectionTokens(target: object): Map<number, InjectionEntry> {\n const direct = INJECTION_TOKENS.get(target)\n if (direct && direct.size > 0) return direct\n\n let proto = Object.getPrototypeOf(target) as object | null\n while (proto !== null && proto !== Function.prototype) {\n const inherited = INJECTION_TOKENS.get(proto)\n if (inherited && inherited.size > 0) return inherited\n proto = Object.getPrototypeOf(proto) as object | null\n }\n\n return new Map<number, InjectionEntry>()\n}\n","import type { InjectionToken } from './types'\nimport { Scope } from './types'\n\nexport {\n InjectParam,\n getMethodInjections,\n type ParamInjection,\n INJECT_PARAM_METADATA_KEY,\n} from './decorators/inject-param.decorator'\n\nexport { inject, getInjectionTokens } from './decorators/inject.decorator'\n\ninterface ClassMetadata {\n scope: Scope\n token?: InjectionToken\n}\n\nconst CLASS_METADATA_KEY = Symbol.for('stratal:di:class-metadata')\nconst g = globalThis as Record<symbol, unknown>\nconst CLASS_METADATA: WeakMap<object, ClassMetadata> =\n (g[CLASS_METADATA_KEY] as WeakMap<object, ClassMetadata>) ??\n (g[CLASS_METADATA_KEY] = new WeakMap<object, ClassMetadata>())\n\nfunction scopeDecorator(scope: Scope) {\n return <T>(token?: InjectionToken<T>) =>\n <TFunction extends abstract new (...args: never[]) => unknown>(target: TFunction): TFunction => {\n CLASS_METADATA.set(target, { scope, token })\n return target\n }\n}\n\nexport const Singleton = scopeDecorator(Scope.Singleton)\nexport const Request = scopeDecorator(Scope.Request)\nexport const Transient = scopeDecorator(Scope.Transient)\n\nexport function getClassMetadata(target: object): ClassMetadata | undefined {\n const direct = CLASS_METADATA.get(target)\n if (direct) return direct\n\n let proto = Object.getPrototypeOf(target) as object | null\n while (proto !== null && proto !== Function.prototype) {\n const inherited = CLASS_METADATA.get(proto)\n if (inherited) return inherited\n proto = Object.getPrototypeOf(proto) as object | null\n }\n\n return undefined\n}\n","import type { Constructor } from '../types'\n\nconst LAZY_MARKER = Symbol.for('stratal:lazy')\n\nexport interface LazyToken<T = unknown> {\n [LAZY_MARKER]: true\n factory: () => Constructor<T>\n}\n\nexport function lazy<T>(factory: () => Constructor<T>): LazyToken<T> {\n return { [LAZY_MARKER]: true, factory } as LazyToken<T>\n}\n\nexport function isLazyToken(value: unknown): value is LazyToken {\n return typeof value === 'object' && value !== null && LAZY_MARKER in value\n}\n","/**\n * Token for the Container instance\n * Used for injecting the Container into services that need dynamic resolution\n */\nexport const CONTAINER_TOKEN = Symbol.for('stratal:di:container')\n\nexport const DI_TOKENS = {\n // Cloudflare\n CloudflareEnv: Symbol.for('stratal:cloudflare:env'),\n ExecutionContext: Symbol.for('stratal:execution:context'),\n\n // Infrastructure\n Container: CONTAINER_TOKEN,\n Application: Symbol.for('stratal:application'),\n ModuleRegistry: Symbol.for('stratal:module:registry'),\n LazyModuleLoader: Symbol.for('stratal:lazy-module-loader'),\n ExceptionHandler: Symbol.for('stratal:exception:handler'),\n Database: Symbol.for('stratal:database:service'),\n Queue: Symbol.for('stratal:queue:manager'),\n ConsumerRegistry: Symbol.for('stratal:consumer:registry'),\n Cron: Symbol.for('stratal:cron:manager'),\n EventRegistry: Symbol.for('stratal:event:registry'),\n Quarry: Symbol.for('stratal:quarry'),\n\n // Context\n /**\n * AuthContext: Use for services that need user authentication (userId).\n */\n AuthContext: Symbol.for('stratal:auth:context'),\n\n // Workers\n DurableObjectState: Symbol.for('stratal:durable:object:state'),\n DurableObjectId: Symbol.for('stratal:durable:object:id'),\n} as const\n\nexport type DIToken = typeof DI_TOKENS[keyof typeof DI_TOKENS]\n","import type { RouterContext } from '../router/router-context';\nimport { ROUTER_TOKENS } from '../router/router.tokens';\nimport type { Constructor } from '../types';\nimport { ConditionalBindingBuilderImpl, type ConditionalBindingBuilder, type PredicateContainer } from './conditional-binding-builder';\nimport { containerStorage } from './container-storage';\nimport { ContainerError } from './container.error';\nimport { getClassMetadata } from './decorators';\nimport { getInjectionTokens } from './decorators/inject.decorator';\nimport { isLazyToken, type LazyToken } from './lazy';\nimport { CONTAINER_TOKEN } from './tokens';\nimport { Scope, type ExtensionDecorator, type InjectionToken, type WhenOptions } from './types';\n\ninterface ClassRegistration {\n kind: 'class'\n useClass: Constructor\n scope: Scope\n}\n\ninterface LazyClassRegistration {\n kind: 'lazy'\n factory: () => Constructor\n}\n\ninterface ValueRegistration {\n kind: 'value'\n value: unknown\n}\n\ninterface FactoryRegistration {\n kind: 'factory'\n factory: (container: Container) => unknown\n}\n\ninterface AliasRegistration {\n kind: 'alias'\n target: InjectionToken\n}\n\ntype Registration = ClassRegistration | LazyClassRegistration | ValueRegistration | FactoryRegistration | AliasRegistration\n\nfunction tokenToString(token: InjectionToken): string {\n if (typeof token === 'symbol') return token.description ?? 'Symbol'\n if (typeof token === 'function') return token.name\n if (typeof token === 'object' && token !== null && 'factory' in token) return '(lazy)'\n return String(token)\n}\n\nexport interface ContainerOptions {\n parent?: Container\n isRequestScoped?: boolean\n}\n\nexport class Container {\n private readonly registrations = new Map<InjectionToken, Registration>()\n private readonly singletons = new Map<InjectionToken, unknown>()\n private readonly requestCache = new Map<InjectionToken, unknown>()\n private readonly requestCacheDeps = new Map<InjectionToken, Set<InjectionToken>>()\n /**\n * Classes currently being constructed, held on the root so it spans the\n * global ↔ request-scope boundary. Used to turn an otherwise-opaque stack\n * overflow on a circular dependency into a clear error naming the cycle.\n */\n private readonly resolutionStack: Constructor[] = []\n private readonly parent: Container | null\n private readonly isRequestScoped: boolean\n\n constructor(options: ContainerOptions = {}) {\n this.parent = options.parent ?? null\n this.isRequestScoped = options.isRequestScoped ?? false\n\n if (!this.isRequestScoped) {\n this.registrations.set(CONTAINER_TOKEN, { kind: 'value', value: this })\n }\n }\n\n // ── Registration ──────────────────────────────────────────────\n\n register<T extends object>(serviceClass: Constructor<T>): void\n register<T extends object>(token: InjectionToken<T>, serviceClassOrLazy: Constructor<T> | LazyToken<T>): void\n register<T extends object>(\n tokenOrClass: InjectionToken<T> | Constructor<T>,\n serviceClassOrLazy?: Constructor<T> | LazyToken<T>,\n ): void {\n if (serviceClassOrLazy !== undefined && isLazyToken(serviceClassOrLazy)) {\n const lazyToken = serviceClassOrLazy\n this.registrations.set(tokenOrClass, {\n kind: 'lazy',\n factory: lazyToken.factory,\n })\n return\n }\n\n let token: InjectionToken<T>\n let impl: Constructor<T>\n\n if (serviceClassOrLazy !== undefined) {\n token = tokenOrClass\n impl = serviceClassOrLazy\n } else {\n token = tokenOrClass as Constructor<T>\n impl = tokenOrClass as Constructor<T>\n }\n\n const meta = getClassMetadata(impl)\n const scope = meta?.scope ?? Scope.Transient\n const effectiveToken = (serviceClassOrLazy === undefined && meta?.token) ? meta.token : token\n\n this.registrations.set(effectiveToken, { kind: 'class', useClass: impl, scope })\n }\n\n registerSingleton<T extends object>(serviceClass: Constructor<T>): void\n registerSingleton<T extends object>(token: InjectionToken<T>, serviceClass: Constructor<T>): void\n registerSingleton<T extends object>(\n tokenOrClass: InjectionToken<T> | Constructor<T>,\n serviceClass?: Constructor<T>,\n ): void {\n const impl = serviceClass ?? tokenOrClass as Constructor<T>\n const meta = getClassMetadata(impl)\n const token = serviceClass !== undefined\n ? tokenOrClass\n : (meta?.token ?? tokenOrClass as Constructor<T>)\n this.registrations.set(token, { kind: 'class', useClass: impl, scope: Scope.Singleton })\n }\n\n registerValue<T>(token: InjectionToken<T>, value: T): void {\n this.registrations.set(token, { kind: 'value', value })\n if (this.isRequestScoped) {\n this.invalidateRequestCache(token)\n }\n }\n\n registerFactory<T>(token: InjectionToken<T>, factory: (container: Container) => T): void {\n this.registrations.set(token, { kind: 'factory', factory })\n }\n\n registerExisting<T>(alias: InjectionToken<T>, target: InjectionToken<T>): void {\n this.registrations.set(alias, { kind: 'alias', target })\n }\n\n // ── Resolution ────────────────────────────────────────────────\n\n resolve<T>(token: InjectionToken<T>): T {\n if (isLazyToken(token)) {\n const realToken = token.factory() as InjectionToken<T>\n return this.resolve(realToken)\n }\n\n // Check request cache (request-scoped containers)\n if (this.isRequestScoped && this.requestCache.has(token)) {\n return this.requestCache.get(token) as T\n }\n\n // Check local registrations first\n const reg = this.registrations.get(token)\n if (reg) return this.resolveRegistration(token, reg) as T\n\n // Check parent chain — request-scoped containers resolve locally to access request values\n if (this.parent) {\n const parentReg = this.parent.findRegistration(token)\n if (parentReg) {\n if (this.isRequestScoped) {\n return this.resolveRegistration(token, parentReg) as T\n }\n return this.parent.resolve(token)\n }\n }\n\n // Auto-resolve class constructors: any class with DI decorators can be\n // instantiated without explicit registration\n if (typeof token === 'function') {\n const meta = getClassMetadata(token)\n const scope = meta?.scope ?? Scope.Transient\n const classReg: ClassRegistration = { kind: 'class', useClass: token as unknown as Constructor, scope }\n this.getRoot().registrations.set(token, classReg)\n return this.resolveClass(token, classReg) as T\n }\n\n throw new ContainerError(`No provider for ${tokenToString(token)}. Did you forget to register it?`)\n }\n\n tryResolve<T>(token: InjectionToken<T>): T | undefined {\n const realToken = isLazyToken(token) ? (token.factory() as InjectionToken<T>) : token\n\n // Only \"nothing is registered\" yields undefined for an optional dependency.\n // A provider that exists but throws while constructing is a real error and\n // must surface — swallowing it would silently inject `undefined` and turn a\n // bug into a baffling downstream failure.\n if (!this.isResolvable(realToken)) return undefined\n return this.resolve(realToken)\n }\n\n isRegistered<T>(token: InjectionToken<T>): boolean {\n if (this.registrations.has(token)) return true\n return this.parent?.isRegistered(token) ?? false\n }\n\n /**\n * Whether a token has anything to resolve to: an explicit registration, or a\n * bare class constructor (auto-resolvable). Distinct from {@link isRegistered}\n * so {@link tryResolve} can tell \"no provider\" (→ undefined) apart from\n * \"provider exists but failed\" (→ rethrow).\n */\n private isResolvable(token: InjectionToken): boolean {\n return typeof token === 'function' || this.isRegistered(token)\n }\n\n // ── Conditional ───────────────────────────────────────────────\n\n when(\n predicate: (container: PredicateContainer) => boolean,\n options: WhenOptions = {},\n ): ConditionalBindingBuilder {\n return new ConditionalBindingBuilderImpl(this, predicate, options)\n }\n\n extend<T>(token: InjectionToken<T>, decorator: ExtensionDecorator<T>): void {\n const current = this.resolve<T>(token)\n const decorated = decorator(current, this)\n this.registerValue(token, decorated)\n }\n\n // ── Request Scope ─────────────────────────────────────────────\n\n async runInRequestScope<T>(\n routerContext: RouterContext,\n callback: (requestContainer: Container) => T | Promise<T>,\n ): Promise<T> {\n if (this.isRequestScoped) {\n throw new ContainerError('Cannot call runInRequestScope on a request-scoped container')\n }\n\n const requestContainer = this.createRequestScope(routerContext)\n return await containerStorage.run(requestContainer, () => callback(requestContainer))\n }\n\n createRequestScope(routerContext: RouterContext): Container {\n if (this.isRequestScoped) {\n throw new ContainerError('Cannot call createRequestScope on a request-scoped container')\n }\n\n const child = new Container({ parent: this, isRequestScoped: true })\n child.registerValue(ROUTER_TOKENS.RouterContext, routerContext)\n return child\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n dispose(): void {\n this.registrations.clear()\n this.singletons.clear()\n this.requestCache.clear()\n this.requestCacheDeps.clear()\n }\n\n // ── Internal ──────────────────────────────────────────────────\n\n /**\n * Transitive constructor dependency tokens of a class, with lazy tokens\n * unwrapped to the concrete token they resolve to. Recorded when a\n * request-scoped instance is cached so {@link invalidateRequestCache} can find\n * dependents.\n *\n * The walk follows class/alias registrations through transient intermediaries:\n * a cached service A that depends on a (non-cached) transient B which depends\n * on token C must still be invalidated when C is re-registered, even though B\n * itself is never cached. Value/factory/lazy providers are not traversed —\n * their dependencies aren't introspectable (factory) or would re-enter a\n * cycle (lazy). Over-collecting is safe: it only rebuilds extra request-scoped\n * instances, which is correct.\n */\n private collectDependencyTokens(Class: Constructor): Set<InjectionToken> {\n const deps = new Set<InjectionToken>()\n const visited = new Set<Constructor>()\n\n const walk = (cls: Constructor): void => {\n if (visited.has(cls)) return\n visited.add(cls)\n for (const { token } of getInjectionTokens(cls).values()) {\n const real = isLazyToken(token) ? token.factory() : token\n deps.add(real)\n const childClass = this.classForToken(real)\n if (childClass) walk(childClass)\n }\n }\n\n walk(Class)\n return deps\n }\n\n /** The implementing class for a token, following class/alias registrations. */\n private classForToken(token: InjectionToken): Constructor | undefined {\n const reg = this.findRegistration(token)\n if (reg) {\n if (reg.kind === 'class') return reg.useClass\n if (reg.kind === 'alias') return this.classForToken(reg.target)\n return undefined\n }\n // A bare constructor token that is auto-resolvable (carries DI metadata).\n if (typeof token === 'function' && getClassMetadata(token as Constructor)) {\n return token as unknown as Constructor\n }\n return undefined\n }\n\n /**\n * Evict a token from the request cache along with every cached request-scoped\n * instance that transitively depends on it. Re-registering a value must\n * rebuild its dependents (so they pick up the new value) while leaving\n * unrelated cached services intact.\n */\n private invalidateRequestCache(token: InjectionToken): void {\n const invalidated = new Set<InjectionToken>([token])\n\n let changed = true\n while (changed) {\n changed = false\n for (const [cachedToken, deps] of this.requestCacheDeps) {\n if (invalidated.has(cachedToken)) continue\n for (const dep of deps) {\n if (invalidated.has(dep)) {\n invalidated.add(cachedToken)\n changed = true\n break\n }\n }\n }\n }\n\n for (const t of invalidated) {\n this.requestCache.delete(t)\n this.requestCacheDeps.delete(t)\n }\n }\n\n private resolveRegistration(token: InjectionToken, reg: Registration): unknown {\n switch (reg.kind) {\n case 'value':\n return reg.value\n\n case 'alias':\n return this.resolve(reg.target)\n\n case 'factory':\n return reg.factory(this)\n\n case 'lazy': {\n const useClass = reg.factory()\n const scope = getClassMetadata(useClass)?.scope ?? Scope.Transient\n return this.resolveClass(token, { kind: 'class', useClass, scope })\n }\n\n case 'class':\n return this.resolveClass(token, reg)\n }\n }\n\n private resolveClass(token: InjectionToken, reg: ClassRegistration): unknown {\n const { useClass, scope } = reg\n\n // Singleton: check global cache (root or current)\n if (scope === Scope.Singleton) {\n const root = this.getRoot()\n if (root.singletons.has(token)) return root.singletons.get(token)\n // Always construct against the root container. Constructing against a\n // request-scoped child would let the singleton permanently capture that\n // one request's request-scoped dependencies (a captive dependency leaking\n // state across every later request on the isolate). Resolving a @Request\n // dependency from root instead throws the request-scope error below,\n // surfacing the illegal singleton→request dependency loudly.\n const instance = root.instantiate(useClass)\n root.singletons.set(token, instance)\n return instance\n }\n\n // Request: cache in the request-scoped container\n if (scope === Scope.Request) {\n if (!this.isRequestScoped) {\n throw new ContainerError(\n `Cannot resolve request-scoped provider ${tokenToString(token)} outside a request scope. ` +\n `Resolve it within an HTTP request, or via runInScope()/runInRequestScope() for queues, cron, and other non-HTTP entrypoints.`,\n )\n }\n if (this.requestCache.has(token)) return this.requestCache.get(token)\n const instance = this.instantiate(useClass)\n this.requestCache.set(token, instance)\n this.requestCacheDeps.set(token, this.collectDependencyTokens(useClass))\n return instance\n }\n\n // Transient: always new instance\n return this.instantiate(useClass)\n }\n\n private instantiate(Class: Constructor): unknown {\n const root = this.getRoot()\n\n // A class re-entering its own construction is a circular dependency. Detect\n // it and throw a clear error naming the cycle instead of recursing into a\n // stack overflow. `lazy()` only defers a forward *reference*, not\n // resolution, so it cannot break a true runtime cycle — the graph must be\n // refactored.\n if (root.resolutionStack.includes(Class)) {\n const cycle = [...root.resolutionStack, Class].map((c) => c.name).join(' → ')\n throw new ContainerError(\n `Circular dependency detected while constructing: ${cycle}. ` +\n `Break the cycle by extracting the shared dependency, or inject a provider/factory instead of the instance.`,\n )\n }\n\n root.resolutionStack.push(Class)\n try {\n const injections = getInjectionTokens(Class)\n\n // Without reflect-metadata there is no `design:paramtypes` fallback, so every\n // constructor dependency must carry an explicit @inject. A required parameter\n // with no entry would otherwise be silently injected as `undefined`; fail loud.\n if (injections.size === 0) {\n if (Class.length > 0) {\n throw new ContainerError(\n `${Class.name} has ${Class.length} required constructor parameter(s) but none are decorated with @inject. ` +\n `Every constructor dependency must be explicitly injected.`,\n )\n }\n return new Class()\n }\n\n const maxIndex = Math.max(...injections.keys())\n const args: unknown[] = new Array(maxIndex + 1)\n\n for (let index = 0; index <= maxIndex; index++) {\n const entry = injections.get(index)\n if (!entry) {\n throw new ContainerError(\n `${Class.name} is missing @inject on constructor parameter ${index}. ` +\n `Every constructor dependency must be explicitly injected.`,\n )\n }\n args[index] = entry.optional ? this.tryResolve(entry.token) : this.resolve(entry.token)\n }\n\n return new Class(...args)\n } finally {\n root.resolutionStack.pop()\n }\n }\n\n findRegistration(token: InjectionToken): Registration | undefined {\n const local = this.registrations.get(token)\n if (local) return local\n return this.parent?.findRegistration(token)\n }\n\n /**\n * The global (non-request-scoped) container at the top of the parent chain.\n * Lazy module loading registers providers here so singletons persist across\n * requests even when `load()` is called from within a request scope.\n */\n getRootContainer(): Container {\n return this.getRoot()\n }\n\n private getRoot(): Container {\n if (!this.parent) return this\n return this.parent.getRoot()\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events-BXJGZjpG.mjs","names":[],"sources":["../src/events/constants.ts","../src/events/decorators/listener.decorator.ts","../src/events/decorators/on.decorator.ts","../src/events/event-registry.ts","../src/events/events.module.ts"],"sourcesContent":["/**\n * Metadata keys for event listener decorators.\n *\n * Uses `Symbol.for()` (global symbol registry) so that both core and\n * framework packages can reference the same symbols without cross-imports.\n */\nexport const LISTENER_METADATA_KEYS = {\n IS_LISTENER: Symbol.for('stratal:listener'),\n EVENT_HANDLERS: Symbol.for('stratal:listener:handlers'),\n} as const\n","import { Transient } from '../../di/decorators'\nimport { defineMetadata, getMetadata } from '../../di/metadata'\nimport type { Constructor } from '../../types'\nimport { LISTENER_METADATA_KEYS } from '../constants'\n\n/**\n * Mark a class as an event listener.\n *\n * Applies `@Transient()` for DI and sets metadata so the module system\n * can auto-discover and wire listener handlers at bootstrap time.\n *\n * @example\n * ```typescript\n * @Listener()\n * export class UserCreatedListener {\n * @On('after.User.create')\n * async sendWelcomeEmail(context: EventContext<'after.User.create'>) {\n * // ...\n * }\n * }\n * ```\n */\nexport function Listener() {\n return function <T extends Constructor>(target: T) {\n Transient()(target)\n defineMetadata(LISTENER_METADATA_KEYS.IS_LISTENER, true, target)\n return target\n }\n}\n\n/**\n * Check if a class is decorated with `@Listener()`\n */\nexport function isListener(target: Constructor): boolean {\n return getMetadata(LISTENER_METADATA_KEYS.IS_LISTENER, target) === true\n}\n","import { defineMetadata, getMetadata } from '../../di/metadata'\nimport { LISTENER_METADATA_KEYS } from '../constants'\nimport type { EventName, EventOptions, ListenerHandlerMetadata } from '../types'\n\n/**\n * Register a method as an event handler within a `@Listener()` class.\n *\n * Accumulates handler metadata on the class so the framework can\n * auto-wire handlers with the EventRegistry at bootstrap time.\n *\n * @param event - Event name to listen for (fully typed with autocomplete)\n * @param options - Optional handler options (priority, blocking)\n *\n * @example\n * ```typescript\n * @Listener()\n * export class AuditListener {\n * @On('after.User.create')\n * async logCreate(context: EventContext<'after.User.create'>) { ... }\n *\n * @On('after.User.delete', { priority: 10 })\n * async logDelete(context: EventContext<'after.User.delete'>) { ... }\n * }\n * ```\n */\nexport function On<E extends EventName>(event: E, options?: EventOptions) {\n return function (\n target: object,\n propertyKey: string,\n _descriptor: PropertyDescriptor\n ) {\n const existingHandlers: ListenerHandlerMetadata[] =\n getMetadata<ListenerHandlerMetadata[]>(LISTENER_METADATA_KEYS.EVENT_HANDLERS, target.constructor) ?? []\n\n existingHandlers.push({\n methodName: propertyKey,\n event: event as string,\n options,\n })\n\n defineMetadata(\n LISTENER_METADATA_KEYS.EVENT_HANDLERS,\n existingHandlers,\n target.constructor\n )\n }\n}\n\n/**\n * Get all `@On()` handler metadata from a listener class\n */\nexport function getListenerHandlers(target: object): ListenerHandlerMetadata[] {\n const metadataTarget = typeof target === 'function' ? target : target.constructor\n return getMetadata<ListenerHandlerMetadata[]>(LISTENER_METADATA_KEYS.EVENT_HANDLERS, metadataTarget) ?? []\n}\n","import { inject } from '../di'\nimport { Singleton } from '../di/decorators'\nimport { DI_TOKENS } from '../di/tokens'\nimport { LOGGER_TOKENS, type LoggerService } from '../logger'\nimport type {\n EventContext,\n EventHandler,\n EventName,\n EventOptions,\n IEventRegistry,\n RegisteredHandler\n} from './types'\n\n@Singleton(DI_TOKENS.EventRegistry)\nexport class EventRegistry implements IEventRegistry {\n private handlers = new Map<string, RegisteredHandler[]>()\n\n constructor(\n @inject(DI_TOKENS.ExecutionContext) private readonly ctx: ExecutionContext,\n @inject(LOGGER_TOKENS.LoggerService) private readonly logger: LoggerService\n ) { }\n\n on<E extends EventName>(event: E, handler: EventHandler<E>, options?: EventOptions): void {\n const registered: RegisteredHandler = {\n handler: handler as EventHandler,\n priority: options?.priority ?? 0,\n blocking: options?.blocking\n }\n\n const existingHandlers = this.handlers.get(event) ?? []\n existingHandlers.push(registered)\n this.handlers.set(event, existingHandlers)\n\n this.logger.debug('Event handler registered', {\n event,\n priority: registered.priority,\n blocking: registered.blocking\n })\n }\n\n async emit<E extends EventName>(\n event: E,\n context?: Partial<EventContext<E>>\n ): Promise<void> {\n // Build full context with caller-provided fields\n const fullContext = {\n ...context\n } as EventContext<E>\n\n // Find matching handlers using pattern matching\n const matchingHandlers = this.findMatchingHandlers(event)\n\n if (matchingHandlers.length === 0) {\n return\n }\n\n // Sort by priority (higher first)\n const sortedHandlers = [...matchingHandlers].sort(\n (a, b) => b.priority - a.priority\n )\n\n // Determine if we should use waitUntil\n const shouldUseWaitUntil = this.shouldUseWaitUntil(event, sortedHandlers)\n\n // Execute handlers\n const promises = sortedHandlers.map((registered) =>\n this.executeHandler(registered.handler, fullContext, event)\n )\n\n if (shouldUseWaitUntil) {\n // Non-blocking: use ctx.waitUntil\n this.ctx.waitUntil(Promise.all(promises))\n } else {\n // Blocking: await all handlers\n await Promise.all(promises)\n }\n }\n\n off<E extends EventName>(event: E, handler: EventHandler<E>): void {\n const existingHandlers = this.handlers.get(event)\n if (!existingHandlers) return\n\n const filtered = existingHandlers.filter((h) => h.handler !== handler)\n if (filtered.length > 0) {\n this.handlers.set(event, filtered)\n } else {\n this.handlers.delete(event)\n }\n\n this.logger.debug('Event handler unregistered', { event })\n }\n\n once<E extends EventName>(event: E, handler: EventHandler<E>, options?: EventOptions): void {\n const wrappedHandler = (async (context: EventContext<E>) => {\n await handler(context)\n this.off(event, wrappedHandler)\n }) as EventHandler<E>\n\n this.on(event, wrappedHandler, options)\n }\n\n /**\n * Find all handlers matching the event using pattern matching.\n * Order: exact match -> model wildcard -> operation wildcard -> global wildcard\n */\n private findMatchingHandlers(event: string): RegisteredHandler[] {\n const handlers: RegisteredHandler[] = []\n\n const parts = event.split('.')\n\n if (parts.length === 3) {\n // Database event: \"phase.model.operation\"\n const [phase, model, operation] = parts\n\n // 1. Exact match: \"after.user.create\"\n handlers.push(...(this.handlers.get(event) ?? []))\n\n // 2. Model wildcard: \"after.user\"\n handlers.push(...(this.handlers.get(`${phase}.${model}`) ?? []))\n\n // 3. Operation wildcard: \"after.create\"\n handlers.push(...(this.handlers.get(`${phase}.${operation}`) ?? []))\n\n // 4. Global wildcard: \"after\"\n handlers.push(...(this.handlers.get(phase) ?? []))\n } else if (parts.length === 2) {\n // Could be wildcard like \"after.user\" or custom event like \"auth.verified\"\n handlers.push(...(this.handlers.get(event) ?? []))\n\n if (parts[0] === 'before' || parts[0] === 'after') {\n handlers.push(...(this.handlers.get(parts[0]) ?? []))\n }\n } else {\n handlers.push(...(this.handlers.get(event) ?? []))\n }\n\n return handlers\n }\n\n /**\n * Determine if we should use ctx.waitUntil (non-blocking) or await (blocking)\n */\n private shouldUseWaitUntil(\n event: string,\n handlers: RegisteredHandler[]\n ): boolean {\n const hasBlockingHandler = handlers.some((h) => h.blocking === true)\n if (hasBlockingHandler) return false\n\n const hasNonBlockingHandler = handlers.some((h) => h.blocking === false)\n if (hasNonBlockingHandler) return true\n\n const phase = event.split('.')[0]\n if (phase === 'before') return false\n if (phase === 'after') return true\n return false // Custom events block by default\n }\n\n /**\n * Execute a single handler with error isolation\n */\n private async executeHandler<E extends EventName>(\n handler: EventHandler,\n context: EventContext<E>,\n event: string\n ): Promise<void> {\n try {\n await handler(context as EventContext)\n } catch (error) {\n this.logger.error('Event handler error', {\n event,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n })\n }\n }\n}\n","import { DI_TOKENS } from '../di/tokens'\nimport { Module } from '../module/module.decorator'\nimport { EventRegistry } from './event-registry'\n\n/**\n * Registers the event registry (`DI_TOKENS.EventRegistry`).\n *\n * Lazy: loaded on demand via `LazyModuleLoader` — by the framework's\n * `DatabaseModule` (which needs it to wire DB event emission) and by the\n * application's event-listener trigger paths. Kept out of cold start for apps\n * that neither emit events nor use the database.\n */\n@Module({\n providers: [\n { provide: DI_TOKENS.EventRegistry, useClass: EventRegistry },\n ],\n})\nexport class EventsModule { }\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-B_JoEl3V.d.mts","names":[],"sources":["../src/errors/application-error.ts","../src/di/tokens.ts","../src/router/route-map.ts","../src/router/constants.ts","../src/router/types.ts","../src/execution-context.ts","../src/di/lazy.ts","../src/di/types.ts","../src/module/types.ts","../src/quarry/types.ts","../src/router/controller.ts","../src/router/middleware.interface.ts","../src/router/hono-app.ts","../src/router/services/locale-path.service.ts","../src/router/services/locale-url.service.ts","../src/router/router.internals.ts","../src/router/router.ts","../src/module/module-registry.ts","../src/router/services/versioning.service.ts","../src/router/route-registry.ts","../src/router/router-resolver.ts","../src/router/services/route-registration.service.ts","../src/router/router.tokens.ts","../src/router/route-url.ts","../src/router/locale-url.ts","../src/router/trailing-slash.ts","../src/router/utils/path.ts","../src/router/utils/route-name.ts","../src/router/middleware/middleware-chain.ts","../src/router/decorators/controller.decorator.ts","../src/router/decorators/http-method.decorator.ts","../src/router/decorators/route.decorator.ts","../src/router/schemas/common.schemas.ts","../src/router/middleware/domain.middleware.ts","../src/router/middleware/verify-signature.middleware.ts","../src/router/signed-url.ts","../src/router/router.error.ts","../src/router/errors/route-not-found.error.ts","../src/router/errors/schema-validation.error.ts","../src/router/errors/index.ts","../src/application.ts","../src/router/uri.ts","../src/router/router-context.ts","../src/di/conditional-binding-builder.ts","../src/di/container.ts","../src/di/container.error.ts","../src/di/decorators/inject-param.decorator.ts","../src/di/decorators/inject.decorator.ts","../src/di/decorators.ts","../src/di/metadata.ts","../src/di/container-storage.ts","../src/errors/error-response.ts","../src/errors/exception-context.ts","../src/errors/exception-handler.types.ts","../src/errors/exception-handler.ts","../src/errors/default-exception-handler.ts","../src/errors/http-exception.ts","../src/errors/internal-error.ts","../src/errors/is-application-error.ts","../src/errors/container-not-initialized.error.ts","../src/errors/stratal-not-initialized.error.ts","../src/errors/database.error.ts","../src/errors/auth.error.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stratal-DL9M38_s.mjs","names":[],"sources":["../src/application.ts","../src/stratal.ts"],"sourcesContent":["import type { CronJob } from './cron/cron-job'\nimport type { CronManager } from './cron/cron-manager'\nimport { Container } from './di/container'\nimport { containerStorage, getContainer, runWithContainer } from './di/container-storage'\nimport { DI_TOKENS } from './di/tokens'\nimport { type StratalEnv } from './env'\nimport { DefaultExceptionHandler } from './errors/default-exception-handler'\nimport { createCliExceptionContext, createCronExceptionContext, createQueueExceptionContext } from './errors/exception-context'\nimport type { ExceptionHandler } from './errors/exception-handler'\nimport type { EventHandler, EventRegistry } from './events'\nimport { getListenerHandlers } from './events'\nimport type { StratalExecutionContext } from './execution-context'\nimport { JsonFormatter, LOGGER_TOKENS, LoggerService, LogLevel, PrettyFormatter } from './logger'\nimport { LazyModuleLoader } from './module/lazy-module-loader'\nimport { ModuleRegistry } from './module/module-registry'\nimport type { DynamicModule, ModuleClass } from './module/types'\nimport type { Command } from './quarry/command'\nimport type { QuarryRegistry } from './quarry/quarry-registry'\nimport type { CommandInput, CommandResult } from './quarry/types'\nimport type { ConsumerRegistry } from './queue/consumer-registry'\nimport type { IQueueConsumer, QueueMessage } from './queue/queue-consumer'\nimport type { QueueManager } from './queue/queue-manager'\nimport type { RouterContext } from './router'\nimport type { HonoApp } from './router/hono-app'\nimport { ROUTER_TOKENS } from './router/router.tokens'\nimport type { TrailingSlashMode, VersioningOptions } from './router/types'\nimport type { Seeder } from './seeder/seeder'\nimport { SEEDER_TOKENS } from './seeder/seeder-registry'\nimport type { SeederRegistry } from './seeder/seeder-registry'\nimport type { Constructor } from './types'\n\nexport interface ApplicationConfig {\n module: ModuleClass | DynamicModule\n logging?: {\n level?: LogLevel\n formatter?: 'json' | 'pretty'\n }\n versioning?: VersioningOptions\n trailingSlash?: TrailingSlashMode\n exceptionHandler?: Constructor<ExceptionHandler>\n}\n\nexport interface ApplicationOptions extends ApplicationConfig {\n env: StratalEnv\n ctx: StratalExecutionContext\n}\n\nexport class Application {\n private _container: Container\n private honoApp!: HonoApp\n private moduleRegistry: ModuleRegistry\n private consumerRegistry!: ConsumerRegistry\n private cronManager?: CronManager\n private quarry!: QuarryRegistry\n private initialized = false\n\n // Independently memoized lazy-init promises — each built-in subsystem is\n // loaded on demand at its trigger point to keep cold start lean.\n private routingInitPromise: Promise<void> | null = null\n private eventsInitPromise: Promise<void> | null = null\n private queueInitPromise: Promise<void> | null = null\n private i18nInitPromise: Promise<void> | null = null\n private cronInitPromise: Promise<void> | null = null\n\n readonly env: StratalEnv\n private readonly appConfig: ApplicationConfig\n\n constructor({ env, ctx, ...config }: ApplicationOptions) {\n this.env = env\n this.appConfig = config\n\n this._container = new Container()\n\n this._container.registerValue(DI_TOKENS.Application, this)\n this._container.registerValue(DI_TOKENS.CloudflareEnv, env)\n this._container.registerValue(DI_TOKENS.ExecutionContext, ctx)\n this._container.registerValue(ROUTER_TOKENS.RouterContext, null)\n\n this.registerLoggerService()\n this.registerCoreServices()\n\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n this.moduleRegistry = new ModuleRegistry(this._container, logger)\n\n this._container.registerValue(DI_TOKENS.ModuleRegistry, this.moduleRegistry)\n }\n\n get container(): Container {\n return this._container\n }\n\n async ensureHono(): Promise<HonoApp> {\n await this.initializeRouting()\n return this.honoApp\n }\n\n get config(): ApplicationConfig {\n return this.appConfig\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return\n }\n\n await runWithContainer(this._container, () => this.initializeInternal())\n }\n\n private async initializeInternal(): Promise<void> {\n // Eager subsystem modules — Quarry/Seeder are resolved synchronously\n // post-init (CLI runner, test harness), so they must be registered before\n // initialize() completes. Dynamic import keeps application.ts free of static\n // subsystem imports (uniform with the other built-ins). They load at boot\n // regardless, so this is for consistency, not cold-start deferral.\n const [{ QuarryModule }, { SeederModule }] = await Promise.all([\n import('./quarry/quarry.module'),\n import('./seeder/seeder.module'),\n ])\n this.moduleRegistry.registerAll([QuarryModule, SeederModule])\n\n // Register the user's root module (traverses imports). Other built-in\n // subsystems (i18n, queue, cache, openapi, cron, events, router) load on\n // demand at their trigger points.\n this.moduleRegistry.register(this.appConfig.module)\n\n // Initialize all modules (only those with lifecycle hooks)\n await this.moduleRegistry.initialize()\n\n // Initialize ExceptionHandler\n this.initializeExceptionHandler()\n\n // Register CLI commands + seeders (class refs only; no instantiation)\n this.registerCommands()\n this.registerSeeders()\n\n // Wire event listeners as part of initialization whenever the application\n // declares any, so emitted events reach their handlers regardless of which\n // entry point drives the app. Listener wiring otherwise happens lazily only\n // on the HTTP router (`initializeRouting`) and queue/scheduled/command\n // (`ensureScopedHandlers`) paths; any code that emits events without going\n // through one of those — a direct service or repository call, an RPC\n // entrypoint, or a Durable Object — would dispatch into a registry with no\n // handlers attached, silently dropping the event. Guarded on there being\n // listeners so applications with none still skip loading the events\n // subsystem; `initializeEventListeners` dedups, so any later lazy trigger\n // becomes a no-op.\n if (this.moduleRegistry.getAllListeners().length > 0) {\n await this.initializeEventListeners()\n }\n\n // Cron only loads when the app actually declares scheduled jobs\n if (this.moduleRegistry.getAllJobs().length > 0) {\n await this.ensureCron()\n }\n\n this.initialized = true\n }\n\n private async registerRoutingServices(): Promise<void> {\n const [\n { HonoApp },\n { RouteRegistry },\n { RouterResolver },\n { VersioningService },\n { LocalePathService },\n { LocaleUrlService },\n { RouteRegistrationService },\n { Uri },\n ] = await Promise.all([\n import('./router/hono-app'),\n import('./router/route-registry'),\n import('./router/router-resolver'),\n import('./router/services/versioning.service'),\n import('./router/services/locale-path.service'),\n import('./router/services/locale-url.service'),\n import('./router/services/route-registration.service'),\n import('./router/uri'),\n ])\n\n this._container.register(ROUTER_TOKENS.VersioningService, VersioningService)\n this._container.register(ROUTER_TOKENS.HonoApp, HonoApp)\n this._container.register(ROUTER_TOKENS.LocalePathService, LocalePathService)\n this._container.register(ROUTER_TOKENS.LocaleUrlService, LocaleUrlService)\n this._container.register(ROUTER_TOKENS.RouteRegistry, RouteRegistry)\n this._container.register(ROUTER_TOKENS.Uri, Uri)\n\n const routerConfigs = this.moduleRegistry.getAllRouterConfigs()\n if (routerConfigs.length > 0) {\n this._container.registerValue(ROUTER_TOKENS.RouterResolver, new RouterResolver(routerConfigs))\n }\n\n this._container.register(RouteRegistrationService, RouteRegistrationService)\n }\n\n /**\n * Load the events subsystem and wire listeners. Needed by the HTTP, queue,\n * and scheduled paths (handlers emit events). Independent of the queue\n * subsystem so HTTP-only apps never load queue code. EventsModule is\n * registered before the (possibly empty) listener wiring so `emit()` works\n * even with zero listeners; dedups against the framework's own load.\n */\n private initializeEventListeners(): Promise<void> {\n this.eventsInitPromise ??= runWithContainer(this._container, async () => {\n const { EventsModule } = await import('./events/events.module')\n await this.moduleRegistry.registerLazy(EventsModule)\n this.registerEventListeners()\n })\n return this.eventsInitPromise\n }\n\n /**\n * Wire event and queue handlers for any non-HTTP request scope — queue\n * batches, scheduled/cron runs, CLI commands, Durable Objects, Workflows,\n * WorkerEntrypoints — all of which may emit events or dispatch to queues from\n * arbitrary user code. This is the single source of truth for that wiring:\n * every non-HTTP entry point routes through it rather than open-coding which\n * subsystems to init, so a subsystem can't be silently dropped by a future\n * refactor (the queue half was once lost from the command path that way).\n *\n * HTTP (`fetch`) deliberately does NOT use this: a fetch worker only enqueues\n * to the async Cloudflare queue and never processes consumers inline, so it\n * skips queue init via `initializeRouting`.\n */\n async ensureScopedHandlers(): Promise<void> {\n await this.initializeEventListeners()\n await this.initializeQueue()\n }\n\n /**\n * Load the queue subsystem on demand (first queue/scheduled trigger). i18n is\n * ensured first because the queue registry depends on it.\n */\n private initializeQueue(): Promise<void> {\n this.queueInitPromise ??= runWithContainer(this._container, async () => {\n await this.ensureI18n()\n const { QueueModule } = await import('./queue/queue.module')\n this.moduleRegistry.register(QueueModule as unknown as ModuleClass)\n this.consumerRegistry = this._container.resolve<ConsumerRegistry>(DI_TOKENS.ConsumerRegistry)\n await this.registerQueueConsumers()\n })\n return this.queueInitPromise\n }\n\n /**\n * Load i18n on demand. Coupled to the request path (Zod validation error maps,\n * OpenAPI descriptions, queue registry), so it loads before routing/queue\n * handling. Uses `registerLazy` because I18nModule has an `onInitialize` hook\n * (configures the Zod error map). Dedups if the app already imported i18n.\n */\n private ensureI18n(): Promise<void> {\n this.i18nInitPromise ??= runWithContainer(this._container, async () => {\n const { I18nModule } = await import('./i18n/i18n.module')\n await this.moduleRegistry.registerLazy(I18nModule as unknown as ModuleClass)\n })\n return this.i18nInitPromise\n }\n\n /**\n * Load the cron subsystem on demand (first scheduled trigger, or at bootstrap\n * when the app declares jobs).\n */\n private ensureCron(): Promise<CronManager> {\n this.cronInitPromise ??= runWithContainer(this._container, async () => {\n const { CronModule } = await import('./cron/cron.module')\n this.moduleRegistry.register(CronModule)\n this.cronManager = this._container.resolve<CronManager>(DI_TOKENS.Cron)\n this.registerCronJobs(this.cronManager)\n })\n return this.cronInitPromise.then(() => this.cronManager!)\n }\n\n resolve<T>(token: symbol): T {\n try {\n return this._container.resolve(token)\n } catch (error) {\n const handler = this._container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n const ctx = createCliExceptionContext('resolve')\n void handler.handle(error, ctx)\n throw error\n }\n }\n\n async handleQueue(batch: MessageBatch, queueName: string): Promise<void> {\n await this.ensureScopedHandlers()\n\n const firstMessage = batch.messages[0]?.body as QueueMessage | undefined\n const locale = firstMessage?.metadata?.locale ?? 'en'\n const mockRouterContext = this.createMockRouterContext(locale)\n\n await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {\n try {\n const queueManager = requestContainer.resolve<QueueManager>(DI_TOKENS.Queue)\n await queueManager.processBatch(queueName, batch)\n } catch (error) {\n const handler = requestContainer.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n await handler.handle(error, createQueueExceptionContext(queueName))\n throw error\n }\n })\n }\n\n async handleScheduled(controller: ScheduledController): Promise<void> {\n const cronManager = await this.ensureCron()\n // A scheduled job is a non-HTTP scope that can emit events and dispatch to\n // queues (timeout/reminder/digest emails) — wire both so dispatches aren't\n // silently dropped by the sync provider. i18n is ensured independently for\n // the job execution context. All inits are memoized, so this is idempotent.\n await this.ensureScopedHandlers()\n await this.ensureI18n()\n\n const mockRouterContext = this.createMockRouterContext('en')\n\n await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {\n try {\n await cronManager.executeScheduled(controller, requestContainer)\n } catch (error) {\n const handler = requestContainer.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n await handler.handle(error, createCronExceptionContext())\n throw error\n }\n })\n }\n\n createMockRouterContext(locale = 'en'): RouterContext {\n return {\n getLocale: () => locale,\n setLocale: () => { /* no-op */ },\n // Inside runInRequestScope the active container is the request-scoped child\n // (set in AsyncLocalStorage); return it so request-scoped providers resolve\n // against the scope, not the global container.\n getContainer: () => containerStorage.getStore() ?? this._container,\n } as unknown as RouterContext\n }\n\n async shutdown(): Promise<void> {\n if (!this.initialized) return\n this.initialized = false\n\n await this.moduleRegistry.shutdown()\n\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n logger.info('Disposing container...')\n\n this._container.dispose()\n }\n\n async handleCommand(name: string, input?: CommandInput): Promise<CommandResult> {\n // Routing first: commands generate URLs via route() (e.g. tenant:bootstrap\n // prints tenant URLs / builds email links).\n await this.initializeRouting()\n // A CLI command is a non-HTTP scope that can dispatch to queues and emit\n // events from arbitrary user code (e.g. tenant:bootstrap → email.send /\n // tenant.geo.seed). Without this the dev/CLI sync provider finds zero\n // consumers and silently drops every dispatched message. All inits are\n // memoized, so the events half (already wired by routing) is a no-op here.\n await this.ensureScopedHandlers()\n // Resolve QuarryRegistry lazily (deferred from bootstrap)\n this.quarry ??= this._container.resolve<QuarryRegistry>(DI_TOKENS.Quarry)\n const mockContext = this.createMockRouterContext('en')\n return this._container.runInRequestScope(mockContext, async () => {\n return this.quarry.call(name, input)\n })\n }\n\n private initializeRouting(): Promise<void> {\n this.routingInitPromise ??= runWithContainer(this._container, async () => {\n await this.initializeEventListeners()\n await this.ensureI18n()\n const { OpenAPIModule } = await import('./openapi')\n this.moduleRegistry.register(OpenAPIModule as unknown as ModuleClass)\n await this.registerRoutingServices()\n this.honoApp = this._container.resolve<HonoApp>(ROUTER_TOKENS.HonoApp)\n await this.honoApp.configure()\n })\n return this.routingInitPromise\n }\n\n private registerCommands(): void {\n this.quarry ??= this._container.resolve<QuarryRegistry>(DI_TOKENS.Quarry)\n const commands = this.moduleRegistry.getAllCommands()\n for (const CommandClass of commands) {\n this.quarry.register(CommandClass as Constructor<Command>)\n }\n }\n\n private registerSeeders(): void {\n const seeders = this.moduleRegistry.getAllSeeders()\n if (seeders.length === 0) return\n const registry = this._container.resolve<SeederRegistry>(SEEDER_TOKENS.SeederRegistry)\n for (const SeederClass of seeders) {\n registry.register(SeederClass as Constructor<Seeder>)\n }\n }\n\n private async registerQueueConsumers(): Promise<void> {\n const consumerClasses = this.moduleRegistry.getAllConsumers()\n if (consumerClasses.length === 0) return\n\n // Consumers are resolved fresh per message at dispatch time (see\n // QueueManager / SyncQueueProvider). Here we only need each consumer's\n // declared message types; read them from a throwaway instance built inside a\n // request scope so a consumer that injects request-scoped providers\n // (@InjectQueue, i18n, auth context, …) doesn't fail to instantiate at boot.\n const mockContext = this.createMockRouterContext('en')\n await this._container.runInRequestScope(mockContext, (requestContainer) => {\n for (const ConsumerClass of consumerClasses) {\n const consumer = requestContainer.resolve(ConsumerClass) as IQueueConsumer\n this.consumerRegistry.register(\n ConsumerClass as Constructor<IQueueConsumer>,\n consumer.messageTypes,\n )\n }\n })\n }\n\n private registerCronJobs(cronManager: CronManager): void {\n for (const JobClass of this.moduleRegistry.getAllJobs()) {\n const schedule = (JobClass as unknown as { schedule: string }).schedule\n if (schedule) {\n cronManager.registerJob(schedule, JobClass as Constructor<CronJob>)\n } else {\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n logger.warn(`Cron job \"${JobClass.name}\" has no static schedule property — skipped`)\n }\n }\n }\n\n private registerEventListeners(): void {\n const listeners = this.moduleRegistry.getAllListeners()\n if (listeners.length === 0) {\n return\n }\n\n const eventRegistry = this._container.resolve<EventRegistry>(DI_TOKENS.EventRegistry)\n\n for (const ListenerClass of listeners) {\n const handlers = getListenerHandlers(ListenerClass)\n\n for (const { methodName, event, options } of handlers) {\n // Resolve the listener fresh per event from the active scope (events are\n // emitted inside an HTTP request or runInScope), so request-scoped\n // listener dependencies bind to the emitting request rather than being\n // frozen at boot. Listener metadata is read from the class statically —\n // no instance is created until an event actually fires.\n const handler: EventHandler = ((...args: unknown[]) => {\n const instance = getContainer().resolve(ListenerClass) as Record<\n string,\n (...a: unknown[]) => unknown\n >\n return instance[methodName](...args)\n }) as EventHandler\n\n eventRegistry.on(event, handler, options)\n }\n }\n }\n\n private registerLoggerService(): void {\n const logLevel = this.appConfig.logging?.level ?? LogLevel.INFO\n const formatter = this.appConfig.logging?.formatter ?? 'json'\n\n this._container.registerValue(LOGGER_TOKENS.LogLevelOptions, logLevel)\n\n this._container\n .when(() => formatter === 'pretty')\n .use(LOGGER_TOKENS.Formatter)\n .give(PrettyFormatter)\n .otherwise(JsonFormatter)\n\n this._container.registerSingleton(LOGGER_TOKENS.LoggerService, LoggerService)\n }\n\n /**\n * Bootstrap kernel — registered imperatively because they cannot be expressed\n * as ordinary module providers: ExceptionHandler is a user-overridable forced\n * singleton (a module ClassProvider derives scope from the class decorator,\n * which a user handler may not carry), and LazyModuleLoader is the loader\n * itself. Subsystem registries (events/cron/quarry/seeder) are modules.\n */\n private registerCoreServices(): void {\n this._container.registerSingleton(\n DI_TOKENS.ExceptionHandler,\n (this.appConfig.exceptionHandler ?? DefaultExceptionHandler) as Constructor,\n )\n this._container.registerSingleton(DI_TOKENS.LazyModuleLoader, LazyModuleLoader)\n }\n\n private initializeExceptionHandler(): void {\n const handler = this._container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n handler.register()\n this.moduleRegistry.configureExceptionHandlers(handler)\n }\n}\n","import { Application, type ApplicationConfig } from './application'\nimport type { StratalEnv } from './env'\nimport { StratalNotInitializedError } from './errors'\nimport type { HonoApp } from './router/hono-app'\n\n/**\n * Stratal — Hono-style entry point for Cloudflare Workers.\n *\n * Eagerly bootstraps the Application at construction time, dynamically\n * importing `cloudflare:workers` for env and waitUntil.\n *\n * @example\n * ```typescript\n * import { Stratal } from 'stratal'\n * import { AppModule } from './app.module'\n *\n * export default new Stratal({ module: AppModule })\n * ```\n */\nexport class Stratal<Env extends StratalEnv = StratalEnv> {\n private app: Application | null = null\n private initPromise: Promise<Application>\n\n private static _application: Promise<Application> | null = null\n private static _generation = 0\n private static _previousInstance: Stratal | null = null\n\n constructor(config: ApplicationConfig) {\n this.fetch = this.fetch.bind(this)\n this.queue = this.queue.bind(this)\n this.scheduled = this.scheduled.bind(this)\n\n // Invalidate any in-flight initialization from a previous instance (Vite HMR reload)\n const generation = ++Stratal._generation\n\n if (Stratal._previousInstance) {\n void Stratal._previousInstance.shutdown()\n }\n Stratal._previousInstance = this\n\n this.initPromise = this.prepareApp(config, generation)\n Stratal._application = this.initPromise\n }\n\n async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {\n const app = await this.ensureReady()\n const hono = await app.ensureHono()\n return hono.fetch(request, env, ctx)\n }\n\n async queue(batch: MessageBatch): Promise<void> {\n const app = await this.ensureReady()\n return app.handleQueue(batch, batch.queue)\n }\n\n async scheduled(controller: ScheduledController): Promise<void> {\n const app = await this.ensureReady()\n return app.handleScheduled(controller)\n }\n\n get hono(): Promise<HonoApp> {\n return this.initPromise.then(app => app.ensureHono())\n }\n\n async shutdown(): Promise<void> {\n try { this.app = await this.initPromise } catch { /* ignore */ }\n if (this.app) {\n await this.app.shutdown()\n this.app = null\n }\n }\n\n /**\n * @internal\n * Resolves the Application instance from the static singleton.\n * Used by worker base classes (DurableObject, Workflow, WorkerEntrypoint)\n * to access the DI container without going through Cloudflare RPC.\n */\n static resolveApplication(): Promise<Application> {\n if (!Stratal._application) {\n throw new StratalNotInitializedError()\n }\n return Stratal._application\n }\n\n private async ensureReady(): Promise<Application> {\n this.app ??= await this.initPromise;\n return this.app\n }\n\n private async prepareApp(config: ApplicationConfig, generation: number): Promise<Application> {\n const { env, waitUntil } = await import('cloudflare:workers')\n\n // After async import, check if a newer instance has replaced us (Vite HMR reload)\n if (generation !== Stratal._generation) {\n return new Promise<Application>(() => {\n //\n }) // Never resolves — avoids cross-request promise warning\n }\n\n const app = new Application({ ...config, env: env as Env, ctx: { waitUntil } })\n await app.initialize()\n\n // Check again after initialization completes\n if (generation !== Stratal._generation) {\n await app.shutdown()\n return new Promise<Application>(() => {\n //\n })\n }\n\n return app\n }\n}\n"],"mappings":"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"}