@haskou/ddd-kernel 3.0.1 → 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 (56) hide show
  1. package/README.md +1 -1
  2. package/dist/{RetryPredicate-DG6jcGCX.d.ts → RetryPredicate-BR91-irp.d.ts} +3 -5
  3. package/dist/{RetryPredicate-BKlKFvI4.d.cts → RetryPredicate-Drg7hU3-.d.cts} +3 -5
  4. package/dist/adapters/index.cjs +7 -30
  5. package/dist/adapters/index.cjs.map +1 -1
  6. package/dist/adapters/index.d.cts +1 -1
  7. package/dist/adapters/index.d.ts +1 -1
  8. package/dist/adapters/index.js +7 -30
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/adapters/pubsub/amqp/index.cjs +2 -2
  11. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  12. package/dist/adapters/pubsub/amqp/index.js +2 -2
  13. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  14. package/dist/adapters/pubsub/index.cjs +7 -24
  15. package/dist/adapters/pubsub/index.cjs.map +1 -1
  16. package/dist/adapters/pubsub/index.d.cts +1 -4
  17. package/dist/adapters/pubsub/index.d.ts +1 -4
  18. package/dist/adapters/pubsub/index.js +7 -24
  19. package/dist/adapters/pubsub/index.js.map +1 -1
  20. package/dist/adapters/ui/express/index.cjs +0 -6
  21. package/dist/adapters/ui/express/index.cjs.map +1 -1
  22. package/dist/adapters/ui/express/index.d.cts +0 -10
  23. package/dist/adapters/ui/express/index.d.ts +0 -10
  24. package/dist/adapters/ui/express/index.js +0 -6
  25. package/dist/adapters/ui/express/index.js.map +1 -1
  26. package/dist/adapters/ui/index.cjs +2 -8
  27. package/dist/adapters/ui/index.cjs.map +1 -1
  28. package/dist/adapters/ui/index.js +2 -8
  29. package/dist/adapters/ui/index.js.map +1 -1
  30. package/dist/adapters/ui/routes/index.cjs +2 -2
  31. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  32. package/dist/adapters/ui/routes/index.js +2 -2
  33. package/dist/adapters/ui/routes/index.js.map +1 -1
  34. package/dist/contracts/index.d.cts +1 -1
  35. package/dist/contracts/index.d.ts +1 -1
  36. package/dist/contracts/kernel/index.d.cts +1 -1
  37. package/dist/contracts/kernel/index.d.ts +1 -1
  38. package/dist/index.cjs +2 -2
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +2 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/infrastructure/dependency-injection/index.cjs +2 -2
  45. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
  46. package/dist/infrastructure/dependency-injection/index.js +2 -2
  47. package/dist/infrastructure/dependency-injection/index.js.map +1 -1
  48. package/dist/infrastructure/express/index.cjs +0 -6
  49. package/dist/infrastructure/express/index.cjs.map +1 -1
  50. package/dist/infrastructure/express/index.js +0 -6
  51. package/dist/infrastructure/express/index.js.map +1 -1
  52. package/dist/infrastructure/scheduler/index.cjs +2 -2
  53. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  54. package/dist/infrastructure/scheduler/index.js +2 -2
  55. package/dist/infrastructure/scheduler/index.js.map +1 -1
  56. 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"]}
@@ -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":"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","names":[]}
@@ -273,10 +273,10 @@ var DependencyInjection = class _DependencyInjection {
273
273
  }
274
274
  trackAutowireAliasIds(autowire) {
275
275
  const internals = autowire;
276
- const createLegacyServiceId = internals._getLegacyServiceId.bind(autowire);
276
+ const createServiceId = internals._getLegacyServiceId.bind(autowire);
277
277
  const aliasIds = /* @__PURE__ */ new Set();
278
278
  internals._getLegacyServiceId = async (...args) => {
279
- const id = await createLegacyServiceId(...args);
279
+ const id = await createServiceId(...args);
280
280
  if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {
281
281
  aliasIds.add(id);
282
282
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/infrastructure/scheduler/index.ts","../../../src/Kernel.ts","../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../src/infrastructure/dependency-injection/AutowireWarningFilter.ts","../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../src/kernel/KernelEnvironmentValidationError.ts","../../../src/infrastructure/scheduler/ScheduledExecutionError.ts","../../../src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts","../../../src/infrastructure/scheduler/InvalidParseCronExpressionError.ts","../../../src/infrastructure/scheduler/Scheduler.ts"],"sourcesContent":["export * from './CronExpression.js';\nexport * from './DefaultSchedulerErrorPolicy.js';\nexport * from './InvalidParseCronExpressionError.js';\nexport * from './ScheduledExecutionError.js';\nexport * from './Scheduler.js';\nexport * from './SchedulerErrorPolicy.js';\nexport { default } from './Scheduler.js';\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type {\n ConsumerMiddleware,\n KernelConsumer,\n KernelLogger,\n KernelRoute,\n ShutdownHook,\n} from './contracts/index.js';\nimport type { ServiceClass } from './infrastructure/dependency-injection/index.js';\nimport type { Initializer, Runtime } from './infrastructure/lifecycle/index.js';\nimport type { Scheduler } from './infrastructure/scheduler/index.js';\nimport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nimport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nimport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nimport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nimport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nimport type { KernelOptions } from './kernel/KernelOptions.js';\nimport type { ShutdownCandidate } from './kernel/ShutdownCandidate.js';\n\nimport { ConsoleKernelLogger } from './adapters/kernel/index.js';\nimport { DependencyInjection } from './infrastructure/dependency-injection/index.js';\nimport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nexport type { KernelDefaultEnvironment } from './kernel/KernelDefaultEnvironment.js';\nexport type { KernelEnvironment } from './kernel/KernelEnvironment.js';\nexport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nexport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nexport type { KernelEnvironmentSchemaInput } from './kernel/KernelEnvironmentSchemaInput.js';\nexport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nexport type { KernelEnvironmentVariableDefinition } from './kernel/KernelEnvironmentVariableDefinition.js';\nexport type { KernelEnvironmentVariablePrimitive } from './kernel/KernelEnvironmentVariablePrimitive.js';\nexport type { KernelEnvironmentVariableResolvedValue } from './kernel/KernelEnvironmentVariableResolvedValue.js';\nexport type { KernelEnvironmentVariableType } from './kernel/KernelEnvironmentVariableType.js';\nexport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nexport type { KernelOptions } from './kernel/KernelOptions.js';\nexport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport class Kernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n> {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: KernelConsumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<KernelRoute>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n private environmentVariables =\n process.env as KernelEnvironmentForSchema<TEnvironmentSchema>;\n\n private static get state(): {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): KernelConsumer[] {\n return Kernel.getActiveKernel().consumers;\n }\n\n public static get consumerMiddleware(): ConsumerMiddleware[] {\n return Kernel.getActiveKernel().consumerMiddleware;\n }\n\n public static get di(): DependencyInjection {\n return Kernel.getActiveKernel().di;\n }\n\n public static get environment(): NodeJS.ProcessEnv {\n return process.env;\n }\n\n public static get logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\n }\n\n public static get active(): Kernel<KernelEnvironmentSchema | undefined> {\n return Kernel.getActiveKernel();\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<KernelRoute>[] {\n return Kernel.getActiveKernel().routes;\n }\n\n public static get schedulers(): Scheduler[] {\n return Kernel.getActiveKernel().schedulers;\n }\n\n public static get sourceDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'src');\n }\n\n private static getActiveKernel(): Kernel<\n KernelEnvironmentSchema | undefined\n > {\n if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n private static assertRequiredEnvironmentVariable(\n name: string,\n value: string | undefined,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value === undefined) {\n throw new KernelEnvironmentValidationError(\n `Missing required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertRequiredEnvironmentVariableIsNotBlank(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Blank required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertEnvironmentVariableChoice(\n name: string,\n value: KernelEnvironmentValue,\n schema: KernelEnvironmentSchema,\n ): void {\n const choices = schema[name]?.choices;\n\n if (choices && !choices.includes(value)) {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be one of: ${choices.join(', ')}.`,\n );\n }\n }\n\n private static getEnvironmentVariablesPath(\n environment: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n >,\n ): string {\n return path.resolve(\n Kernel.rootDirectory,\n options.path ?? (environment ? `.env.${environment}` : '.env'),\n );\n }\n\n private static parseBooleanEnvironmentVariable(\n name: string,\n value: string,\n ): boolean {\n if (['1', 'true', 'yes', 'on'].includes(value.toLowerCase())) {\n return true;\n }\n\n if (['0', 'false', 'no', 'off'].includes(value.toLowerCase())) {\n return false;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid boolean value \"${value}\".`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid number value \"${value}\".`,\n );\n }\n\n private static parseEnvironmentVariable(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): KernelEnvironmentValue {\n const definition = schema[name];\n\n if (definition.type === 'boolean') {\n const parsedValue = Kernel.parseBooleanEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n if (definition.type === 'number') {\n const parsedValue = Kernel.parseNumberEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n Kernel.assertEnvironmentVariableChoice(name, value, schema);\n\n return value;\n }\n\n private static getEnvironmentVariableValue(\n name: string,\n definition: KernelEnvironmentSchema[string],\n schema: KernelEnvironmentSchema,\n ): string | undefined {\n const value = process.env[name];\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);\n }\n\n if (value !== undefined && value.trim() !== '') {\n return value;\n }\n\n return definition.defaultValue?.toString();\n }\n\n private static shouldUnsetBlankOptionalEnvironmentVariable(\n name: string,\n value: string | undefined,\n valueOrDefault: string | undefined,\n schema: KernelEnvironmentSchema,\n ): boolean {\n return (\n value !== undefined &&\n value.trim() === '' &&\n valueOrDefault === undefined &&\n schema[name]?.required !== true\n );\n }\n\n private static validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<\n string,\n KernelEnvironmentValue | undefined\n > = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name];\n const valueOrDefault = Kernel.getEnvironmentVariableValue(\n name,\n definition,\n schema,\n );\n\n if (valueOrDefault !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n valueOrDefault,\n schema,\n );\n } else if (\n Kernel.shouldUnsetBlankOptionalEnvironmentVariable(\n name,\n value,\n valueOrDefault,\n schema,\n )\n ) {\n environmentVariables[name] = undefined;\n }\n }\n\n return {\n ...process.env,\n ...environmentVariables,\n } as KernelEnvironmentForSchema<TSchema>;\n }\n\n public static loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const environmentName = environment ?? process.env.NODE_ENV ?? 'local';\n\n const result = dotenv.config({\n override: options.override,\n path: Kernel.getEnvironmentVariablesPath(environmentName, options),\n });\n\n if (options.schema) {\n Kernel.validateEnvironmentVariables(options.schema);\n }\n\n return result;\n }\n\n constructor(\n private readonly options: KernelOptions<TEnvironmentSchema> = {},\n ) {\n this.loggerInstance = options.logger ?? new ConsoleKernelLogger();\n this.dependencyInjectionInstance = options.di;\n Kernel.state.activeKernel = this;\n }\n\n private async closeCandidate(candidate: ShutdownCandidate): Promise<void> {\n if (candidate.shutdown) {\n await candidate.shutdown();\n\n return;\n }\n\n if (candidate.close) {\n await candidate.close();\n\n return;\n }\n\n if (candidate.stop) {\n await candidate.stop();\n\n return;\n }\n\n if (candidate.flush) {\n await candidate.flush();\n }\n }\n\n private getConsumerFromClass(\n ClassDefinition: ServiceClass<KernelConsumer>,\n ): KernelConsumer {\n return this.di.getService<KernelConsumer>(ClassDefinition);\n }\n\n private getInitializerFromClass(\n ClassDefinition: ServiceClass<Initializer>,\n ): Initializer {\n return this.di.getService<Initializer>(ClassDefinition);\n }\n\n private getRuntimeFromClass(ClassDefinition: ServiceClass<Runtime>): Runtime {\n return this.di.getService<Runtime>(ClassDefinition);\n }\n\n private getSchedulerFromClass(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Scheduler {\n return this.di.getService<Scheduler>(ClassDefinition);\n }\n\n public get consumers(): KernelConsumer[] {\n return this.consumersList;\n }\n\n public get consumerMiddleware(): ConsumerMiddleware[] {\n return this.consumerMiddlewares;\n }\n\n public get di(): DependencyInjection {\n if (!this.dependencyInjectionInstance) {\n throw new Error('Kernel dependency injection has not been initialized.');\n }\n\n return this.dependencyInjectionInstance;\n }\n\n public get environment(): KernelEnvironmentForSchema<TEnvironmentSchema> {\n return this.environmentVariables;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<KernelRoute>[] {\n return this.routesList;\n }\n\n public get schedulers(): Scheduler[] {\n return this.schedulersList;\n }\n\n private getDependencyInjectionOptions(\n options: KernelDependencyInjectionOptions = {},\n ): Required<KernelDependencyInjectionOptions> {\n return {\n containerBuild:\n options.containerBuild ?? process.env.CONTAINER_BUILD === 'true',\n overrides: options.overrides ?? [],\n servicesYamlPath:\n options.servicesYamlPath ??\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory:\n options.sourceDirectory ??\n this.options.sourceDirectory ??\n Kernel.sourceDirectory,\n };\n }\n\n public async dependencyInjection(\n options: KernelDependencyInjectionOptions = {},\n ): Promise<void> {\n Kernel.state.activeKernel = this;\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure(\n this.getDependencyInjectionOptions(options),\n );\n\n await this.dependencyInjectionInstance.compile();\n Kernel.state.activeKernel = this;\n }\n\n public loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const result = Kernel.loadEnvironmentVariables(environment, {\n ...options,\n schema: options.schema ?? this.options.environmentSchema,\n });\n\n this.environmentVariables = this.options.environmentSchema\n ? Kernel.validateEnvironmentVariables(this.options.environmentSchema)\n : (process.env as KernelEnvironmentForSchema<TEnvironmentSchema>);\n\n return result;\n }\n\n public getRoutes(): ServiceClass<KernelRoute>[] {\n return this.routes;\n }\n\n public registerConsumerMiddleware(\n ...middlewares: ConsumerMiddleware[]\n ): void {\n this.consumerMiddlewares.push(...middlewares);\n }\n\n public registerConsumers(\n ...ClassDefinitions: ServiceClass<KernelConsumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: KernelConsumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(\n ...ClassDefinitions: ServiceClass<KernelRoute>[]\n ): void {\n this.routesList.push(...ClassDefinitions);\n }\n\n public registerSchedulers(\n ...ClassDefinitions: ServiceClass<Scheduler>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));\n }\n }\n\n public registerSchedulerInstances(...schedulers: Scheduler[]): void {\n this.schedulersList.push(...schedulers);\n }\n\n public registerShutdownHook(hook: ShutdownHook): void {\n this.shutdownHooks.push(hook);\n }\n\n public removeConsumers(): void {\n this.consumersList.length = 0;\n }\n\n public removeRoutes(): void {\n this.routesList.length = 0;\n }\n\n public removeSchedulers(): void {\n this.schedulersList.length = 0;\n }\n\n public async runConsumers(): Promise<void> {\n for (const consumer of this.consumersList) {\n await consumer.init();\n }\n }\n\n public async runInitializers(\n ...ClassDefinitions: ServiceClass<Initializer>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n await this.getInitializerFromClass(ClassDefinition).ensure();\n }\n }\n\n public async runRuntimes(\n ...ClassDefinitions: ServiceClass<Runtime>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n const runtime = this.getRuntimeFromClass(ClassDefinition);\n\n await runtime.run();\n this.registerShutdownHook(() =>\n this.closeCandidate(runtime as ShutdownCandidate),\n );\n }\n }\n\n public async runSchedulerNowAndSchedule(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Promise<void> {\n const scheduler = this.getSchedulerFromClass(ClassDefinition);\n\n await scheduler.runOnce();\n await scheduler.init();\n this.schedulersList.push(scheduler);\n }\n\n public async runSchedulers(): Promise<void> {\n for (const scheduler of this.schedulersList) {\n await scheduler.init();\n }\n }\n\n public async shutdown(): Promise<void> {\n for (const consumer of [...this.consumersList].reverse()) {\n await this.closeCandidate(consumer as ShutdownCandidate);\n }\n\n for (const scheduler of [...this.schedulersList].reverse()) {\n await this.closeCandidate(scheduler as ShutdownCandidate);\n }\n\n for (const hook of [...this.shutdownHooks].reverse()) {\n await hook();\n }\n\n await this.closeCandidate(this.loggerInstance as ShutdownCandidate);\n }\n}\n\nexport function createKernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n>(options?: KernelOptions<TEnvironmentSchema>): Kernel<TEnvironmentSchema> {\n return new Kernel(options);\n}\n\nexport default Kernel;\n","import type { KernelLogger } from '../../../contracts/index.js';\n\nexport class ConsoleKernelLogger implements KernelLogger {\n public debug(message: string): void {\n // eslint-disable-next-line no-console\n console.debug(message);\n }\n\n public error(message: string): void {\n // eslint-disable-next-line no-console\n console.error(message);\n }\n\n public info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(message);\n }\n\n public warn(message: string): void {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n","import type { Logger } from 'node-dependency-injection';\n\nexport class AutowireWarningFilter implements Logger {\n constructor(private readonly logger: Logger) {}\n\n private isIgnorableAutowireWarning(message: string): boolean {\n return (\n message.startsWith(\n 'Autowire: file has export default declaration but no runtime default export:',\n ) ||\n message.startsWith('Autowire: failed to create definition for undefined:')\n );\n }\n\n public warn(message?: unknown, ...optionalParams: unknown[]): void {\n if (\n typeof message === 'string' &&\n this.isIgnorableAutowireWarning(message)\n ) {\n this.logger.debug?.(`Ignored ${message}`, ...optionalParams);\n\n return;\n }\n\n this.logger.warn(message, ...optionalParams);\n }\n\n public info(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.info?.(message, ...optionalParams);\n }\n\n public debug(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.debug?.(message, ...optionalParams);\n }\n}\n","import fs from 'fs-extra';\nimport {\n Autowire,\n ContainerBuilder,\n ServiceFile,\n YamlFileLoader,\n} from 'node-dependency-injection';\nimport path from 'node:path';\n\nimport type { ServiceResolver } from '../../contracts/index.js';\nimport type { AutowireInternals } from './AutowireInternals.js';\nimport type { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nimport { AutowireWarningFilter } from './AutowireWarningFilter.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private loader: YamlFileLoader | undefined;\n private readonly container: ContainerBuilder;\n private readonly overrideTokenIds = new Map<unknown, string>();\n\n public static configure(\n options: DependencyInjectionOptions,\n ): DependencyInjection {\n DependencyInjection.configuredInstance = new DependencyInjection(options);\n\n return DependencyInjection.configuredInstance;\n }\n\n public static get instance(): DependencyInjection {\n if (!DependencyInjection.configuredInstance) {\n throw new Error('DependencyInjection has not been configured.');\n }\n\n return DependencyInjection.configuredInstance;\n }\n\n constructor(\n private readonly options: DependencyInjectionOptions = {\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath: path.resolve(\n process.cwd(),\n 'config',\n 'container',\n 'services.yaml',\n ),\n sourceDirectory: path.resolve(process.cwd(), 'src'),\n },\n ) {\n this.container = new ContainerBuilder(false, this.options.sourceDirectory);\n }\n\n private get definitions(): Map<string, DefinitionMetadata> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._definitions || new Map();\n }\n\n private get aliases(): Map<string, string> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._alias || new Map();\n }\n\n private async ensureFolderExists(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n }\n\n private getServiceClassName(serviceName: unknown): string | undefined {\n return typeof serviceName === 'function' ? serviceName.name : undefined;\n }\n\n private getOverrideId(prefix: string, token: unknown): string {\n const tokenName = this.getServiceClassName(token) ?? String(token);\n\n return `ddd-kernel.override.${prefix}.${tokenName}`;\n }\n\n private hasDirectService(serviceName: unknown): boolean {\n return (\n typeof serviceName === 'string' &&\n (this.definitions.has(serviceName) || this.aliases.has(serviceName))\n );\n }\n\n private ensureSyntheticService(id: string, value: unknown): void {\n const definition = this.container.register(id);\n\n definition.public = true;\n definition.synthetic = true;\n this.container.set(id, value);\n }\n\n private idNamesService(id: string, serviceClassName: string): boolean {\n return path.posix.basename(id) === serviceClassName;\n }\n\n private getReferenceId(value: unknown): string | undefined {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n typeof value.id === 'string'\n ) {\n return value.id;\n }\n\n return undefined;\n }\n\n private getDefinitionArgumentReferences(\n definition: DefinitionMetadata,\n ): string[] {\n return [\n ...(definition._args ?? []),\n ...(definition._appendArgs ?? []),\n ...(definition._overrideArgs ?? []),\n ].flatMap((argument) => {\n const referenceId = this.getReferenceId(argument);\n\n return referenceId ? [referenceId] : [];\n });\n }\n\n private findConcreteChildServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.entries()]\n .filter(([, definition]) => definition._abstract !== true)\n .filter(\n ([, definition]) =>\n definition._parent &&\n this.idNamesService(definition._parent, serviceClassName),\n )\n .map(([id]) => id);\n\n return matches[matches.length - 1];\n }\n\n private findRegisteredServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.keys()].filter((id) =>\n this.idNamesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findAliasServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.aliases.keys()].filter((id) =>\n this.idNamesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findReferencedServiceIds(serviceName: unknown): string[] {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return [];\n }\n\n return [\n ...new Set(\n [...this.definitions.values()]\n .flatMap((definition) =>\n this.getDefinitionArgumentReferences(definition),\n )\n .filter((id) => this.idNamesService(id, serviceClassName)),\n ),\n ];\n }\n\n private getOverrideTokenIds(token: unknown): string[] {\n const tokenIds = [\n this.findRegisteredServiceId(token),\n this.findAliasServiceId(token),\n ...this.findReferencedServiceIds(token),\n ].filter((id): id is string => id !== undefined);\n const existingTokenIds = [...new Set(tokenIds)];\n\n if (existingTokenIds.length > 0) {\n return existingTokenIds;\n }\n\n const overrideTokenId = this.getOverrideId('token', token);\n\n this.ensureSyntheticService(overrideTokenId, undefined);\n\n return [overrideTokenId];\n }\n\n private getOverrideClassServiceId(\n ClassDefinition: new () => unknown,\n ): string {\n const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);\n\n if (registeredServiceId) {\n return registeredServiceId;\n }\n\n const overrideClassId = this.getOverrideId('class', ClassDefinition);\n\n this.container.register(overrideClassId, ClassDefinition);\n\n return overrideClassId;\n }\n\n private applyClassOverride(override: DependencyOverride): void {\n if (!('useClass' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const classId = this.getOverrideClassServiceId(override.useClass);\n\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, classId);\n }\n }\n\n private applyFactoryOverride(override: DependencyOverride): void {\n if (!('useFactory' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const factoryId = this.getOverrideId('factory', override.token);\n\n this.ensureSyntheticService(factoryId, override.useFactory(this));\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, factoryId);\n }\n }\n\n private applyValueOverride(override: DependencyOverride): void {\n if (!('useValue' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const valueId = this.getOverrideId('value', override.token);\n\n this.ensureSyntheticService(valueId, override.useValue);\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, valueId);\n }\n }\n\n private applyOverrides(): void {\n for (const override of this.options.overrides ?? []) {\n this.applyClassOverride(override);\n this.applyFactoryOverride(override);\n this.applyValueOverride(override);\n }\n }\n\n private trackAutowireAliasIds(autowire: Autowire): Set<string> {\n const internals = autowire as unknown as AutowireInternals;\n const createLegacyServiceId = internals._getLegacyServiceId.bind(autowire);\n const aliasIds = new Set<string>();\n\n internals._getLegacyServiceId = async (...args) => {\n const id = await createLegacyServiceId(...args);\n\n if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {\n aliasIds.add(id);\n }\n\n return id;\n };\n\n return aliasIds;\n }\n\n private async processAutowire(autowire: Autowire): Promise<void> {\n const previousLogger = this.container.logger;\n const autowireAliasIds = this.trackAutowireAliasIds(autowire);\n\n this.container.logger = new AutowireWarningFilter(previousLogger);\n\n try {\n await autowire.process();\n } finally {\n this.container.logger = previousLogger;\n }\n\n for (const id of autowireAliasIds) {\n this.aliases.delete(id);\n }\n }\n\n private registerParentAliases(): void {\n for (const [id, definition] of this.definitions.entries()) {\n if (definition._abstract === true || !definition._parent) {\n continue;\n }\n\n this.container.setAlias(definition._parent, id);\n }\n }\n\n public async compile(): Promise<void> {\n if (this.options.containerBuild) {\n await this.ensureFolderExists(this.options.servicesYamlPath);\n const autowire = new Autowire(this.container);\n\n autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.processAutowire(autowire);\n } else {\n this.loader = new YamlFileLoader(this.container);\n await this.loader.load(this.options.servicesYamlPath);\n }\n\n this.registerParentAliases();\n this.applyOverrides();\n await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const overrideTokenId = this.overrideTokenIds.get(serviceName);\n\n if (overrideTokenId) {\n return this.container.get<T>(overrideTokenId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\n }\n\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const registeredServiceId = this.findRegisteredServiceId(serviceName);\n\n if (registeredServiceId) {\n return this.container.get<T>(registeredServiceId);\n }\n\n // NDI 4 types only string IDs, but still resolves constructors and validates other tokens at runtime.\n return this.container.get<T>(serviceName as string);\n }\n\n public hasService(serviceName: unknown): boolean {\n return (\n this.overrideTokenIds.has(serviceName) ||\n this.findAliasServiceId(serviceName) !== undefined ||\n this.findConcreteChildServiceId(serviceName) !== undefined ||\n this.findRegisteredServiceId(serviceName) !== undefined ||\n this.hasDirectService(serviceName)\n );\n }\n}\n\nexport default DependencyInjection;\n","export class KernelEnvironmentValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelEnvironmentValidationError';\n }\n}\n","export class ScheduledExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScheduledExecutionError';\n }\n}\n","import type { Scheduler } from './Scheduler.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { ScheduledExecutionError } from './ScheduledExecutionError.js';\n\nexport class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {\n public handle(error: unknown, scheduler: Scheduler): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scheduledError = new ScheduledExecutionError(\n `Error on ${scheduler.getProcessName()}: ${errorMessage}`,\n );\n\n Kernel.logger.error(scheduledError.message);\n }\n\n public shouldSkip(): boolean {\n return false;\n }\n}\n\nexport default DefaultSchedulerErrorPolicy;\n","export class InvalidParseCronExpressionError extends Error {\n constructor(processName: string) {\n super(`Invalid cron expression for scheduler \"${processName}\".`);\n this.name = 'InvalidParseCronExpressionError';\n }\n}\n","import { Flow, Semaphore } from '@haskou/flow';\nimport cron from 'node-cron';\n\nimport type { CronExpression } from './CronExpression.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { DefaultSchedulerErrorPolicy } from './DefaultSchedulerErrorPolicy.js';\nimport { InvalidParseCronExpressionError } from './InvalidParseCronExpressionError.js';\n\nexport abstract class Scheduler {\n private readonly executionSemaphore = new Semaphore(1);\n\n constructor(\n private readonly errorPolicy: SchedulerErrorPolicy = new DefaultSchedulerErrorPolicy(),\n ) {}\n\n public abstract execute(): Promise<void>;\n\n public abstract getCronExpression(): CronExpression;\n\n public abstract getProcessName(): string;\n\n private parseCronExpression(): string {\n const expression = this.getCronExpression();\n\n return (\n '' +\n `${expression.second ?? '*'} ` +\n `${expression.minute ?? '*'} ` +\n `${expression.hour ?? '*'} ` +\n `${expression.dayOfMonth ?? '*'} ` +\n `${expression.month ?? '*'} ` +\n `${expression.dayOfWeek ?? '*'}`\n );\n }\n\n public async runOnce(): Promise<void> {\n const permit = this.executionSemaphore.tryAcquire();\n\n if (permit === null) {\n return;\n }\n\n try {\n Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);\n await new Flow().task(() => this.execute()).run();\n } catch (error: unknown) {\n if (this.errorPolicy.shouldSkip(error)) {\n return;\n }\n\n await this.errorPolicy.handle(error, this);\n } finally {\n permit.release();\n }\n }\n\n public get<T>(service: unknown): T {\n return Kernel.di.getService<T>(service);\n }\n\n public init(): Promise<void> {\n let parsedCronExpression: string;\n\n try {\n parsedCronExpression = this.parseCronExpression();\n } catch {\n throw new InvalidParseCronExpressionError(this.getProcessName());\n }\n\n cron.schedule(parsedCronExpression, () => {\n void this.runOnce();\n });\n\n return Promise.resolve();\n }\n}\n\nexport default Scheduler;\n"],"mappings":"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","names":["import_node_path","path","fs","path","dotenv","cron"]}
1
+ {"version":3,"sources":["../../../src/infrastructure/scheduler/index.ts","../../../src/Kernel.ts","../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../src/infrastructure/dependency-injection/AutowireWarningFilter.ts","../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../src/kernel/KernelEnvironmentValidationError.ts","../../../src/infrastructure/scheduler/ScheduledExecutionError.ts","../../../src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts","../../../src/infrastructure/scheduler/InvalidParseCronExpressionError.ts","../../../src/infrastructure/scheduler/Scheduler.ts"],"sourcesContent":["export * from './CronExpression.js';\nexport * from './DefaultSchedulerErrorPolicy.js';\nexport * from './InvalidParseCronExpressionError.js';\nexport * from './ScheduledExecutionError.js';\nexport * from './Scheduler.js';\nexport * from './SchedulerErrorPolicy.js';\nexport { default } from './Scheduler.js';\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type {\n ConsumerMiddleware,\n KernelConsumer,\n KernelLogger,\n KernelRoute,\n ShutdownHook,\n} from './contracts/index.js';\nimport type { ServiceClass } from './infrastructure/dependency-injection/index.js';\nimport type { Initializer, Runtime } from './infrastructure/lifecycle/index.js';\nimport type { Scheduler } from './infrastructure/scheduler/index.js';\nimport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nimport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nimport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nimport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nimport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nimport type { KernelOptions } from './kernel/KernelOptions.js';\nimport type { ShutdownCandidate } from './kernel/ShutdownCandidate.js';\n\nimport { ConsoleKernelLogger } from './adapters/kernel/index.js';\nimport { DependencyInjection } from './infrastructure/dependency-injection/index.js';\nimport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nexport type { KernelDefaultEnvironment } from './kernel/KernelDefaultEnvironment.js';\nexport type { KernelEnvironment } from './kernel/KernelEnvironment.js';\nexport type { KernelEnvironmentForSchema } from './kernel/KernelEnvironmentForSchema.js';\nexport type { KernelEnvironmentSchema } from './kernel/KernelEnvironmentSchema.js';\nexport type { KernelEnvironmentSchemaInput } from './kernel/KernelEnvironmentSchemaInput.js';\nexport type { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nexport type { KernelEnvironmentVariableDefinition } from './kernel/KernelEnvironmentVariableDefinition.js';\nexport type { KernelEnvironmentVariablePrimitive } from './kernel/KernelEnvironmentVariablePrimitive.js';\nexport type { KernelEnvironmentVariableResolvedValue } from './kernel/KernelEnvironmentVariableResolvedValue.js';\nexport type { KernelEnvironmentVariableType } from './kernel/KernelEnvironmentVariableType.js';\nexport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nexport type { KernelOptions } from './kernel/KernelOptions.js';\nexport { KernelEnvironmentValidationError } from './kernel/KernelEnvironmentValidationError.js';\n\nexport class Kernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n> {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: KernelConsumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<KernelRoute>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n private environmentVariables =\n process.env as KernelEnvironmentForSchema<TEnvironmentSchema>;\n\n private static get state(): {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as {\n activeKernel?: Kernel<KernelEnvironmentSchema | undefined>;\n };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): KernelConsumer[] {\n return Kernel.getActiveKernel().consumers;\n }\n\n public static get consumerMiddleware(): ConsumerMiddleware[] {\n return Kernel.getActiveKernel().consumerMiddleware;\n }\n\n public static get di(): DependencyInjection {\n return Kernel.getActiveKernel().di;\n }\n\n public static get environment(): NodeJS.ProcessEnv {\n return process.env;\n }\n\n public static get logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\n }\n\n public static get active(): Kernel<KernelEnvironmentSchema | undefined> {\n return Kernel.getActiveKernel();\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<KernelRoute>[] {\n return Kernel.getActiveKernel().routes;\n }\n\n public static get schedulers(): Scheduler[] {\n return Kernel.getActiveKernel().schedulers;\n }\n\n public static get sourceDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'src');\n }\n\n private static getActiveKernel(): Kernel<\n KernelEnvironmentSchema | undefined\n > {\n if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n private static assertRequiredEnvironmentVariable(\n name: string,\n value: string | undefined,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value === undefined) {\n throw new KernelEnvironmentValidationError(\n `Missing required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertRequiredEnvironmentVariableIsNotBlank(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): void {\n if (schema[name]?.required === true && value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Blank required environment variable \"${name}\".`,\n );\n }\n }\n\n private static assertEnvironmentVariableChoice(\n name: string,\n value: KernelEnvironmentValue,\n schema: KernelEnvironmentSchema,\n ): void {\n const choices = schema[name]?.choices;\n\n if (choices && !choices.includes(value)) {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be one of: ${choices.join(', ')}.`,\n );\n }\n }\n\n private static getEnvironmentVariablesPath(\n environment: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n >,\n ): string {\n return path.resolve(\n Kernel.rootDirectory,\n options.path ?? (environment ? `.env.${environment}` : '.env'),\n );\n }\n\n private static parseBooleanEnvironmentVariable(\n name: string,\n value: string,\n ): boolean {\n if (['1', 'true', 'yes', 'on'].includes(value.toLowerCase())) {\n return true;\n }\n\n if (['0', 'false', 'no', 'off'].includes(value.toLowerCase())) {\n return false;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid boolean value \"${value}\".`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" has invalid number value \"${value}\".`,\n );\n }\n\n private static parseEnvironmentVariable(\n name: string,\n value: string,\n schema: KernelEnvironmentSchema,\n ): KernelEnvironmentValue {\n const definition = schema[name];\n\n if (definition.type === 'boolean') {\n const parsedValue = Kernel.parseBooleanEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n if (definition.type === 'number') {\n const parsedValue = Kernel.parseNumberEnvironmentVariable(name, value);\n\n Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);\n\n return parsedValue;\n }\n\n Kernel.assertEnvironmentVariableChoice(name, value, schema);\n\n return value;\n }\n\n private static getEnvironmentVariableValue(\n name: string,\n definition: KernelEnvironmentSchema[string],\n schema: KernelEnvironmentSchema,\n ): string | undefined {\n const value = process.env[name];\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);\n }\n\n if (value !== undefined && value.trim() !== '') {\n return value;\n }\n\n return definition.defaultValue?.toString();\n }\n\n private static shouldUnsetBlankOptionalEnvironmentVariable(\n name: string,\n value: string | undefined,\n valueOrDefault: string | undefined,\n schema: KernelEnvironmentSchema,\n ): boolean {\n return (\n value !== undefined &&\n value.trim() === '' &&\n valueOrDefault === undefined &&\n schema[name]?.required !== true\n );\n }\n\n private static validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<\n string,\n KernelEnvironmentValue | undefined\n > = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name];\n const valueOrDefault = Kernel.getEnvironmentVariableValue(\n name,\n definition,\n schema,\n );\n\n if (valueOrDefault !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n valueOrDefault,\n schema,\n );\n } else if (\n Kernel.shouldUnsetBlankOptionalEnvironmentVariable(\n name,\n value,\n valueOrDefault,\n schema,\n )\n ) {\n environmentVariables[name] = undefined;\n }\n }\n\n return {\n ...process.env,\n ...environmentVariables,\n } as KernelEnvironmentForSchema<TSchema>;\n }\n\n public static loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const environmentName = environment ?? process.env.NODE_ENV ?? 'local';\n\n const result = dotenv.config({\n override: options.override,\n path: Kernel.getEnvironmentVariablesPath(environmentName, options),\n });\n\n if (options.schema) {\n Kernel.validateEnvironmentVariables(options.schema);\n }\n\n return result;\n }\n\n constructor(\n private readonly options: KernelOptions<TEnvironmentSchema> = {},\n ) {\n this.loggerInstance = options.logger ?? new ConsoleKernelLogger();\n this.dependencyInjectionInstance = options.di;\n Kernel.state.activeKernel = this;\n }\n\n private async closeCandidate(candidate: ShutdownCandidate): Promise<void> {\n if (candidate.shutdown) {\n await candidate.shutdown();\n\n return;\n }\n\n if (candidate.close) {\n await candidate.close();\n\n return;\n }\n\n if (candidate.stop) {\n await candidate.stop();\n\n return;\n }\n\n if (candidate.flush) {\n await candidate.flush();\n }\n }\n\n private getConsumerFromClass(\n ClassDefinition: ServiceClass<KernelConsumer>,\n ): KernelConsumer {\n return this.di.getService<KernelConsumer>(ClassDefinition);\n }\n\n private getInitializerFromClass(\n ClassDefinition: ServiceClass<Initializer>,\n ): Initializer {\n return this.di.getService<Initializer>(ClassDefinition);\n }\n\n private getRuntimeFromClass(ClassDefinition: ServiceClass<Runtime>): Runtime {\n return this.di.getService<Runtime>(ClassDefinition);\n }\n\n private getSchedulerFromClass(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Scheduler {\n return this.di.getService<Scheduler>(ClassDefinition);\n }\n\n public get consumers(): KernelConsumer[] {\n return this.consumersList;\n }\n\n public get consumerMiddleware(): ConsumerMiddleware[] {\n return this.consumerMiddlewares;\n }\n\n public get di(): DependencyInjection {\n if (!this.dependencyInjectionInstance) {\n throw new Error('Kernel dependency injection has not been initialized.');\n }\n\n return this.dependencyInjectionInstance;\n }\n\n public get environment(): KernelEnvironmentForSchema<TEnvironmentSchema> {\n return this.environmentVariables;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<KernelRoute>[] {\n return this.routesList;\n }\n\n public get schedulers(): Scheduler[] {\n return this.schedulersList;\n }\n\n private getDependencyInjectionOptions(\n options: KernelDependencyInjectionOptions = {},\n ): Required<KernelDependencyInjectionOptions> {\n return {\n containerBuild:\n options.containerBuild ?? process.env.CONTAINER_BUILD === 'true',\n overrides: options.overrides ?? [],\n servicesYamlPath:\n options.servicesYamlPath ??\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory:\n options.sourceDirectory ??\n this.options.sourceDirectory ??\n Kernel.sourceDirectory,\n };\n }\n\n public async dependencyInjection(\n options: KernelDependencyInjectionOptions = {},\n ): Promise<void> {\n Kernel.state.activeKernel = this;\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure(\n this.getDependencyInjectionOptions(options),\n );\n\n await this.dependencyInjectionInstance.compile();\n Kernel.state.activeKernel = this;\n }\n\n public loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions<\n KernelEnvironmentSchema | undefined\n > = {},\n ): DotenvConfigOutput {\n const result = Kernel.loadEnvironmentVariables(environment, {\n ...options,\n schema: options.schema ?? this.options.environmentSchema,\n });\n\n this.environmentVariables = this.options.environmentSchema\n ? Kernel.validateEnvironmentVariables(this.options.environmentSchema)\n : (process.env as KernelEnvironmentForSchema<TEnvironmentSchema>);\n\n return result;\n }\n\n public getRoutes(): ServiceClass<KernelRoute>[] {\n return this.routes;\n }\n\n public registerConsumerMiddleware(\n ...middlewares: ConsumerMiddleware[]\n ): void {\n this.consumerMiddlewares.push(...middlewares);\n }\n\n public registerConsumers(\n ...ClassDefinitions: ServiceClass<KernelConsumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: KernelConsumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(\n ...ClassDefinitions: ServiceClass<KernelRoute>[]\n ): void {\n this.routesList.push(...ClassDefinitions);\n }\n\n public registerSchedulers(\n ...ClassDefinitions: ServiceClass<Scheduler>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));\n }\n }\n\n public registerSchedulerInstances(...schedulers: Scheduler[]): void {\n this.schedulersList.push(...schedulers);\n }\n\n public registerShutdownHook(hook: ShutdownHook): void {\n this.shutdownHooks.push(hook);\n }\n\n public removeConsumers(): void {\n this.consumersList.length = 0;\n }\n\n public removeRoutes(): void {\n this.routesList.length = 0;\n }\n\n public removeSchedulers(): void {\n this.schedulersList.length = 0;\n }\n\n public async runConsumers(): Promise<void> {\n for (const consumer of this.consumersList) {\n await consumer.init();\n }\n }\n\n public async runInitializers(\n ...ClassDefinitions: ServiceClass<Initializer>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n await this.getInitializerFromClass(ClassDefinition).ensure();\n }\n }\n\n public async runRuntimes(\n ...ClassDefinitions: ServiceClass<Runtime>[]\n ): Promise<void> {\n for (const ClassDefinition of ClassDefinitions) {\n const runtime = this.getRuntimeFromClass(ClassDefinition);\n\n await runtime.run();\n this.registerShutdownHook(() =>\n this.closeCandidate(runtime as ShutdownCandidate),\n );\n }\n }\n\n public async runSchedulerNowAndSchedule(\n ClassDefinition: ServiceClass<Scheduler>,\n ): Promise<void> {\n const scheduler = this.getSchedulerFromClass(ClassDefinition);\n\n await scheduler.runOnce();\n await scheduler.init();\n this.schedulersList.push(scheduler);\n }\n\n public async runSchedulers(): Promise<void> {\n for (const scheduler of this.schedulersList) {\n await scheduler.init();\n }\n }\n\n public async shutdown(): Promise<void> {\n for (const consumer of [...this.consumersList].reverse()) {\n await this.closeCandidate(consumer as ShutdownCandidate);\n }\n\n for (const scheduler of [...this.schedulersList].reverse()) {\n await this.closeCandidate(scheduler as ShutdownCandidate);\n }\n\n for (const hook of [...this.shutdownHooks].reverse()) {\n await hook();\n }\n\n await this.closeCandidate(this.loggerInstance as ShutdownCandidate);\n }\n}\n\nexport function createKernel<\n TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined,\n>(options?: KernelOptions<TEnvironmentSchema>): Kernel<TEnvironmentSchema> {\n return new Kernel(options);\n}\n\nexport default Kernel;\n","import type { KernelLogger } from '../../../contracts/index.js';\n\nexport class ConsoleKernelLogger implements KernelLogger {\n public debug(message: string): void {\n // eslint-disable-next-line no-console\n console.debug(message);\n }\n\n public error(message: string): void {\n // eslint-disable-next-line no-console\n console.error(message);\n }\n\n public info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(message);\n }\n\n public warn(message: string): void {\n // eslint-disable-next-line no-console\n console.warn(message);\n }\n}\n","import type { Logger } from 'node-dependency-injection';\n\nexport class AutowireWarningFilter implements Logger {\n constructor(private readonly logger: Logger) {}\n\n private isIgnorableAutowireWarning(message: string): boolean {\n return (\n message.startsWith(\n 'Autowire: file has export default declaration but no runtime default export:',\n ) ||\n message.startsWith('Autowire: failed to create definition for undefined:')\n );\n }\n\n public warn(message?: unknown, ...optionalParams: unknown[]): void {\n if (\n typeof message === 'string' &&\n this.isIgnorableAutowireWarning(message)\n ) {\n this.logger.debug?.(`Ignored ${message}`, ...optionalParams);\n\n return;\n }\n\n this.logger.warn(message, ...optionalParams);\n }\n\n public info(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.info?.(message, ...optionalParams);\n }\n\n public debug(message?: unknown, ...optionalParams: unknown[]): void {\n this.logger.debug?.(message, ...optionalParams);\n }\n}\n","import fs from 'fs-extra';\nimport {\n Autowire,\n ContainerBuilder,\n ServiceFile,\n YamlFileLoader,\n} from 'node-dependency-injection';\nimport path from 'node:path';\n\nimport type { ServiceResolver } from '../../contracts/index.js';\nimport type { AutowireInternals } from './AutowireInternals.js';\nimport type { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nimport { AutowireWarningFilter } from './AutowireWarningFilter.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private loader: YamlFileLoader | undefined;\n private readonly container: ContainerBuilder;\n private readonly overrideTokenIds = new Map<unknown, string>();\n\n public static configure(\n options: DependencyInjectionOptions,\n ): DependencyInjection {\n DependencyInjection.configuredInstance = new DependencyInjection(options);\n\n return DependencyInjection.configuredInstance;\n }\n\n public static get instance(): DependencyInjection {\n if (!DependencyInjection.configuredInstance) {\n throw new Error('DependencyInjection has not been configured.');\n }\n\n return DependencyInjection.configuredInstance;\n }\n\n constructor(\n private readonly options: DependencyInjectionOptions = {\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath: path.resolve(\n process.cwd(),\n 'config',\n 'container',\n 'services.yaml',\n ),\n sourceDirectory: path.resolve(process.cwd(), 'src'),\n },\n ) {\n this.container = new ContainerBuilder(false, this.options.sourceDirectory);\n }\n\n private get definitions(): Map<string, DefinitionMetadata> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._definitions || new Map();\n }\n\n private get aliases(): Map<string, string> {\n const container = this.container as unknown as ContainerInternals;\n\n return container._alias || new Map();\n }\n\n private async ensureFolderExists(filePath: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n }\n\n private getServiceClassName(serviceName: unknown): string | undefined {\n return typeof serviceName === 'function' ? serviceName.name : undefined;\n }\n\n private getOverrideId(prefix: string, token: unknown): string {\n const tokenName = this.getServiceClassName(token) ?? String(token);\n\n return `ddd-kernel.override.${prefix}.${tokenName}`;\n }\n\n private hasDirectService(serviceName: unknown): boolean {\n return (\n typeof serviceName === 'string' &&\n (this.definitions.has(serviceName) || this.aliases.has(serviceName))\n );\n }\n\n private ensureSyntheticService(id: string, value: unknown): void {\n const definition = this.container.register(id);\n\n definition.public = true;\n definition.synthetic = true;\n this.container.set(id, value);\n }\n\n private idNamesService(id: string, serviceClassName: string): boolean {\n return path.posix.basename(id) === serviceClassName;\n }\n\n private getReferenceId(value: unknown): string | undefined {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n typeof value.id === 'string'\n ) {\n return value.id;\n }\n\n return undefined;\n }\n\n private getDefinitionArgumentReferences(\n definition: DefinitionMetadata,\n ): string[] {\n return [\n ...(definition._args ?? []),\n ...(definition._appendArgs ?? []),\n ...(definition._overrideArgs ?? []),\n ].flatMap((argument) => {\n const referenceId = this.getReferenceId(argument);\n\n return referenceId ? [referenceId] : [];\n });\n }\n\n private findConcreteChildServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.entries()]\n .filter(([, definition]) => definition._abstract !== true)\n .filter(\n ([, definition]) =>\n definition._parent &&\n this.idNamesService(definition._parent, serviceClassName),\n )\n .map(([id]) => id);\n\n return matches[matches.length - 1];\n }\n\n private findRegisteredServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.definitions.keys()].filter((id) =>\n this.idNamesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findAliasServiceId(serviceName: unknown): string | undefined {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return undefined;\n }\n\n const matches = [...this.aliases.keys()].filter((id) =>\n this.idNamesService(id, serviceClassName),\n );\n\n return matches[matches.length - 1];\n }\n\n private findReferencedServiceIds(serviceName: unknown): string[] {\n const serviceClassName = this.getServiceClassName(serviceName);\n\n if (!serviceClassName) {\n return [];\n }\n\n return [\n ...new Set(\n [...this.definitions.values()]\n .flatMap((definition) =>\n this.getDefinitionArgumentReferences(definition),\n )\n .filter((id) => this.idNamesService(id, serviceClassName)),\n ),\n ];\n }\n\n private getOverrideTokenIds(token: unknown): string[] {\n const tokenIds = [\n this.findRegisteredServiceId(token),\n this.findAliasServiceId(token),\n ...this.findReferencedServiceIds(token),\n ].filter((id): id is string => id !== undefined);\n const existingTokenIds = [...new Set(tokenIds)];\n\n if (existingTokenIds.length > 0) {\n return existingTokenIds;\n }\n\n const overrideTokenId = this.getOverrideId('token', token);\n\n this.ensureSyntheticService(overrideTokenId, undefined);\n\n return [overrideTokenId];\n }\n\n private getOverrideClassServiceId(\n ClassDefinition: new () => unknown,\n ): string {\n const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);\n\n if (registeredServiceId) {\n return registeredServiceId;\n }\n\n const overrideClassId = this.getOverrideId('class', ClassDefinition);\n\n this.container.register(overrideClassId, ClassDefinition);\n\n return overrideClassId;\n }\n\n private applyClassOverride(override: DependencyOverride): void {\n if (!('useClass' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const classId = this.getOverrideClassServiceId(override.useClass);\n\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, classId);\n }\n }\n\n private applyFactoryOverride(override: DependencyOverride): void {\n if (!('useFactory' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const factoryId = this.getOverrideId('factory', override.token);\n\n this.ensureSyntheticService(factoryId, override.useFactory(this));\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, factoryId);\n }\n }\n\n private applyValueOverride(override: DependencyOverride): void {\n if (!('useValue' in override)) {\n return;\n }\n\n const tokenIds = this.getOverrideTokenIds(override.token);\n const valueId = this.getOverrideId('value', override.token);\n\n this.ensureSyntheticService(valueId, override.useValue);\n this.overrideTokenIds.set(override.token, tokenIds[0]);\n for (const tokenId of tokenIds) {\n this.container.setAlias(tokenId, valueId);\n }\n }\n\n private applyOverrides(): void {\n for (const override of this.options.overrides ?? []) {\n this.applyClassOverride(override);\n this.applyFactoryOverride(override);\n this.applyValueOverride(override);\n }\n }\n\n private trackAutowireAliasIds(autowire: Autowire): Set<string> {\n const internals = autowire as unknown as AutowireInternals;\n const createServiceId = internals._getLegacyServiceId.bind(autowire);\n const aliasIds = new Set<string>();\n\n internals._getLegacyServiceId = async (...args) => {\n const id = await createServiceId(...args);\n\n if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {\n aliasIds.add(id);\n }\n\n return id;\n };\n\n return aliasIds;\n }\n\n private async processAutowire(autowire: Autowire): Promise<void> {\n const previousLogger = this.container.logger;\n const autowireAliasIds = this.trackAutowireAliasIds(autowire);\n\n this.container.logger = new AutowireWarningFilter(previousLogger);\n\n try {\n await autowire.process();\n } finally {\n this.container.logger = previousLogger;\n }\n\n for (const id of autowireAliasIds) {\n this.aliases.delete(id);\n }\n }\n\n private registerParentAliases(): void {\n for (const [id, definition] of this.definitions.entries()) {\n if (definition._abstract === true || !definition._parent) {\n continue;\n }\n\n this.container.setAlias(definition._parent, id);\n }\n }\n\n public async compile(): Promise<void> {\n if (this.options.containerBuild) {\n await this.ensureFolderExists(this.options.servicesYamlPath);\n const autowire = new Autowire(this.container);\n\n autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.processAutowire(autowire);\n } else {\n this.loader = new YamlFileLoader(this.container);\n await this.loader.load(this.options.servicesYamlPath);\n }\n\n this.registerParentAliases();\n this.applyOverrides();\n await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const overrideTokenId = this.overrideTokenIds.get(serviceName);\n\n if (overrideTokenId) {\n return this.container.get<T>(overrideTokenId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\n }\n\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const registeredServiceId = this.findRegisteredServiceId(serviceName);\n\n if (registeredServiceId) {\n return this.container.get<T>(registeredServiceId);\n }\n\n // NDI 4 types only string IDs, but still resolves constructors and validates other tokens at runtime.\n return this.container.get<T>(serviceName as string);\n }\n\n public hasService(serviceName: unknown): boolean {\n return (\n this.overrideTokenIds.has(serviceName) ||\n this.findAliasServiceId(serviceName) !== undefined ||\n this.findConcreteChildServiceId(serviceName) !== undefined ||\n this.findRegisteredServiceId(serviceName) !== undefined ||\n this.hasDirectService(serviceName)\n );\n }\n}\n\nexport default DependencyInjection;\n","export class KernelEnvironmentValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelEnvironmentValidationError';\n }\n}\n","export class ScheduledExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScheduledExecutionError';\n }\n}\n","import type { Scheduler } from './Scheduler.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { ScheduledExecutionError } from './ScheduledExecutionError.js';\n\nexport class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {\n public handle(error: unknown, scheduler: Scheduler): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scheduledError = new ScheduledExecutionError(\n `Error on ${scheduler.getProcessName()}: ${errorMessage}`,\n );\n\n Kernel.logger.error(scheduledError.message);\n }\n\n public shouldSkip(): boolean {\n return false;\n }\n}\n\nexport default DefaultSchedulerErrorPolicy;\n","export class InvalidParseCronExpressionError extends Error {\n constructor(processName: string) {\n super(`Invalid cron expression for scheduler \"${processName}\".`);\n this.name = 'InvalidParseCronExpressionError';\n }\n}\n","import { Flow, Semaphore } from '@haskou/flow';\nimport cron from 'node-cron';\n\nimport type { CronExpression } from './CronExpression.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { DefaultSchedulerErrorPolicy } from './DefaultSchedulerErrorPolicy.js';\nimport { InvalidParseCronExpressionError } from './InvalidParseCronExpressionError.js';\n\nexport abstract class Scheduler {\n private readonly executionSemaphore = new Semaphore(1);\n\n constructor(\n private readonly errorPolicy: SchedulerErrorPolicy = new DefaultSchedulerErrorPolicy(),\n ) {}\n\n public abstract execute(): Promise<void>;\n\n public abstract getCronExpression(): CronExpression;\n\n public abstract getProcessName(): string;\n\n private parseCronExpression(): string {\n const expression = this.getCronExpression();\n\n return (\n '' +\n `${expression.second ?? '*'} ` +\n `${expression.minute ?? '*'} ` +\n `${expression.hour ?? '*'} ` +\n `${expression.dayOfMonth ?? '*'} ` +\n `${expression.month ?? '*'} ` +\n `${expression.dayOfWeek ?? '*'}`\n );\n }\n\n public async runOnce(): Promise<void> {\n const permit = this.executionSemaphore.tryAcquire();\n\n if (permit === null) {\n return;\n }\n\n try {\n Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);\n await new Flow().task(() => this.execute()).run();\n } catch (error: unknown) {\n if (this.errorPolicy.shouldSkip(error)) {\n return;\n }\n\n await this.errorPolicy.handle(error, this);\n } finally {\n permit.release();\n }\n }\n\n public get<T>(service: unknown): T {\n return Kernel.di.getService<T>(service);\n }\n\n public init(): Promise<void> {\n let parsedCronExpression: string;\n\n try {\n parsedCronExpression = this.parseCronExpression();\n } catch {\n throw new InvalidParseCronExpressionError(this.getProcessName());\n }\n\n cron.schedule(parsedCronExpression, () => {\n void this.runOnce();\n });\n\n return Promise.resolve();\n }\n}\n\nexport default Scheduler;\n"],"mappings":"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","names":["import_node_path","path","fs","path","dotenv","cron"]}
@@ -238,10 +238,10 @@ var DependencyInjection = class _DependencyInjection {
238
238
  }
239
239
  trackAutowireAliasIds(autowire) {
240
240
  const internals = autowire;
241
- const createLegacyServiceId = internals._getLegacyServiceId.bind(autowire);
241
+ const createServiceId = internals._getLegacyServiceId.bind(autowire);
242
242
  const aliasIds = /* @__PURE__ */ new Set();
243
243
  internals._getLegacyServiceId = async (...args) => {
244
- const id = await createLegacyServiceId(...args);
244
+ const id = await createServiceId(...args);
245
245
  if (!this.container.hasAlias(id) && !this.container.hasDefinition(id)) {
246
246
  aliasIds.add(id);
247
247
  }