@haskou/ddd-kernel 3.0.0 → 4.0.0

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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/{RetryPredicate-Cch9NXV3.d.ts → RetryPredicate-BR91-irp.d.ts} +4 -6
  3. package/dist/{RetryPredicate-cPJPlGbJ.d.cts → RetryPredicate-Drg7hU3-.d.cts} +4 -6
  4. package/dist/{ServiceClass-Bj3G71L8.d.ts → ServiceClass-C-ZCUQWE.d.ts} +1 -1
  5. package/dist/{ServiceClass-nnDgfgdL.d.cts → ServiceClass-U0Vk46dN.d.cts} +1 -1
  6. package/dist/{ShutdownHook-Cx1Rc40s.d.ts → ShutdownHook-BCQgEMUI.d.ts} +1 -1
  7. package/dist/{ShutdownHook-Ho-CeLu8.d.cts → ShutdownHook-CCtg4Ypg.d.cts} +1 -1
  8. package/dist/adapters/index.cjs +27 -34
  9. package/dist/adapters/index.cjs.map +1 -1
  10. package/dist/adapters/index.d.cts +3 -3
  11. package/dist/adapters/index.d.ts +3 -3
  12. package/dist/adapters/index.js +27 -34
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/adapters/pubsub/amqp/index.cjs +22 -6
  15. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  16. package/dist/adapters/pubsub/amqp/index.js +22 -6
  17. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  18. package/dist/adapters/pubsub/index.cjs +27 -28
  19. package/dist/adapters/pubsub/index.cjs.map +1 -1
  20. package/dist/adapters/pubsub/index.d.cts +3 -6
  21. package/dist/adapters/pubsub/index.d.ts +3 -6
  22. package/dist/adapters/pubsub/index.js +27 -28
  23. package/dist/adapters/pubsub/index.js.map +1 -1
  24. package/dist/adapters/ui/express/index.cjs +0 -6
  25. package/dist/adapters/ui/express/index.cjs.map +1 -1
  26. package/dist/adapters/ui/express/index.d.cts +2 -12
  27. package/dist/adapters/ui/express/index.d.ts +2 -12
  28. package/dist/adapters/ui/express/index.js +0 -6
  29. package/dist/adapters/ui/express/index.js.map +1 -1
  30. package/dist/adapters/ui/index.cjs +22 -12
  31. package/dist/adapters/ui/index.cjs.map +1 -1
  32. package/dist/adapters/ui/index.d.cts +2 -2
  33. package/dist/adapters/ui/index.d.ts +2 -2
  34. package/dist/adapters/ui/index.js +22 -12
  35. package/dist/adapters/ui/index.js.map +1 -1
  36. package/dist/adapters/ui/routes/index.cjs +22 -6
  37. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  38. package/dist/adapters/ui/routes/index.js +22 -6
  39. package/dist/adapters/ui/routes/index.js.map +1 -1
  40. package/dist/contracts/index.d.cts +3 -3
  41. package/dist/contracts/index.d.ts +3 -3
  42. package/dist/contracts/kernel/index.d.cts +3 -3
  43. package/dist/contracts/kernel/index.d.ts +3 -3
  44. package/dist/index.cjs +22 -6
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +3 -3
  47. package/dist/index.d.ts +3 -3
  48. package/dist/index.js +22 -6
  49. package/dist/index.js.map +1 -1
  50. package/dist/infrastructure/dependency-injection/index.cjs +22 -6
  51. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
  52. package/dist/infrastructure/dependency-injection/index.d.cts +6 -2
  53. package/dist/infrastructure/dependency-injection/index.d.ts +6 -2
  54. package/dist/infrastructure/dependency-injection/index.js +22 -6
  55. package/dist/infrastructure/dependency-injection/index.js.map +1 -1
  56. package/dist/infrastructure/express/index.cjs +0 -6
  57. package/dist/infrastructure/express/index.cjs.map +1 -1
  58. package/dist/infrastructure/express/index.d.cts +2 -2
  59. package/dist/infrastructure/express/index.d.ts +2 -2
  60. package/dist/infrastructure/express/index.js +0 -6
  61. package/dist/infrastructure/express/index.js.map +1 -1
  62. package/dist/infrastructure/scheduler/index.cjs +22 -6
  63. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  64. package/dist/infrastructure/scheduler/index.js +22 -6
  65. package/dist/infrastructure/scheduler/index.js.map +1 -1
  66. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/infrastructure/express/index.ts","../../../src/adapters/ui/express/ExpressControllerResolver.ts","../../../src/adapters/ui/express/ExpressKernelServer.ts","../../../src/adapters/ui/express/HttpErrorHandler.ts","../../../src/contracts/ui/HttpRouteStatusEnum.ts","../../../src/adapters/ui/express/RoutePrefix.ts"],"sourcesContent":["export * from '../../adapters/ui/express/index.js';\n","import type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\n\nexport class ExpressControllerResolver {\n private readonly controllerInstances = new Map<ExpressController, unknown>();\n\n private readonly controllers: Set<ExpressController>;\n\n constructor(\n private readonly kernel: ExpressKernelServerOptions['kernel'],\n controllers: readonly ExpressController[],\n ) {\n this.controllers = new Set(controllers);\n }\n\n private createControllerInstance(\n ClassDefinition: ExpressController,\n ): unknown {\n const Controller = ClassDefinition as new () => unknown;\n\n return new Controller();\n }\n\n private getCachedController(ClassDefinition: ExpressController): unknown {\n const cached = this.controllerInstances.get(ClassDefinition);\n\n if (cached) {\n return cached;\n }\n\n const instance = this.createControllerInstance(ClassDefinition);\n\n this.controllerInstances.set(ClassDefinition, instance);\n\n return instance;\n }\n\n private isKnownController(ClassDefinition: ExpressController): boolean {\n return this.controllers.has(ClassDefinition);\n }\n\n private canResolveService(ClassDefinition: ExpressController): boolean {\n return this.kernel.di.hasService?.(ClassDefinition) === true;\n }\n\n public get(ClassDefinition: ExpressController): unknown {\n if (!this.canResolveService(ClassDefinition)) {\n if (this.isKnownController(ClassDefinition)) {\n return this.getCachedController(ClassDefinition);\n }\n\n return undefined;\n }\n\n return this.kernel.di.getService(ClassDefinition);\n }\n}\n\nexport default ExpressControllerResolver;\n","import type { ErrorRequestHandler, RequestHandler } from 'express';\n\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { ExpressAppHook } from './ExpressAppHook.js';\nimport type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\nimport type { ExpressPhaseHook } from './ExpressPhaseHook.js';\nimport type { HttpApp } from './HttpApp.js';\nimport type { HttpServer } from './HttpServer.js';\n\nimport { ExpressControllerResolver } from './ExpressControllerResolver.js';\n\nexport class ExpressKernelServer {\n private readonly applicationRequire = createRequire(\n path.resolve(process.cwd(), 'package.json'),\n );\n\n private readonly afterControllersHooks: ExpressAppHook[];\n\n private appInstance: HttpApp | undefined;\n\n private readonly beforeControllersHooks: ExpressAppHook[];\n\n private readonly controllers: ExpressController[];\n\n private readonly errorHandlers: ErrorRequestHandler[];\n\n private readonly hooks: ExpressPhaseHook[];\n\n private readonly middlewares: RequestHandler[];\n\n private readonly postControllerMiddlewares: RequestHandler[];\n\n private readonly preControllerMiddlewares: RequestHandler[];\n\n private serverInstance: HttpServer | undefined;\n\n private readonly staticHooks: ExpressAppHook[];\n\n private readonly swaggerHooks: ExpressAppHook[];\n\n constructor(private readonly options: ExpressKernelServerOptions) {\n this.afterControllersHooks = this.copy(options.afterControllersHooks);\n this.beforeControllersHooks = this.copy(options.beforeControllersHooks);\n this.controllers = this.copy(options.controllers);\n this.errorHandlers = this.copy(options.errorHandlers);\n this.hooks = this.copy(options.hooks);\n this.middlewares = this.copy(options.middlewares);\n this.postControllerMiddlewares = this.copy(\n options.postControllerMiddlewares,\n );\n this.preControllerMiddlewares = this.copy(options.preControllerMiddlewares);\n this.staticHooks = this.copy(options.staticHooks);\n this.swaggerHooks = this.copy(options.swaggerHooks);\n }\n\n private copy<Type>(items: Type[] | undefined): Type[] {\n return [...(items ?? [])];\n }\n\n private configureControllerContainer(\n controllers: readonly ExpressController[],\n ): void {\n const { useContainer } = this.getRoutingControllers();\n const resolver = new ExpressControllerResolver(\n this.options.kernel,\n controllers,\n );\n\n useContainer(\n {\n get: <T>(ClassDefinition: new (...args: never[]) => T): T =>\n resolver.get(ClassDefinition as unknown as ExpressController) as T,\n },\n {\n fallback: true,\n fallbackOnErrors: false,\n },\n );\n }\n\n private getExpress(): typeof import('express') {\n return this.applicationRequire('express') as typeof import('express');\n }\n\n private getRoutingControllers(): Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n > {\n return this.applicationRequire('routing-controllers') as Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n >;\n }\n\n private applyErrorHandlers(app: HttpApp): void {\n const handlers =\n this.errorHandlers.length > 0\n ? this.errorHandlers\n : [this.defaultErrorHandler()];\n\n for (const handler of handlers) {\n app.use(handler);\n }\n }\n\n private defaultErrorHandler(): ErrorRequestHandler {\n return (error, request, response, next) => {\n void request;\n\n if (response.headersSent) {\n next(error);\n\n return;\n }\n\n response.status(500).json({\n error: error instanceof Error ? error.message : String(error),\n });\n };\n }\n\n private async runHooks(\n hooks: readonly ((app: HttpApp) => Promise<void> | void)[],\n app: HttpApp,\n ): Promise<void> {\n for (const hook of hooks) {\n await hook(app);\n }\n }\n\n private async runPhaseHooks(\n phase: 'afterControllers' | 'beforeControllers' | 'beforeErrors',\n app: HttpApp,\n ): Promise<void> {\n for (const hook of this.hooks) {\n if (hook.phase === phase) {\n await hook.handle(app);\n }\n }\n }\n\n private applyMiddlewares(\n app: HttpApp,\n middlewares: readonly RequestHandler[],\n ): void {\n for (const middleware of middlewares) {\n app.use(middleware);\n }\n }\n\n public get app(): HttpApp {\n if (!this.appInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.appInstance;\n }\n\n public get server(): HttpServer {\n if (!this.serverInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.serverInstance;\n }\n\n private assertServerIsNotRunning(): void {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n }\n\n public close(): Promise<void> {\n if (!this.serverInstance) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this.serverInstance?.close((error?: Error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n this.serverInstance = undefined;\n this.appInstance = undefined;\n resolve();\n });\n });\n }\n\n public registerAfterControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['afterControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.afterControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerBeforeControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['beforeControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.beforeControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerControllers(...controllers: ExpressController[]): this {\n this.assertServerIsNotRunning();\n this.controllers.push(...controllers);\n\n return this;\n }\n\n public registerErrorHandlers(...handlers: ErrorRequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.errorHandlers.push(...handlers);\n\n return this;\n }\n\n public registerHooks(...hooks: ExpressPhaseHook[]): this {\n this.assertServerIsNotRunning();\n this.hooks.push(...hooks);\n\n return this;\n }\n\n public registerMiddlewares(...middlewares: RequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.middlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPostControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.postControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPreControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.preControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public async run(): Promise<void> {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n\n const controllers: ExpressController[] = [\n ...this.options.kernel.getRoutes(),\n ...this.controllers,\n ] as ExpressController[];\n const express = this.getExpress();\n const { useExpressServer } = this.getRoutingControllers();\n const app = express() as HttpApp;\n\n this.applyMiddlewares(app, this.middlewares);\n this.applyMiddlewares(app, this.preControllerMiddlewares);\n await this.runHooks(this.beforeControllersHooks, app);\n await this.runPhaseHooks('beforeControllers', app);\n this.configureControllerContainer(controllers);\n useExpressServer(app, {\n ...this.options.routingControllersOptions,\n controllers,\n routePrefix: this.options.routePrefix,\n });\n this.applyMiddlewares(app, this.postControllerMiddlewares);\n await this.runHooks(this.afterControllersHooks, app);\n await this.runPhaseHooks('afterControllers', app);\n await this.runHooks(this.swaggerHooks, app);\n await this.runHooks(this.staticHooks, app);\n await this.runPhaseHooks('beforeErrors', app);\n\n this.applyErrorHandlers(app);\n this.appInstance = app;\n\n return new Promise((resolve) => {\n this.serverInstance = app.listen(this.options.port ?? 3000, () => {\n resolve();\n });\n });\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\n\nimport {\n type ExpressErrorMiddlewareInterface,\n HttpError,\n} from 'routing-controllers';\n\nimport type { ErrorExplanation } from './ErrorExplanation.js';\nimport type { ErrorResponseHandler } from './ErrorResponseHandler.js';\nimport type { FormattedValidationError } from './FormattedValidationError.js';\nimport type { HttpErrorHandlerOptions } from './HttpErrorHandlerOptions.js';\nimport type { HttpErrorLike } from './HttpErrorLike.js';\nimport type { PayloadTooLargeError } from './PayloadTooLargeError.js';\nimport type { ValidationError } from './ValidationError.js';\n\nimport { HttpRouteStatusEnum } from '../../../contracts/ui/index.js';\n\nexport class HttpErrorHandler implements ExpressErrorMiddlewareInterface {\n private readonly handlers: readonly ErrorResponseHandler[];\n\n private readonly exposeUnhandledErrorsIn: readonly string[];\n\n constructor(private readonly options: HttpErrorHandlerOptions = {}) {\n this.handlers = options.handlers ?? [];\n this.exposeUnhandledErrorsIn = options.exposeUnhandledErrorsIn ?? [\n 'local',\n 'test',\n ];\n }\n\n private formatValidationErrors(\n errors: readonly ValidationError[],\n ): FormattedValidationError[] {\n return errors.flatMap((error) => {\n if (error.children && error.children.length > 0) {\n return this.formatValidationErrors(error.children);\n }\n\n return [\n {\n details: error.constraints,\n property: error.property,\n value: error.value,\n },\n ];\n });\n }\n\n private getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private getHttpStatus(error: HttpErrorLike): number | undefined {\n return error.httpCode ?? error.statusCode ?? error.status;\n }\n\n private isPayloadTooLargeError(error: PayloadTooLargeError): boolean {\n return (\n error.type === 'entity.too.large' ||\n this.getHttpStatus(error) === HttpRouteStatusEnum.PAYLOAD_TOO_LARGE\n );\n }\n\n private logUnhandledError(error: Error): void {\n this.options.logger?.error(`Unhandled error: ${error.message}`);\n this.options.logger?.debug(error.stack ?? 'No stack trace available');\n }\n\n private handleSyntaxError(error: Error, response: Response): boolean {\n if (!(error instanceof SyntaxError)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.BAD_REQUEST).json({\n code: 'SyntaxError',\n message: 'Malformed JSON',\n });\n\n return true;\n }\n\n private handlePayloadTooLargeError(\n error: Error,\n response: Response,\n ): boolean {\n if (!this.isPayloadTooLargeError(error)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.PAYLOAD_TOO_LARGE).json({\n code: 'PayloadTooLargeError',\n httpStatus: HttpRouteStatusEnum.PAYLOAD_TOO_LARGE,\n message: 'Request entity too large.',\n });\n\n return true;\n }\n\n private handleHttpError(error: Error, response: Response): boolean {\n const httpError = error as HttpErrorLike;\n const httpStatus = this.getHttpStatus(httpError);\n\n if (!httpStatus && !(error instanceof HttpError)) {\n return false;\n }\n\n response\n .status(httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR)\n .json({\n code: error.name,\n errors: this.formatValidationErrors(\n (error as ErrorExplanation).errors ?? [],\n ),\n httpStatus: httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR,\n message: error.message,\n });\n\n return true;\n }\n\n private handleUnhandledError(error: Error, response: Response): void {\n if (this.exposeUnhandledErrorsIn.includes(process.env.NODE_ENV ?? '')) {\n this.logUnhandledError(error);\n }\n\n response.status(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR).json({\n code:\n error.constructor.name ||\n String(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR),\n message: error.message || 'Unknown error',\n });\n }\n\n public error(\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void {\n void request;\n\n const handlers: ErrorResponseHandler[] = [\n this.handleSyntaxError.bind(this),\n this.handlePayloadTooLargeError.bind(this),\n ...this.handlers,\n this.handleHttpError.bind(this),\n ];\n\n if (handlers.some((handler) => handler(error, response))) {\n return;\n }\n\n void next;\n\n this.handleUnhandledError(error, response);\n }\n\n public handle = (\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void => {\n this.error(error, request, response, next);\n };\n}\n\nexport default HttpErrorHandler;\n","export const HttpRouteStatusEnum = {\n BAD_REQUEST: 400,\n CONFLICT: 409,\n CREATED: 201,\n DEPRECATED: 299,\n FORBIDDEN: 403,\n INTERNAL_SERVER_ERROR: 500,\n NO_CONTENT: 204,\n NOT_FOUND: 404,\n OK: 200,\n PAYLOAD_TOO_LARGE: 413,\n SERVICE_UNAVAILABLE: 503,\n TOO_MANY_REQUESTS: 429,\n UNAUTHORIZED: 401,\n UNPROCESSABLE_ENTITY: 422,\n} as const;\n\nexport default HttpRouteStatusEnum;\n","export class RoutePrefix {\n private readonly value: string;\n\n public static fromEnvironment(value: string | undefined): RoutePrefix {\n return new RoutePrefix(value);\n }\n\n constructor(value: string | undefined) {\n if (!value || value === '/') {\n this.value = '';\n\n return;\n }\n\n const normalizedPrefix = value\n .trim()\n .replace(/^\\/+/, '')\n .replace(/\\/+$/, '');\n\n this.value = normalizedPrefix ? `/${normalizedPrefix}` : '';\n }\n\n public includes(requestPath: string): boolean {\n return (\n this.value.length > 0 &&\n (requestPath === this.value || requestPath.startsWith(`${this.value}/`))\n );\n }\n\n public isEmpty(): boolean {\n return this.value.length === 0;\n }\n\n public toString(): string {\n return this.value;\n }\n}\n"],"mappings":"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","names":["path"]}
1
+ {"version":3,"sources":["../../../src/infrastructure/express/index.ts","../../../src/adapters/ui/express/ExpressControllerResolver.ts","../../../src/adapters/ui/express/ExpressKernelServer.ts","../../../src/adapters/ui/express/HttpErrorHandler.ts","../../../src/contracts/ui/HttpRouteStatusEnum.ts","../../../src/adapters/ui/express/RoutePrefix.ts"],"sourcesContent":["export * from '../../adapters/ui/express/index.js';\n","import type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\n\nexport class ExpressControllerResolver {\n private readonly controllerInstances = new Map<ExpressController, unknown>();\n\n private readonly controllers: Set<ExpressController>;\n\n constructor(\n private readonly kernel: ExpressKernelServerOptions['kernel'],\n controllers: readonly ExpressController[],\n ) {\n this.controllers = new Set(controllers);\n }\n\n private createControllerInstance(\n ClassDefinition: ExpressController,\n ): unknown {\n const Controller = ClassDefinition as new () => unknown;\n\n return new Controller();\n }\n\n private getCachedController(ClassDefinition: ExpressController): unknown {\n const cached = this.controllerInstances.get(ClassDefinition);\n\n if (cached) {\n return cached;\n }\n\n const instance = this.createControllerInstance(ClassDefinition);\n\n this.controllerInstances.set(ClassDefinition, instance);\n\n return instance;\n }\n\n private isKnownController(ClassDefinition: ExpressController): boolean {\n return this.controllers.has(ClassDefinition);\n }\n\n private canResolveService(ClassDefinition: ExpressController): boolean {\n return this.kernel.di.hasService?.(ClassDefinition) === true;\n }\n\n public get(ClassDefinition: ExpressController): unknown {\n if (!this.canResolveService(ClassDefinition)) {\n if (this.isKnownController(ClassDefinition)) {\n return this.getCachedController(ClassDefinition);\n }\n\n return undefined;\n }\n\n return this.kernel.di.getService(ClassDefinition);\n }\n}\n\nexport default ExpressControllerResolver;\n","import type { ErrorRequestHandler, RequestHandler } from 'express';\n\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { ExpressAppHook } from './ExpressAppHook.js';\nimport type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\nimport type { ExpressPhaseHook } from './ExpressPhaseHook.js';\nimport type { HttpApp } from './HttpApp.js';\nimport type { HttpServer } from './HttpServer.js';\n\nimport { ExpressControllerResolver } from './ExpressControllerResolver.js';\n\nexport class ExpressKernelServer {\n private readonly applicationRequire = createRequire(\n path.resolve(process.cwd(), 'package.json'),\n );\n\n private readonly afterControllersHooks: ExpressAppHook[];\n\n private appInstance: HttpApp | undefined;\n\n private readonly beforeControllersHooks: ExpressAppHook[];\n\n private readonly controllers: ExpressController[];\n\n private readonly errorHandlers: ErrorRequestHandler[];\n\n private readonly hooks: ExpressPhaseHook[];\n\n private readonly middlewares: RequestHandler[];\n\n private readonly postControllerMiddlewares: RequestHandler[];\n\n private readonly preControllerMiddlewares: RequestHandler[];\n\n private serverInstance: HttpServer | undefined;\n\n constructor(private readonly options: ExpressKernelServerOptions) {\n this.afterControllersHooks = this.copy(options.afterControllersHooks);\n this.beforeControllersHooks = this.copy(options.beforeControllersHooks);\n this.controllers = this.copy(options.controllers);\n this.errorHandlers = this.copy(options.errorHandlers);\n this.hooks = this.copy(options.hooks);\n this.middlewares = this.copy(options.middlewares);\n this.postControllerMiddlewares = this.copy(\n options.postControllerMiddlewares,\n );\n this.preControllerMiddlewares = this.copy(options.preControllerMiddlewares);\n }\n\n private copy<Type>(items: Type[] | undefined): Type[] {\n return [...(items ?? [])];\n }\n\n private configureControllerContainer(\n controllers: readonly ExpressController[],\n ): void {\n const { useContainer } = this.getRoutingControllers();\n const resolver = new ExpressControllerResolver(\n this.options.kernel,\n controllers,\n );\n\n useContainer(\n {\n get: <T>(ClassDefinition: new (...args: never[]) => T): T =>\n resolver.get(ClassDefinition as unknown as ExpressController) as T,\n },\n {\n fallback: true,\n fallbackOnErrors: false,\n },\n );\n }\n\n private getExpress(): typeof import('express') {\n return this.applicationRequire('express') as typeof import('express');\n }\n\n private getRoutingControllers(): Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n > {\n return this.applicationRequire('routing-controllers') as Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n >;\n }\n\n private applyErrorHandlers(app: HttpApp): void {\n const handlers =\n this.errorHandlers.length > 0\n ? this.errorHandlers\n : [this.defaultErrorHandler()];\n\n for (const handler of handlers) {\n app.use(handler);\n }\n }\n\n private defaultErrorHandler(): ErrorRequestHandler {\n return (error, request, response, next) => {\n void request;\n\n if (response.headersSent) {\n next(error);\n\n return;\n }\n\n response.status(500).json({\n error: error instanceof Error ? error.message : String(error),\n });\n };\n }\n\n private async runHooks(\n hooks: readonly ((app: HttpApp) => Promise<void> | void)[],\n app: HttpApp,\n ): Promise<void> {\n for (const hook of hooks) {\n await hook(app);\n }\n }\n\n private async runPhaseHooks(\n phase: 'afterControllers' | 'beforeControllers' | 'beforeErrors',\n app: HttpApp,\n ): Promise<void> {\n for (const hook of this.hooks) {\n if (hook.phase === phase) {\n await hook.handle(app);\n }\n }\n }\n\n private applyMiddlewares(\n app: HttpApp,\n middlewares: readonly RequestHandler[],\n ): void {\n for (const middleware of middlewares) {\n app.use(middleware);\n }\n }\n\n public get app(): HttpApp {\n if (!this.appInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.appInstance;\n }\n\n public get server(): HttpServer {\n if (!this.serverInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.serverInstance;\n }\n\n private assertServerIsNotRunning(): void {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n }\n\n public close(): Promise<void> {\n if (!this.serverInstance) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this.serverInstance?.close((error?: Error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n this.serverInstance = undefined;\n this.appInstance = undefined;\n resolve();\n });\n });\n }\n\n public registerAfterControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['afterControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.afterControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerBeforeControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['beforeControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.beforeControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerControllers(...controllers: ExpressController[]): this {\n this.assertServerIsNotRunning();\n this.controllers.push(...controllers);\n\n return this;\n }\n\n public registerErrorHandlers(...handlers: ErrorRequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.errorHandlers.push(...handlers);\n\n return this;\n }\n\n public registerHooks(...hooks: ExpressPhaseHook[]): this {\n this.assertServerIsNotRunning();\n this.hooks.push(...hooks);\n\n return this;\n }\n\n public registerMiddlewares(...middlewares: RequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.middlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPostControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.postControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPreControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.preControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public async run(): Promise<void> {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n\n const controllers: ExpressController[] = [\n ...this.options.kernel.getRoutes(),\n ...this.controllers,\n ] as ExpressController[];\n const express = this.getExpress();\n const { useExpressServer } = this.getRoutingControllers();\n const app = express() as HttpApp;\n\n this.applyMiddlewares(app, this.middlewares);\n this.applyMiddlewares(app, this.preControllerMiddlewares);\n await this.runHooks(this.beforeControllersHooks, app);\n await this.runPhaseHooks('beforeControllers', app);\n this.configureControllerContainer(controllers);\n useExpressServer(app, {\n ...this.options.routingControllersOptions,\n controllers,\n routePrefix: this.options.routePrefix,\n });\n this.applyMiddlewares(app, this.postControllerMiddlewares);\n await this.runHooks(this.afterControllersHooks, app);\n await this.runPhaseHooks('afterControllers', app);\n await this.runPhaseHooks('beforeErrors', app);\n\n this.applyErrorHandlers(app);\n this.appInstance = app;\n\n return new Promise((resolve) => {\n this.serverInstance = app.listen(this.options.port ?? 3000, () => {\n resolve();\n });\n });\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\n\nimport {\n type ExpressErrorMiddlewareInterface,\n HttpError,\n} from 'routing-controllers';\n\nimport type { ErrorExplanation } from './ErrorExplanation.js';\nimport type { ErrorResponseHandler } from './ErrorResponseHandler.js';\nimport type { FormattedValidationError } from './FormattedValidationError.js';\nimport type { HttpErrorHandlerOptions } from './HttpErrorHandlerOptions.js';\nimport type { HttpErrorLike } from './HttpErrorLike.js';\nimport type { PayloadTooLargeError } from './PayloadTooLargeError.js';\nimport type { ValidationError } from './ValidationError.js';\n\nimport { HttpRouteStatusEnum } from '../../../contracts/ui/index.js';\n\nexport class HttpErrorHandler implements ExpressErrorMiddlewareInterface {\n private readonly handlers: readonly ErrorResponseHandler[];\n\n private readonly exposeUnhandledErrorsIn: readonly string[];\n\n constructor(private readonly options: HttpErrorHandlerOptions = {}) {\n this.handlers = options.handlers ?? [];\n this.exposeUnhandledErrorsIn = options.exposeUnhandledErrorsIn ?? [\n 'local',\n 'test',\n ];\n }\n\n private formatValidationErrors(\n errors: readonly ValidationError[],\n ): FormattedValidationError[] {\n return errors.flatMap((error) => {\n if (error.children && error.children.length > 0) {\n return this.formatValidationErrors(error.children);\n }\n\n return [\n {\n details: error.constraints,\n property: error.property,\n value: error.value,\n },\n ];\n });\n }\n\n private getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private getHttpStatus(error: HttpErrorLike): number | undefined {\n return error.httpCode ?? error.statusCode ?? error.status;\n }\n\n private isPayloadTooLargeError(error: PayloadTooLargeError): boolean {\n return (\n error.type === 'entity.too.large' ||\n this.getHttpStatus(error) === HttpRouteStatusEnum.PAYLOAD_TOO_LARGE\n );\n }\n\n private logUnhandledError(error: Error): void {\n this.options.logger?.error(`Unhandled error: ${error.message}`);\n this.options.logger?.debug(error.stack ?? 'No stack trace available');\n }\n\n private handleSyntaxError(error: Error, response: Response): boolean {\n if (!(error instanceof SyntaxError)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.BAD_REQUEST).json({\n code: 'SyntaxError',\n message: 'Malformed JSON',\n });\n\n return true;\n }\n\n private handlePayloadTooLargeError(\n error: Error,\n response: Response,\n ): boolean {\n if (!this.isPayloadTooLargeError(error)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.PAYLOAD_TOO_LARGE).json({\n code: 'PayloadTooLargeError',\n httpStatus: HttpRouteStatusEnum.PAYLOAD_TOO_LARGE,\n message: 'Request entity too large.',\n });\n\n return true;\n }\n\n private handleHttpError(error: Error, response: Response): boolean {\n const httpError = error as HttpErrorLike;\n const httpStatus = this.getHttpStatus(httpError);\n\n if (!httpStatus && !(error instanceof HttpError)) {\n return false;\n }\n\n response\n .status(httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR)\n .json({\n code: error.name,\n errors: this.formatValidationErrors(\n (error as ErrorExplanation).errors ?? [],\n ),\n httpStatus: httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR,\n message: error.message,\n });\n\n return true;\n }\n\n private handleUnhandledError(error: Error, response: Response): void {\n if (this.exposeUnhandledErrorsIn.includes(process.env.NODE_ENV ?? '')) {\n this.logUnhandledError(error);\n }\n\n response.status(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR).json({\n code:\n error.constructor.name ||\n String(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR),\n message: error.message || 'Unknown error',\n });\n }\n\n public error(\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void {\n void request;\n\n const handlers: ErrorResponseHandler[] = [\n this.handleSyntaxError.bind(this),\n this.handlePayloadTooLargeError.bind(this),\n ...this.handlers,\n this.handleHttpError.bind(this),\n ];\n\n if (handlers.some((handler) => handler(error, response))) {\n return;\n }\n\n void next;\n\n this.handleUnhandledError(error, response);\n }\n\n public handle = (\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void => {\n this.error(error, request, response, next);\n };\n}\n\nexport default HttpErrorHandler;\n","export const HttpRouteStatusEnum = {\n BAD_REQUEST: 400,\n CONFLICT: 409,\n CREATED: 201,\n DEPRECATED: 299,\n FORBIDDEN: 403,\n INTERNAL_SERVER_ERROR: 500,\n NO_CONTENT: 204,\n NOT_FOUND: 404,\n OK: 200,\n PAYLOAD_TOO_LARGE: 413,\n SERVICE_UNAVAILABLE: 503,\n TOO_MANY_REQUESTS: 429,\n UNAUTHORIZED: 401,\n UNPROCESSABLE_ENTITY: 422,\n} as const;\n\nexport default HttpRouteStatusEnum;\n","export class RoutePrefix {\n private readonly value: string;\n\n public static fromEnvironment(value: string | undefined): RoutePrefix {\n return new RoutePrefix(value);\n }\n\n constructor(value: string | undefined) {\n if (!value || value === '/') {\n this.value = '';\n\n return;\n }\n\n const normalizedPrefix = value\n .trim()\n .replace(/^\\/+/, '')\n .replace(/\\/+$/, '');\n\n this.value = normalizedPrefix ? `/${normalizedPrefix}` : '';\n }\n\n public includes(requestPath: string): boolean {\n return (\n this.value.length > 0 &&\n (requestPath === this.value || requestPath.startsWith(`${this.value}/`))\n );\n }\n\n public isEmpty(): boolean {\n return this.value.length === 0;\n }\n\n public toString(): string {\n return this.value;\n }\n}\n"],"mappings":"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","names":["path"]}
@@ -1,10 +1,10 @@
1
1
  export { ErrorExplanation, ErrorResponseHandler, ExpressAppHook, ExpressController, ExpressControllerResolver, ExpressHookPhase, ExpressKernelServer, ExpressKernelServerOptions, ExpressPhaseHook, FormattedValidationError, HttpApp, HttpErrorHandler, HttpErrorHandlerOptions, HttpErrorLike, HttpErrorResponse, HttpServer, PayloadTooLargeError, RoutePrefix, ValidationError } from '../../adapters/ui/express/index.cjs';
2
2
  import 'express';
3
3
  import 'routing-controllers';
4
- import '../../ShutdownHook-Ho-CeLu8.cjs';
4
+ import '../../ShutdownHook-CCtg4Ypg.cjs';
5
5
  import '../../DomainEvent-C2OvBSCS.cjs';
6
6
  import 'dotenv';
7
- import '../../ServiceClass-nnDgfgdL.cjs';
7
+ import '../../ServiceClass-U0Vk46dN.cjs';
8
8
  import '../../ServiceResolver-CQGmbk-X.cjs';
9
9
  import '../lifecycle/index.cjs';
10
10
  import '../../Scheduler-Cm24s3-v.cjs';
@@ -1,10 +1,10 @@
1
1
  export { ErrorExplanation, ErrorResponseHandler, ExpressAppHook, ExpressController, ExpressControllerResolver, ExpressHookPhase, ExpressKernelServer, ExpressKernelServerOptions, ExpressPhaseHook, FormattedValidationError, HttpApp, HttpErrorHandler, HttpErrorHandlerOptions, HttpErrorLike, HttpErrorResponse, HttpServer, PayloadTooLargeError, RoutePrefix, ValidationError } from '../../adapters/ui/express/index.js';
2
2
  import 'express';
3
3
  import 'routing-controllers';
4
- import '../../ShutdownHook-Cx1Rc40s.js';
4
+ import '../../ShutdownHook-BCQgEMUI.js';
5
5
  import '../../DomainEvent-C2OvBSCS.js';
6
6
  import 'dotenv';
7
- import '../../ServiceClass-Bj3G71L8.js';
7
+ import '../../ServiceClass-C-ZCUQWE.js';
8
8
  import '../../ServiceResolver-CQGmbk-X.js';
9
9
  import '../lifecycle/index.js';
10
10
  import '../../Scheduler-Cm24s3-v.js';
@@ -53,8 +53,6 @@ var ExpressKernelServer = class {
53
53
  options.postControllerMiddlewares
54
54
  );
55
55
  this.preControllerMiddlewares = this.copy(options.preControllerMiddlewares);
56
- this.staticHooks = this.copy(options.staticHooks);
57
- this.swaggerHooks = this.copy(options.swaggerHooks);
58
56
  }
59
57
  options;
60
58
  applicationRequire = createRequire(
@@ -70,8 +68,6 @@ var ExpressKernelServer = class {
70
68
  postControllerMiddlewares;
71
69
  preControllerMiddlewares;
72
70
  serverInstance;
73
- staticHooks;
74
- swaggerHooks;
75
71
  copy(items) {
76
72
  return [...items ?? []];
77
73
  }
@@ -229,8 +225,6 @@ var ExpressKernelServer = class {
229
225
  this.applyMiddlewares(app, this.postControllerMiddlewares);
230
226
  await this.runHooks(this.afterControllersHooks, app);
231
227
  await this.runPhaseHooks("afterControllers", app);
232
- await this.runHooks(this.swaggerHooks, app);
233
- await this.runHooks(this.staticHooks, app);
234
228
  await this.runPhaseHooks("beforeErrors", app);
235
229
  this.applyErrorHandlers(app);
236
230
  this.appInstance = app;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/ui/express/ExpressControllerResolver.ts","../../../src/adapters/ui/express/ExpressKernelServer.ts","../../../src/adapters/ui/express/HttpErrorHandler.ts","../../../src/contracts/ui/HttpRouteStatusEnum.ts","../../../src/adapters/ui/express/RoutePrefix.ts"],"sourcesContent":["import type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\n\nexport class ExpressControllerResolver {\n private readonly controllerInstances = new Map<ExpressController, unknown>();\n\n private readonly controllers: Set<ExpressController>;\n\n constructor(\n private readonly kernel: ExpressKernelServerOptions['kernel'],\n controllers: readonly ExpressController[],\n ) {\n this.controllers = new Set(controllers);\n }\n\n private createControllerInstance(\n ClassDefinition: ExpressController,\n ): unknown {\n const Controller = ClassDefinition as new () => unknown;\n\n return new Controller();\n }\n\n private getCachedController(ClassDefinition: ExpressController): unknown {\n const cached = this.controllerInstances.get(ClassDefinition);\n\n if (cached) {\n return cached;\n }\n\n const instance = this.createControllerInstance(ClassDefinition);\n\n this.controllerInstances.set(ClassDefinition, instance);\n\n return instance;\n }\n\n private isKnownController(ClassDefinition: ExpressController): boolean {\n return this.controllers.has(ClassDefinition);\n }\n\n private canResolveService(ClassDefinition: ExpressController): boolean {\n return this.kernel.di.hasService?.(ClassDefinition) === true;\n }\n\n public get(ClassDefinition: ExpressController): unknown {\n if (!this.canResolveService(ClassDefinition)) {\n if (this.isKnownController(ClassDefinition)) {\n return this.getCachedController(ClassDefinition);\n }\n\n return undefined;\n }\n\n return this.kernel.di.getService(ClassDefinition);\n }\n}\n\nexport default ExpressControllerResolver;\n","import type { ErrorRequestHandler, RequestHandler } from 'express';\n\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { ExpressAppHook } from './ExpressAppHook.js';\nimport type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\nimport type { ExpressPhaseHook } from './ExpressPhaseHook.js';\nimport type { HttpApp } from './HttpApp.js';\nimport type { HttpServer } from './HttpServer.js';\n\nimport { ExpressControllerResolver } from './ExpressControllerResolver.js';\n\nexport class ExpressKernelServer {\n private readonly applicationRequire = createRequire(\n path.resolve(process.cwd(), 'package.json'),\n );\n\n private readonly afterControllersHooks: ExpressAppHook[];\n\n private appInstance: HttpApp | undefined;\n\n private readonly beforeControllersHooks: ExpressAppHook[];\n\n private readonly controllers: ExpressController[];\n\n private readonly errorHandlers: ErrorRequestHandler[];\n\n private readonly hooks: ExpressPhaseHook[];\n\n private readonly middlewares: RequestHandler[];\n\n private readonly postControllerMiddlewares: RequestHandler[];\n\n private readonly preControllerMiddlewares: RequestHandler[];\n\n private serverInstance: HttpServer | undefined;\n\n private readonly staticHooks: ExpressAppHook[];\n\n private readonly swaggerHooks: ExpressAppHook[];\n\n constructor(private readonly options: ExpressKernelServerOptions) {\n this.afterControllersHooks = this.copy(options.afterControllersHooks);\n this.beforeControllersHooks = this.copy(options.beforeControllersHooks);\n this.controllers = this.copy(options.controllers);\n this.errorHandlers = this.copy(options.errorHandlers);\n this.hooks = this.copy(options.hooks);\n this.middlewares = this.copy(options.middlewares);\n this.postControllerMiddlewares = this.copy(\n options.postControllerMiddlewares,\n );\n this.preControllerMiddlewares = this.copy(options.preControllerMiddlewares);\n this.staticHooks = this.copy(options.staticHooks);\n this.swaggerHooks = this.copy(options.swaggerHooks);\n }\n\n private copy<Type>(items: Type[] | undefined): Type[] {\n return [...(items ?? [])];\n }\n\n private configureControllerContainer(\n controllers: readonly ExpressController[],\n ): void {\n const { useContainer } = this.getRoutingControllers();\n const resolver = new ExpressControllerResolver(\n this.options.kernel,\n controllers,\n );\n\n useContainer(\n {\n get: <T>(ClassDefinition: new (...args: never[]) => T): T =>\n resolver.get(ClassDefinition as unknown as ExpressController) as T,\n },\n {\n fallback: true,\n fallbackOnErrors: false,\n },\n );\n }\n\n private getExpress(): typeof import('express') {\n return this.applicationRequire('express') as typeof import('express');\n }\n\n private getRoutingControllers(): Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n > {\n return this.applicationRequire('routing-controllers') as Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n >;\n }\n\n private applyErrorHandlers(app: HttpApp): void {\n const handlers =\n this.errorHandlers.length > 0\n ? this.errorHandlers\n : [this.defaultErrorHandler()];\n\n for (const handler of handlers) {\n app.use(handler);\n }\n }\n\n private defaultErrorHandler(): ErrorRequestHandler {\n return (error, request, response, next) => {\n void request;\n\n if (response.headersSent) {\n next(error);\n\n return;\n }\n\n response.status(500).json({\n error: error instanceof Error ? error.message : String(error),\n });\n };\n }\n\n private async runHooks(\n hooks: readonly ((app: HttpApp) => Promise<void> | void)[],\n app: HttpApp,\n ): Promise<void> {\n for (const hook of hooks) {\n await hook(app);\n }\n }\n\n private async runPhaseHooks(\n phase: 'afterControllers' | 'beforeControllers' | 'beforeErrors',\n app: HttpApp,\n ): Promise<void> {\n for (const hook of this.hooks) {\n if (hook.phase === phase) {\n await hook.handle(app);\n }\n }\n }\n\n private applyMiddlewares(\n app: HttpApp,\n middlewares: readonly RequestHandler[],\n ): void {\n for (const middleware of middlewares) {\n app.use(middleware);\n }\n }\n\n public get app(): HttpApp {\n if (!this.appInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.appInstance;\n }\n\n public get server(): HttpServer {\n if (!this.serverInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.serverInstance;\n }\n\n private assertServerIsNotRunning(): void {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n }\n\n public close(): Promise<void> {\n if (!this.serverInstance) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this.serverInstance?.close((error?: Error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n this.serverInstance = undefined;\n this.appInstance = undefined;\n resolve();\n });\n });\n }\n\n public registerAfterControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['afterControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.afterControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerBeforeControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['beforeControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.beforeControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerControllers(...controllers: ExpressController[]): this {\n this.assertServerIsNotRunning();\n this.controllers.push(...controllers);\n\n return this;\n }\n\n public registerErrorHandlers(...handlers: ErrorRequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.errorHandlers.push(...handlers);\n\n return this;\n }\n\n public registerHooks(...hooks: ExpressPhaseHook[]): this {\n this.assertServerIsNotRunning();\n this.hooks.push(...hooks);\n\n return this;\n }\n\n public registerMiddlewares(...middlewares: RequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.middlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPostControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.postControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPreControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.preControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public async run(): Promise<void> {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n\n const controllers: ExpressController[] = [\n ...this.options.kernel.getRoutes(),\n ...this.controllers,\n ] as ExpressController[];\n const express = this.getExpress();\n const { useExpressServer } = this.getRoutingControllers();\n const app = express() as HttpApp;\n\n this.applyMiddlewares(app, this.middlewares);\n this.applyMiddlewares(app, this.preControllerMiddlewares);\n await this.runHooks(this.beforeControllersHooks, app);\n await this.runPhaseHooks('beforeControllers', app);\n this.configureControllerContainer(controllers);\n useExpressServer(app, {\n ...this.options.routingControllersOptions,\n controllers,\n routePrefix: this.options.routePrefix,\n });\n this.applyMiddlewares(app, this.postControllerMiddlewares);\n await this.runHooks(this.afterControllersHooks, app);\n await this.runPhaseHooks('afterControllers', app);\n await this.runHooks(this.swaggerHooks, app);\n await this.runHooks(this.staticHooks, app);\n await this.runPhaseHooks('beforeErrors', app);\n\n this.applyErrorHandlers(app);\n this.appInstance = app;\n\n return new Promise((resolve) => {\n this.serverInstance = app.listen(this.options.port ?? 3000, () => {\n resolve();\n });\n });\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\n\nimport {\n type ExpressErrorMiddlewareInterface,\n HttpError,\n} from 'routing-controllers';\n\nimport type { ErrorExplanation } from './ErrorExplanation.js';\nimport type { ErrorResponseHandler } from './ErrorResponseHandler.js';\nimport type { FormattedValidationError } from './FormattedValidationError.js';\nimport type { HttpErrorHandlerOptions } from './HttpErrorHandlerOptions.js';\nimport type { HttpErrorLike } from './HttpErrorLike.js';\nimport type { PayloadTooLargeError } from './PayloadTooLargeError.js';\nimport type { ValidationError } from './ValidationError.js';\n\nimport { HttpRouteStatusEnum } from '../../../contracts/ui/index.js';\n\nexport class HttpErrorHandler implements ExpressErrorMiddlewareInterface {\n private readonly handlers: readonly ErrorResponseHandler[];\n\n private readonly exposeUnhandledErrorsIn: readonly string[];\n\n constructor(private readonly options: HttpErrorHandlerOptions = {}) {\n this.handlers = options.handlers ?? [];\n this.exposeUnhandledErrorsIn = options.exposeUnhandledErrorsIn ?? [\n 'local',\n 'test',\n ];\n }\n\n private formatValidationErrors(\n errors: readonly ValidationError[],\n ): FormattedValidationError[] {\n return errors.flatMap((error) => {\n if (error.children && error.children.length > 0) {\n return this.formatValidationErrors(error.children);\n }\n\n return [\n {\n details: error.constraints,\n property: error.property,\n value: error.value,\n },\n ];\n });\n }\n\n private getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private getHttpStatus(error: HttpErrorLike): number | undefined {\n return error.httpCode ?? error.statusCode ?? error.status;\n }\n\n private isPayloadTooLargeError(error: PayloadTooLargeError): boolean {\n return (\n error.type === 'entity.too.large' ||\n this.getHttpStatus(error) === HttpRouteStatusEnum.PAYLOAD_TOO_LARGE\n );\n }\n\n private logUnhandledError(error: Error): void {\n this.options.logger?.error(`Unhandled error: ${error.message}`);\n this.options.logger?.debug(error.stack ?? 'No stack trace available');\n }\n\n private handleSyntaxError(error: Error, response: Response): boolean {\n if (!(error instanceof SyntaxError)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.BAD_REQUEST).json({\n code: 'SyntaxError',\n message: 'Malformed JSON',\n });\n\n return true;\n }\n\n private handlePayloadTooLargeError(\n error: Error,\n response: Response,\n ): boolean {\n if (!this.isPayloadTooLargeError(error)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.PAYLOAD_TOO_LARGE).json({\n code: 'PayloadTooLargeError',\n httpStatus: HttpRouteStatusEnum.PAYLOAD_TOO_LARGE,\n message: 'Request entity too large.',\n });\n\n return true;\n }\n\n private handleHttpError(error: Error, response: Response): boolean {\n const httpError = error as HttpErrorLike;\n const httpStatus = this.getHttpStatus(httpError);\n\n if (!httpStatus && !(error instanceof HttpError)) {\n return false;\n }\n\n response\n .status(httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR)\n .json({\n code: error.name,\n errors: this.formatValidationErrors(\n (error as ErrorExplanation).errors ?? [],\n ),\n httpStatus: httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR,\n message: error.message,\n });\n\n return true;\n }\n\n private handleUnhandledError(error: Error, response: Response): void {\n if (this.exposeUnhandledErrorsIn.includes(process.env.NODE_ENV ?? '')) {\n this.logUnhandledError(error);\n }\n\n response.status(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR).json({\n code:\n error.constructor.name ||\n String(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR),\n message: error.message || 'Unknown error',\n });\n }\n\n public error(\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void {\n void request;\n\n const handlers: ErrorResponseHandler[] = [\n this.handleSyntaxError.bind(this),\n this.handlePayloadTooLargeError.bind(this),\n ...this.handlers,\n this.handleHttpError.bind(this),\n ];\n\n if (handlers.some((handler) => handler(error, response))) {\n return;\n }\n\n void next;\n\n this.handleUnhandledError(error, response);\n }\n\n public handle = (\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void => {\n this.error(error, request, response, next);\n };\n}\n\nexport default HttpErrorHandler;\n","export const HttpRouteStatusEnum = {\n BAD_REQUEST: 400,\n CONFLICT: 409,\n CREATED: 201,\n DEPRECATED: 299,\n FORBIDDEN: 403,\n INTERNAL_SERVER_ERROR: 500,\n NO_CONTENT: 204,\n NOT_FOUND: 404,\n OK: 200,\n PAYLOAD_TOO_LARGE: 413,\n SERVICE_UNAVAILABLE: 503,\n TOO_MANY_REQUESTS: 429,\n UNAUTHORIZED: 401,\n UNPROCESSABLE_ENTITY: 422,\n} as const;\n\nexport default HttpRouteStatusEnum;\n","export class RoutePrefix {\n private readonly value: string;\n\n public static fromEnvironment(value: string | undefined): RoutePrefix {\n return new RoutePrefix(value);\n }\n\n constructor(value: string | undefined) {\n if (!value || value === '/') {\n this.value = '';\n\n return;\n }\n\n const normalizedPrefix = value\n .trim()\n .replace(/^\\/+/, '')\n .replace(/\\/+$/, '');\n\n this.value = normalizedPrefix ? `/${normalizedPrefix}` : '';\n }\n\n public includes(requestPath: string): boolean {\n return (\n this.value.length > 0 &&\n (requestPath === this.value || requestPath.startsWith(`${this.value}/`))\n );\n }\n\n public isEmpty(): boolean {\n return this.value.length === 0;\n }\n\n public toString(): string {\n return this.value;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/adapters/ui/express/ExpressControllerResolver.ts","../../../src/adapters/ui/express/ExpressKernelServer.ts","../../../src/adapters/ui/express/HttpErrorHandler.ts","../../../src/contracts/ui/HttpRouteStatusEnum.ts","../../../src/adapters/ui/express/RoutePrefix.ts"],"sourcesContent":["import type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\n\nexport class ExpressControllerResolver {\n private readonly controllerInstances = new Map<ExpressController, unknown>();\n\n private readonly controllers: Set<ExpressController>;\n\n constructor(\n private readonly kernel: ExpressKernelServerOptions['kernel'],\n controllers: readonly ExpressController[],\n ) {\n this.controllers = new Set(controllers);\n }\n\n private createControllerInstance(\n ClassDefinition: ExpressController,\n ): unknown {\n const Controller = ClassDefinition as new () => unknown;\n\n return new Controller();\n }\n\n private getCachedController(ClassDefinition: ExpressController): unknown {\n const cached = this.controllerInstances.get(ClassDefinition);\n\n if (cached) {\n return cached;\n }\n\n const instance = this.createControllerInstance(ClassDefinition);\n\n this.controllerInstances.set(ClassDefinition, instance);\n\n return instance;\n }\n\n private isKnownController(ClassDefinition: ExpressController): boolean {\n return this.controllers.has(ClassDefinition);\n }\n\n private canResolveService(ClassDefinition: ExpressController): boolean {\n return this.kernel.di.hasService?.(ClassDefinition) === true;\n }\n\n public get(ClassDefinition: ExpressController): unknown {\n if (!this.canResolveService(ClassDefinition)) {\n if (this.isKnownController(ClassDefinition)) {\n return this.getCachedController(ClassDefinition);\n }\n\n return undefined;\n }\n\n return this.kernel.di.getService(ClassDefinition);\n }\n}\n\nexport default ExpressControllerResolver;\n","import type { ErrorRequestHandler, RequestHandler } from 'express';\n\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { ExpressAppHook } from './ExpressAppHook.js';\nimport type { ExpressController } from './ExpressController.js';\nimport type { ExpressKernelServerOptions } from './ExpressKernelServerOptions.js';\nimport type { ExpressPhaseHook } from './ExpressPhaseHook.js';\nimport type { HttpApp } from './HttpApp.js';\nimport type { HttpServer } from './HttpServer.js';\n\nimport { ExpressControllerResolver } from './ExpressControllerResolver.js';\n\nexport class ExpressKernelServer {\n private readonly applicationRequire = createRequire(\n path.resolve(process.cwd(), 'package.json'),\n );\n\n private readonly afterControllersHooks: ExpressAppHook[];\n\n private appInstance: HttpApp | undefined;\n\n private readonly beforeControllersHooks: ExpressAppHook[];\n\n private readonly controllers: ExpressController[];\n\n private readonly errorHandlers: ErrorRequestHandler[];\n\n private readonly hooks: ExpressPhaseHook[];\n\n private readonly middlewares: RequestHandler[];\n\n private readonly postControllerMiddlewares: RequestHandler[];\n\n private readonly preControllerMiddlewares: RequestHandler[];\n\n private serverInstance: HttpServer | undefined;\n\n constructor(private readonly options: ExpressKernelServerOptions) {\n this.afterControllersHooks = this.copy(options.afterControllersHooks);\n this.beforeControllersHooks = this.copy(options.beforeControllersHooks);\n this.controllers = this.copy(options.controllers);\n this.errorHandlers = this.copy(options.errorHandlers);\n this.hooks = this.copy(options.hooks);\n this.middlewares = this.copy(options.middlewares);\n this.postControllerMiddlewares = this.copy(\n options.postControllerMiddlewares,\n );\n this.preControllerMiddlewares = this.copy(options.preControllerMiddlewares);\n }\n\n private copy<Type>(items: Type[] | undefined): Type[] {\n return [...(items ?? [])];\n }\n\n private configureControllerContainer(\n controllers: readonly ExpressController[],\n ): void {\n const { useContainer } = this.getRoutingControllers();\n const resolver = new ExpressControllerResolver(\n this.options.kernel,\n controllers,\n );\n\n useContainer(\n {\n get: <T>(ClassDefinition: new (...args: never[]) => T): T =>\n resolver.get(ClassDefinition as unknown as ExpressController) as T,\n },\n {\n fallback: true,\n fallbackOnErrors: false,\n },\n );\n }\n\n private getExpress(): typeof import('express') {\n return this.applicationRequire('express') as typeof import('express');\n }\n\n private getRoutingControllers(): Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n > {\n return this.applicationRequire('routing-controllers') as Pick<\n typeof import('routing-controllers'),\n 'useContainer' | 'useExpressServer'\n >;\n }\n\n private applyErrorHandlers(app: HttpApp): void {\n const handlers =\n this.errorHandlers.length > 0\n ? this.errorHandlers\n : [this.defaultErrorHandler()];\n\n for (const handler of handlers) {\n app.use(handler);\n }\n }\n\n private defaultErrorHandler(): ErrorRequestHandler {\n return (error, request, response, next) => {\n void request;\n\n if (response.headersSent) {\n next(error);\n\n return;\n }\n\n response.status(500).json({\n error: error instanceof Error ? error.message : String(error),\n });\n };\n }\n\n private async runHooks(\n hooks: readonly ((app: HttpApp) => Promise<void> | void)[],\n app: HttpApp,\n ): Promise<void> {\n for (const hook of hooks) {\n await hook(app);\n }\n }\n\n private async runPhaseHooks(\n phase: 'afterControllers' | 'beforeControllers' | 'beforeErrors',\n app: HttpApp,\n ): Promise<void> {\n for (const hook of this.hooks) {\n if (hook.phase === phase) {\n await hook.handle(app);\n }\n }\n }\n\n private applyMiddlewares(\n app: HttpApp,\n middlewares: readonly RequestHandler[],\n ): void {\n for (const middleware of middlewares) {\n app.use(middleware);\n }\n }\n\n public get app(): HttpApp {\n if (!this.appInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.appInstance;\n }\n\n public get server(): HttpServer {\n if (!this.serverInstance) {\n throw new Error('HTTP server is not running.');\n }\n\n return this.serverInstance;\n }\n\n private assertServerIsNotRunning(): void {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n }\n\n public close(): Promise<void> {\n if (!this.serverInstance) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n this.serverInstance?.close((error?: Error) => {\n if (error) {\n reject(error);\n\n return;\n }\n\n this.serverInstance = undefined;\n this.appInstance = undefined;\n resolve();\n });\n });\n }\n\n public registerAfterControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['afterControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.afterControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerBeforeControllersHooks(\n ...hooks: NonNullable<ExpressKernelServerOptions['beforeControllersHooks']>\n ): this {\n this.assertServerIsNotRunning();\n this.beforeControllersHooks?.push(...hooks);\n\n return this;\n }\n\n public registerControllers(...controllers: ExpressController[]): this {\n this.assertServerIsNotRunning();\n this.controllers.push(...controllers);\n\n return this;\n }\n\n public registerErrorHandlers(...handlers: ErrorRequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.errorHandlers.push(...handlers);\n\n return this;\n }\n\n public registerHooks(...hooks: ExpressPhaseHook[]): this {\n this.assertServerIsNotRunning();\n this.hooks.push(...hooks);\n\n return this;\n }\n\n public registerMiddlewares(...middlewares: RequestHandler[]): this {\n this.assertServerIsNotRunning();\n this.middlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPostControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.postControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public registerPreControllerMiddlewares(\n ...middlewares: RequestHandler[]\n ): this {\n this.assertServerIsNotRunning();\n this.preControllerMiddlewares.push(...middlewares);\n\n return this;\n }\n\n public async run(): Promise<void> {\n if (this.serverInstance) {\n throw new Error('HTTP server is already running.');\n }\n\n const controllers: ExpressController[] = [\n ...this.options.kernel.getRoutes(),\n ...this.controllers,\n ] as ExpressController[];\n const express = this.getExpress();\n const { useExpressServer } = this.getRoutingControllers();\n const app = express() as HttpApp;\n\n this.applyMiddlewares(app, this.middlewares);\n this.applyMiddlewares(app, this.preControllerMiddlewares);\n await this.runHooks(this.beforeControllersHooks, app);\n await this.runPhaseHooks('beforeControllers', app);\n this.configureControllerContainer(controllers);\n useExpressServer(app, {\n ...this.options.routingControllersOptions,\n controllers,\n routePrefix: this.options.routePrefix,\n });\n this.applyMiddlewares(app, this.postControllerMiddlewares);\n await this.runHooks(this.afterControllersHooks, app);\n await this.runPhaseHooks('afterControllers', app);\n await this.runPhaseHooks('beforeErrors', app);\n\n this.applyErrorHandlers(app);\n this.appInstance = app;\n\n return new Promise((resolve) => {\n this.serverInstance = app.listen(this.options.port ?? 3000, () => {\n resolve();\n });\n });\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\n\nimport {\n type ExpressErrorMiddlewareInterface,\n HttpError,\n} from 'routing-controllers';\n\nimport type { ErrorExplanation } from './ErrorExplanation.js';\nimport type { ErrorResponseHandler } from './ErrorResponseHandler.js';\nimport type { FormattedValidationError } from './FormattedValidationError.js';\nimport type { HttpErrorHandlerOptions } from './HttpErrorHandlerOptions.js';\nimport type { HttpErrorLike } from './HttpErrorLike.js';\nimport type { PayloadTooLargeError } from './PayloadTooLargeError.js';\nimport type { ValidationError } from './ValidationError.js';\n\nimport { HttpRouteStatusEnum } from '../../../contracts/ui/index.js';\n\nexport class HttpErrorHandler implements ExpressErrorMiddlewareInterface {\n private readonly handlers: readonly ErrorResponseHandler[];\n\n private readonly exposeUnhandledErrorsIn: readonly string[];\n\n constructor(private readonly options: HttpErrorHandlerOptions = {}) {\n this.handlers = options.handlers ?? [];\n this.exposeUnhandledErrorsIn = options.exposeUnhandledErrorsIn ?? [\n 'local',\n 'test',\n ];\n }\n\n private formatValidationErrors(\n errors: readonly ValidationError[],\n ): FormattedValidationError[] {\n return errors.flatMap((error) => {\n if (error.children && error.children.length > 0) {\n return this.formatValidationErrors(error.children);\n }\n\n return [\n {\n details: error.constraints,\n property: error.property,\n value: error.value,\n },\n ];\n });\n }\n\n private getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private getHttpStatus(error: HttpErrorLike): number | undefined {\n return error.httpCode ?? error.statusCode ?? error.status;\n }\n\n private isPayloadTooLargeError(error: PayloadTooLargeError): boolean {\n return (\n error.type === 'entity.too.large' ||\n this.getHttpStatus(error) === HttpRouteStatusEnum.PAYLOAD_TOO_LARGE\n );\n }\n\n private logUnhandledError(error: Error): void {\n this.options.logger?.error(`Unhandled error: ${error.message}`);\n this.options.logger?.debug(error.stack ?? 'No stack trace available');\n }\n\n private handleSyntaxError(error: Error, response: Response): boolean {\n if (!(error instanceof SyntaxError)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.BAD_REQUEST).json({\n code: 'SyntaxError',\n message: 'Malformed JSON',\n });\n\n return true;\n }\n\n private handlePayloadTooLargeError(\n error: Error,\n response: Response,\n ): boolean {\n if (!this.isPayloadTooLargeError(error)) {\n return false;\n }\n\n response.status(HttpRouteStatusEnum.PAYLOAD_TOO_LARGE).json({\n code: 'PayloadTooLargeError',\n httpStatus: HttpRouteStatusEnum.PAYLOAD_TOO_LARGE,\n message: 'Request entity too large.',\n });\n\n return true;\n }\n\n private handleHttpError(error: Error, response: Response): boolean {\n const httpError = error as HttpErrorLike;\n const httpStatus = this.getHttpStatus(httpError);\n\n if (!httpStatus && !(error instanceof HttpError)) {\n return false;\n }\n\n response\n .status(httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR)\n .json({\n code: error.name,\n errors: this.formatValidationErrors(\n (error as ErrorExplanation).errors ?? [],\n ),\n httpStatus: httpStatus ?? HttpRouteStatusEnum.INTERNAL_SERVER_ERROR,\n message: error.message,\n });\n\n return true;\n }\n\n private handleUnhandledError(error: Error, response: Response): void {\n if (this.exposeUnhandledErrorsIn.includes(process.env.NODE_ENV ?? '')) {\n this.logUnhandledError(error);\n }\n\n response.status(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR).json({\n code:\n error.constructor.name ||\n String(HttpRouteStatusEnum.INTERNAL_SERVER_ERROR),\n message: error.message || 'Unknown error',\n });\n }\n\n public error(\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void {\n void request;\n\n const handlers: ErrorResponseHandler[] = [\n this.handleSyntaxError.bind(this),\n this.handlePayloadTooLargeError.bind(this),\n ...this.handlers,\n this.handleHttpError.bind(this),\n ];\n\n if (handlers.some((handler) => handler(error, response))) {\n return;\n }\n\n void next;\n\n this.handleUnhandledError(error, response);\n }\n\n public handle = (\n error: Error,\n request: Request,\n response: Response,\n next: NextFunction,\n ): void => {\n this.error(error, request, response, next);\n };\n}\n\nexport default HttpErrorHandler;\n","export const HttpRouteStatusEnum = {\n BAD_REQUEST: 400,\n CONFLICT: 409,\n CREATED: 201,\n DEPRECATED: 299,\n FORBIDDEN: 403,\n INTERNAL_SERVER_ERROR: 500,\n NO_CONTENT: 204,\n NOT_FOUND: 404,\n OK: 200,\n PAYLOAD_TOO_LARGE: 413,\n SERVICE_UNAVAILABLE: 503,\n TOO_MANY_REQUESTS: 429,\n UNAUTHORIZED: 401,\n UNPROCESSABLE_ENTITY: 422,\n} as const;\n\nexport default HttpRouteStatusEnum;\n","export class RoutePrefix {\n private readonly value: string;\n\n public static fromEnvironment(value: string | undefined): RoutePrefix {\n return new RoutePrefix(value);\n }\n\n constructor(value: string | undefined) {\n if (!value || value === '/') {\n this.value = '';\n\n return;\n }\n\n const normalizedPrefix = value\n .trim()\n .replace(/^\\/+/, '')\n .replace(/\\/+$/, '');\n\n this.value = normalizedPrefix ? `/${normalizedPrefix}` : '';\n }\n\n public includes(requestPath: string): boolean {\n return (\n this.value.length > 0 &&\n (requestPath === this.value || requestPath.startsWith(`${this.value}/`))\n );\n }\n\n public isEmpty(): boolean {\n return this.value.length === 0;\n }\n\n public toString(): string {\n return this.value;\n }\n}\n"],"mappings":";AAGO,IAAM,4BAAN,MAAgC;AAAA,EAKrC,YACmB,QACjB,aACA;AAFiB;AAGjB,SAAK,cAAc,IAAI,IAAI,WAAW;AAAA,EACxC;AAAA,EAJmB;AAAA,EALF,sBAAsB,oBAAI,IAAgC;AAAA,EAE1D;AAAA,EAST,yBACN,iBACS;AACT,UAAM,aAAa;AAEnB,WAAO,IAAI,WAAW;AAAA,EACxB;AAAA,EAEQ,oBAAoB,iBAA6C;AACvE,UAAM,SAAS,KAAK,oBAAoB,IAAI,eAAe;AAE3D,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,yBAAyB,eAAe;AAE9D,SAAK,oBAAoB,IAAI,iBAAiB,QAAQ;AAEtD,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,iBAA6C;AACrE,WAAO,KAAK,YAAY,IAAI,eAAe;AAAA,EAC7C;AAAA,EAEQ,kBAAkB,iBAA6C;AACrE,WAAO,KAAK,OAAO,GAAG,aAAa,eAAe,MAAM;AAAA,EAC1D;AAAA,EAEO,IAAI,iBAA6C;AACtD,QAAI,CAAC,KAAK,kBAAkB,eAAe,GAAG;AAC5C,UAAI,KAAK,kBAAkB,eAAe,GAAG;AAC3C,eAAO,KAAK,oBAAoB,eAAe;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,OAAO,GAAG,WAAW,eAAe;AAAA,EAClD;AACF;;;ACtDA,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAWV,IAAM,sBAAN,MAA0B;AAAA,EAyB/B,YAA6B,SAAqC;AAArC;AAC3B,SAAK,wBAAwB,KAAK,KAAK,QAAQ,qBAAqB;AACpE,SAAK,yBAAyB,KAAK,KAAK,QAAQ,sBAAsB;AACtE,SAAK,cAAc,KAAK,KAAK,QAAQ,WAAW;AAChD,SAAK,gBAAgB,KAAK,KAAK,QAAQ,aAAa;AACpD,SAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK;AACpC,SAAK,cAAc,KAAK,KAAK,QAAQ,WAAW;AAChD,SAAK,4BAA4B,KAAK;AAAA,MACpC,QAAQ;AAAA,IACV;AACA,SAAK,2BAA2B,KAAK,KAAK,QAAQ,wBAAwB;AAAA,EAC5E;AAAA,EAX6B;AAAA,EAxBZ,qBAAqB;AAAA,IACpC,KAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc;AAAA,EAC5C;AAAA,EAEiB;AAAA,EAET;AAAA,EAES;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAET;AAAA,EAeA,KAAW,OAAmC;AACpD,WAAO,CAAC,GAAI,SAAS,CAAC,CAAE;AAAA,EAC1B;AAAA,EAEQ,6BACN,aACM;AACN,UAAM,EAAE,aAAa,IAAI,KAAK,sBAAsB;AACpD,UAAM,WAAW,IAAI;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb;AAAA,IACF;AAEA;AAAA,MACE;AAAA,QACE,KAAK,CAAI,oBACP,SAAS,IAAI,eAA+C;AAAA,MAChE;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,kBAAkB;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAuC;AAC7C,WAAO,KAAK,mBAAmB,SAAS;AAAA,EAC1C;AAAA,EAEQ,wBAGN;AACA,WAAO,KAAK,mBAAmB,qBAAqB;AAAA,EAItD;AAAA,EAEQ,mBAAmB,KAAoB;AAC7C,UAAM,WACJ,KAAK,cAAc,SAAS,IACxB,KAAK,gBACL,CAAC,KAAK,oBAAoB,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,UAAI,IAAI,OAAO;AAAA,IACjB;AAAA,EACF;AAAA,EAEQ,sBAA2C;AACjD,WAAO,CAAC,OAAO,SAAS,UAAU,SAAS;AACzC,WAAK;AAEL,UAAI,SAAS,aAAa;AACxB,aAAK,KAAK;AAEV;AAAA,MACF;AAEA,eAAS,OAAO,GAAG,EAAE,KAAK;AAAA,QACxB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,SACZ,OACA,KACe;AACf,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,GAAG;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAc,cACZ,OACA,KACe;AACf,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,KAAK,UAAU,OAAO;AACxB,cAAM,KAAK,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBACN,KACA,aACM;AACN,eAAW,cAAc,aAAa;AACpC,UAAI,IAAI,UAAU;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,IAAW,MAAe;AACxB,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,SAAqB;AAC9B,QAAI,CAAC,KAAK,gBAAgB;AACxB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,2BAAiC;AACvC,QAAI,KAAK,gBAAgB;AACvB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAAA,EACF;AAAA,EAEO,QAAuB;AAC5B,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,gBAAgB,MAAM,CAAC,UAAkB;AAC5C,YAAI,OAAO;AACT,iBAAO,KAAK;AAEZ;AAAA,QACF;AAEA,aAAK,iBAAiB;AACtB,aAAK,cAAc;AACnB,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEO,iCACF,OACG;AACN,SAAK,yBAAyB;AAC9B,SAAK,uBAAuB,KAAK,GAAG,KAAK;AAEzC,WAAO;AAAA,EACT;AAAA,EAEO,kCACF,OACG;AACN,SAAK,yBAAyB;AAC9B,SAAK,wBAAwB,KAAK,GAAG,KAAK;AAE1C,WAAO;AAAA,EACT;AAAA,EAEO,uBAAuB,aAAwC;AACpE,SAAK,yBAAyB;AAC9B,SAAK,YAAY,KAAK,GAAG,WAAW;AAEpC,WAAO;AAAA,EACT;AAAA,EAEO,yBAAyB,UAAuC;AACrE,SAAK,yBAAyB;AAC9B,SAAK,cAAc,KAAK,GAAG,QAAQ;AAEnC,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,OAAiC;AACvD,SAAK,yBAAyB;AAC9B,SAAK,MAAM,KAAK,GAAG,KAAK;AAExB,WAAO;AAAA,EACT;AAAA,EAEO,uBAAuB,aAAqC;AACjE,SAAK,yBAAyB;AAC9B,SAAK,YAAY,KAAK,GAAG,WAAW;AAEpC,WAAO;AAAA,EACT;AAAA,EAEO,qCACF,aACG;AACN,SAAK,yBAAyB;AAC9B,SAAK,0BAA0B,KAAK,GAAG,WAAW;AAElD,WAAO;AAAA,EACT;AAAA,EAEO,oCACF,aACG;AACN,SAAK,yBAAyB;AAC9B,SAAK,yBAAyB,KAAK,GAAG,WAAW;AAEjD,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,MAAqB;AAChC,QAAI,KAAK,gBAAgB;AACvB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,UAAM,cAAmC;AAAA,MACvC,GAAG,KAAK,QAAQ,OAAO,UAAU;AAAA,MACjC,GAAG,KAAK;AAAA,IACV;AACA,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,EAAE,iBAAiB,IAAI,KAAK,sBAAsB;AACxD,UAAM,MAAM,QAAQ;AAEpB,SAAK,iBAAiB,KAAK,KAAK,WAAW;AAC3C,SAAK,iBAAiB,KAAK,KAAK,wBAAwB;AACxD,UAAM,KAAK,SAAS,KAAK,wBAAwB,GAAG;AACpD,UAAM,KAAK,cAAc,qBAAqB,GAAG;AACjD,SAAK,6BAA6B,WAAW;AAC7C,qBAAiB,KAAK;AAAA,MACpB,GAAG,KAAK,QAAQ;AAAA,MAChB;AAAA,MACA,aAAa,KAAK,QAAQ;AAAA,IAC5B,CAAC;AACD,SAAK,iBAAiB,KAAK,KAAK,yBAAyB;AACzD,UAAM,KAAK,SAAS,KAAK,uBAAuB,GAAG;AACnD,UAAM,KAAK,cAAc,oBAAoB,GAAG;AAChD,UAAM,KAAK,cAAc,gBAAgB,GAAG;AAE5C,SAAK,mBAAmB,GAAG;AAC3B,SAAK,cAAc;AAEnB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,iBAAiB,IAAI,OAAO,KAAK,QAAQ,QAAQ,KAAM,MAAM;AAChE,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AChSA;AAAA,EAEE;AAAA,OACK;;;ACLA,IAAM,sBAAsB;AAAA,EACjC,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,sBAAsB;AACxB;;;ADEO,IAAM,mBAAN,MAAkE;AAAA,EAKvE,YAA6B,UAAmC,CAAC,GAAG;AAAvC;AAC3B,SAAK,WAAW,QAAQ,YAAY,CAAC;AACrC,SAAK,0BAA0B,QAAQ,2BAA2B;AAAA,MAChE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAN6B;AAAA,EAJZ;AAAA,EAEA;AAAA,EAUT,uBACN,QAC4B;AAC5B,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,UAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,eAAO,KAAK,uBAAuB,MAAM,QAAQ;AAAA,MACnD;AAEA,aAAO;AAAA,QACL;AAAA,UACE,SAAS,MAAM;AAAA,UACf,UAAU,MAAM;AAAA,UAChB,OAAO,MAAM;AAAA,QACf;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB,OAAwB;AAC9C,WAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAC9D;AAAA,EAEQ,cAAc,OAA0C;AAC9D,WAAO,MAAM,YAAY,MAAM,cAAc,MAAM;AAAA,EACrD;AAAA,EAEQ,uBAAuB,OAAsC;AACnE,WACE,MAAM,SAAS,sBACf,KAAK,cAAc,KAAK,MAAM,oBAAoB;AAAA,EAEtD;AAAA,EAEQ,kBAAkB,OAAoB;AAC5C,SAAK,QAAQ,QAAQ,MAAM,oBAAoB,MAAM,OAAO,EAAE;AAC9D,SAAK,QAAQ,QAAQ,MAAM,MAAM,SAAS,0BAA0B;AAAA,EACtE;AAAA,EAEQ,kBAAkB,OAAc,UAA6B;AACnE,QAAI,EAAE,iBAAiB,cAAc;AACnC,aAAO;AAAA,IACT;AAEA,aAAS,OAAO,oBAAoB,WAAW,EAAE,KAAK;AAAA,MACpD,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,2BACN,OACA,UACS;AACT,QAAI,CAAC,KAAK,uBAAuB,KAAK,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,aAAS,OAAO,oBAAoB,iBAAiB,EAAE,KAAK;AAAA,MAC1D,MAAM;AAAA,MACN,YAAY,oBAAoB;AAAA,MAChC,SAAS;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,OAAc,UAA6B;AACjE,UAAM,YAAY;AAClB,UAAM,aAAa,KAAK,cAAc,SAAS;AAE/C,QAAI,CAAC,cAAc,EAAE,iBAAiB,YAAY;AAChD,aAAO;AAAA,IACT;AAEA,aACG,OAAO,cAAc,oBAAoB,qBAAqB,EAC9D,KAAK;AAAA,MACJ,MAAM,MAAM;AAAA,MACZ,QAAQ,KAAK;AAAA,QACV,MAA2B,UAAU,CAAC;AAAA,MACzC;AAAA,MACA,YAAY,cAAc,oBAAoB;AAAA,MAC9C,SAAS,MAAM;AAAA,IACjB,CAAC;AAEH,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,OAAc,UAA0B;AACnE,QAAI,KAAK,wBAAwB,SAAS,QAAQ,IAAI,YAAY,EAAE,GAAG;AACrE,WAAK,kBAAkB,KAAK;AAAA,IAC9B;AAEA,aAAS,OAAO,oBAAoB,qBAAqB,EAAE,KAAK;AAAA,MAC9D,MACE,MAAM,YAAY,QAClB,OAAO,oBAAoB,qBAAqB;AAAA,MAClD,SAAS,MAAM,WAAW;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEO,MACL,OACA,SACA,UACA,MACM;AACN,SAAK;AAEL,UAAM,WAAmC;AAAA,MACvC,KAAK,kBAAkB,KAAK,IAAI;AAAA,MAChC,KAAK,2BAA2B,KAAK,IAAI;AAAA,MACzC,GAAG,KAAK;AAAA,MACR,KAAK,gBAAgB,KAAK,IAAI;AAAA,IAChC;AAEA,QAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,QAAQ,CAAC,GAAG;AACxD;AAAA,IACF;AAEA,SAAK;AAEL,SAAK,qBAAqB,OAAO,QAAQ;AAAA,EAC3C;AAAA,EAEO,SAAS,CACd,OACA,SACA,UACA,SACS;AACT,SAAK,MAAM,OAAO,SAAS,UAAU,IAAI;AAAA,EAC3C;AACF;;;AErKO,IAAM,cAAN,MAAM,aAAY;AAAA,EACN;AAAA,EAEjB,OAAc,gBAAgB,OAAwC;AACpE,WAAO,IAAI,aAAY,KAAK;AAAA,EAC9B;AAAA,EAEA,YAAY,OAA2B;AACrC,QAAI,CAAC,SAAS,UAAU,KAAK;AAC3B,WAAK,QAAQ;AAEb;AAAA,IACF;AAEA,UAAM,mBAAmB,MACtB,KAAK,EACL,QAAQ,QAAQ,EAAE,EAClB,QAAQ,QAAQ,EAAE;AAErB,SAAK,QAAQ,mBAAmB,IAAI,gBAAgB,KAAK;AAAA,EAC3D;AAAA,EAEO,SAAS,aAA8B;AAC5C,WACE,KAAK,MAAM,SAAS,MACnB,gBAAgB,KAAK,SAAS,YAAY,WAAW,GAAG,KAAK,KAAK,GAAG;AAAA,EAE1E;AAAA,EAEO,UAAmB;AACxB,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA,EAEO,WAAmB;AACxB,WAAO,KAAK;AAAA,EACd;AACF;","names":[]}
@@ -104,7 +104,6 @@ var DependencyInjection = class _DependencyInjection {
104
104
  }
105
105
  options;
106
106
  static configuredInstance;
107
- autowire;
108
107
  loader;
109
108
  container;
110
109
  overrideTokenIds = /* @__PURE__ */ new Map();
@@ -272,14 +271,31 @@ var DependencyInjection = class _DependencyInjection {
272
271
  this.applyValueOverride(override);
273
272
  }
274
273
  }
275
- async processAutowire() {
274
+ trackAutowireAliasIds(autowire) {
275
+ const internals = autowire;
276
+ const createServiceId = internals._getLegacyServiceId.bind(autowire);
277
+ const aliasIds = /* @__PURE__ */ new Set();
278
+ internals._getLegacyServiceId = async (...args) => {
279
+ const id = await createServiceId(...args);
280
+ if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {
281
+ aliasIds.add(id);
282
+ }
283
+ return id;
284
+ };
285
+ return aliasIds;
286
+ }
287
+ async processAutowire(autowire) {
276
288
  const previousLogger = this.container.logger;
289
+ const autowireAliasIds = this.trackAutowireAliasIds(autowire);
277
290
  this.container.logger = new AutowireWarningFilter(previousLogger);
278
291
  try {
279
- await this.autowire?.process();
292
+ await autowire.process();
280
293
  } finally {
281
294
  this.container.logger = previousLogger;
282
295
  }
296
+ for (const id of autowireAliasIds) {
297
+ this.aliases.delete(id);
298
+ }
283
299
  }
284
300
  registerParentAliases() {
285
301
  for (const [id, definition] of this.definitions.entries()) {
@@ -292,12 +308,12 @@ var DependencyInjection = class _DependencyInjection {
292
308
  async compile() {
293
309
  if (this.options.containerBuild) {
294
310
  await this.ensureFolderExists(this.options.servicesYamlPath);
295
- this.autowire = new import_node_dependency_injection.Autowire(this.container);
296
- this.autowire.serviceFile = new import_node_dependency_injection.ServiceFile(
311
+ const autowire = new import_node_dependency_injection.Autowire(this.container);
312
+ autowire.serviceFile = new import_node_dependency_injection.ServiceFile(
297
313
  this.options.servicesYamlPath,
298
314
  false
299
315
  );
300
- await this.processAutowire();
316
+ await this.processAutowire(autowire);
301
317
  } else {
302
318
  this.loader = new import_node_dependency_injection.YamlFileLoader(this.container);
303
319
  await this.loader.load(this.options.servicesYamlPath);