@haskou/ddd-kernel 1.1.0 → 1.2.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 (49) hide show
  1. package/dist/{RetryPredicate-DAv_7ve2.d.ts → RetryPredicate-Bl3SMnbL.d.ts} +1 -1
  2. package/dist/{RetryPredicate-CBlnBUDO.d.cts → RetryPredicate-ZjioTYXn.d.cts} +1 -1
  3. package/dist/{ShutdownHook-3Gc1yyHI.d.ts → ShutdownHook-B03Mcke-.d.ts} +47 -11
  4. package/dist/{ShutdownHook-BUvR2Ii7.d.cts → ShutdownHook-BsEGvnEf.d.cts} +47 -11
  5. package/dist/adapters/index.cjs +81 -3
  6. package/dist/adapters/index.cjs.map +1 -1
  7. package/dist/adapters/index.d.cts +2 -2
  8. package/dist/adapters/index.d.ts +2 -2
  9. package/dist/adapters/index.js +81 -3
  10. package/dist/adapters/index.js.map +1 -1
  11. package/dist/adapters/pubsub/amqp/index.cjs +81 -3
  12. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  13. package/dist/adapters/pubsub/amqp/index.js +81 -3
  14. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  15. package/dist/adapters/pubsub/index.cjs +81 -3
  16. package/dist/adapters/pubsub/index.cjs.map +1 -1
  17. package/dist/adapters/pubsub/index.d.cts +3 -3
  18. package/dist/adapters/pubsub/index.d.ts +3 -3
  19. package/dist/adapters/pubsub/index.js +81 -3
  20. package/dist/adapters/pubsub/index.js.map +1 -1
  21. package/dist/adapters/ui/express/index.d.cts +2 -2
  22. package/dist/adapters/ui/express/index.d.ts +2 -2
  23. package/dist/adapters/ui/index.cjs +81 -3
  24. package/dist/adapters/ui/index.cjs.map +1 -1
  25. package/dist/adapters/ui/index.d.cts +1 -1
  26. package/dist/adapters/ui/index.d.ts +1 -1
  27. package/dist/adapters/ui/index.js +81 -3
  28. package/dist/adapters/ui/index.js.map +1 -1
  29. package/dist/adapters/ui/routes/index.cjs +81 -3
  30. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  31. package/dist/adapters/ui/routes/index.js +81 -3
  32. package/dist/adapters/ui/routes/index.js.map +1 -1
  33. package/dist/contracts/index.d.cts +2 -2
  34. package/dist/contracts/index.d.ts +2 -2
  35. package/dist/contracts/kernel/index.d.cts +2 -2
  36. package/dist/contracts/kernel/index.d.ts +2 -2
  37. package/dist/index.cjs +83 -3
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +8 -2
  40. package/dist/index.d.ts +8 -2
  41. package/dist/index.js +82 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/infrastructure/express/index.d.cts +1 -1
  44. package/dist/infrastructure/express/index.d.ts +1 -1
  45. package/dist/infrastructure/scheduler/index.cjs +81 -3
  46. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  47. package/dist/infrastructure/scheduler/index.js +81 -3
  48. package/dist/infrastructure/scheduler/index.js.map +1 -1
  49. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/contracts/ui/HttpRouteStatusEnum.ts","../src/errors/KernelError.ts","../src/errors/DependencyNotFoundError.ts","../src/errors/HandlerNotFoundError.ts","../src/Kernel.ts","../src/adapters/kernel/console/ConsoleKernelLogger.ts","../src/infrastructure/dependency-injection/DependencyInjection.ts"],"sourcesContent":["export * from './contracts/index.js';\nexport * from './errors/index.js';\nexport * from './Kernel.js';\nexport { default } from './Kernel.js';\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 KernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class DependencyNotFoundError extends KernelError {\n constructor(token: string) {\n super(`Dependency not found for token \"${token}\".`);\n this.name = 'DependencyNotFoundError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class HandlerNotFoundError extends KernelError {\n constructor(kind: string, name: string) {\n super(`${kind} handler not found for \"${name}\".`);\n this.name = 'HandlerNotFoundError';\n }\n}\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type { Consumer } from './adapters/pubsub/index.js';\nimport type { Route } from './adapters/ui/routes/index.js';\nimport type {\n ConsumerMiddleware,\n KernelLogger,\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 { 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';\n\nexport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nexport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nexport type { KernelOptions } from './kernel/KernelOptions.js';\n\nexport class Kernel {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: Consumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<Route>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n\n private static get state(): { activeKernel?: Kernel } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: { activeKernel?: Kernel };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as { activeKernel?: Kernel };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): Consumer[] {\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 {\n return Kernel.getActiveKernel();\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<Route>[] {\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 if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n private static getEnvironmentVariablesPath(\n environment: string,\n options: KernelEnvironmentVariablesOptions,\n ): string {\n return path.resolve(\n Kernel.rootDirectory,\n options.path ?? (environment ? `.env.${environment}` : '.env'),\n );\n }\n\n public static loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions = {},\n ): DotenvConfigOutput {\n const environmentName = environment ?? process.env.NODE_ENV ?? 'local';\n\n return dotenv.config({\n override: options.override,\n path: Kernel.getEnvironmentVariablesPath(environmentName, options),\n });\n }\n\n constructor(private readonly options: KernelOptions = {}) {\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<Consumer>,\n ): Consumer {\n return this.di.getService<Consumer>(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(): Consumer[] {\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(): NodeJS.ProcessEnv {\n return Kernel.environment;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<Route>[] {\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 ): DotenvConfigOutput {\n return Kernel.loadEnvironmentVariables(environment, options);\n }\n\n public getRoutes(): ServiceClass<Route>[] {\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<Consumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: Consumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): 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(options?: KernelOptions): Kernel {\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 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 { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | 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 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 parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdReferencesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${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(([, definition]) =>\n this.parentMatchesService(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.serviceIdMatchesService(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.serviceIdMatchesService(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) =>\n this.serviceIdReferencesService(id, serviceClassName),\n ),\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 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 this.autowire = new Autowire(this.container);\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\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 return this.container.get<T>(serviceName);\n }\n}\n\nexport default DependencyInjection;\n"],"mappings":"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","names":["import_node_path","path","fs","path","dotenv"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/contracts/ui/HttpRouteStatusEnum.ts","../src/errors/KernelError.ts","../src/errors/DependencyNotFoundError.ts","../src/errors/HandlerNotFoundError.ts","../src/Kernel.ts","../src/adapters/kernel/console/ConsoleKernelLogger.ts","../src/infrastructure/dependency-injection/DependencyInjection.ts","../src/kernel/KernelEnvironmentValidationError.ts"],"sourcesContent":["export * from './contracts/index.js';\nexport * from './errors/index.js';\nexport * from './Kernel.js';\nexport { default } from './Kernel.js';\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 KernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class DependencyNotFoundError extends KernelError {\n constructor(token: string) {\n super(`Dependency not found for token \"${token}\".`);\n this.name = 'DependencyNotFoundError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class HandlerNotFoundError extends KernelError {\n constructor(kind: string, name: string) {\n super(`${kind} handler not found for \"${name}\".`);\n this.name = 'HandlerNotFoundError';\n }\n}\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type { Consumer } from './adapters/pubsub/index.js';\nimport type { Route } from './adapters/ui/routes/index.js';\nimport type {\n ConsumerMiddleware,\n KernelLogger,\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 { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nexport type { KernelEnvironmentVariableDefinition } from './kernel/KernelEnvironmentVariableDefinition.js';\nexport type { KernelEnvironmentVariablePrimitive } from './kernel/KernelEnvironmentVariablePrimitive.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: Consumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<Route>[] = [];\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(): Consumer[] {\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<Route>[] {\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 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}\" must be a boolean.`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n if (value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be a number.`,\n );\n }\n\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be a number.`,\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 return Kernel.parseBooleanEnvironmentVariable(name, value);\n }\n\n if (definition.type === 'number') {\n return Kernel.parseNumberEnvironmentVariable(name, value);\n }\n\n return value;\n }\n\n private static validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<string, KernelEnvironmentValue> = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name] ?? definition.defaultValue?.toString();\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n value,\n schema,\n );\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<Consumer>,\n ): Consumer {\n return this.di.getService<Consumer>(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(): Consumer[] {\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<Route>[] {\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<Route>[] {\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<Consumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: Consumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): 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 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 { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | 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 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 parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdReferencesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${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(([, definition]) =>\n this.parentMatchesService(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.serviceIdMatchesService(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.serviceIdMatchesService(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) =>\n this.serviceIdReferencesService(id, serviceClassName),\n ),\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 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 this.autowire = new Autowire(this.container);\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\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 return this.container.get<T>(serviceName);\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"],"mappings":"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","names":["import_node_path","path","fs","path","dotenv"]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { R as Repository } from './Repository-D9CuAyCV.cjs';
2
2
  export { UnitOfWork } from './contracts/db/index.cjs';
3
- export { a as ConsumerExecutionContext, b as ConsumerMiddleware, c as ConsumerNext, K as Kernel, d as KernelDependencyInjectionOptions, e as KernelEnvironmentVariablesOptions, f as KernelOptions, S as ShutdownHook, g as createKernel, K as default } from './ShutdownHook-BUvR2Ii7.cjs';
3
+ export { a as ConsumerExecutionContext, b as ConsumerMiddleware, c as ConsumerNext, K as Kernel, d as KernelDefaultEnvironment, e as KernelDependencyInjectionOptions, f as KernelEnvironment, g as KernelEnvironmentForSchema, h as KernelEnvironmentSchema, i as KernelEnvironmentValue, j as KernelEnvironmentVariableDefinition, k as KernelEnvironmentVariablePrimitive, l as KernelEnvironmentVariableType, m as KernelEnvironmentVariablesOptions, n as KernelOptions, S as ShutdownHook, o as createKernel, K as default } from './ShutdownHook-BsEGvnEf.cjs';
4
4
  export { D as DomainEvent, H as HandlerContext, M as Message, a as MessageMetadata } from './HandlerContext-Lm89pSeG.cjs';
5
- export { I as IdempotencyStore, R as RetryDelayResolver, a as RetryPredicate } from './RetryPredicate-CBlnBUDO.cjs';
5
+ export { I as IdempotencyStore, R as RetryDelayResolver, a as RetryPredicate } from './RetryPredicate-ZjioTYXn.cjs';
6
6
  export { K as KernelLogger } from './KernelLogger-BESOFrpW.cjs';
7
7
  export { KernelMiddleware } from './contracts/kernel/index.cjs';
8
8
  export { S as ServiceResolver } from './ServiceResolver-D2Jz-l_Z.cjs';
@@ -19,3 +19,9 @@ import './adapters/ui/routes/index.cjs';
19
19
  import './ServiceClass-BkEHcXDi.cjs';
20
20
  import './infrastructure/lifecycle/index.cjs';
21
21
  import './Scheduler-BW-U5Ccg.cjs';
22
+
23
+ declare class KernelEnvironmentValidationError extends Error {
24
+ constructor(message: string);
25
+ }
26
+
27
+ export { KernelEnvironmentValidationError };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { R as Repository } from './Repository-D9CuAyCV.js';
2
2
  export { UnitOfWork } from './contracts/db/index.js';
3
- export { a as ConsumerExecutionContext, b as ConsumerMiddleware, c as ConsumerNext, K as Kernel, d as KernelDependencyInjectionOptions, e as KernelEnvironmentVariablesOptions, f as KernelOptions, S as ShutdownHook, g as createKernel, K as default } from './ShutdownHook-3Gc1yyHI.js';
3
+ export { a as ConsumerExecutionContext, b as ConsumerMiddleware, c as ConsumerNext, K as Kernel, d as KernelDefaultEnvironment, e as KernelDependencyInjectionOptions, f as KernelEnvironment, g as KernelEnvironmentForSchema, h as KernelEnvironmentSchema, i as KernelEnvironmentValue, j as KernelEnvironmentVariableDefinition, k as KernelEnvironmentVariablePrimitive, l as KernelEnvironmentVariableType, m as KernelEnvironmentVariablesOptions, n as KernelOptions, S as ShutdownHook, o as createKernel, K as default } from './ShutdownHook-B03Mcke-.js';
4
4
  export { D as DomainEvent, H as HandlerContext, M as Message, a as MessageMetadata } from './HandlerContext-DUUExVo3.js';
5
- export { I as IdempotencyStore, R as RetryDelayResolver, a as RetryPredicate } from './RetryPredicate-DAv_7ve2.js';
5
+ export { I as IdempotencyStore, R as RetryDelayResolver, a as RetryPredicate } from './RetryPredicate-Bl3SMnbL.js';
6
6
  export { K as KernelLogger } from './KernelLogger-BESOFrpW.js';
7
7
  export { KernelMiddleware } from './contracts/kernel/index.js';
8
8
  export { S as ServiceResolver } from './ServiceResolver-D2Jz-l_Z.js';
@@ -19,3 +19,9 @@ import './adapters/ui/routes/index.js';
19
19
  import './ServiceClass-Bq_fBC5R.js';
20
20
  import './infrastructure/lifecycle/index.js';
21
21
  import './Scheduler-BW-U5Ccg.js';
22
+
23
+ declare class KernelEnvironmentValidationError extends Error {
24
+ constructor(message: string);
25
+ }
26
+
27
+ export { KernelEnvironmentValidationError };
package/dist/index.js CHANGED
@@ -310,6 +310,14 @@ var DependencyInjection = class _DependencyInjection {
310
310
  }
311
311
  };
312
312
 
313
+ // src/kernel/KernelEnvironmentValidationError.ts
314
+ var KernelEnvironmentValidationError = class extends Error {
315
+ constructor(message) {
316
+ super(message);
317
+ this.name = "KernelEnvironmentValidationError";
318
+ }
319
+ };
320
+
313
321
  // src/Kernel.ts
314
322
  var Kernel = class _Kernel {
315
323
  constructor(options = {}) {
@@ -329,6 +337,7 @@ var Kernel = class _Kernel {
329
337
  schedulersList = [];
330
338
  shutdownHooks = [];
331
339
  dependencyInjectionInstance;
340
+ environmentVariables = process.env;
332
341
  static get state() {
333
342
  const stateContainer = globalThis;
334
343
  stateContainer[_Kernel.stateKey] = stateContainer[_Kernel.stateKey] ?? {};
@@ -373,18 +382,82 @@ var Kernel = class _Kernel {
373
382
  }
374
383
  return _Kernel.state.activeKernel;
375
384
  }
385
+ static assertRequiredEnvironmentVariable(name, value, schema) {
386
+ if (schema[name]?.required === true && value === void 0) {
387
+ throw new KernelEnvironmentValidationError(
388
+ `Missing required environment variable "${name}".`
389
+ );
390
+ }
391
+ }
376
392
  static getEnvironmentVariablesPath(environment, options) {
377
393
  return path2.resolve(
378
394
  _Kernel.rootDirectory,
379
395
  options.path ?? (environment ? `.env.${environment}` : ".env")
380
396
  );
381
397
  }
398
+ static parseBooleanEnvironmentVariable(name, value) {
399
+ if (["1", "true", "yes", "on"].includes(value.toLowerCase())) {
400
+ return true;
401
+ }
402
+ if (["0", "false", "no", "off"].includes(value.toLowerCase())) {
403
+ return false;
404
+ }
405
+ throw new KernelEnvironmentValidationError(
406
+ `Environment variable "${name}" must be a boolean.`
407
+ );
408
+ }
409
+ static parseNumberEnvironmentVariable(name, value) {
410
+ if (value.trim() === "") {
411
+ throw new KernelEnvironmentValidationError(
412
+ `Environment variable "${name}" must be a number.`
413
+ );
414
+ }
415
+ const parsedValue = Number(value);
416
+ if (Number.isFinite(parsedValue)) {
417
+ return parsedValue;
418
+ }
419
+ throw new KernelEnvironmentValidationError(
420
+ `Environment variable "${name}" must be a number.`
421
+ );
422
+ }
423
+ static parseEnvironmentVariable(name, value, schema) {
424
+ const definition = schema[name];
425
+ if (definition.type === "boolean") {
426
+ return _Kernel.parseBooleanEnvironmentVariable(name, value);
427
+ }
428
+ if (definition.type === "number") {
429
+ return _Kernel.parseNumberEnvironmentVariable(name, value);
430
+ }
431
+ return value;
432
+ }
433
+ static validateEnvironmentVariables(schema) {
434
+ const environmentVariables = {};
435
+ for (const [name, definition] of Object.entries(schema)) {
436
+ const value = process.env[name] ?? definition.defaultValue?.toString();
437
+ _Kernel.assertRequiredEnvironmentVariable(name, value, schema);
438
+ if (value !== void 0) {
439
+ environmentVariables[name] = _Kernel.parseEnvironmentVariable(
440
+ name,
441
+ value,
442
+ schema
443
+ );
444
+ }
445
+ }
446
+ return {
447
+ ...process.env,
448
+ ...environmentVariables
449
+ };
450
+ }
382
451
  static loadEnvironmentVariables(environment, options = {}) {
383
452
  const environmentName = environment ?? process.env.NODE_ENV ?? "local";
384
- return dotenv.config({
453
+ const result = dotenv.config({
385
454
  override: options.override,
386
455
  path: _Kernel.getEnvironmentVariablesPath(environmentName, options)
387
456
  });
457
+ if (options.schema) {
458
+ _Kernel.validateEnvironmentVariables(options.schema);
459
+ }
460
+ return result;
388
461
  }
389
462
  async closeCandidate(candidate) {
390
463
  if (candidate.shutdown) {
@@ -428,7 +501,7 @@ var Kernel = class _Kernel {
428
501
  return this.dependencyInjectionInstance;
429
502
  }
430
503
  get environment() {
431
- return _Kernel.environment;
504
+ return this.environmentVariables;
432
505
  }
433
506
  get logger() {
434
507
  return this.loggerInstance;
@@ -456,7 +529,12 @@ var Kernel = class _Kernel {
456
529
  _Kernel.state.activeKernel = this;
457
530
  }
458
531
  loadEnvironmentVariables(environment, options = {}) {
459
- return _Kernel.loadEnvironmentVariables(environment, options);
532
+ const result = _Kernel.loadEnvironmentVariables(environment, {
533
+ ...options,
534
+ schema: options.schema ?? this.options.environmentSchema
535
+ });
536
+ this.environmentVariables = this.options.environmentSchema ? _Kernel.validateEnvironmentVariables(this.options.environmentSchema) : process.env;
537
+ return result;
460
538
  }
461
539
  getRoutes() {
462
540
  return this.routes;
@@ -547,6 +625,7 @@ export {
547
625
  HandlerNotFoundError,
548
626
  HttpRouteStatusEnum,
549
627
  Kernel,
628
+ KernelEnvironmentValidationError,
550
629
  KernelError,
551
630
  createKernel,
552
631
  Kernel_default as default
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contracts/ui/HttpRouteStatusEnum.ts","../src/errors/KernelError.ts","../src/errors/DependencyNotFoundError.ts","../src/errors/HandlerNotFoundError.ts","../src/Kernel.ts","../src/adapters/kernel/console/ConsoleKernelLogger.ts","../src/infrastructure/dependency-injection/DependencyInjection.ts"],"sourcesContent":["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 KernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class DependencyNotFoundError extends KernelError {\n constructor(token: string) {\n super(`Dependency not found for token \"${token}\".`);\n this.name = 'DependencyNotFoundError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class HandlerNotFoundError extends KernelError {\n constructor(kind: string, name: string) {\n super(`${kind} handler not found for \"${name}\".`);\n this.name = 'HandlerNotFoundError';\n }\n}\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type { Consumer } from './adapters/pubsub/index.js';\nimport type { Route } from './adapters/ui/routes/index.js';\nimport type {\n ConsumerMiddleware,\n KernelLogger,\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 { 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';\n\nexport type { KernelDependencyInjectionOptions } from './kernel/KernelDependencyInjectionOptions.js';\nexport type { KernelEnvironmentVariablesOptions } from './kernel/KernelEnvironmentVariablesOptions.js';\nexport type { KernelOptions } from './kernel/KernelOptions.js';\n\nexport class Kernel {\n private static readonly stateKey = Symbol.for(\n '@haskou/ddd-kernel/kernel-state',\n );\n\n private readonly consumerMiddlewares: ConsumerMiddleware[] = [];\n private readonly consumersList: Consumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<Route>[] = [];\n private readonly schedulersList: Scheduler[] = [];\n private readonly shutdownHooks: ShutdownHook[] = [];\n private dependencyInjectionInstance: DependencyInjection | undefined;\n\n private static get state(): { activeKernel?: Kernel } {\n const stateContainer = globalThis as typeof globalThis & {\n [Kernel.stateKey]?: { activeKernel?: Kernel };\n };\n\n stateContainer[Kernel.stateKey] = stateContainer[Kernel.stateKey] ?? {};\n\n return stateContainer[Kernel.stateKey] as { activeKernel?: Kernel };\n }\n\n public static get configDirectory(): string {\n return path.resolve(Kernel.rootDirectory, 'config');\n }\n\n public static get consumers(): Consumer[] {\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 {\n return Kernel.getActiveKernel();\n }\n\n public static get rootDirectory(): string {\n return process.cwd();\n }\n\n public static get routes(): ServiceClass<Route>[] {\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 if (!Kernel.state.activeKernel) {\n Kernel.state.activeKernel = new Kernel();\n }\n\n return Kernel.state.activeKernel;\n }\n\n private static getEnvironmentVariablesPath(\n environment: string,\n options: KernelEnvironmentVariablesOptions,\n ): string {\n return path.resolve(\n Kernel.rootDirectory,\n options.path ?? (environment ? `.env.${environment}` : '.env'),\n );\n }\n\n public static loadEnvironmentVariables(\n environment?: string,\n options: KernelEnvironmentVariablesOptions = {},\n ): DotenvConfigOutput {\n const environmentName = environment ?? process.env.NODE_ENV ?? 'local';\n\n return dotenv.config({\n override: options.override,\n path: Kernel.getEnvironmentVariablesPath(environmentName, options),\n });\n }\n\n constructor(private readonly options: KernelOptions = {}) {\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<Consumer>,\n ): Consumer {\n return this.di.getService<Consumer>(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(): Consumer[] {\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(): NodeJS.ProcessEnv {\n return Kernel.environment;\n }\n\n public get logger(): KernelLogger {\n return this.loggerInstance;\n }\n\n public get routes(): ServiceClass<Route>[] {\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 ): DotenvConfigOutput {\n return Kernel.loadEnvironmentVariables(environment, options);\n }\n\n public getRoutes(): ServiceClass<Route>[] {\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<Consumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: Consumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): 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(options?: KernelOptions): Kernel {\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 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 { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | 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 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 parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdReferencesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${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(([, definition]) =>\n this.parentMatchesService(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.serviceIdMatchesService(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.serviceIdMatchesService(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) =>\n this.serviceIdReferencesService(id, serviceClassName),\n ),\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 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 this.autowire = new Autowire(this.container);\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\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 return this.container.get<T>(serviceName);\n }\n}\n\nexport default DependencyInjection;\n"],"mappings":"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","names":["path","path"]}
1
+ {"version":3,"sources":["../src/contracts/ui/HttpRouteStatusEnum.ts","../src/errors/KernelError.ts","../src/errors/DependencyNotFoundError.ts","../src/errors/HandlerNotFoundError.ts","../src/Kernel.ts","../src/adapters/kernel/console/ConsoleKernelLogger.ts","../src/infrastructure/dependency-injection/DependencyInjection.ts","../src/kernel/KernelEnvironmentValidationError.ts"],"sourcesContent":["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 KernelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'KernelError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class DependencyNotFoundError extends KernelError {\n constructor(token: string) {\n super(`Dependency not found for token \"${token}\".`);\n this.name = 'DependencyNotFoundError';\n }\n}\n","import { KernelError } from './KernelError.js';\n\nexport class HandlerNotFoundError extends KernelError {\n constructor(kind: string, name: string) {\n super(`${kind} handler not found for \"${name}\".`);\n this.name = 'HandlerNotFoundError';\n }\n}\n","import dotenv, { type DotenvConfigOutput } from 'dotenv';\nimport path from 'node:path';\n\nimport type { Consumer } from './adapters/pubsub/index.js';\nimport type { Route } from './adapters/ui/routes/index.js';\nimport type {\n ConsumerMiddleware,\n KernelLogger,\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 { KernelEnvironmentValue } from './kernel/KernelEnvironmentValue.js';\nexport type { KernelEnvironmentVariableDefinition } from './kernel/KernelEnvironmentVariableDefinition.js';\nexport type { KernelEnvironmentVariablePrimitive } from './kernel/KernelEnvironmentVariablePrimitive.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: Consumer[] = [];\n private readonly loggerInstance: KernelLogger;\n private readonly routesList: ServiceClass<Route>[] = [];\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(): Consumer[] {\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<Route>[] {\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 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}\" must be a boolean.`,\n );\n }\n\n private static parseNumberEnvironmentVariable(\n name: string,\n value: string,\n ): number {\n if (value.trim() === '') {\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be a number.`,\n );\n }\n\n const parsedValue = Number(value);\n\n if (Number.isFinite(parsedValue)) {\n return parsedValue;\n }\n\n throw new KernelEnvironmentValidationError(\n `Environment variable \"${name}\" must be a number.`,\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 return Kernel.parseBooleanEnvironmentVariable(name, value);\n }\n\n if (definition.type === 'number') {\n return Kernel.parseNumberEnvironmentVariable(name, value);\n }\n\n return value;\n }\n\n private static validateEnvironmentVariables<\n TSchema extends KernelEnvironmentSchema,\n >(schema: TSchema): KernelEnvironmentForSchema<TSchema> {\n const environmentVariables: Record<string, KernelEnvironmentValue> = {};\n\n for (const [name, definition] of Object.entries(schema)) {\n const value = process.env[name] ?? definition.defaultValue?.toString();\n\n Kernel.assertRequiredEnvironmentVariable(name, value, schema);\n\n if (value !== undefined) {\n environmentVariables[name] = Kernel.parseEnvironmentVariable(\n name,\n value,\n schema,\n );\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<Consumer>,\n ): Consumer {\n return this.di.getService<Consumer>(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(): Consumer[] {\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<Route>[] {\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<Route>[] {\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<Consumer>[]\n ): void {\n for (const ClassDefinition of ClassDefinitions) {\n this.consumersList.push(this.getConsumerFromClass(ClassDefinition));\n }\n }\n\n public registerConsumerInstances(...consumers: Consumer[]): void {\n this.consumersList.push(...consumers);\n }\n\n public registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): 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 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 { ContainerInternals } from './ContainerInternals.js';\nimport type { DefinitionMetadata } from './DefinitionMetadata.js';\nimport type { DependencyInjectionOptions } from './DependencyInjectionOptions.js';\nimport type { DependencyOverride } from './DependencyOverride.js';\n\nexport class DependencyInjection implements ServiceResolver {\n private static configuredInstance: DependencyInjection | undefined;\n private autowire: Autowire | 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 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 parentMatchesService(\n parentId: string | null | undefined,\n serviceClassName: string,\n ): boolean {\n if (!parentId) {\n return false;\n }\n\n const parentName = Buffer.from(parentId, 'base64').toString('utf8');\n\n return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdMatchesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);\n }\n\n private serviceIdReferencesService(\n serviceId: string,\n serviceClassName: string,\n ): boolean {\n const serviceName = Buffer.from(serviceId, 'base64').toString('utf8');\n\n return serviceName.endsWith(`__${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(([, definition]) =>\n this.parentMatchesService(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.serviceIdMatchesService(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.serviceIdMatchesService(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) =>\n this.serviceIdReferencesService(id, serviceClassName),\n ),\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 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 this.autowire = new Autowire(this.container);\n this.autowire.serviceFile = new ServiceFile(\n this.options.servicesYamlPath,\n false,\n );\n await this.autowire.process();\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 return this.container.get<T>(serviceName);\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"],"mappings":"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","names":["path","path"]}
@@ -2,7 +2,7 @@ export { ErrorExplanation, ErrorResponseHandler, ExpressAppHook, ExpressControll
2
2
  import '../../adapters/ui/routes/index.cjs';
3
3
  import 'express';
4
4
  import 'routing-controllers';
5
- import '../../ShutdownHook-BUvR2Ii7.cjs';
5
+ import '../../ShutdownHook-BsEGvnEf.cjs';
6
6
  import '../../DomainEvent-mXWEtr_J.cjs';
7
7
  import 'dotenv';
8
8
  import '../../DomainEventConsumer-Bg-bOwmh.cjs';
@@ -2,7 +2,7 @@ export { ErrorExplanation, ErrorResponseHandler, ExpressAppHook, ExpressControll
2
2
  import '../../adapters/ui/routes/index.js';
3
3
  import 'express';
4
4
  import 'routing-controllers';
5
- import '../../ShutdownHook-3Gc1yyHI.js';
5
+ import '../../ShutdownHook-B03Mcke-.js';
6
6
  import '../../DomainEvent-mXWEtr_J.js';
7
7
  import 'dotenv';
8
8
  import '../../DomainEventConsumer-BroJmVty.js';