@haskou/ddd-kernel 2.0.1 → 2.0.3

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 (89) hide show
  1. package/dist/{DomainMessageBus-CQSFU6A6.d.cts → DomainMessageBus-BHnBQZvI.d.cts} +1 -1
  2. package/dist/{DomainMessageBus-kjMVNGfv.d.ts → DomainMessageBus-DbctRnBy.d.ts} +1 -1
  3. package/dist/{HandlerContext-DUUExVo3.d.ts → HandlerContext-BT0RLBRT.d.ts} +1 -1
  4. package/dist/{HandlerContext-Lm89pSeG.d.cts → HandlerContext-CdX28Pr5.d.cts} +1 -1
  5. package/dist/{MessageBus-BtUXnd0Y.d.cts → MessageBus-BTy_hVua.d.cts} +2 -2
  6. package/dist/{MessageBus-oQ9BnW84.d.ts → MessageBus-BkHiX3LI.d.ts} +2 -2
  7. package/dist/{NoFailedMessagesError-z-6ffelK.d.ts → NoFailedMessagesError-C6wMAOvs.d.ts} +2 -2
  8. package/dist/{NoFailedMessagesError-Dm5AFcJV.d.cts → NoFailedMessagesError-De3UfABY.d.cts} +2 -2
  9. package/dist/{PublisherHookErrorPolicy-DSsCNE6O.d.ts → PublisherHookErrorPolicy-Bfh_QLs7.d.ts} +1 -1
  10. package/dist/{PublisherHookErrorPolicy-CjouTcSR.d.cts → PublisherHookErrorPolicy-BgSvNZBD.d.cts} +1 -1
  11. package/dist/{RetryPredicate-DNdxY_KR.d.cts → RetryPredicate-CqvyqG9g.d.cts} +1 -1
  12. package/dist/{RetryPredicate-CD9n6cE8.d.ts → RetryPredicate-DTeTm450.d.ts} +1 -1
  13. package/dist/{ServiceClass-BkEHcXDi.d.cts → ServiceClass-D_0gCcMr.d.cts} +4 -1
  14. package/dist/{ServiceClass-Bq_fBC5R.d.ts → ServiceClass-IInu6j5L.d.ts} +4 -1
  15. package/dist/{ServiceResolver-D2Jz-l_Z.d.cts → ServiceResolver-CQGmbk-X.d.cts} +1 -0
  16. package/dist/{ServiceResolver-D2Jz-l_Z.d.ts → ServiceResolver-CQGmbk-X.d.ts} +1 -0
  17. package/dist/{ShutdownHook-D23WfIIc.d.cts → ShutdownHook-C48hH6-x.d.cts} +4 -1
  18. package/dist/{ShutdownHook-CUl7zYwd.d.ts → ShutdownHook-CWTm9Lkn.d.ts} +4 -1
  19. package/dist/{Subscription-vtF0lEHP.d.ts → Subscription-BdLdP_5-.d.ts} +1 -1
  20. package/dist/{Subscription-4vuAAxax.d.cts → Subscription-DY3nBVkU.d.cts} +1 -1
  21. package/dist/adapters/index.cjs +133 -18
  22. package/dist/adapters/index.cjs.map +1 -1
  23. package/dist/adapters/index.d.cts +9 -9
  24. package/dist/adapters/index.d.ts +9 -9
  25. package/dist/adapters/index.js +132 -18
  26. package/dist/adapters/index.js.map +1 -1
  27. package/dist/adapters/pubsub/amqp/index.cjs +80 -12
  28. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  29. package/dist/adapters/pubsub/amqp/index.d.cts +8 -8
  30. package/dist/adapters/pubsub/amqp/index.d.ts +8 -8
  31. package/dist/adapters/pubsub/amqp/index.js +80 -12
  32. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  33. package/dist/adapters/pubsub/in-memory/index.d.cts +4 -4
  34. package/dist/adapters/pubsub/in-memory/index.d.ts +4 -4
  35. package/dist/adapters/pubsub/index.cjs +80 -12
  36. package/dist/adapters/pubsub/index.cjs.map +1 -1
  37. package/dist/adapters/pubsub/index.d.cts +8 -8
  38. package/dist/adapters/pubsub/index.d.ts +8 -8
  39. package/dist/adapters/pubsub/index.js +80 -12
  40. package/dist/adapters/pubsub/index.js.map +1 -1
  41. package/dist/adapters/ui/express/index.cjs +53 -6
  42. package/dist/adapters/ui/express/index.cjs.map +1 -1
  43. package/dist/adapters/ui/express/index.d.cts +16 -4
  44. package/dist/adapters/ui/express/index.d.ts +16 -4
  45. package/dist/adapters/ui/express/index.js +52 -6
  46. package/dist/adapters/ui/express/index.js.map +1 -1
  47. package/dist/adapters/ui/index.cjs +133 -18
  48. package/dist/adapters/ui/index.cjs.map +1 -1
  49. package/dist/adapters/ui/index.d.cts +4 -4
  50. package/dist/adapters/ui/index.d.ts +4 -4
  51. package/dist/adapters/ui/index.js +132 -18
  52. package/dist/adapters/ui/index.js.map +1 -1
  53. package/dist/adapters/ui/routes/index.cjs +80 -12
  54. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  55. package/dist/adapters/ui/routes/index.js +80 -12
  56. package/dist/adapters/ui/routes/index.js.map +1 -1
  57. package/dist/contracts/index.d.cts +8 -8
  58. package/dist/contracts/index.d.ts +8 -8
  59. package/dist/contracts/kernel/index.d.cts +5 -5
  60. package/dist/contracts/kernel/index.d.ts +5 -5
  61. package/dist/contracts/pubsub/index.d.cts +7 -7
  62. package/dist/contracts/pubsub/index.d.ts +7 -7
  63. package/dist/contracts/ui/index.d.cts +2 -2
  64. package/dist/contracts/ui/index.d.ts +2 -2
  65. package/dist/domain/index.d.cts +5 -5
  66. package/dist/domain/index.d.ts +5 -5
  67. package/dist/index.cjs +80 -12
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +8 -8
  70. package/dist/index.d.ts +8 -8
  71. package/dist/index.js +80 -12
  72. package/dist/index.js.map +1 -1
  73. package/dist/infrastructure/dependency-injection/index.cjs +44 -1
  74. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -1
  75. package/dist/infrastructure/dependency-injection/index.d.cts +13 -3
  76. package/dist/infrastructure/dependency-injection/index.d.ts +13 -3
  77. package/dist/infrastructure/dependency-injection/index.js +43 -1
  78. package/dist/infrastructure/dependency-injection/index.js.map +1 -1
  79. package/dist/infrastructure/express/index.cjs +53 -6
  80. package/dist/infrastructure/express/index.cjs.map +1 -1
  81. package/dist/infrastructure/express/index.d.cts +4 -4
  82. package/dist/infrastructure/express/index.d.ts +4 -4
  83. package/dist/infrastructure/express/index.js +52 -6
  84. package/dist/infrastructure/express/index.js.map +1 -1
  85. package/dist/infrastructure/scheduler/index.cjs +80 -12
  86. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  87. package/dist/infrastructure/scheduler/index.js +80 -12
  88. package/dist/infrastructure/scheduler/index.js.map +1 -1
  89. package/package.json +5 -4
@@ -66,6 +66,32 @@ var ConsoleKernelLogger = class {
66
66
  import dotenv from "dotenv";
67
67
  import path2 from "path";
68
68
 
69
+ // src/infrastructure/dependency-injection/AutowireWarningFilter.ts
70
+ var AutowireWarningFilter = class {
71
+ constructor(logger) {
72
+ this.logger = logger;
73
+ }
74
+ logger;
75
+ isIgnorableAutowireWarning(message) {
76
+ return message.startsWith(
77
+ "Autowire: file has export default declaration but no runtime default export:"
78
+ ) || message.startsWith("Autowire: failed to create definition for undefined:");
79
+ }
80
+ warn(message, ...optionalParams) {
81
+ if (typeof message === "string" && this.isIgnorableAutowireWarning(message)) {
82
+ this.logger.debug?.(`Ignored ${message}`, ...optionalParams);
83
+ return;
84
+ }
85
+ this.logger.warn(message, ...optionalParams);
86
+ }
87
+ info(message, ...optionalParams) {
88
+ this.logger.info?.(message, ...optionalParams);
89
+ }
90
+ debug(message, ...optionalParams) {
91
+ this.logger.debug?.(message, ...optionalParams);
92
+ }
93
+ };
94
+
69
95
  // src/infrastructure/dependency-injection/DependencyInjection.ts
70
96
  import fs from "fs-extra";
71
97
  import {
@@ -123,6 +149,9 @@ var DependencyInjection = class _DependencyInjection {
123
149
  const tokenName = this.getServiceClassName(token) ?? String(token);
124
150
  return `ddd-kernel.override.${prefix}.${tokenName}`;
125
151
  }
152
+ hasDirectService(serviceName) {
153
+ return typeof serviceName === "string" && (this.definitions.has(serviceName) || this.aliases.has(serviceName));
154
+ }
126
155
  ensureSyntheticService(id, value) {
127
156
  const definition = this.container.register(id);
128
157
  definition.public = true;
@@ -270,6 +299,15 @@ var DependencyInjection = class _DependencyInjection {
270
299
  this.applyValueOverride(override);
271
300
  }
272
301
  }
302
+ async processAutowire() {
303
+ const previousLogger = this.container.logger;
304
+ this.container.logger = new AutowireWarningFilter(previousLogger);
305
+ try {
306
+ await this.autowire?.process();
307
+ } finally {
308
+ this.container.logger = previousLogger;
309
+ }
310
+ }
273
311
  registerParentAliases() {
274
312
  for (const [id, definition] of this.definitions.entries()) {
275
313
  if (definition._abstract === true || !definition._parent) {
@@ -286,7 +324,7 @@ var DependencyInjection = class _DependencyInjection {
286
324
  this.options.servicesYamlPath,
287
325
  false
288
326
  );
289
- await this.autowire.process();
327
+ await this.processAutowire();
290
328
  } else {
291
329
  this.loader = new YamlFileLoader(this.container);
292
330
  await this.loader.load(this.options.servicesYamlPath);
@@ -314,6 +352,9 @@ var DependencyInjection = class _DependencyInjection {
314
352
  }
315
353
  return this.container.get(serviceName);
316
354
  }
355
+ hasService(serviceName) {
356
+ return this.overrideTokenIds.has(serviceName) || this.findAliasServiceId(serviceName) !== void 0 || this.findConcreteChildServiceId(serviceName) !== void 0 || this.findRegisteredServiceId(serviceName) !== void 0 || this.hasDirectService(serviceName);
357
+ }
317
358
  };
318
359
 
319
360
  // src/kernel/KernelEnvironmentValidationError.ts
@@ -395,6 +436,13 @@ var Kernel = class _Kernel {
395
436
  );
396
437
  }
397
438
  }
439
+ static assertRequiredEnvironmentVariableIsNotBlank(name, value, schema) {
440
+ if (schema[name]?.required === true && value.trim() === "") {
441
+ throw new KernelEnvironmentValidationError(
442
+ `Blank required environment variable "${name}".`
443
+ );
444
+ }
445
+ }
398
446
  static assertEnvironmentVariableChoice(name, value, schema) {
399
447
  const choices = schema[name]?.choices;
400
448
  if (choices && !choices.includes(value)) {
@@ -417,21 +465,16 @@ var Kernel = class _Kernel {
417
465
  return false;
418
466
  }
419
467
  throw new KernelEnvironmentValidationError(
420
- `Environment variable "${name}" must be a boolean.`
468
+ `Environment variable "${name}" has invalid boolean value "${value}".`
421
469
  );
422
470
  }
423
471
  static parseNumberEnvironmentVariable(name, value) {
424
- if (value.trim() === "") {
425
- throw new KernelEnvironmentValidationError(
426
- `Environment variable "${name}" must be a number.`
427
- );
428
- }
429
472
  const parsedValue = Number(value);
430
473
  if (Number.isFinite(parsedValue)) {
431
474
  return parsedValue;
432
475
  }
433
476
  throw new KernelEnvironmentValidationError(
434
- `Environment variable "${name}" must be a number.`
477
+ `Environment variable "${name}" has invalid number value "${value}".`
435
478
  );
436
479
  }
437
480
  static parseEnvironmentVariable(name, value, schema) {
@@ -449,17 +492,42 @@ var Kernel = class _Kernel {
449
492
  _Kernel.assertEnvironmentVariableChoice(name, value, schema);
450
493
  return value;
451
494
  }
495
+ static getEnvironmentVariableValue(name, definition, schema) {
496
+ const value = process.env[name];
497
+ _Kernel.assertRequiredEnvironmentVariable(name, value, schema);
498
+ if (value !== void 0) {
499
+ _Kernel.assertRequiredEnvironmentVariableIsNotBlank(name, value, schema);
500
+ }
501
+ if (value !== void 0 && value.trim() !== "") {
502
+ return value;
503
+ }
504
+ return definition.defaultValue?.toString();
505
+ }
506
+ static shouldUnsetBlankOptionalEnvironmentVariable(name, value, valueOrDefault, schema) {
507
+ return value !== void 0 && value.trim() === "" && valueOrDefault === void 0 && schema[name]?.required !== true;
508
+ }
452
509
  static validateEnvironmentVariables(schema) {
453
510
  const environmentVariables = {};
454
511
  for (const [name, definition] of Object.entries(schema)) {
455
- const value = process.env[name] ?? definition.defaultValue?.toString();
456
- _Kernel.assertRequiredEnvironmentVariable(name, value, schema);
457
- if (value !== void 0) {
512
+ const value = process.env[name];
513
+ const valueOrDefault = _Kernel.getEnvironmentVariableValue(
514
+ name,
515
+ definition,
516
+ schema
517
+ );
518
+ if (valueOrDefault !== void 0) {
458
519
  environmentVariables[name] = _Kernel.parseEnvironmentVariable(
459
520
  name,
460
- value,
521
+ valueOrDefault,
461
522
  schema
462
523
  );
524
+ } else if (_Kernel.shouldUnsetBlankOptionalEnvironmentVariable(
525
+ name,
526
+ value,
527
+ valueOrDefault,
528
+ schema
529
+ )) {
530
+ environmentVariables[name] = void 0;
463
531
  }
464
532
  }
465
533
  return {
@@ -963,6 +1031,45 @@ var InMemoryPubSub = class {
963
1031
  }
964
1032
  };
965
1033
 
1034
+ // src/adapters/ui/express/ExpressControllerResolver.ts
1035
+ var ExpressControllerResolver = class {
1036
+ constructor(kernel, controllers) {
1037
+ this.kernel = kernel;
1038
+ this.controllers = new Set(controllers);
1039
+ }
1040
+ kernel;
1041
+ controllerInstances = /* @__PURE__ */ new Map();
1042
+ controllers;
1043
+ createControllerInstance(ClassDefinition) {
1044
+ const Controller = ClassDefinition;
1045
+ return new Controller();
1046
+ }
1047
+ getCachedController(ClassDefinition) {
1048
+ const cached = this.controllerInstances.get(ClassDefinition);
1049
+ if (cached) {
1050
+ return cached;
1051
+ }
1052
+ const instance = this.createControllerInstance(ClassDefinition);
1053
+ this.controllerInstances.set(ClassDefinition, instance);
1054
+ return instance;
1055
+ }
1056
+ isKnownController(ClassDefinition) {
1057
+ return this.controllers.has(ClassDefinition);
1058
+ }
1059
+ canResolveService(ClassDefinition) {
1060
+ return this.kernel.di.hasService?.(ClassDefinition) === true;
1061
+ }
1062
+ get(ClassDefinition) {
1063
+ if (!this.canResolveService(ClassDefinition)) {
1064
+ if (this.isKnownController(ClassDefinition)) {
1065
+ return this.getCachedController(ClassDefinition);
1066
+ }
1067
+ return void 0;
1068
+ }
1069
+ return this.kernel.di.getService(ClassDefinition);
1070
+ }
1071
+ };
1072
+
966
1073
  // src/adapters/ui/express/ExpressKernelServer.ts
967
1074
  import { createRequire } from "module";
968
1075
  import path3 from "path";
@@ -1001,16 +1108,19 @@ var ExpressKernelServer = class {
1001
1108
  copy(items) {
1002
1109
  return [...items ?? []];
1003
1110
  }
1004
- configureControllerContainer() {
1111
+ configureControllerContainer(controllers) {
1005
1112
  const { useContainer } = this.getRoutingControllers();
1113
+ const resolver = new ExpressControllerResolver(
1114
+ this.options.kernel,
1115
+ controllers
1116
+ );
1006
1117
  useContainer(
1007
1118
  {
1008
- /* c8 ignore next */
1009
- get: (ClassDefinition) => this.options.kernel.di.getService(ClassDefinition)
1119
+ get: (ClassDefinition) => resolver.get(ClassDefinition)
1010
1120
  },
1011
1121
  {
1012
1122
  fallback: true,
1013
- fallbackOnErrors: true
1123
+ fallbackOnErrors: false
1014
1124
  }
1015
1125
  );
1016
1126
  }
@@ -1028,8 +1138,11 @@ var ExpressKernelServer = class {
1028
1138
  }
1029
1139
  defaultErrorHandler() {
1030
1140
  return (error, request, response, next) => {
1031
- void next;
1032
1141
  void request;
1142
+ if (response.headersSent) {
1143
+ next(error);
1144
+ return;
1145
+ }
1033
1146
  response.status(500).json({
1034
1147
  error: error instanceof Error ? error.message : String(error)
1035
1148
  });
@@ -1140,7 +1253,7 @@ var ExpressKernelServer = class {
1140
1253
  this.applyMiddlewares(app, this.preControllerMiddlewares);
1141
1254
  await this.runHooks(this.beforeControllersHooks, app);
1142
1255
  await this.runPhaseHooks("beforeControllers", app);
1143
- this.configureControllerContainer();
1256
+ this.configureControllerContainer(controllers);
1144
1257
  useExpressServer(app, {
1145
1258
  ...this.options.routingControllersOptions,
1146
1259
  controllers,
@@ -1331,6 +1444,7 @@ export {
1331
1444
  ConsumerMiddlewarePipeline,
1332
1445
  CorrelationConsumerMiddleware,
1333
1446
  DefaultPublisherHookErrorPolicy,
1447
+ ExpressControllerResolver,
1334
1448
  ExpressKernelServer,
1335
1449
  HttpErrorHandler,
1336
1450
  IdempotencyConsumerMiddleware,