@haskou/ddd-kernel 1.2.1 → 2.0.1

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 (73) hide show
  1. package/dist/{DomainEventConsumer-Bg-bOwmh.d.cts → DomainEventConsumer-BiTSbfMw.d.cts} +5 -1
  2. package/dist/{DomainEventConsumer-BroJmVty.d.ts → DomainEventConsumer-D1P4oXoj.d.ts} +5 -1
  3. package/dist/{DomainMessageBus-OyliPu3Z.d.cts → DomainMessageBus-CQSFU6A6.d.cts} +1 -1
  4. package/dist/{DomainMessageBus-3jYk7TPw.d.ts → DomainMessageBus-kjMVNGfv.d.ts} +1 -1
  5. package/dist/KernelRoute-B7mVPrEx.d.cts +5 -0
  6. package/dist/KernelRoute-B7mVPrEx.d.ts +5 -0
  7. package/dist/{NoFailedMessagesError-BjxYoKTR.d.cts → NoFailedMessagesError-Dm5AFcJV.d.cts} +2 -3
  8. package/dist/{NoFailedMessagesError-BLpGI-G4.d.ts → NoFailedMessagesError-z-6ffelK.d.ts} +2 -3
  9. package/dist/{RetryPredicate-Bl3SMnbL.d.ts → RetryPredicate-CD9n6cE8.d.ts} +1 -1
  10. package/dist/{RetryPredicate-ZjioTYXn.d.cts → RetryPredicate-DNdxY_KR.d.cts} +1 -1
  11. package/dist/{ShutdownHook-B03Mcke-.d.ts → ShutdownHook-CUl7zYwd.d.ts} +44 -30
  12. package/dist/{ShutdownHook-BsEGvnEf.d.cts → ShutdownHook-D23WfIIc.d.cts} +44 -30
  13. package/dist/adapters/index.cjs +20 -3
  14. package/dist/adapters/index.cjs.map +1 -1
  15. package/dist/adapters/index.d.cts +7 -7
  16. package/dist/adapters/index.d.ts +7 -7
  17. package/dist/adapters/index.js +20 -3
  18. package/dist/adapters/index.js.map +1 -1
  19. package/dist/adapters/pubsub/amqp/index.cjs +15 -2
  20. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -1
  21. package/dist/adapters/pubsub/amqp/index.d.cts +5 -6
  22. package/dist/adapters/pubsub/amqp/index.d.ts +5 -6
  23. package/dist/adapters/pubsub/amqp/index.js +15 -2
  24. package/dist/adapters/pubsub/amqp/index.js.map +1 -1
  25. package/dist/adapters/pubsub/index.cjs +15 -2
  26. package/dist/adapters/pubsub/index.cjs.map +1 -1
  27. package/dist/adapters/pubsub/index.d.cts +19 -8
  28. package/dist/adapters/pubsub/index.d.ts +19 -8
  29. package/dist/adapters/pubsub/index.js +15 -2
  30. package/dist/adapters/pubsub/index.js.map +1 -1
  31. package/dist/adapters/ui/express/index.d.cts +2 -3
  32. package/dist/adapters/ui/express/index.d.ts +2 -3
  33. package/dist/adapters/ui/index.cjs +20 -3
  34. package/dist/adapters/ui/index.cjs.map +1 -1
  35. package/dist/adapters/ui/index.d.cts +2 -2
  36. package/dist/adapters/ui/index.d.ts +2 -2
  37. package/dist/adapters/ui/index.js +20 -3
  38. package/dist/adapters/ui/index.js.map +1 -1
  39. package/dist/adapters/ui/routes/index.cjs +20 -3
  40. package/dist/adapters/ui/routes/index.cjs.map +1 -1
  41. package/dist/adapters/ui/routes/index.d.cts +3 -1
  42. package/dist/adapters/ui/routes/index.d.ts +3 -1
  43. package/dist/adapters/ui/routes/index.js +20 -3
  44. package/dist/adapters/ui/routes/index.js.map +1 -1
  45. package/dist/contracts/index.cjs +8 -2
  46. package/dist/contracts/index.cjs.map +1 -1
  47. package/dist/contracts/index.d.cts +3 -4
  48. package/dist/contracts/index.d.ts +3 -4
  49. package/dist/contracts/index.js +6 -1
  50. package/dist/contracts/index.js.map +1 -1
  51. package/dist/contracts/kernel/index.cjs +15 -0
  52. package/dist/contracts/kernel/index.cjs.map +1 -1
  53. package/dist/contracts/kernel/index.d.cts +3 -4
  54. package/dist/contracts/kernel/index.d.ts +3 -4
  55. package/dist/contracts/kernel/index.js +6 -0
  56. package/dist/contracts/kernel/index.js.map +1 -1
  57. package/dist/domain/index.d.cts +2 -3
  58. package/dist/domain/index.d.ts +2 -3
  59. package/dist/index.cjs +21 -2
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +3 -4
  62. package/dist/index.d.ts +3 -4
  63. package/dist/index.js +20 -2
  64. package/dist/index.js.map +1 -1
  65. package/dist/infrastructure/express/index.d.cts +2 -3
  66. package/dist/infrastructure/express/index.d.ts +2 -3
  67. package/dist/infrastructure/scheduler/index.cjs +15 -2
  68. package/dist/infrastructure/scheduler/index.cjs.map +1 -1
  69. package/dist/infrastructure/scheduler/index.js +15 -2
  70. package/dist/infrastructure/scheduler/index.js.map +1 -1
  71. package/package.json +5 -5
  72. package/dist/Constructor-fyZLLIh8.d.cts +0 -5
  73. package/dist/Constructor-fyZLLIh8.d.ts +0 -5
@@ -1,5 +1,9 @@
1
1
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.cjs';
2
2
 
3
+ type Constructor<T> = {
4
+ new (...args: unknown[]): T;
5
+ };
6
+
3
7
  interface DomainEventConsumerContext {
4
8
  readonly metadata: Readonly<Record<string, unknown>>;
5
9
  }
@@ -8,4 +12,4 @@ declare abstract class DomainEventConsumer {
8
12
  abstract consume(queueName: string, bindingKey: string, domainEvent: typeof DomainEvent, exchange: string, handler: (event: DomainEvent, context?: DomainEventConsumerContext) => Promise<void>): Promise<void>;
9
13
  }
10
14
 
11
- export { DomainEventConsumer as D, type DomainEventConsumerContext as a };
15
+ export { type Constructor as C, DomainEventConsumer as D, type DomainEventConsumerContext as a };
@@ -1,5 +1,9 @@
1
1
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.js';
2
2
 
3
+ type Constructor<T> = {
4
+ new (...args: unknown[]): T;
5
+ };
6
+
3
7
  interface DomainEventConsumerContext {
4
8
  readonly metadata: Readonly<Record<string, unknown>>;
5
9
  }
@@ -8,4 +12,4 @@ declare abstract class DomainEventConsumer {
8
12
  abstract consume(queueName: string, bindingKey: string, domainEvent: typeof DomainEvent, exchange: string, handler: (event: DomainEvent, context?: DomainEventConsumerContext) => Promise<void>): Promise<void>;
9
13
  }
10
14
 
11
- export { DomainEventConsumer as D, type DomainEventConsumerContext as a };
15
+ export { type Constructor as C, DomainEventConsumer as D, type DomainEventConsumerContext as a };
@@ -1,5 +1,5 @@
1
1
  import { M as MessageBus } from './MessageBus-BtUXnd0Y.cjs';
2
- import { D as DomainEventConsumer } from './DomainEventConsumer-Bg-bOwmh.cjs';
2
+ import { D as DomainEventConsumer } from './DomainEventConsumer-BiTSbfMw.cjs';
3
3
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.cjs';
4
4
 
5
5
  declare abstract class DomainEventPublisher {
@@ -1,5 +1,5 @@
1
1
  import { M as MessageBus } from './MessageBus-oQ9BnW84.js';
2
- import { D as DomainEventConsumer } from './DomainEventConsumer-BroJmVty.js';
2
+ import { D as DomainEventConsumer } from './DomainEventConsumer-D1P4oXoj.js';
3
3
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.js';
4
4
 
5
5
  declare abstract class DomainEventPublisher {
@@ -0,0 +1,5 @@
1
+ declare abstract class KernelRoute {
2
+ protected readonly kernelRouteContract: never;
3
+ }
4
+
5
+ export { KernelRoute as K };
@@ -0,0 +1,5 @@
1
+ declare abstract class KernelRoute {
2
+ protected readonly kernelRouteContract: never;
3
+ }
4
+
5
+ export { KernelRoute as K };
@@ -1,10 +1,9 @@
1
1
  import { a as PublisherHook } from './Subscription-4vuAAxax.cjs';
2
- import { L as Log } from './Log-36L3Z84a.cjs';
3
2
  import { P as PublisherHookErrorPolicy } from './PublisherHookErrorPolicy-CjouTcSR.cjs';
3
+ import { L as Log } from './Log-36L3Z84a.cjs';
4
4
  import { Channel } from 'amqplib';
5
5
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.cjs';
6
- import { C as Constructor } from './Constructor-fyZLLIh8.cjs';
7
- import { a as DomainEventConsumerContext } from './DomainEventConsumer-Bg-bOwmh.cjs';
6
+ import { a as DomainEventConsumerContext, C as Constructor } from './DomainEventConsumer-BiTSbfMw.cjs';
8
7
 
9
8
  type AmqpMessage = {
10
9
  readonly aggregate_id: string;
@@ -1,10 +1,9 @@
1
1
  import { a as PublisherHook } from './Subscription-vtF0lEHP.js';
2
- import { L as Log } from './Log-36L3Z84a.js';
3
2
  import { P as PublisherHookErrorPolicy } from './PublisherHookErrorPolicy-DSsCNE6O.js';
3
+ import { L as Log } from './Log-36L3Z84a.js';
4
4
  import { Channel } from 'amqplib';
5
5
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.js';
6
- import { C as Constructor } from './Constructor-fyZLLIh8.js';
7
- import { a as DomainEventConsumerContext } from './DomainEventConsumer-BroJmVty.js';
6
+ import { a as DomainEventConsumerContext, C as Constructor } from './DomainEventConsumer-D1P4oXoj.js';
8
7
 
9
8
  type AmqpMessage = {
10
9
  readonly aggregate_id: string;
@@ -1,4 +1,4 @@
1
- import { a as ConsumerExecutionContext } from './ShutdownHook-B03Mcke-.js';
1
+ import { C as ConsumerExecutionContext } from './ShutdownHook-CUl7zYwd.js';
2
2
 
3
3
  interface IdempotencyStore {
4
4
  claim?(key: string): Promise<boolean> | boolean;
@@ -1,4 +1,4 @@
1
- import { a as ConsumerExecutionContext } from './ShutdownHook-BsEGvnEf.cjs';
1
+ import { C as ConsumerExecutionContext } from './ShutdownHook-D23WfIIc.cjs';
2
2
 
3
3
  interface IdempotencyStore {
4
4
  claim?(key: string): Promise<boolean> | boolean;
@@ -1,24 +1,10 @@
1
1
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.js';
2
2
  import { DotenvConfigOutput } from 'dotenv';
3
- import { D as DomainEventConsumer } from './DomainEventConsumer-BroJmVty.js';
4
- import { Route } from './adapters/ui/routes/index.js';
5
3
  import { b as DependencyOverride, D as DependencyInjection, S as ServiceClass } from './ServiceClass-Bq_fBC5R.js';
6
4
  import { Initializer, Runtime } from './infrastructure/lifecycle/index.js';
7
5
  import { a as Scheduler } from './Scheduler-BW-U5Ccg.js';
8
6
  import { K as KernelLogger } from './KernelLogger-BESOFrpW.js';
9
-
10
- declare abstract class Consumer {
11
- private readonly consumer;
12
- constructor(consumer: DomainEventConsumer);
13
- private runMiddleware;
14
- abstract get domainEvent(): typeof DomainEvent;
15
- abstract get eventName(): string;
16
- abstract get exchange(): string;
17
- abstract get queueName(): string;
18
- abstract handler(event: DomainEvent): Promise<void>;
19
- init(): Promise<void>;
20
- get<T>(service: unknown): T;
21
- }
7
+ import { K as KernelRoute } from './KernelRoute-B7mVPrEx.js';
22
8
 
23
9
  interface KernelDependencyInjectionOptions {
24
10
  readonly containerBuild?: boolean;
@@ -33,9 +19,12 @@ type KernelEnvironmentVariableType = 'boolean' | 'number' | 'string';
33
19
 
34
20
  type KernelEnvironmentVariablePrimitive<TType extends KernelEnvironmentVariableType> = TType extends 'boolean' ? boolean : TType extends 'number' ? number : string;
35
21
 
36
- interface KernelEnvironmentVariableDefinition<TType extends KernelEnvironmentVariableType = KernelEnvironmentVariableType, TRequired extends boolean = boolean> {
37
- readonly defaultValue?: KernelEnvironmentVariablePrimitive<TType>;
22
+ interface KernelEnvironmentVariableDefinition<TType extends KernelEnvironmentVariableType = KernelEnvironmentVariableType, TRequired extends boolean = boolean, TChoices extends readonly KernelEnvironmentVariablePrimitive<TType>[] | undefined = readonly KernelEnvironmentVariablePrimitive<TType>[] | undefined> {
23
+ readonly choices?: TChoices;
24
+ readonly defaultValue?: TChoices extends readonly KernelEnvironmentVariablePrimitive<TType>[] ? TChoices[number] : KernelEnvironmentVariablePrimitive<TType>;
25
+ readonly description?: string;
38
26
  readonly required?: TRequired;
27
+ readonly sensitive?: boolean;
39
28
  readonly type: TType;
40
29
  }
41
30
 
@@ -43,9 +32,15 @@ type KernelEnvironmentSchema = Readonly<Record<string, KernelEnvironmentVariable
43
32
 
44
33
  type KernelEnvironmentValue = boolean | number | string;
45
34
 
46
- type KernelEnvironmentVariable<TDefinition extends KernelEnvironmentVariableDefinition> = TDefinition extends KernelEnvironmentVariableDefinition<infer TType extends KernelEnvironmentVariableType, infer TRequired extends boolean> ? TDefinition extends {
35
+ type KernelEnvironmentVariableResolvedValue<TDefinition extends KernelEnvironmentVariableDefinition> = TDefinition extends {
36
+ readonly choices: readonly (infer TChoice extends KernelEnvironmentValue)[];
37
+ } ? TChoice : TDefinition extends KernelEnvironmentVariableDefinition<infer TType extends KernelEnvironmentVariableType> ? KernelEnvironmentVariablePrimitive<TType> : never;
38
+
39
+ type KernelEnvironmentVariable<TDefinition extends KernelEnvironmentVariableDefinition> = TDefinition extends {
47
40
  readonly defaultValue: unknown;
48
- } ? KernelEnvironmentVariablePrimitive<TType> : TRequired extends true ? KernelEnvironmentVariablePrimitive<TType> : KernelEnvironmentVariablePrimitive<TType> | undefined : never;
41
+ } ? KernelEnvironmentVariableResolvedValue<TDefinition> : TDefinition extends {
42
+ readonly required: true;
43
+ } ? KernelEnvironmentVariableResolvedValue<TDefinition> : KernelEnvironmentVariableResolvedValue<TDefinition> | undefined;
49
44
 
50
45
  type KernelEnvironment<TSchema extends KernelEnvironmentSchema> = {
51
46
  readonly [key: string]: KernelEnvironmentValue | undefined;
@@ -55,15 +50,28 @@ type KernelEnvironment<TSchema extends KernelEnvironmentSchema> = {
55
50
 
56
51
  type KernelEnvironmentForSchema<TSchema extends KernelEnvironmentSchema | undefined> = TSchema extends KernelEnvironmentSchema ? KernelEnvironment<TSchema> : KernelDefaultEnvironment;
57
52
 
53
+ type KernelEnvironmentSchemaInput<TSchema extends KernelEnvironmentSchema> = {
54
+ readonly [TKey in keyof TSchema]: TSchema[TKey] extends {
55
+ readonly choices: infer TChoices extends readonly KernelEnvironmentVariablePrimitive<TSchema[TKey]['type']>[];
56
+ readonly type: infer TType extends KernelEnvironmentVariableType;
57
+ } ? KernelEnvironmentVariableDefinition<TType, TSchema[TKey] extends {
58
+ readonly required: true;
59
+ } ? true : boolean, TChoices> : TSchema[TKey] extends {
60
+ readonly type: infer TType extends KernelEnvironmentVariableType;
61
+ } ? KernelEnvironmentVariableDefinition<TType, TSchema[TKey] extends {
62
+ readonly required: true;
63
+ } ? true : boolean> : never;
64
+ };
65
+
58
66
  interface KernelEnvironmentVariablesOptions<TSchema extends KernelEnvironmentSchema | undefined = undefined> {
59
67
  readonly override?: boolean;
60
68
  readonly path?: string;
61
- readonly schema?: TSchema;
69
+ readonly schema?: TSchema extends KernelEnvironmentSchema ? TSchema & KernelEnvironmentSchemaInput<TSchema> : TSchema;
62
70
  }
63
71
 
64
72
  interface KernelOptions<TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined> {
65
73
  readonly di?: DependencyInjection;
66
- readonly environmentSchema?: TEnvironmentSchema;
74
+ readonly environmentSchema?: TEnvironmentSchema extends KernelEnvironmentSchema ? TEnvironmentSchema & KernelEnvironmentSchemaInput<TEnvironmentSchema> : TEnvironmentSchema;
67
75
  readonly logger?: KernelLogger;
68
76
  readonly servicesYamlPath?: string;
69
77
  readonly sourceDirectory?: string;
@@ -82,18 +90,19 @@ declare class Kernel<TEnvironmentSchema extends KernelEnvironmentSchema | undefi
82
90
  private environmentVariables;
83
91
  private static get state();
84
92
  static get configDirectory(): string;
85
- static get consumers(): Consumer[];
93
+ static get consumers(): KernelConsumer[];
86
94
  static get consumerMiddleware(): ConsumerMiddleware[];
87
95
  static get di(): DependencyInjection;
88
96
  static get environment(): NodeJS.ProcessEnv;
89
97
  static get logger(): KernelLogger;
90
98
  static get active(): Kernel<KernelEnvironmentSchema | undefined>;
91
99
  static get rootDirectory(): string;
92
- static get routes(): ServiceClass<Route>[];
100
+ static get routes(): ServiceClass<KernelRoute>[];
93
101
  static get schedulers(): Scheduler[];
94
102
  static get sourceDirectory(): string;
95
103
  private static getActiveKernel;
96
104
  private static assertRequiredEnvironmentVariable;
105
+ private static assertEnvironmentVariableChoice;
97
106
  private static getEnvironmentVariablesPath;
98
107
  private static parseBooleanEnvironmentVariable;
99
108
  private static parseNumberEnvironmentVariable;
@@ -106,21 +115,21 @@ declare class Kernel<TEnvironmentSchema extends KernelEnvironmentSchema | undefi
106
115
  private getInitializerFromClass;
107
116
  private getRuntimeFromClass;
108
117
  private getSchedulerFromClass;
109
- get consumers(): Consumer[];
118
+ get consumers(): KernelConsumer[];
110
119
  get consumerMiddleware(): ConsumerMiddleware[];
111
120
  get di(): DependencyInjection;
112
121
  get environment(): KernelEnvironmentForSchema<TEnvironmentSchema>;
113
122
  get logger(): KernelLogger;
114
- get routes(): ServiceClass<Route>[];
123
+ get routes(): ServiceClass<KernelRoute>[];
115
124
  get schedulers(): Scheduler[];
116
125
  private getDependencyInjectionOptions;
117
126
  dependencyInjection(options?: KernelDependencyInjectionOptions): Promise<void>;
118
127
  loadEnvironmentVariables(environment?: string, options?: KernelEnvironmentVariablesOptions<KernelEnvironmentSchema | undefined>): DotenvConfigOutput;
119
- getRoutes(): ServiceClass<Route>[];
128
+ getRoutes(): ServiceClass<KernelRoute>[];
120
129
  registerConsumerMiddleware(...middlewares: ConsumerMiddleware[]): void;
121
- registerConsumers(...ClassDefinitions: ServiceClass<Consumer>[]): void;
122
- registerConsumerInstances(...consumers: Consumer[]): void;
123
- registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): void;
130
+ registerConsumers(...ClassDefinitions: ServiceClass<KernelConsumer>[]): void;
131
+ registerConsumerInstances(...consumers: KernelConsumer[]): void;
132
+ registerRoutes(...ClassDefinitions: ServiceClass<KernelRoute>[]): void;
124
133
  registerSchedulers(...ClassDefinitions: ServiceClass<Scheduler>[]): void;
125
134
  registerSchedulerInstances(...schedulers: Scheduler[]): void;
126
135
  registerShutdownHook(hook: ShutdownHook): void;
@@ -154,6 +163,11 @@ interface ConsumerMiddleware {
154
163
  handle(event: DomainEvent, next: ConsumerNext, context: ConsumerExecutionContext): Promise<void>;
155
164
  }
156
165
 
166
+ interface KernelConsumer {
167
+ readonly queueName: string;
168
+ init(): Promise<void>;
169
+ }
170
+
157
171
  type ShutdownHook = () => Promise<void> | void;
158
172
 
159
- export { Consumer as C, Kernel as K, type ShutdownHook as S, type ConsumerExecutionContext as a, type ConsumerMiddleware as b, type ConsumerNext as c, type KernelDefaultEnvironment as d, type KernelDependencyInjectionOptions as e, type KernelEnvironment as f, type KernelEnvironmentForSchema as g, type KernelEnvironmentSchema as h, type KernelEnvironmentValue as i, type KernelEnvironmentVariableDefinition as j, type KernelEnvironmentVariablePrimitive as k, type KernelEnvironmentVariableType as l, type KernelEnvironmentVariablesOptions as m, type KernelOptions as n, createKernel as o };
173
+ export { type ConsumerExecutionContext as C, type KernelConsumer as K, type ShutdownHook as S, type ConsumerMiddleware as a, type ConsumerNext as b, Kernel as c, type KernelDefaultEnvironment as d, type KernelDependencyInjectionOptions as e, type KernelEnvironment as f, type KernelEnvironmentForSchema as g, type KernelEnvironmentSchema as h, type KernelEnvironmentSchemaInput as i, type KernelEnvironmentValue as j, type KernelEnvironmentVariableDefinition as k, type KernelEnvironmentVariablePrimitive as l, type KernelEnvironmentVariableResolvedValue as m, type KernelEnvironmentVariableType as n, type KernelEnvironmentVariablesOptions as o, type KernelOptions as p, createKernel as q };
@@ -1,24 +1,10 @@
1
1
  import { D as DomainEvent } from './DomainEvent-mXWEtr_J.cjs';
2
2
  import { DotenvConfigOutput } from 'dotenv';
3
- import { D as DomainEventConsumer } from './DomainEventConsumer-Bg-bOwmh.cjs';
4
- import { Route } from './adapters/ui/routes/index.cjs';
5
3
  import { b as DependencyOverride, D as DependencyInjection, S as ServiceClass } from './ServiceClass-BkEHcXDi.cjs';
6
4
  import { Initializer, Runtime } from './infrastructure/lifecycle/index.cjs';
7
5
  import { a as Scheduler } from './Scheduler-BW-U5Ccg.cjs';
8
6
  import { K as KernelLogger } from './KernelLogger-BESOFrpW.cjs';
9
-
10
- declare abstract class Consumer {
11
- private readonly consumer;
12
- constructor(consumer: DomainEventConsumer);
13
- private runMiddleware;
14
- abstract get domainEvent(): typeof DomainEvent;
15
- abstract get eventName(): string;
16
- abstract get exchange(): string;
17
- abstract get queueName(): string;
18
- abstract handler(event: DomainEvent): Promise<void>;
19
- init(): Promise<void>;
20
- get<T>(service: unknown): T;
21
- }
7
+ import { K as KernelRoute } from './KernelRoute-B7mVPrEx.cjs';
22
8
 
23
9
  interface KernelDependencyInjectionOptions {
24
10
  readonly containerBuild?: boolean;
@@ -33,9 +19,12 @@ type KernelEnvironmentVariableType = 'boolean' | 'number' | 'string';
33
19
 
34
20
  type KernelEnvironmentVariablePrimitive<TType extends KernelEnvironmentVariableType> = TType extends 'boolean' ? boolean : TType extends 'number' ? number : string;
35
21
 
36
- interface KernelEnvironmentVariableDefinition<TType extends KernelEnvironmentVariableType = KernelEnvironmentVariableType, TRequired extends boolean = boolean> {
37
- readonly defaultValue?: KernelEnvironmentVariablePrimitive<TType>;
22
+ interface KernelEnvironmentVariableDefinition<TType extends KernelEnvironmentVariableType = KernelEnvironmentVariableType, TRequired extends boolean = boolean, TChoices extends readonly KernelEnvironmentVariablePrimitive<TType>[] | undefined = readonly KernelEnvironmentVariablePrimitive<TType>[] | undefined> {
23
+ readonly choices?: TChoices;
24
+ readonly defaultValue?: TChoices extends readonly KernelEnvironmentVariablePrimitive<TType>[] ? TChoices[number] : KernelEnvironmentVariablePrimitive<TType>;
25
+ readonly description?: string;
38
26
  readonly required?: TRequired;
27
+ readonly sensitive?: boolean;
39
28
  readonly type: TType;
40
29
  }
41
30
 
@@ -43,9 +32,15 @@ type KernelEnvironmentSchema = Readonly<Record<string, KernelEnvironmentVariable
43
32
 
44
33
  type KernelEnvironmentValue = boolean | number | string;
45
34
 
46
- type KernelEnvironmentVariable<TDefinition extends KernelEnvironmentVariableDefinition> = TDefinition extends KernelEnvironmentVariableDefinition<infer TType extends KernelEnvironmentVariableType, infer TRequired extends boolean> ? TDefinition extends {
35
+ type KernelEnvironmentVariableResolvedValue<TDefinition extends KernelEnvironmentVariableDefinition> = TDefinition extends {
36
+ readonly choices: readonly (infer TChoice extends KernelEnvironmentValue)[];
37
+ } ? TChoice : TDefinition extends KernelEnvironmentVariableDefinition<infer TType extends KernelEnvironmentVariableType> ? KernelEnvironmentVariablePrimitive<TType> : never;
38
+
39
+ type KernelEnvironmentVariable<TDefinition extends KernelEnvironmentVariableDefinition> = TDefinition extends {
47
40
  readonly defaultValue: unknown;
48
- } ? KernelEnvironmentVariablePrimitive<TType> : TRequired extends true ? KernelEnvironmentVariablePrimitive<TType> : KernelEnvironmentVariablePrimitive<TType> | undefined : never;
41
+ } ? KernelEnvironmentVariableResolvedValue<TDefinition> : TDefinition extends {
42
+ readonly required: true;
43
+ } ? KernelEnvironmentVariableResolvedValue<TDefinition> : KernelEnvironmentVariableResolvedValue<TDefinition> | undefined;
49
44
 
50
45
  type KernelEnvironment<TSchema extends KernelEnvironmentSchema> = {
51
46
  readonly [key: string]: KernelEnvironmentValue | undefined;
@@ -55,15 +50,28 @@ type KernelEnvironment<TSchema extends KernelEnvironmentSchema> = {
55
50
 
56
51
  type KernelEnvironmentForSchema<TSchema extends KernelEnvironmentSchema | undefined> = TSchema extends KernelEnvironmentSchema ? KernelEnvironment<TSchema> : KernelDefaultEnvironment;
57
52
 
53
+ type KernelEnvironmentSchemaInput<TSchema extends KernelEnvironmentSchema> = {
54
+ readonly [TKey in keyof TSchema]: TSchema[TKey] extends {
55
+ readonly choices: infer TChoices extends readonly KernelEnvironmentVariablePrimitive<TSchema[TKey]['type']>[];
56
+ readonly type: infer TType extends KernelEnvironmentVariableType;
57
+ } ? KernelEnvironmentVariableDefinition<TType, TSchema[TKey] extends {
58
+ readonly required: true;
59
+ } ? true : boolean, TChoices> : TSchema[TKey] extends {
60
+ readonly type: infer TType extends KernelEnvironmentVariableType;
61
+ } ? KernelEnvironmentVariableDefinition<TType, TSchema[TKey] extends {
62
+ readonly required: true;
63
+ } ? true : boolean> : never;
64
+ };
65
+
58
66
  interface KernelEnvironmentVariablesOptions<TSchema extends KernelEnvironmentSchema | undefined = undefined> {
59
67
  readonly override?: boolean;
60
68
  readonly path?: string;
61
- readonly schema?: TSchema;
69
+ readonly schema?: TSchema extends KernelEnvironmentSchema ? TSchema & KernelEnvironmentSchemaInput<TSchema> : TSchema;
62
70
  }
63
71
 
64
72
  interface KernelOptions<TEnvironmentSchema extends KernelEnvironmentSchema | undefined = undefined> {
65
73
  readonly di?: DependencyInjection;
66
- readonly environmentSchema?: TEnvironmentSchema;
74
+ readonly environmentSchema?: TEnvironmentSchema extends KernelEnvironmentSchema ? TEnvironmentSchema & KernelEnvironmentSchemaInput<TEnvironmentSchema> : TEnvironmentSchema;
67
75
  readonly logger?: KernelLogger;
68
76
  readonly servicesYamlPath?: string;
69
77
  readonly sourceDirectory?: string;
@@ -82,18 +90,19 @@ declare class Kernel<TEnvironmentSchema extends KernelEnvironmentSchema | undefi
82
90
  private environmentVariables;
83
91
  private static get state();
84
92
  static get configDirectory(): string;
85
- static get consumers(): Consumer[];
93
+ static get consumers(): KernelConsumer[];
86
94
  static get consumerMiddleware(): ConsumerMiddleware[];
87
95
  static get di(): DependencyInjection;
88
96
  static get environment(): NodeJS.ProcessEnv;
89
97
  static get logger(): KernelLogger;
90
98
  static get active(): Kernel<KernelEnvironmentSchema | undefined>;
91
99
  static get rootDirectory(): string;
92
- static get routes(): ServiceClass<Route>[];
100
+ static get routes(): ServiceClass<KernelRoute>[];
93
101
  static get schedulers(): Scheduler[];
94
102
  static get sourceDirectory(): string;
95
103
  private static getActiveKernel;
96
104
  private static assertRequiredEnvironmentVariable;
105
+ private static assertEnvironmentVariableChoice;
97
106
  private static getEnvironmentVariablesPath;
98
107
  private static parseBooleanEnvironmentVariable;
99
108
  private static parseNumberEnvironmentVariable;
@@ -106,21 +115,21 @@ declare class Kernel<TEnvironmentSchema extends KernelEnvironmentSchema | undefi
106
115
  private getInitializerFromClass;
107
116
  private getRuntimeFromClass;
108
117
  private getSchedulerFromClass;
109
- get consumers(): Consumer[];
118
+ get consumers(): KernelConsumer[];
110
119
  get consumerMiddleware(): ConsumerMiddleware[];
111
120
  get di(): DependencyInjection;
112
121
  get environment(): KernelEnvironmentForSchema<TEnvironmentSchema>;
113
122
  get logger(): KernelLogger;
114
- get routes(): ServiceClass<Route>[];
123
+ get routes(): ServiceClass<KernelRoute>[];
115
124
  get schedulers(): Scheduler[];
116
125
  private getDependencyInjectionOptions;
117
126
  dependencyInjection(options?: KernelDependencyInjectionOptions): Promise<void>;
118
127
  loadEnvironmentVariables(environment?: string, options?: KernelEnvironmentVariablesOptions<KernelEnvironmentSchema | undefined>): DotenvConfigOutput;
119
- getRoutes(): ServiceClass<Route>[];
128
+ getRoutes(): ServiceClass<KernelRoute>[];
120
129
  registerConsumerMiddleware(...middlewares: ConsumerMiddleware[]): void;
121
- registerConsumers(...ClassDefinitions: ServiceClass<Consumer>[]): void;
122
- registerConsumerInstances(...consumers: Consumer[]): void;
123
- registerRoutes(...ClassDefinitions: ServiceClass<Route>[]): void;
130
+ registerConsumers(...ClassDefinitions: ServiceClass<KernelConsumer>[]): void;
131
+ registerConsumerInstances(...consumers: KernelConsumer[]): void;
132
+ registerRoutes(...ClassDefinitions: ServiceClass<KernelRoute>[]): void;
124
133
  registerSchedulers(...ClassDefinitions: ServiceClass<Scheduler>[]): void;
125
134
  registerSchedulerInstances(...schedulers: Scheduler[]): void;
126
135
  registerShutdownHook(hook: ShutdownHook): void;
@@ -154,6 +163,11 @@ interface ConsumerMiddleware {
154
163
  handle(event: DomainEvent, next: ConsumerNext, context: ConsumerExecutionContext): Promise<void>;
155
164
  }
156
165
 
166
+ interface KernelConsumer {
167
+ readonly queueName: string;
168
+ init(): Promise<void>;
169
+ }
170
+
157
171
  type ShutdownHook = () => Promise<void> | void;
158
172
 
159
- export { Consumer as C, Kernel as K, type ShutdownHook as S, type ConsumerExecutionContext as a, type ConsumerMiddleware as b, type ConsumerNext as c, type KernelDefaultEnvironment as d, type KernelDependencyInjectionOptions as e, type KernelEnvironment as f, type KernelEnvironmentForSchema as g, type KernelEnvironmentSchema as h, type KernelEnvironmentValue as i, type KernelEnvironmentVariableDefinition as j, type KernelEnvironmentVariablePrimitive as k, type KernelEnvironmentVariableType as l, type KernelEnvironmentVariablesOptions as m, type KernelOptions as n, createKernel as o };
173
+ export { type ConsumerExecutionContext as C, type KernelConsumer as K, type ShutdownHook as S, type ConsumerMiddleware as a, type ConsumerNext as b, Kernel as c, type KernelDefaultEnvironment as d, type KernelDependencyInjectionOptions as e, type KernelEnvironment as f, type KernelEnvironmentForSchema as g, type KernelEnvironmentSchema as h, type KernelEnvironmentSchemaInput as i, type KernelEnvironmentValue as j, type KernelEnvironmentVariableDefinition as k, type KernelEnvironmentVariablePrimitive as l, type KernelEnvironmentVariableResolvedValue as m, type KernelEnvironmentVariableType as n, type KernelEnvironmentVariablesOptions as o, type KernelOptions as p, createKernel as q };
@@ -444,6 +444,14 @@ var Kernel = class _Kernel {
444
444
  );
445
445
  }
446
446
  }
447
+ static assertEnvironmentVariableChoice(name, value, schema) {
448
+ const choices = schema[name]?.choices;
449
+ if (choices && !choices.includes(value)) {
450
+ throw new KernelEnvironmentValidationError(
451
+ `Environment variable "${name}" must be one of: ${choices.join(", ")}.`
452
+ );
453
+ }
454
+ }
447
455
  static getEnvironmentVariablesPath(environment, options) {
448
456
  return import_node_path2.default.resolve(
449
457
  _Kernel.rootDirectory,
@@ -478,11 +486,16 @@ var Kernel = class _Kernel {
478
486
  static parseEnvironmentVariable(name, value, schema) {
479
487
  const definition = schema[name];
480
488
  if (definition.type === "boolean") {
481
- return _Kernel.parseBooleanEnvironmentVariable(name, value);
489
+ const parsedValue = _Kernel.parseBooleanEnvironmentVariable(name, value);
490
+ _Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);
491
+ return parsedValue;
482
492
  }
483
493
  if (definition.type === "number") {
484
- return _Kernel.parseNumberEnvironmentVariable(name, value);
494
+ const parsedValue = _Kernel.parseNumberEnvironmentVariable(name, value);
495
+ _Kernel.assertEnvironmentVariableChoice(name, parsedValue, schema);
496
+ return parsedValue;
485
497
  }
498
+ _Kernel.assertEnvironmentVariableChoice(name, value, schema);
486
499
  return value;
487
500
  }
488
501
  static validateEnvironmentVariables(schema) {
@@ -1349,8 +1362,12 @@ var RoutePrefix = class _RoutePrefix {
1349
1362
  }
1350
1363
  };
1351
1364
 
1365
+ // src/contracts/kernel/KernelRoute.ts
1366
+ var KernelRoute = class {
1367
+ };
1368
+
1352
1369
  // src/adapters/ui/routes/Route.ts
1353
- var Route = class {
1370
+ var Route = class extends KernelRoute {
1354
1371
  get(service) {
1355
1372
  return Kernel.di.getService(service);
1356
1373
  }