@haskou/ddd-kernel 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +44 -115
  2. package/dist/DomainEventConsumer-Bg-bOwmh.d.cts +11 -0
  3. package/dist/DomainEventConsumer-BroJmVty.d.ts +11 -0
  4. package/dist/DomainMessageBus-3jYk7TPw.d.ts +13 -0
  5. package/dist/DomainMessageBus-OyliPu3Z.d.cts +13 -0
  6. package/dist/MessageBus-BtUXnd0Y.d.cts +10 -0
  7. package/dist/MessageBus-oQ9BnW84.d.ts +10 -0
  8. package/dist/{NoFailedMessagesError-0YJKRWPF.d.ts → NoFailedMessagesError-BLpGI-G4.d.ts} +6 -1
  9. package/dist/{NoFailedMessagesError-Kz7CYWpT.d.cts → NoFailedMessagesError-BjxYoKTR.d.cts} +6 -1
  10. package/dist/PublisherHookErrorPolicy-CjouTcSR.d.cts +8 -0
  11. package/dist/PublisherHookErrorPolicy-DSsCNE6O.d.ts +8 -0
  12. package/dist/RetryPredicate-U7dYnQ4N.d.ts +15 -0
  13. package/dist/RetryPredicate-yT_z9zk1.d.cts +15 -0
  14. package/dist/{Scheduler-oigqNOUJ.d.ts → Scheduler-BW-U5Ccg.d.cts} +1 -1
  15. package/dist/{Scheduler-oigqNOUJ.d.cts → Scheduler-BW-U5Ccg.d.ts} +1 -1
  16. package/dist/ServiceClass-BkEHcXDi.d.cts +72 -0
  17. package/dist/ServiceClass-Bq_fBC5R.d.ts +72 -0
  18. package/dist/{Kernel-BWUOUWWI.d.cts → ShutdownHook-BjbnCKzr.d.cts} +49 -7
  19. package/dist/{Kernel-CUaqHa1s.d.ts → ShutdownHook-CMWLsfu-.d.ts} +49 -7
  20. package/dist/Subscription-4vuAAxax.d.cts +23 -0
  21. package/dist/Subscription-vtF0lEHP.d.ts +23 -0
  22. package/dist/adapters/index.cjs +665 -37
  23. package/dist/adapters/index.cjs.map +1 -1
  24. package/dist/adapters/index.d.cts +15 -13
  25. package/dist/adapters/index.d.ts +15 -13
  26. package/dist/adapters/index.js +659 -37
  27. package/dist/adapters/index.js.map +1 -1
  28. package/dist/adapters/pubsub/amqp/index.cjs +241 -16
  29. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  30. package/dist/adapters/pubsub/amqp/index.d.cts +16 -8
  31. package/dist/adapters/pubsub/amqp/index.d.ts +16 -8
  32. package/dist/adapters/pubsub/amqp/index.js +241 -16
  33. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  34. package/dist/adapters/pubsub/in-memory/index.cjs +96 -8
  35. package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -1
  36. package/dist/adapters/pubsub/in-memory/index.d.cts +9 -3
  37. package/dist/adapters/pubsub/in-memory/index.d.ts +9 -3
  38. package/dist/adapters/pubsub/in-memory/index.js +96 -8
  39. package/dist/adapters/pubsub/in-memory/index.js.map +1 -1
  40. package/dist/adapters/pubsub/index.cjs +397 -27
  41. package/dist/adapters/pubsub/index.cjs.map +1 -1
  42. package/dist/adapters/pubsub/index.d.cts +89 -7
  43. package/dist/adapters/pubsub/index.d.ts +89 -7
  44. package/dist/adapters/pubsub/index.js +389 -26
  45. package/dist/adapters/pubsub/index.js.map +1 -1
  46. package/dist/adapters/ui/express/index.cjs +279 -11
  47. package/dist/adapters/ui/express/index.cjs.map +1 -1
  48. package/dist/adapters/ui/express/index.d.cts +127 -12
  49. package/dist/adapters/ui/express/index.d.ts +127 -12
  50. package/dist/adapters/ui/express/index.js +270 -11
  51. package/dist/adapters/ui/express/index.js.map +1 -1
  52. package/dist/adapters/ui/index.cjs +412 -27
  53. package/dist/adapters/ui/index.cjs.map +1 -1
  54. package/dist/adapters/ui/index.d.cts +7 -8
  55. package/dist/adapters/ui/index.d.ts +7 -8
  56. package/dist/adapters/ui/index.js +413 -27
  57. package/dist/adapters/ui/index.js.map +1 -1
  58. package/dist/adapters/ui/routes/index.cjs +136 -9
  59. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  60. package/dist/adapters/ui/routes/index.js +136 -9
  61. package/dist/adapters/ui/routes/index.js.map +1 -1
  62. package/dist/contracts/index.cjs +16 -17
  63. package/dist/contracts/index.cjs.map +1 -1
  64. package/dist/contracts/index.d.cts +10 -2
  65. package/dist/contracts/index.d.ts +10 -2
  66. package/dist/contracts/index.js +16 -17
  67. package/dist/contracts/index.js.map +1 -1
  68. package/dist/contracts/kernel/index.cjs.map +1 -1
  69. package/dist/contracts/kernel/index.d.cts +7 -1
  70. package/dist/contracts/kernel/index.d.ts +7 -1
  71. package/dist/contracts/pubsub/index.cjs.map +1 -1
  72. package/dist/contracts/pubsub/index.d.cts +5 -1
  73. package/dist/contracts/pubsub/index.d.ts +5 -1
  74. package/dist/contracts/ui/index.cjs +16 -17
  75. package/dist/contracts/ui/index.cjs.map +1 -1
  76. package/dist/contracts/ui/index.d.cts +16 -16
  77. package/dist/contracts/ui/index.d.ts +16 -16
  78. package/dist/contracts/ui/index.js +16 -17
  79. package/dist/contracts/ui/index.js.map +1 -1
  80. package/dist/domain/index.cjs.map +1 -1
  81. package/dist/domain/index.d.cts +6 -2
  82. package/dist/domain/index.d.ts +6 -2
  83. package/dist/domain/index.js.map +1 -1
  84. package/dist/index.cjs +152 -26
  85. package/dist/index.cjs.map +1 -1
  86. package/dist/index.d.cts +8 -7
  87. package/dist/index.d.ts +8 -7
  88. package/dist/index.js +152 -26
  89. package/dist/index.js.map +1 -1
  90. package/dist/infrastructure/dependency-injection/index.cjs +119 -3
  91. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
  92. package/dist/infrastructure/dependency-injection/index.d.cts +4 -1
  93. package/dist/infrastructure/dependency-injection/index.d.ts +4 -1
  94. package/dist/infrastructure/dependency-injection/index.js +119 -3
  95. package/dist/infrastructure/dependency-injection/index.js.map +1 -1
  96. package/dist/infrastructure/express/index.cjs +279 -11
  97. package/dist/infrastructure/express/index.cjs.map +1 -1
  98. package/dist/infrastructure/express/index.d.cts +7 -8
  99. package/dist/infrastructure/express/index.d.ts +7 -8
  100. package/dist/infrastructure/express/index.js +270 -11
  101. package/dist/infrastructure/express/index.js.map +1 -1
  102. package/dist/infrastructure/scheduler/index.cjs +136 -9
  103. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  104. package/dist/infrastructure/scheduler/index.d.cts +2 -2
  105. package/dist/infrastructure/scheduler/index.d.ts +2 -2
  106. package/dist/infrastructure/scheduler/index.js +136 -9
  107. package/dist/infrastructure/scheduler/index.js.map +1 -1
  108. package/package.json +101 -11
  109. package/dist/Consumer-CC8ZRCsd.d.cts +0 -17
  110. package/dist/Consumer-CeT0Wbxb.d.ts +0 -17
  111. package/dist/DomainEventConsumer-3WBMSSr2.d.cts +0 -7
  112. package/dist/DomainEventConsumer-B4hkIUmP.d.ts +0 -7
  113. package/dist/DomainEventPublisher-8G0lvmdy.d.cts +0 -7
  114. package/dist/DomainEventPublisher-DhGgM3f2.d.ts +0 -7
  115. package/dist/ServiceClass-BmNw8fJj.d.cts +0 -37
  116. package/dist/ServiceClass-C7NCKdSS.d.ts +0 -37
  117. package/dist/ShutdownHook-BGskq2-q.d.ts +0 -9
  118. package/dist/ShutdownHook-Dib5uNKB.d.cts +0 -9
  119. package/dist/Subscription-Bwkb_did.d.ts +0 -9
  120. package/dist/Subscription-P9WROD_6.d.cts +0 -9
@@ -80,6 +80,7 @@ var DependencyInjection = class _DependencyInjection {
80
80
  autowire;
81
81
  loader;
82
82
  container;
83
+ overrideTokenIds = /* @__PURE__ */ new Map();
83
84
  static configure(options) {
84
85
  _DependencyInjection.configuredInstance = new _DependencyInjection(options);
85
86
  return _DependencyInjection.configuredInstance;
@@ -104,6 +105,16 @@ var DependencyInjection = class _DependencyInjection {
104
105
  getServiceClassName(serviceName) {
105
106
  return typeof serviceName === "function" ? serviceName.name : void 0;
106
107
  }
108
+ getOverrideId(prefix, token) {
109
+ const tokenName = this.getServiceClassName(token) ?? String(token);
110
+ return `ddd-kernel.override.${prefix}.${tokenName}`;
111
+ }
112
+ ensureSyntheticService(id, value) {
113
+ const definition = this.container.register(id);
114
+ definition.public = true;
115
+ definition.synthetic = true;
116
+ this.container.set(id, value);
117
+ }
107
118
  parentMatchesService(parentId, serviceClassName) {
108
119
  if (!parentId) {
109
120
  return false;
@@ -115,6 +126,26 @@ var DependencyInjection = class _DependencyInjection {
115
126
  const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
116
127
  return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
117
128
  }
129
+ serviceIdReferencesService(serviceId, serviceClassName) {
130
+ const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
131
+ return serviceName.endsWith(`__${serviceClassName}`);
132
+ }
133
+ getReferenceId(value) {
134
+ if (typeof value === "object" && value !== null && "id" in value && typeof value.id === "string") {
135
+ return value.id;
136
+ }
137
+ return void 0;
138
+ }
139
+ getDefinitionArgumentReferences(definition) {
140
+ return [
141
+ ...definition._args ?? [],
142
+ ...definition._appendArgs ?? [],
143
+ ...definition._overrideArgs ?? []
144
+ ].flatMap((argument) => {
145
+ const referenceId = this.getReferenceId(argument);
146
+ return referenceId ? [referenceId] : [];
147
+ });
148
+ }
118
149
  findConcreteChildServiceId(serviceName) {
119
150
  const serviceClassName = this.getServiceClassName(serviceName);
120
151
  if (!serviceClassName) {
@@ -145,6 +176,86 @@ var DependencyInjection = class _DependencyInjection {
145
176
  );
146
177
  return matches[matches.length - 1];
147
178
  }
179
+ findReferencedServiceIds(serviceName) {
180
+ const serviceClassName = this.getServiceClassName(serviceName);
181
+ if (!serviceClassName) {
182
+ return [];
183
+ }
184
+ return [
185
+ ...new Set(
186
+ [...this.definitions.values()].flatMap(
187
+ (definition) => this.getDefinitionArgumentReferences(definition)
188
+ ).filter(
189
+ (id) => this.serviceIdReferencesService(id, serviceClassName)
190
+ )
191
+ )
192
+ ];
193
+ }
194
+ getOverrideTokenIds(token) {
195
+ const tokenIds = [
196
+ this.findRegisteredServiceId(token),
197
+ this.findAliasServiceId(token),
198
+ ...this.findReferencedServiceIds(token)
199
+ ].filter((id) => id !== void 0);
200
+ const existingTokenIds = [...new Set(tokenIds)];
201
+ if (existingTokenIds.length > 0) {
202
+ return existingTokenIds;
203
+ }
204
+ const overrideTokenId = this.getOverrideId("token", token);
205
+ this.ensureSyntheticService(overrideTokenId, void 0);
206
+ return [overrideTokenId];
207
+ }
208
+ getOverrideClassServiceId(ClassDefinition) {
209
+ const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);
210
+ if (registeredServiceId) {
211
+ return registeredServiceId;
212
+ }
213
+ const overrideClassId = this.getOverrideId("class", ClassDefinition);
214
+ this.container.register(overrideClassId, ClassDefinition);
215
+ return overrideClassId;
216
+ }
217
+ applyClassOverride(override) {
218
+ if (!("useClass" in override)) {
219
+ return;
220
+ }
221
+ const tokenIds = this.getOverrideTokenIds(override.token);
222
+ const classId = this.getOverrideClassServiceId(override.useClass);
223
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
224
+ for (const tokenId of tokenIds) {
225
+ this.container.setAlias(tokenId, classId);
226
+ }
227
+ }
228
+ applyFactoryOverride(override) {
229
+ if (!("useFactory" in override)) {
230
+ return;
231
+ }
232
+ const tokenIds = this.getOverrideTokenIds(override.token);
233
+ const factoryId = this.getOverrideId("factory", override.token);
234
+ this.ensureSyntheticService(factoryId, override.useFactory(this));
235
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
236
+ for (const tokenId of tokenIds) {
237
+ this.container.setAlias(tokenId, factoryId);
238
+ }
239
+ }
240
+ applyValueOverride(override) {
241
+ if (!("useValue" in override)) {
242
+ return;
243
+ }
244
+ const tokenIds = this.getOverrideTokenIds(override.token);
245
+ const valueId = this.getOverrideId("value", override.token);
246
+ this.ensureSyntheticService(valueId, override.useValue);
247
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
248
+ for (const tokenId of tokenIds) {
249
+ this.container.setAlias(tokenId, valueId);
250
+ }
251
+ }
252
+ applyOverrides() {
253
+ for (const override of this.options.overrides ?? []) {
254
+ this.applyClassOverride(override);
255
+ this.applyFactoryOverride(override);
256
+ this.applyValueOverride(override);
257
+ }
258
+ }
148
259
  registerParentAliases() {
149
260
  for (const [id, definition] of this.definitions.entries()) {
150
261
  if (definition._abstract === true || !definition._parent) {
@@ -167,17 +278,22 @@ var DependencyInjection = class _DependencyInjection {
167
278
  await this.loader.load(this.options.servicesYamlPath);
168
279
  }
169
280
  this.registerParentAliases();
281
+ this.applyOverrides();
170
282
  await this.container.compile();
171
283
  }
172
284
  getService(serviceName) {
173
- const childServiceId = this.findConcreteChildServiceId(serviceName);
174
- if (childServiceId) {
175
- return this.container.get(childServiceId);
285
+ const overrideTokenId = this.overrideTokenIds.get(serviceName);
286
+ if (overrideTokenId) {
287
+ return this.container.get(overrideTokenId);
176
288
  }
177
289
  const aliasServiceId = this.findAliasServiceId(serviceName);
178
290
  if (aliasServiceId) {
179
291
  return this.container.get(aliasServiceId);
180
292
  }
293
+ const childServiceId = this.findConcreteChildServiceId(serviceName);
294
+ if (childServiceId) {
295
+ return this.container.get(childServiceId);
296
+ }
181
297
  const registeredServiceId = this.findRegisteredServiceId(serviceName);
182
298
  if (registeredServiceId) {
183
299
  return this.container.get(registeredServiceId);
@@ -225,6 +341,9 @@ var Kernel = class _Kernel {
225
341
  static get logger() {
226
342
  return _Kernel.getActiveKernel().logger;
227
343
  }
344
+ static get active() {
345
+ return _Kernel.getActiveKernel();
346
+ }
228
347
  static get rootDirectory() {
229
348
  return process.cwd();
230
349
  }
@@ -293,13 +412,21 @@ var Kernel = class _Kernel {
293
412
  get schedulers() {
294
413
  return this.schedulersList;
295
414
  }
296
- async dependencyInjection() {
297
- this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure({
298
- containerBuild: process.env.CONTAINER_BUILD === "true",
299
- servicesYamlPath: this.options.servicesYamlPath ?? import_node_path2.default.resolve(_Kernel.configDirectory, "container", "services.yaml"),
300
- sourceDirectory: this.options.sourceDirectory ?? _Kernel.sourceDirectory
301
- });
415
+ getDependencyInjectionOptions(options = {}) {
416
+ return {
417
+ containerBuild: options.containerBuild ?? process.env.CONTAINER_BUILD === "true",
418
+ overrides: options.overrides ?? [],
419
+ servicesYamlPath: options.servicesYamlPath ?? this.options.servicesYamlPath ?? import_node_path2.default.resolve(_Kernel.configDirectory, "container", "services.yaml"),
420
+ sourceDirectory: options.sourceDirectory ?? this.options.sourceDirectory ?? _Kernel.sourceDirectory
421
+ };
422
+ }
423
+ async dependencyInjection(options = {}) {
424
+ _Kernel.state.activeKernel = this;
425
+ this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure(
426
+ this.getDependencyInjectionOptions(options)
427
+ );
302
428
  await this.dependencyInjectionInstance.compile();
429
+ _Kernel.state.activeKernel = this;
303
430
  }
304
431
  getRoutes() {
305
432
  return this.routes;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/infrastructure/scheduler/index.ts","../../../src/Kernel.ts","../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../src/infrastructure/scheduler/ScheduledExecutionError.ts","../../../src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts","../../../src/infrastructure/scheduler/InvalidParseCronExpressionError.ts","../../../src/infrastructure/scheduler/Scheduler.ts"],"sourcesContent":["export * from './CronExpression.js';\nexport * from './DefaultSchedulerErrorPolicy.js';\nexport * from './InvalidParseCronExpressionError.js';\nexport * from './ScheduledExecutionError.js';\nexport * from './Scheduler.js';\nexport * from './SchedulerErrorPolicy.js';\nexport { default } from './Scheduler.js';\n","import 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 { 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 { 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 logger(): KernelLogger {\n return Kernel.getActiveKernel().logger;\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 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 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 public async dependencyInjection(): Promise<void> {\n this.dependencyInjectionInstance =\n this.dependencyInjectionInstance ??\n DependencyInjection.configure({\n containerBuild: process.env.CONTAINER_BUILD === 'true',\n servicesYamlPath:\n this.options.servicesYamlPath ??\n path.resolve(Kernel.configDirectory, 'container', 'services.yaml'),\n sourceDirectory: this.options.sourceDirectory ?? Kernel.sourceDirectory,\n });\n\n await this.dependencyInjectionInstance.compile();\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';\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\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 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 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 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 await this.container.compile();\n }\n\n public getService<T>(serviceName: unknown): T {\n const childServiceId = this.findConcreteChildServiceId(serviceName);\n\n if (childServiceId) {\n return this.container.get<T>(childServiceId);\n }\n\n const aliasServiceId = this.findAliasServiceId(serviceName);\n\n if (aliasServiceId) {\n return this.container.get<T>(aliasServiceId);\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 ScheduledExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScheduledExecutionError';\n }\n}\n","import type { Scheduler } from './Scheduler.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { ScheduledExecutionError } from './ScheduledExecutionError.js';\n\nexport class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {\n public handle(error: unknown, scheduler: Scheduler): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scheduledError = new ScheduledExecutionError(\n `Error on ${scheduler.getProcessName()}: ${errorMessage}`,\n );\n\n Kernel.logger.error(scheduledError.message);\n }\n\n public shouldSkip(): boolean {\n return false;\n }\n}\n\nexport default DefaultSchedulerErrorPolicy;\n","export class InvalidParseCronExpressionError extends Error {\n constructor(processName: string) {\n super(`Invalid cron expression for scheduler \"${processName}\".`);\n this.name = 'InvalidParseCronExpressionError';\n }\n}\n","import cron from 'node-cron';\n\nimport type { CronExpression } from './CronExpression.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { DefaultSchedulerErrorPolicy } from './DefaultSchedulerErrorPolicy.js';\nimport { InvalidParseCronExpressionError } from './InvalidParseCronExpressionError.js';\n\nexport abstract class Scheduler {\n constructor(\n private readonly errorPolicy: SchedulerErrorPolicy = new DefaultSchedulerErrorPolicy(),\n ) {}\n\n private parseCronExpression(): string {\n const expression = this.getCronExpression();\n\n return (\n '' +\n `${expression.second ?? '*'} ` +\n `${expression.minute ?? '*'} ` +\n `${expression.hour ?? '*'} ` +\n `${expression.dayOfMonth ?? '*'} ` +\n `${expression.month ?? '*'} ` +\n `${expression.dayOfWeek ?? '*'}`\n );\n }\n\n public abstract execute(): Promise<void>;\n\n public abstract getCronExpression(): CronExpression;\n\n public abstract getProcessName(): string;\n\n public async runOnce(): Promise<void> {\n try {\n Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);\n await this.execute();\n } catch (error: unknown) {\n if (this.errorPolicy.shouldSkip(error)) {\n return;\n }\n\n await this.errorPolicy.handle(error, this);\n }\n }\n\n public get<T>(service: unknown): T {\n return Kernel.di.getService<T>(service);\n }\n\n public init(): Promise<void> {\n let parsedCronExpression: string;\n\n try {\n parsedCronExpression = this.parseCronExpression();\n } catch {\n throw new InvalidParseCronExpressionError(this.getProcessName());\n }\n\n cron.schedule(parsedCronExpression, () => {\n void this.runOnce();\n });\n\n return Promise.resolve();\n }\n}\n\nexport default Scheduler;\n"],"mappings":"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","names":["import_node_path","path","fs","path","cron"]}
1
+ {"version":3,"sources":["../../../src/infrastructure/scheduler/index.ts","../../../src/Kernel.ts","../../../src/adapters/kernel/console/ConsoleKernelLogger.ts","../../../src/infrastructure/dependency-injection/DependencyInjection.ts","../../../src/infrastructure/scheduler/ScheduledExecutionError.ts","../../../src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts","../../../src/infrastructure/scheduler/InvalidParseCronExpressionError.ts","../../../src/infrastructure/scheduler/Scheduler.ts"],"sourcesContent":["export * from './CronExpression.js';\nexport * from './DefaultSchedulerErrorPolicy.js';\nexport * from './InvalidParseCronExpressionError.js';\nexport * from './ScheduledExecutionError.js';\nexport * from './Scheduler.js';\nexport * from './SchedulerErrorPolicy.js';\nexport { default } from './Scheduler.js';\n","import 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 { 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 { 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 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 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 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 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","export class ScheduledExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ScheduledExecutionError';\n }\n}\n","import type { Scheduler } from './Scheduler.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { ScheduledExecutionError } from './ScheduledExecutionError.js';\n\nexport class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {\n public handle(error: unknown, scheduler: Scheduler): void {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const scheduledError = new ScheduledExecutionError(\n `Error on ${scheduler.getProcessName()}: ${errorMessage}`,\n );\n\n Kernel.logger.error(scheduledError.message);\n }\n\n public shouldSkip(): boolean {\n return false;\n }\n}\n\nexport default DefaultSchedulerErrorPolicy;\n","export class InvalidParseCronExpressionError extends Error {\n constructor(processName: string) {\n super(`Invalid cron expression for scheduler \"${processName}\".`);\n this.name = 'InvalidParseCronExpressionError';\n }\n}\n","import cron from 'node-cron';\n\nimport type { CronExpression } from './CronExpression.js';\nimport type { SchedulerErrorPolicy } from './SchedulerErrorPolicy.js';\n\nimport { Kernel } from '../../Kernel.js';\nimport { DefaultSchedulerErrorPolicy } from './DefaultSchedulerErrorPolicy.js';\nimport { InvalidParseCronExpressionError } from './InvalidParseCronExpressionError.js';\n\nexport abstract class Scheduler {\n constructor(\n private readonly errorPolicy: SchedulerErrorPolicy = new DefaultSchedulerErrorPolicy(),\n ) {}\n\n private parseCronExpression(): string {\n const expression = this.getCronExpression();\n\n return (\n '' +\n `${expression.second ?? '*'} ` +\n `${expression.minute ?? '*'} ` +\n `${expression.hour ?? '*'} ` +\n `${expression.dayOfMonth ?? '*'} ` +\n `${expression.month ?? '*'} ` +\n `${expression.dayOfWeek ?? '*'}`\n );\n }\n\n public abstract execute(): Promise<void>;\n\n public abstract getCronExpression(): CronExpression;\n\n public abstract getProcessName(): string;\n\n public async runOnce(): Promise<void> {\n try {\n Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);\n await this.execute();\n } catch (error: unknown) {\n if (this.errorPolicy.shouldSkip(error)) {\n return;\n }\n\n await this.errorPolicy.handle(error, this);\n }\n }\n\n public get<T>(service: unknown): T {\n return Kernel.di.getService<T>(service);\n }\n\n public init(): Promise<void> {\n let parsedCronExpression: string;\n\n try {\n parsedCronExpression = this.parseCronExpression();\n } catch {\n throw new InvalidParseCronExpressionError(this.getProcessName());\n }\n\n cron.schedule(parsedCronExpression, () => {\n void this.runOnce();\n });\n\n return Promise.resolve();\n }\n}\n\nexport default Scheduler;\n"],"mappings":"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","names":["import_node_path","path","fs","path","cron"]}
@@ -1,5 +1,5 @@
1
- import { a as SchedulerErrorPolicy, S as Scheduler } from '../../Scheduler-oigqNOUJ.cjs';
2
- export { C as CronExpression } from '../../Scheduler-oigqNOUJ.cjs';
1
+ import { S as SchedulerErrorPolicy, a as Scheduler } from '../../Scheduler-BW-U5Ccg.cjs';
2
+ export { C as CronExpression } from '../../Scheduler-BW-U5Ccg.cjs';
3
3
 
4
4
  declare class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {
5
5
  handle(error: unknown, scheduler: Scheduler): void;
@@ -1,5 +1,5 @@
1
- import { a as SchedulerErrorPolicy, S as Scheduler } from '../../Scheduler-oigqNOUJ.js';
2
- export { C as CronExpression } from '../../Scheduler-oigqNOUJ.js';
1
+ import { S as SchedulerErrorPolicy, a as Scheduler } from '../../Scheduler-BW-U5Ccg.js';
2
+ export { C as CronExpression } from '../../Scheduler-BW-U5Ccg.js';
3
3
 
4
4
  declare class DefaultSchedulerErrorPolicy implements SchedulerErrorPolicy {
5
5
  handle(error: unknown, scheduler: Scheduler): void;
@@ -45,6 +45,7 @@ var DependencyInjection = class _DependencyInjection {
45
45
  autowire;
46
46
  loader;
47
47
  container;
48
+ overrideTokenIds = /* @__PURE__ */ new Map();
48
49
  static configure(options) {
49
50
  _DependencyInjection.configuredInstance = new _DependencyInjection(options);
50
51
  return _DependencyInjection.configuredInstance;
@@ -69,6 +70,16 @@ var DependencyInjection = class _DependencyInjection {
69
70
  getServiceClassName(serviceName) {
70
71
  return typeof serviceName === "function" ? serviceName.name : void 0;
71
72
  }
73
+ getOverrideId(prefix, token) {
74
+ const tokenName = this.getServiceClassName(token) ?? String(token);
75
+ return `ddd-kernel.override.${prefix}.${tokenName}`;
76
+ }
77
+ ensureSyntheticService(id, value) {
78
+ const definition = this.container.register(id);
79
+ definition.public = true;
80
+ definition.synthetic = true;
81
+ this.container.set(id, value);
82
+ }
72
83
  parentMatchesService(parentId, serviceClassName) {
73
84
  if (!parentId) {
74
85
  return false;
@@ -80,6 +91,26 @@ var DependencyInjection = class _DependencyInjection {
80
91
  const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
81
92
  return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
82
93
  }
94
+ serviceIdReferencesService(serviceId, serviceClassName) {
95
+ const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
96
+ return serviceName.endsWith(`__${serviceClassName}`);
97
+ }
98
+ getReferenceId(value) {
99
+ if (typeof value === "object" && value !== null && "id" in value && typeof value.id === "string") {
100
+ return value.id;
101
+ }
102
+ return void 0;
103
+ }
104
+ getDefinitionArgumentReferences(definition) {
105
+ return [
106
+ ...definition._args ?? [],
107
+ ...definition._appendArgs ?? [],
108
+ ...definition._overrideArgs ?? []
109
+ ].flatMap((argument) => {
110
+ const referenceId = this.getReferenceId(argument);
111
+ return referenceId ? [referenceId] : [];
112
+ });
113
+ }
83
114
  findConcreteChildServiceId(serviceName) {
84
115
  const serviceClassName = this.getServiceClassName(serviceName);
85
116
  if (!serviceClassName) {
@@ -110,6 +141,86 @@ var DependencyInjection = class _DependencyInjection {
110
141
  );
111
142
  return matches[matches.length - 1];
112
143
  }
144
+ findReferencedServiceIds(serviceName) {
145
+ const serviceClassName = this.getServiceClassName(serviceName);
146
+ if (!serviceClassName) {
147
+ return [];
148
+ }
149
+ return [
150
+ ...new Set(
151
+ [...this.definitions.values()].flatMap(
152
+ (definition) => this.getDefinitionArgumentReferences(definition)
153
+ ).filter(
154
+ (id) => this.serviceIdReferencesService(id, serviceClassName)
155
+ )
156
+ )
157
+ ];
158
+ }
159
+ getOverrideTokenIds(token) {
160
+ const tokenIds = [
161
+ this.findRegisteredServiceId(token),
162
+ this.findAliasServiceId(token),
163
+ ...this.findReferencedServiceIds(token)
164
+ ].filter((id) => id !== void 0);
165
+ const existingTokenIds = [...new Set(tokenIds)];
166
+ if (existingTokenIds.length > 0) {
167
+ return existingTokenIds;
168
+ }
169
+ const overrideTokenId = this.getOverrideId("token", token);
170
+ this.ensureSyntheticService(overrideTokenId, void 0);
171
+ return [overrideTokenId];
172
+ }
173
+ getOverrideClassServiceId(ClassDefinition) {
174
+ const registeredServiceId = this.findRegisteredServiceId(ClassDefinition);
175
+ if (registeredServiceId) {
176
+ return registeredServiceId;
177
+ }
178
+ const overrideClassId = this.getOverrideId("class", ClassDefinition);
179
+ this.container.register(overrideClassId, ClassDefinition);
180
+ return overrideClassId;
181
+ }
182
+ applyClassOverride(override) {
183
+ if (!("useClass" in override)) {
184
+ return;
185
+ }
186
+ const tokenIds = this.getOverrideTokenIds(override.token);
187
+ const classId = this.getOverrideClassServiceId(override.useClass);
188
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
189
+ for (const tokenId of tokenIds) {
190
+ this.container.setAlias(tokenId, classId);
191
+ }
192
+ }
193
+ applyFactoryOverride(override) {
194
+ if (!("useFactory" in override)) {
195
+ return;
196
+ }
197
+ const tokenIds = this.getOverrideTokenIds(override.token);
198
+ const factoryId = this.getOverrideId("factory", override.token);
199
+ this.ensureSyntheticService(factoryId, override.useFactory(this));
200
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
201
+ for (const tokenId of tokenIds) {
202
+ this.container.setAlias(tokenId, factoryId);
203
+ }
204
+ }
205
+ applyValueOverride(override) {
206
+ if (!("useValue" in override)) {
207
+ return;
208
+ }
209
+ const tokenIds = this.getOverrideTokenIds(override.token);
210
+ const valueId = this.getOverrideId("value", override.token);
211
+ this.ensureSyntheticService(valueId, override.useValue);
212
+ this.overrideTokenIds.set(override.token, tokenIds[0]);
213
+ for (const tokenId of tokenIds) {
214
+ this.container.setAlias(tokenId, valueId);
215
+ }
216
+ }
217
+ applyOverrides() {
218
+ for (const override of this.options.overrides ?? []) {
219
+ this.applyClassOverride(override);
220
+ this.applyFactoryOverride(override);
221
+ this.applyValueOverride(override);
222
+ }
223
+ }
113
224
  registerParentAliases() {
114
225
  for (const [id, definition] of this.definitions.entries()) {
115
226
  if (definition._abstract === true || !definition._parent) {
@@ -132,17 +243,22 @@ var DependencyInjection = class _DependencyInjection {
132
243
  await this.loader.load(this.options.servicesYamlPath);
133
244
  }
134
245
  this.registerParentAliases();
246
+ this.applyOverrides();
135
247
  await this.container.compile();
136
248
  }
137
249
  getService(serviceName) {
138
- const childServiceId = this.findConcreteChildServiceId(serviceName);
139
- if (childServiceId) {
140
- return this.container.get(childServiceId);
250
+ const overrideTokenId = this.overrideTokenIds.get(serviceName);
251
+ if (overrideTokenId) {
252
+ return this.container.get(overrideTokenId);
141
253
  }
142
254
  const aliasServiceId = this.findAliasServiceId(serviceName);
143
255
  if (aliasServiceId) {
144
256
  return this.container.get(aliasServiceId);
145
257
  }
258
+ const childServiceId = this.findConcreteChildServiceId(serviceName);
259
+ if (childServiceId) {
260
+ return this.container.get(childServiceId);
261
+ }
146
262
  const registeredServiceId = this.findRegisteredServiceId(serviceName);
147
263
  if (registeredServiceId) {
148
264
  return this.container.get(registeredServiceId);
@@ -190,6 +306,9 @@ var Kernel = class _Kernel {
190
306
  static get logger() {
191
307
  return _Kernel.getActiveKernel().logger;
192
308
  }
309
+ static get active() {
310
+ return _Kernel.getActiveKernel();
311
+ }
193
312
  static get rootDirectory() {
194
313
  return process.cwd();
195
314
  }
@@ -258,13 +377,21 @@ var Kernel = class _Kernel {
258
377
  get schedulers() {
259
378
  return this.schedulersList;
260
379
  }
261
- async dependencyInjection() {
262
- this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure({
263
- containerBuild: process.env.CONTAINER_BUILD === "true",
264
- servicesYamlPath: this.options.servicesYamlPath ?? path2.resolve(_Kernel.configDirectory, "container", "services.yaml"),
265
- sourceDirectory: this.options.sourceDirectory ?? _Kernel.sourceDirectory
266
- });
380
+ getDependencyInjectionOptions(options = {}) {
381
+ return {
382
+ containerBuild: options.containerBuild ?? process.env.CONTAINER_BUILD === "true",
383
+ overrides: options.overrides ?? [],
384
+ servicesYamlPath: options.servicesYamlPath ?? this.options.servicesYamlPath ?? path2.resolve(_Kernel.configDirectory, "container", "services.yaml"),
385
+ sourceDirectory: options.sourceDirectory ?? this.options.sourceDirectory ?? _Kernel.sourceDirectory
386
+ };
387
+ }
388
+ async dependencyInjection(options = {}) {
389
+ _Kernel.state.activeKernel = this;
390
+ this.dependencyInjectionInstance = this.dependencyInjectionInstance ?? DependencyInjection.configure(
391
+ this.getDependencyInjectionOptions(options)
392
+ );
267
393
  await this.dependencyInjectionInstance.compile();
394
+ _Kernel.state.activeKernel = this;
268
395
  }
269
396
  getRoutes() {
270
397
  return this.routes;