@haskou/ddd-kernel 0.1.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +143 -0
  3. package/dist/Constructor-fyZLLIh8.d.cts +5 -0
  4. package/dist/Constructor-fyZLLIh8.d.ts +5 -0
  5. package/dist/Consumer-CC8ZRCsd.d.cts +17 -0
  6. package/dist/Consumer-CeT0Wbxb.d.ts +17 -0
  7. package/dist/DomainEvent-mXWEtr_J.d.cts +26 -0
  8. package/dist/DomainEvent-mXWEtr_J.d.ts +26 -0
  9. package/dist/DomainEventConsumer-3WBMSSr2.d.cts +7 -0
  10. package/dist/DomainEventConsumer-B4hkIUmP.d.ts +7 -0
  11. package/dist/DomainEventPublisher-8G0lvmdy.d.cts +7 -0
  12. package/dist/DomainEventPublisher-DhGgM3f2.d.ts +7 -0
  13. package/dist/HandlerContext-DUUExVo3.d.ts +20 -0
  14. package/dist/HandlerContext-Lm89pSeG.d.cts +20 -0
  15. package/dist/Kernel-BWUOUWWI.d.cts +70 -0
  16. package/dist/Kernel-CUaqHa1s.d.ts +70 -0
  17. package/dist/KernelLogger-BESOFrpW.d.cts +8 -0
  18. package/dist/KernelLogger-BESOFrpW.d.ts +8 -0
  19. package/dist/Log-36L3Z84a.d.cts +8 -0
  20. package/dist/Log-36L3Z84a.d.ts +8 -0
  21. package/dist/NoFailedMessagesError-0YJKRWPF.d.ts +45 -0
  22. package/dist/NoFailedMessagesError-Kz7CYWpT.d.cts +45 -0
  23. package/dist/Repository-D9CuAyCV.d.cts +7 -0
  24. package/dist/Repository-D9CuAyCV.d.ts +7 -0
  25. package/dist/Scheduler-oigqNOUJ.d.cts +27 -0
  26. package/dist/Scheduler-oigqNOUJ.d.ts +27 -0
  27. package/dist/ServiceClass-BmNw8fJj.d.cts +37 -0
  28. package/dist/ServiceClass-C7NCKdSS.d.ts +37 -0
  29. package/dist/ServiceResolver-D2Jz-l_Z.d.cts +5 -0
  30. package/dist/ServiceResolver-D2Jz-l_Z.d.ts +5 -0
  31. package/dist/ShutdownHook-BGskq2-q.d.ts +9 -0
  32. package/dist/ShutdownHook-Dib5uNKB.d.cts +9 -0
  33. package/dist/Subscription-Bwkb_did.d.ts +9 -0
  34. package/dist/Subscription-P9WROD_6.d.cts +9 -0
  35. package/dist/adapters/db/in-memory/index.cjs +46 -0
  36. package/dist/adapters/db/in-memory/index.cjs.map +1 -0
  37. package/dist/adapters/db/in-memory/index.d.cts +12 -0
  38. package/dist/adapters/db/in-memory/index.d.ts +12 -0
  39. package/dist/adapters/db/in-memory/index.js +19 -0
  40. package/dist/adapters/db/in-memory/index.js.map +1 -0
  41. package/dist/adapters/db/index.cjs +80 -0
  42. package/dist/adapters/db/index.cjs.map +1 -0
  43. package/dist/adapters/db/index.d.cts +4 -0
  44. package/dist/adapters/db/index.d.ts +4 -0
  45. package/dist/adapters/db/index.js +52 -0
  46. package/dist/adapters/db/index.js.map +1 -0
  47. package/dist/adapters/db/mongo/index.cjs +62 -0
  48. package/dist/adapters/db/mongo/index.cjs.map +1 -0
  49. package/dist/adapters/db/mongo/index.d.cts +22 -0
  50. package/dist/adapters/db/mongo/index.d.ts +22 -0
  51. package/dist/adapters/db/mongo/index.js +35 -0
  52. package/dist/adapters/db/mongo/index.js.map +1 -0
  53. package/dist/adapters/index.cjs +651 -0
  54. package/dist/adapters/index.cjs.map +1 -0
  55. package/dist/adapters/index.d.cts +26 -0
  56. package/dist/adapters/index.d.ts +26 -0
  57. package/dist/adapters/index.js +609 -0
  58. package/dist/adapters/index.js.map +1 -0
  59. package/dist/adapters/kernel/console/index.cjs +46 -0
  60. package/dist/adapters/kernel/console/index.cjs.map +1 -0
  61. package/dist/adapters/kernel/console/index.d.cts +10 -0
  62. package/dist/adapters/kernel/console/index.d.ts +10 -0
  63. package/dist/adapters/kernel/console/index.js +19 -0
  64. package/dist/adapters/kernel/console/index.js.map +1 -0
  65. package/dist/adapters/kernel/index.cjs +46 -0
  66. package/dist/adapters/kernel/index.cjs.map +1 -0
  67. package/dist/adapters/kernel/index.d.cts +2 -0
  68. package/dist/adapters/kernel/index.d.ts +2 -0
  69. package/dist/adapters/kernel/index.js +19 -0
  70. package/dist/adapters/kernel/index.js.map +1 -0
  71. package/dist/adapters/pubsub/amqp/index.cjs +724 -0
  72. package/dist/adapters/pubsub/amqp/index.cjs.map +1 -0
  73. package/dist/adapters/pubsub/amqp/index.d.cts +42 -0
  74. package/dist/adapters/pubsub/amqp/index.d.ts +42 -0
  75. package/dist/adapters/pubsub/amqp/index.js +691 -0
  76. package/dist/adapters/pubsub/amqp/index.js.map +1 -0
  77. package/dist/adapters/pubsub/in-memory/index.cjs +79 -0
  78. package/dist/adapters/pubsub/in-memory/index.cjs.map +1 -0
  79. package/dist/adapters/pubsub/in-memory/index.d.cts +21 -0
  80. package/dist/adapters/pubsub/in-memory/index.d.ts +21 -0
  81. package/dist/adapters/pubsub/in-memory/index.js +51 -0
  82. package/dist/adapters/pubsub/in-memory/index.js.map +1 -0
  83. package/dist/adapters/pubsub/index.cjs +492 -0
  84. package/dist/adapters/pubsub/index.cjs.map +1 -0
  85. package/dist/adapters/pubsub/index.d.cts +11 -0
  86. package/dist/adapters/pubsub/index.d.ts +11 -0
  87. package/dist/adapters/pubsub/index.js +456 -0
  88. package/dist/adapters/pubsub/index.js.map +1 -0
  89. package/dist/adapters/ui/express/index.cjs +126 -0
  90. package/dist/adapters/ui/express/index.cjs.map +1 -0
  91. package/dist/adapters/ui/express/index.d.cts +49 -0
  92. package/dist/adapters/ui/express/index.d.ts +49 -0
  93. package/dist/adapters/ui/express/index.js +98 -0
  94. package/dist/adapters/ui/express/index.js.map +1 -0
  95. package/dist/adapters/ui/index.cjs +489 -0
  96. package/dist/adapters/ui/index.cjs.map +1 -0
  97. package/dist/adapters/ui/index.d.cts +14 -0
  98. package/dist/adapters/ui/index.d.ts +14 -0
  99. package/dist/adapters/ui/index.js +455 -0
  100. package/dist/adapters/ui/index.js.map +1 -0
  101. package/dist/adapters/ui/routes/index.cjs +393 -0
  102. package/dist/adapters/ui/routes/index.cjs.map +1 -0
  103. package/dist/adapters/ui/routes/index.d.cts +5 -0
  104. package/dist/adapters/ui/routes/index.d.ts +5 -0
  105. package/dist/adapters/ui/routes/index.js +361 -0
  106. package/dist/adapters/ui/routes/index.js.map +1 -0
  107. package/dist/contracts/db/index.cjs +19 -0
  108. package/dist/contracts/db/index.cjs.map +1 -0
  109. package/dist/contracts/db/index.d.cts +7 -0
  110. package/dist/contracts/db/index.d.ts +7 -0
  111. package/dist/contracts/db/index.js +1 -0
  112. package/dist/contracts/db/index.js.map +1 -0
  113. package/dist/contracts/index.cjs +49 -0
  114. package/dist/contracts/index.cjs.map +1 -0
  115. package/dist/contracts/index.d.cts +11 -0
  116. package/dist/contracts/index.d.ts +11 -0
  117. package/dist/contracts/index.js +22 -0
  118. package/dist/contracts/index.js.map +1 -0
  119. package/dist/contracts/kernel/index.cjs +19 -0
  120. package/dist/contracts/kernel/index.cjs.map +1 -0
  121. package/dist/contracts/kernel/index.d.cts +9 -0
  122. package/dist/contracts/kernel/index.d.ts +9 -0
  123. package/dist/contracts/kernel/index.js +1 -0
  124. package/dist/contracts/kernel/index.js.map +1 -0
  125. package/dist/contracts/pubsub/index.cjs +19 -0
  126. package/dist/contracts/pubsub/index.cjs.map +1 -0
  127. package/dist/contracts/pubsub/index.d.cts +26 -0
  128. package/dist/contracts/pubsub/index.d.ts +26 -0
  129. package/dist/contracts/pubsub/index.js +1 -0
  130. package/dist/contracts/pubsub/index.js.map +1 -0
  131. package/dist/contracts/ui/index.cjs +49 -0
  132. package/dist/contracts/ui/index.cjs.map +1 -0
  133. package/dist/contracts/ui/index.d.cts +29 -0
  134. package/dist/contracts/ui/index.d.ts +29 -0
  135. package/dist/contracts/ui/index.js +22 -0
  136. package/dist/contracts/ui/index.js.map +1 -0
  137. package/dist/domain/index.cjs +121 -0
  138. package/dist/domain/index.cjs.map +1 -0
  139. package/dist/domain/index.d.cts +26 -0
  140. package/dist/domain/index.d.ts +26 -0
  141. package/dist/domain/index.js +89 -0
  142. package/dist/domain/index.js.map +1 -0
  143. package/dist/errors/index.cjs +58 -0
  144. package/dist/errors/index.cjs.map +1 -0
  145. package/dist/errors/index.d.cts +13 -0
  146. package/dist/errors/index.d.ts +13 -0
  147. package/dist/errors/index.js +29 -0
  148. package/dist/errors/index.js.map +1 -0
  149. package/dist/index.cjs +442 -0
  150. package/dist/index.cjs.map +1 -0
  151. package/dist/index.d.cts +19 -0
  152. package/dist/index.d.ts +19 -0
  153. package/dist/index.js +405 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/infrastructure/dependency-injection/index.cjs +169 -0
  156. package/dist/infrastructure/dependency-injection/index.cjs.map +1 -0
  157. package/dist/infrastructure/dependency-injection/index.d.cts +30 -0
  158. package/dist/infrastructure/dependency-injection/index.d.ts +30 -0
  159. package/dist/infrastructure/dependency-injection/index.js +137 -0
  160. package/dist/infrastructure/dependency-injection/index.js.map +1 -0
  161. package/dist/infrastructure/express/index.cjs +126 -0
  162. package/dist/infrastructure/express/index.cjs.map +1 -0
  163. package/dist/infrastructure/express/index.d.cts +14 -0
  164. package/dist/infrastructure/express/index.d.ts +14 -0
  165. package/dist/infrastructure/express/index.js +98 -0
  166. package/dist/infrastructure/express/index.js.map +1 -0
  167. package/dist/infrastructure/lifecycle/index.cjs +19 -0
  168. package/dist/infrastructure/lifecycle/index.cjs.map +1 -0
  169. package/dist/infrastructure/lifecycle/index.d.cts +9 -0
  170. package/dist/infrastructure/lifecycle/index.d.ts +9 -0
  171. package/dist/infrastructure/lifecycle/index.js +1 -0
  172. package/dist/infrastructure/lifecycle/index.js.map +1 -0
  173. package/dist/infrastructure/logs/index.cjs +144 -0
  174. package/dist/infrastructure/logs/index.cjs.map +1 -0
  175. package/dist/infrastructure/logs/index.d.cts +30 -0
  176. package/dist/infrastructure/logs/index.d.ts +30 -0
  177. package/dist/infrastructure/logs/index.js +107 -0
  178. package/dist/infrastructure/logs/index.js.map +1 -0
  179. package/dist/infrastructure/scheduler/index.cjs +461 -0
  180. package/dist/infrastructure/scheduler/index.cjs.map +1 -0
  181. package/dist/infrastructure/scheduler/index.d.cts +17 -0
  182. package/dist/infrastructure/scheduler/index.d.ts +17 -0
  183. package/dist/infrastructure/scheduler/index.js +426 -0
  184. package/dist/infrastructure/scheduler/index.js.map +1 -0
  185. package/dist/infrastructure/websocket/index.cjs +131 -0
  186. package/dist/infrastructure/websocket/index.cjs.map +1 -0
  187. package/dist/infrastructure/websocket/index.d.cts +56 -0
  188. package/dist/infrastructure/websocket/index.d.ts +56 -0
  189. package/dist/infrastructure/websocket/index.js +103 -0
  190. package/dist/infrastructure/websocket/index.js.map +1 -0
  191. package/package.json +248 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/infrastructure/logs/index.ts","../../../src/infrastructure/logs/WinstonLogger.ts"],"sourcesContent":["export * from './Log.js';\nexport * from './WinstonLogger.js';\nexport * from './WinstonLoggerOptions.js';\n","import winston, { format, type Logger } from 'winston';\n\nimport type { Log } from './Log.js';\nimport type { WinstonLoggerOptions } from './WinstonLoggerOptions.js';\n\nexport class WinstonLogger implements Log {\n private loggerInstance: Logger | undefined;\n private prefix = '';\n\n constructor(private readonly options: WinstonLoggerOptions = {}) {}\n\n private get logger(): Logger {\n if (!this.loggerInstance) {\n this.loggerInstance = winston.createLogger({\n level: this.options.logLevel ?? process.env.LOG_LEVEL ?? 'info',\n transports: [\n new winston.transports.Console({\n format: this.consoleFormat(),\n }),\n new winston.transports.File({\n filename: this.getLogFileName(),\n format: this.jsonFormat(),\n }),\n ],\n });\n }\n\n return this.loggerInstance;\n }\n\n private consoleFormat(): winston.Logform.Format {\n return format.combine(\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n format.colorize(),\n format.printf((entry) => {\n const timestamp = this.formatTimestamp(entry.timestamp);\n const level = String(entry.level);\n const message = this.formatConsoleMessage(entry.message);\n\n return `${timestamp} ${level.padEnd(7)} ${message}`;\n }),\n );\n }\n\n private jsonFormat(): winston.Logform.Format {\n return format.combine(\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n format.json(),\n );\n }\n\n private getLogFileName(): string {\n const rootDirectory = this.options.rootDirectory ?? process.cwd();\n const logDirectory =\n this.options.logDirectory ?? process.env.LOG_URL ?? 'logs';\n const serviceName =\n this.options.serviceName ?? process.env.SERVICE_NAME ?? 'service';\n\n return `${rootDirectory}/${logDirectory}/${serviceName}.log`;\n }\n\n private formatConsoleMessage(message: unknown): string {\n if (typeof message !== 'string') {\n return String(message);\n }\n\n const parsedMessage = this.parseJSONMessage(message);\n\n if (!parsedMessage) {\n return message;\n }\n\n return Object.entries(parsedMessage)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${key}=${this.formatConsoleValue(value)}`)\n .join(' ');\n }\n\n private formatTimestamp(timestamp: unknown): string {\n return String(timestamp || '');\n }\n\n private formatConsoleValue(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.formatConsoleValue(item)).join(',')}]`;\n }\n\n if (value && typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return JSON.stringify(value);\n }\n\n private parseJSONMessage(\n message: string,\n ): Record<string, unknown> | undefined {\n try {\n const parsedMessage: unknown = JSON.parse(message);\n\n if (\n !parsedMessage ||\n typeof parsedMessage !== 'object' ||\n Array.isArray(parsedMessage)\n ) {\n return undefined;\n }\n\n return parsedMessage as Record<string, unknown>;\n } catch {\n return undefined;\n }\n }\n\n public run(prefix?: string): void {\n this.prefix = prefix || '';\n }\n\n public error(message: string): void {\n this.logger.error(this.prefix + message);\n }\n\n public warn(message: string): void {\n this.logger.warn(this.prefix + message);\n }\n\n public info(message: string): void {\n this.logger.info(this.prefix + message);\n }\n\n public debug(message: string): void {\n this.logger.debug(this.prefix + message);\n }\n}\n"],"mappings":"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","names":["winston"]}
@@ -0,0 +1,30 @@
1
+ import { L as Log } from '../../Log-36L3Z84a.cjs';
2
+
3
+ interface WinstonLoggerOptions {
4
+ readonly logDirectory?: string;
5
+ readonly logLevel?: string;
6
+ readonly rootDirectory?: string;
7
+ readonly serviceName?: string;
8
+ }
9
+
10
+ declare class WinstonLogger implements Log {
11
+ private readonly options;
12
+ private loggerInstance;
13
+ private prefix;
14
+ constructor(options?: WinstonLoggerOptions);
15
+ private get logger();
16
+ private consoleFormat;
17
+ private jsonFormat;
18
+ private getLogFileName;
19
+ private formatConsoleMessage;
20
+ private formatTimestamp;
21
+ private formatConsoleValue;
22
+ private parseJSONMessage;
23
+ run(prefix?: string): void;
24
+ error(message: string): void;
25
+ warn(message: string): void;
26
+ info(message: string): void;
27
+ debug(message: string): void;
28
+ }
29
+
30
+ export { Log, WinstonLogger, type WinstonLoggerOptions };
@@ -0,0 +1,30 @@
1
+ import { L as Log } from '../../Log-36L3Z84a.js';
2
+
3
+ interface WinstonLoggerOptions {
4
+ readonly logDirectory?: string;
5
+ readonly logLevel?: string;
6
+ readonly rootDirectory?: string;
7
+ readonly serviceName?: string;
8
+ }
9
+
10
+ declare class WinstonLogger implements Log {
11
+ private readonly options;
12
+ private loggerInstance;
13
+ private prefix;
14
+ constructor(options?: WinstonLoggerOptions);
15
+ private get logger();
16
+ private consoleFormat;
17
+ private jsonFormat;
18
+ private getLogFileName;
19
+ private formatConsoleMessage;
20
+ private formatTimestamp;
21
+ private formatConsoleValue;
22
+ private parseJSONMessage;
23
+ run(prefix?: string): void;
24
+ error(message: string): void;
25
+ warn(message: string): void;
26
+ info(message: string): void;
27
+ debug(message: string): void;
28
+ }
29
+
30
+ export { Log, WinstonLogger, type WinstonLoggerOptions };
@@ -0,0 +1,107 @@
1
+ // src/infrastructure/logs/WinstonLogger.ts
2
+ import winston, { format } from "winston";
3
+ var WinstonLogger = class {
4
+ constructor(options = {}) {
5
+ this.options = options;
6
+ }
7
+ options;
8
+ loggerInstance;
9
+ prefix = "";
10
+ get logger() {
11
+ if (!this.loggerInstance) {
12
+ this.loggerInstance = winston.createLogger({
13
+ level: this.options.logLevel ?? process.env.LOG_LEVEL ?? "info",
14
+ transports: [
15
+ new winston.transports.Console({
16
+ format: this.consoleFormat()
17
+ }),
18
+ new winston.transports.File({
19
+ filename: this.getLogFileName(),
20
+ format: this.jsonFormat()
21
+ })
22
+ ]
23
+ });
24
+ }
25
+ return this.loggerInstance;
26
+ }
27
+ consoleFormat() {
28
+ return format.combine(
29
+ format.timestamp({
30
+ format: "YYYY-MM-DD HH:mm:ss"
31
+ }),
32
+ format.colorize(),
33
+ format.printf((entry) => {
34
+ const timestamp = this.formatTimestamp(entry.timestamp);
35
+ const level = String(entry.level);
36
+ const message = this.formatConsoleMessage(entry.message);
37
+ return `${timestamp} ${level.padEnd(7)} ${message}`;
38
+ })
39
+ );
40
+ }
41
+ jsonFormat() {
42
+ return format.combine(
43
+ format.timestamp({
44
+ format: "YYYY-MM-DD HH:mm:ss"
45
+ }),
46
+ format.json()
47
+ );
48
+ }
49
+ getLogFileName() {
50
+ const rootDirectory = this.options.rootDirectory ?? process.cwd();
51
+ const logDirectory = this.options.logDirectory ?? process.env.LOG_URL ?? "logs";
52
+ const serviceName = this.options.serviceName ?? process.env.SERVICE_NAME ?? "service";
53
+ return `${rootDirectory}/${logDirectory}/${serviceName}.log`;
54
+ }
55
+ formatConsoleMessage(message) {
56
+ if (typeof message !== "string") {
57
+ return String(message);
58
+ }
59
+ const parsedMessage = this.parseJSONMessage(message);
60
+ if (!parsedMessage) {
61
+ return message;
62
+ }
63
+ return Object.entries(parsedMessage).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}=${this.formatConsoleValue(value)}`).join(" ");
64
+ }
65
+ formatTimestamp(timestamp) {
66
+ return String(timestamp || "");
67
+ }
68
+ formatConsoleValue(value) {
69
+ if (Array.isArray(value)) {
70
+ return `[${value.map((item) => this.formatConsoleValue(item)).join(",")}]`;
71
+ }
72
+ if (value && typeof value === "object") {
73
+ return JSON.stringify(value);
74
+ }
75
+ return JSON.stringify(value);
76
+ }
77
+ parseJSONMessage(message) {
78
+ try {
79
+ const parsedMessage = JSON.parse(message);
80
+ if (!parsedMessage || typeof parsedMessage !== "object" || Array.isArray(parsedMessage)) {
81
+ return void 0;
82
+ }
83
+ return parsedMessage;
84
+ } catch {
85
+ return void 0;
86
+ }
87
+ }
88
+ run(prefix) {
89
+ this.prefix = prefix || "";
90
+ }
91
+ error(message) {
92
+ this.logger.error(this.prefix + message);
93
+ }
94
+ warn(message) {
95
+ this.logger.warn(this.prefix + message);
96
+ }
97
+ info(message) {
98
+ this.logger.info(this.prefix + message);
99
+ }
100
+ debug(message) {
101
+ this.logger.debug(this.prefix + message);
102
+ }
103
+ };
104
+ export {
105
+ WinstonLogger
106
+ };
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/infrastructure/logs/WinstonLogger.ts"],"sourcesContent":["import winston, { format, type Logger } from 'winston';\n\nimport type { Log } from './Log.js';\nimport type { WinstonLoggerOptions } from './WinstonLoggerOptions.js';\n\nexport class WinstonLogger implements Log {\n private loggerInstance: Logger | undefined;\n private prefix = '';\n\n constructor(private readonly options: WinstonLoggerOptions = {}) {}\n\n private get logger(): Logger {\n if (!this.loggerInstance) {\n this.loggerInstance = winston.createLogger({\n level: this.options.logLevel ?? process.env.LOG_LEVEL ?? 'info',\n transports: [\n new winston.transports.Console({\n format: this.consoleFormat(),\n }),\n new winston.transports.File({\n filename: this.getLogFileName(),\n format: this.jsonFormat(),\n }),\n ],\n });\n }\n\n return this.loggerInstance;\n }\n\n private consoleFormat(): winston.Logform.Format {\n return format.combine(\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n format.colorize(),\n format.printf((entry) => {\n const timestamp = this.formatTimestamp(entry.timestamp);\n const level = String(entry.level);\n const message = this.formatConsoleMessage(entry.message);\n\n return `${timestamp} ${level.padEnd(7)} ${message}`;\n }),\n );\n }\n\n private jsonFormat(): winston.Logform.Format {\n return format.combine(\n format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss',\n }),\n format.json(),\n );\n }\n\n private getLogFileName(): string {\n const rootDirectory = this.options.rootDirectory ?? process.cwd();\n const logDirectory =\n this.options.logDirectory ?? process.env.LOG_URL ?? 'logs';\n const serviceName =\n this.options.serviceName ?? process.env.SERVICE_NAME ?? 'service';\n\n return `${rootDirectory}/${logDirectory}/${serviceName}.log`;\n }\n\n private formatConsoleMessage(message: unknown): string {\n if (typeof message !== 'string') {\n return String(message);\n }\n\n const parsedMessage = this.parseJSONMessage(message);\n\n if (!parsedMessage) {\n return message;\n }\n\n return Object.entries(parsedMessage)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${key}=${this.formatConsoleValue(value)}`)\n .join(' ');\n }\n\n private formatTimestamp(timestamp: unknown): string {\n return String(timestamp || '');\n }\n\n private formatConsoleValue(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.formatConsoleValue(item)).join(',')}]`;\n }\n\n if (value && typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return JSON.stringify(value);\n }\n\n private parseJSONMessage(\n message: string,\n ): Record<string, unknown> | undefined {\n try {\n const parsedMessage: unknown = JSON.parse(message);\n\n if (\n !parsedMessage ||\n typeof parsedMessage !== 'object' ||\n Array.isArray(parsedMessage)\n ) {\n return undefined;\n }\n\n return parsedMessage as Record<string, unknown>;\n } catch {\n return undefined;\n }\n }\n\n public run(prefix?: string): void {\n this.prefix = prefix || '';\n }\n\n public error(message: string): void {\n this.logger.error(this.prefix + message);\n }\n\n public warn(message: string): void {\n this.logger.warn(this.prefix + message);\n }\n\n public info(message: string): void {\n this.logger.info(this.prefix + message);\n }\n\n public debug(message: string): void {\n this.logger.debug(this.prefix + message);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/infrastructure/scheduler/index.ts
31
+ var scheduler_exports = {};
32
+ __export(scheduler_exports, {
33
+ DefaultSchedulerErrorPolicy: () => DefaultSchedulerErrorPolicy,
34
+ InvalidParseCronExpressionError: () => InvalidParseCronExpressionError,
35
+ ScheduledExecutionError: () => ScheduledExecutionError,
36
+ Scheduler: () => Scheduler,
37
+ default: () => Scheduler_default
38
+ });
39
+ module.exports = __toCommonJS(scheduler_exports);
40
+
41
+ // src/Kernel.ts
42
+ var import_node_path2 = __toESM(require("path"), 1);
43
+
44
+ // src/adapters/kernel/console/ConsoleKernelLogger.ts
45
+ var ConsoleKernelLogger = class {
46
+ debug(message) {
47
+ console.debug(message);
48
+ }
49
+ error(message) {
50
+ console.error(message);
51
+ }
52
+ info(message) {
53
+ console.info(message);
54
+ }
55
+ warn(message) {
56
+ console.warn(message);
57
+ }
58
+ };
59
+
60
+ // src/infrastructure/dependency-injection/DependencyInjection.ts
61
+ var import_fs_extra = __toESM(require("fs-extra"), 1);
62
+ var import_node_dependency_injection = require("node-dependency-injection");
63
+ var import_node_path = __toESM(require("path"), 1);
64
+ var DependencyInjection = class _DependencyInjection {
65
+ constructor(options = {
66
+ containerBuild: process.env.CONTAINER_BUILD === "true",
67
+ servicesYamlPath: import_node_path.default.resolve(
68
+ process.cwd(),
69
+ "config",
70
+ "container",
71
+ "services.yaml"
72
+ ),
73
+ sourceDirectory: import_node_path.default.resolve(process.cwd(), "src")
74
+ }) {
75
+ this.options = options;
76
+ this.container = new import_node_dependency_injection.ContainerBuilder(false, this.options.sourceDirectory);
77
+ }
78
+ options;
79
+ static configuredInstance;
80
+ autowire;
81
+ loader;
82
+ container;
83
+ static configure(options) {
84
+ _DependencyInjection.configuredInstance = new _DependencyInjection(options);
85
+ return _DependencyInjection.configuredInstance;
86
+ }
87
+ static get instance() {
88
+ if (!_DependencyInjection.configuredInstance) {
89
+ throw new Error("DependencyInjection has not been configured.");
90
+ }
91
+ return _DependencyInjection.configuredInstance;
92
+ }
93
+ get definitions() {
94
+ const container = this.container;
95
+ return container._definitions || /* @__PURE__ */ new Map();
96
+ }
97
+ get aliases() {
98
+ const container = this.container;
99
+ return container._alias || /* @__PURE__ */ new Map();
100
+ }
101
+ async ensureFolderExists(filePath) {
102
+ await import_fs_extra.default.mkdir(import_node_path.default.dirname(filePath), { recursive: true });
103
+ }
104
+ getServiceClassName(serviceName) {
105
+ return typeof serviceName === "function" ? serviceName.name : void 0;
106
+ }
107
+ parentMatchesService(parentId, serviceClassName) {
108
+ if (!parentId) {
109
+ return false;
110
+ }
111
+ const parentName = Buffer.from(parentId, "base64").toString("utf8");
112
+ return parentName.endsWith(`__${serviceClassName}__${serviceClassName}`);
113
+ }
114
+ serviceIdMatchesService(serviceId, serviceClassName) {
115
+ const serviceName = Buffer.from(serviceId, "base64").toString("utf8");
116
+ return serviceName.endsWith(`__${serviceClassName}__${serviceClassName}`);
117
+ }
118
+ findConcreteChildServiceId(serviceName) {
119
+ const serviceClassName = this.getServiceClassName(serviceName);
120
+ if (!serviceClassName) {
121
+ return void 0;
122
+ }
123
+ const matches = [...this.definitions.entries()].filter(([, definition]) => definition._abstract !== true).filter(
124
+ ([, definition]) => this.parentMatchesService(definition._parent, serviceClassName)
125
+ ).map(([id]) => id);
126
+ return matches[matches.length - 1];
127
+ }
128
+ findRegisteredServiceId(serviceName) {
129
+ const serviceClassName = this.getServiceClassName(serviceName);
130
+ if (!serviceClassName) {
131
+ return void 0;
132
+ }
133
+ const matches = [...this.definitions.keys()].filter(
134
+ (id) => this.serviceIdMatchesService(id, serviceClassName)
135
+ );
136
+ return matches[matches.length - 1];
137
+ }
138
+ findAliasServiceId(serviceName) {
139
+ const serviceClassName = this.getServiceClassName(serviceName);
140
+ if (!serviceClassName) {
141
+ return void 0;
142
+ }
143
+ const matches = [...this.aliases.keys()].filter(
144
+ (id) => this.serviceIdMatchesService(id, serviceClassName)
145
+ );
146
+ return matches[matches.length - 1];
147
+ }
148
+ registerParentAliases() {
149
+ for (const [id, definition] of this.definitions.entries()) {
150
+ if (definition._abstract === true || !definition._parent) {
151
+ continue;
152
+ }
153
+ this.container.setAlias(definition._parent, id);
154
+ }
155
+ }
156
+ async compile() {
157
+ if (this.options.containerBuild) {
158
+ await this.ensureFolderExists(this.options.servicesYamlPath);
159
+ this.autowire = new import_node_dependency_injection.Autowire(this.container);
160
+ this.autowire.serviceFile = new import_node_dependency_injection.ServiceFile(
161
+ this.options.servicesYamlPath,
162
+ false
163
+ );
164
+ await this.autowire.process();
165
+ } else {
166
+ this.loader = new import_node_dependency_injection.YamlFileLoader(this.container);
167
+ await this.loader.load(this.options.servicesYamlPath);
168
+ }
169
+ this.registerParentAliases();
170
+ await this.container.compile();
171
+ }
172
+ getService(serviceName) {
173
+ const childServiceId = this.findConcreteChildServiceId(serviceName);
174
+ if (childServiceId) {
175
+ return this.container.get(childServiceId);
176
+ }
177
+ const aliasServiceId = this.findAliasServiceId(serviceName);
178
+ if (aliasServiceId) {
179
+ return this.container.get(aliasServiceId);
180
+ }
181
+ const registeredServiceId = this.findRegisteredServiceId(serviceName);
182
+ if (registeredServiceId) {
183
+ return this.container.get(registeredServiceId);
184
+ }
185
+ return this.container.get(serviceName);
186
+ }
187
+ };
188
+
189
+ // src/Kernel.ts
190
+ var Kernel = class _Kernel {
191
+ constructor(options = {}) {
192
+ this.options = options;
193
+ this.loggerInstance = options.logger ?? new ConsoleKernelLogger();
194
+ this.dependencyInjectionInstance = options.di;
195
+ _Kernel.state.activeKernel = this;
196
+ }
197
+ options;
198
+ static stateKey = /* @__PURE__ */ Symbol.for(
199
+ "@haskou/ddd-kernel/kernel-state"
200
+ );
201
+ consumerMiddlewares = [];
202
+ consumersList = [];
203
+ loggerInstance;
204
+ routesList = [];
205
+ schedulersList = [];
206
+ shutdownHooks = [];
207
+ dependencyInjectionInstance;
208
+ static get state() {
209
+ const stateContainer = globalThis;
210
+ stateContainer[_Kernel.stateKey] = stateContainer[_Kernel.stateKey] ?? {};
211
+ return stateContainer[_Kernel.stateKey];
212
+ }
213
+ static get configDirectory() {
214
+ return import_node_path2.default.resolve(_Kernel.rootDirectory, "config");
215
+ }
216
+ static get consumers() {
217
+ return _Kernel.getActiveKernel().consumers;
218
+ }
219
+ static get consumerMiddleware() {
220
+ return _Kernel.getActiveKernel().consumerMiddleware;
221
+ }
222
+ static get di() {
223
+ return _Kernel.getActiveKernel().di;
224
+ }
225
+ static get logger() {
226
+ return _Kernel.getActiveKernel().logger;
227
+ }
228
+ static get rootDirectory() {
229
+ return process.cwd();
230
+ }
231
+ static get routes() {
232
+ return _Kernel.getActiveKernel().routes;
233
+ }
234
+ static get schedulers() {
235
+ return _Kernel.getActiveKernel().schedulers;
236
+ }
237
+ static get sourceDirectory() {
238
+ return import_node_path2.default.resolve(_Kernel.rootDirectory, "src");
239
+ }
240
+ static getActiveKernel() {
241
+ if (!_Kernel.state.activeKernel) {
242
+ _Kernel.state.activeKernel = new _Kernel();
243
+ }
244
+ return _Kernel.state.activeKernel;
245
+ }
246
+ async closeCandidate(candidate) {
247
+ if (candidate.shutdown) {
248
+ await candidate.shutdown();
249
+ return;
250
+ }
251
+ if (candidate.close) {
252
+ await candidate.close();
253
+ return;
254
+ }
255
+ if (candidate.stop) {
256
+ await candidate.stop();
257
+ return;
258
+ }
259
+ if (candidate.flush) {
260
+ await candidate.flush();
261
+ }
262
+ }
263
+ getConsumerFromClass(ClassDefinition) {
264
+ return this.di.getService(ClassDefinition);
265
+ }
266
+ getInitializerFromClass(ClassDefinition) {
267
+ return this.di.getService(ClassDefinition);
268
+ }
269
+ getRuntimeFromClass(ClassDefinition) {
270
+ return this.di.getService(ClassDefinition);
271
+ }
272
+ getSchedulerFromClass(ClassDefinition) {
273
+ return this.di.getService(ClassDefinition);
274
+ }
275
+ get consumers() {
276
+ return this.consumersList;
277
+ }
278
+ get consumerMiddleware() {
279
+ return this.consumerMiddlewares;
280
+ }
281
+ get di() {
282
+ if (!this.dependencyInjectionInstance) {
283
+ throw new Error("Kernel dependency injection has not been initialized.");
284
+ }
285
+ return this.dependencyInjectionInstance;
286
+ }
287
+ get logger() {
288
+ return this.loggerInstance;
289
+ }
290
+ get routes() {
291
+ return this.routesList;
292
+ }
293
+ get schedulers() {
294
+ return this.schedulersList;
295
+ }
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
+ });
302
+ await this.dependencyInjectionInstance.compile();
303
+ }
304
+ getRoutes() {
305
+ return this.routes;
306
+ }
307
+ registerConsumerMiddleware(...middlewares) {
308
+ this.consumerMiddlewares.push(...middlewares);
309
+ }
310
+ registerConsumers(...ClassDefinitions) {
311
+ for (const ClassDefinition of ClassDefinitions) {
312
+ this.consumersList.push(this.getConsumerFromClass(ClassDefinition));
313
+ }
314
+ }
315
+ registerConsumerInstances(...consumers) {
316
+ this.consumersList.push(...consumers);
317
+ }
318
+ registerRoutes(...ClassDefinitions) {
319
+ this.routesList.push(...ClassDefinitions);
320
+ }
321
+ registerSchedulers(...ClassDefinitions) {
322
+ for (const ClassDefinition of ClassDefinitions) {
323
+ this.schedulersList.push(this.getSchedulerFromClass(ClassDefinition));
324
+ }
325
+ }
326
+ registerSchedulerInstances(...schedulers) {
327
+ this.schedulersList.push(...schedulers);
328
+ }
329
+ registerShutdownHook(hook) {
330
+ this.shutdownHooks.push(hook);
331
+ }
332
+ removeConsumers() {
333
+ this.consumersList.length = 0;
334
+ }
335
+ removeRoutes() {
336
+ this.routesList.length = 0;
337
+ }
338
+ removeSchedulers() {
339
+ this.schedulersList.length = 0;
340
+ }
341
+ async runConsumers() {
342
+ for (const consumer of this.consumersList) {
343
+ await consumer.init();
344
+ }
345
+ }
346
+ async runInitializers(...ClassDefinitions) {
347
+ for (const ClassDefinition of ClassDefinitions) {
348
+ await this.getInitializerFromClass(ClassDefinition).ensure();
349
+ }
350
+ }
351
+ async runRuntimes(...ClassDefinitions) {
352
+ for (const ClassDefinition of ClassDefinitions) {
353
+ const runtime = this.getRuntimeFromClass(ClassDefinition);
354
+ await runtime.run();
355
+ this.registerShutdownHook(
356
+ () => this.closeCandidate(runtime)
357
+ );
358
+ }
359
+ }
360
+ async runSchedulerNowAndSchedule(ClassDefinition) {
361
+ const scheduler = this.getSchedulerFromClass(ClassDefinition);
362
+ await scheduler.runOnce();
363
+ await scheduler.init();
364
+ this.schedulersList.push(scheduler);
365
+ }
366
+ async runSchedulers() {
367
+ for (const scheduler of this.schedulersList) {
368
+ await scheduler.init();
369
+ }
370
+ }
371
+ async shutdown() {
372
+ for (const consumer of [...this.consumersList].reverse()) {
373
+ await this.closeCandidate(consumer);
374
+ }
375
+ for (const scheduler of [...this.schedulersList].reverse()) {
376
+ await this.closeCandidate(scheduler);
377
+ }
378
+ for (const hook of [...this.shutdownHooks].reverse()) {
379
+ await hook();
380
+ }
381
+ await this.closeCandidate(this.loggerInstance);
382
+ }
383
+ };
384
+
385
+ // src/infrastructure/scheduler/ScheduledExecutionError.ts
386
+ var ScheduledExecutionError = class extends Error {
387
+ constructor(message) {
388
+ super(message);
389
+ this.name = "ScheduledExecutionError";
390
+ }
391
+ };
392
+
393
+ // src/infrastructure/scheduler/DefaultSchedulerErrorPolicy.ts
394
+ var DefaultSchedulerErrorPolicy = class {
395
+ handle(error, scheduler) {
396
+ const errorMessage = error instanceof Error ? error.message : String(error);
397
+ const scheduledError = new ScheduledExecutionError(
398
+ `Error on ${scheduler.getProcessName()}: ${errorMessage}`
399
+ );
400
+ Kernel.logger.error(scheduledError.message);
401
+ }
402
+ shouldSkip() {
403
+ return false;
404
+ }
405
+ };
406
+
407
+ // src/infrastructure/scheduler/InvalidParseCronExpressionError.ts
408
+ var InvalidParseCronExpressionError = class extends Error {
409
+ constructor(processName) {
410
+ super(`Invalid cron expression for scheduler "${processName}".`);
411
+ this.name = "InvalidParseCronExpressionError";
412
+ }
413
+ };
414
+
415
+ // src/infrastructure/scheduler/Scheduler.ts
416
+ var import_node_cron = __toESM(require("node-cron"), 1);
417
+ var Scheduler = class {
418
+ constructor(errorPolicy = new DefaultSchedulerErrorPolicy()) {
419
+ this.errorPolicy = errorPolicy;
420
+ }
421
+ errorPolicy;
422
+ parseCronExpression() {
423
+ const expression = this.getCronExpression();
424
+ return `${expression.second ?? "*"} ${expression.minute ?? "*"} ${expression.hour ?? "*"} ${expression.dayOfMonth ?? "*"} ${expression.month ?? "*"} ${expression.dayOfWeek ?? "*"}`;
425
+ }
426
+ async runOnce() {
427
+ try {
428
+ Kernel.logger?.debug?.(`Scheduler: Executing ${this.getProcessName()}`);
429
+ await this.execute();
430
+ } catch (error) {
431
+ if (this.errorPolicy.shouldSkip(error)) {
432
+ return;
433
+ }
434
+ await this.errorPolicy.handle(error, this);
435
+ }
436
+ }
437
+ get(service) {
438
+ return Kernel.di.getService(service);
439
+ }
440
+ init() {
441
+ let parsedCronExpression;
442
+ try {
443
+ parsedCronExpression = this.parseCronExpression();
444
+ } catch {
445
+ throw new InvalidParseCronExpressionError(this.getProcessName());
446
+ }
447
+ import_node_cron.default.schedule(parsedCronExpression, () => {
448
+ void this.runOnce();
449
+ });
450
+ return Promise.resolve();
451
+ }
452
+ };
453
+ var Scheduler_default = Scheduler;
454
+ // Annotate the CommonJS export names for ESM import in node:
455
+ 0 && (module.exports = {
456
+ DefaultSchedulerErrorPolicy,
457
+ InvalidParseCronExpressionError,
458
+ ScheduledExecutionError,
459
+ Scheduler
460
+ });
461
+ //# sourceMappingURL=index.cjs.map