@hexaijs/plugin-contracts-generator 0.2.0 → 0.2.2

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 (98) hide show
  1. package/README.md +33 -25
  2. package/dist/ast-utils.d.ts +6 -0
  3. package/dist/ast-utils.d.ts.map +1 -0
  4. package/dist/ast-utils.js +73 -0
  5. package/dist/ast-utils.js.map +1 -0
  6. package/dist/class-analyzer.d.ts +16 -0
  7. package/dist/class-analyzer.d.ts.map +1 -0
  8. package/dist/class-analyzer.js +114 -0
  9. package/dist/class-analyzer.js.map +1 -0
  10. package/dist/cli.d.ts +32 -1
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +226 -2480
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config-loader.d.ts +24 -0
  15. package/dist/config-loader.d.ts.map +1 -0
  16. package/dist/config-loader.js +126 -0
  17. package/dist/config-loader.js.map +1 -0
  18. package/dist/context-config.d.ts +44 -0
  19. package/dist/context-config.d.ts.map +1 -0
  20. package/dist/context-config.js +140 -0
  21. package/dist/context-config.js.map +1 -0
  22. package/dist/domain/index.d.ts +2 -0
  23. package/dist/domain/index.d.ts.map +1 -0
  24. package/dist/domain/index.js +2 -0
  25. package/dist/domain/index.js.map +1 -0
  26. package/dist/domain/types.d.ts +182 -0
  27. package/dist/domain/types.d.ts.map +1 -0
  28. package/dist/domain/types.js +49 -0
  29. package/dist/domain/types.js.map +1 -0
  30. package/dist/errors.d.ts +72 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +112 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/file-copier.d.ts +84 -0
  35. package/dist/file-copier.d.ts.map +1 -0
  36. package/dist/file-copier.js +721 -0
  37. package/dist/file-copier.js.map +1 -0
  38. package/dist/file-graph-resolver.d.ts +42 -0
  39. package/dist/file-graph-resolver.d.ts.map +1 -0
  40. package/dist/file-graph-resolver.js +138 -0
  41. package/dist/file-graph-resolver.js.map +1 -0
  42. package/dist/file-system.d.ts +26 -0
  43. package/dist/file-system.d.ts.map +1 -0
  44. package/dist/file-system.js +30 -0
  45. package/dist/file-system.js.map +1 -0
  46. package/dist/hexai-plugin.d.ts +16 -0
  47. package/dist/hexai-plugin.d.ts.map +1 -0
  48. package/dist/hexai-plugin.js +56 -0
  49. package/dist/hexai-plugin.js.map +1 -0
  50. package/dist/import-analyzer.d.ts +6 -0
  51. package/dist/import-analyzer.d.ts.map +1 -0
  52. package/dist/import-analyzer.js +39 -0
  53. package/dist/import-analyzer.js.map +1 -0
  54. package/dist/index.d.ts +39 -531
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +56 -2739
  57. package/dist/index.js.map +1 -1
  58. package/dist/logger.d.ts +21 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +43 -0
  61. package/dist/logger.js.map +1 -0
  62. package/dist/parser.d.ts +32 -0
  63. package/dist/parser.d.ts.map +1 -0
  64. package/dist/parser.js +202 -0
  65. package/dist/parser.js.map +1 -0
  66. package/dist/pipeline.d.ts +57 -0
  67. package/dist/pipeline.d.ts.map +1 -0
  68. package/dist/pipeline.js +148 -0
  69. package/dist/pipeline.js.map +1 -0
  70. package/dist/reexport-generator.d.ts +81 -0
  71. package/dist/reexport-generator.d.ts.map +1 -0
  72. package/dist/reexport-generator.js +171 -0
  73. package/dist/reexport-generator.js.map +1 -0
  74. package/dist/registry-generator.d.ts +27 -0
  75. package/dist/registry-generator.d.ts.map +1 -0
  76. package/dist/registry-generator.js +104 -0
  77. package/dist/registry-generator.js.map +1 -0
  78. package/dist/runtime/index.d.ts +2 -23
  79. package/dist/runtime/index.d.ts.map +1 -0
  80. package/dist/runtime/index.js +1 -38
  81. package/dist/runtime/index.js.map +1 -1
  82. package/dist/runtime/message-registry.d.ts +23 -0
  83. package/dist/runtime/message-registry.d.ts.map +1 -0
  84. package/dist/runtime/message-registry.js +35 -0
  85. package/dist/runtime/message-registry.js.map +1 -0
  86. package/dist/scanner.d.ts +21 -0
  87. package/dist/scanner.d.ts.map +1 -0
  88. package/dist/scanner.js +49 -0
  89. package/dist/scanner.js.map +1 -0
  90. package/dist/test-utils.d.ts +23 -0
  91. package/dist/test-utils.d.ts.map +1 -0
  92. package/dist/test-utils.js +188 -0
  93. package/dist/test-utils.js.map +1 -0
  94. package/package.json +69 -64
  95. package/dist/cli-CPg-O4OY.d.ts +0 -214
  96. package/dist/decorators/index.d.ts +0 -144
  97. package/dist/decorators/index.js +0 -28
  98. package/dist/decorators/index.js.map +0 -1
@@ -0,0 +1,171 @@
1
+ import * as ts from "typescript";
2
+ import * as path from "path";
3
+ import { nodeFileSystem } from "./file-system.js";
4
+ /**
5
+ * Generates re-export files for pathAliasRewrites
6
+ */
7
+ export class ReexportGenerator {
8
+ fs;
9
+ constructor(options = {}) {
10
+ this.fs = options.fileSystem ?? nodeFileSystem;
11
+ }
12
+ /**
13
+ * Analyzes files to find imports that match pathAliasRewrites
14
+ * and groups them by rewritten path
15
+ */
16
+ async analyze(options) {
17
+ const { files, pathAliasRewrites } = options;
18
+ // Invert the map: rewritten prefix -> original prefix
19
+ const rewrittenToOriginal = new Map();
20
+ for (const [original, rewritten] of pathAliasRewrites) {
21
+ rewrittenToOriginal.set(rewritten, original);
22
+ }
23
+ // Collect all rewritten imports across all files
24
+ const allImports = [];
25
+ for (const file of files) {
26
+ const content = await this.fs.readFile(file);
27
+ const imports = this.extractRewrittenImports(content, rewrittenToOriginal);
28
+ allImports.push(...imports);
29
+ }
30
+ // Group by rewritten path and merge symbols
31
+ return this.groupImportsByPath(allImports);
32
+ }
33
+ /**
34
+ * Generates re-export files
35
+ */
36
+ async generate(options) {
37
+ const { outputDir, reexportFiles } = options;
38
+ const generatedFiles = [];
39
+ for (const reexport of reexportFiles) {
40
+ const filePath = path.join(outputDir, reexport.relativePath);
41
+ const content = this.generateReexportContent(reexport);
42
+ await this.fs.mkdir(path.dirname(filePath), { recursive: true });
43
+ await this.fs.writeFile(filePath, content);
44
+ generatedFiles.push(filePath);
45
+ }
46
+ return generatedFiles;
47
+ }
48
+ /**
49
+ * Extracts imports from source content that match rewritten prefixes
50
+ */
51
+ extractRewrittenImports(content, rewrittenToOriginal) {
52
+ const sourceFile = ts.createSourceFile("temp.ts", content, ts.ScriptTarget.Latest, true);
53
+ const imports = [];
54
+ ts.forEachChild(sourceFile, (node) => {
55
+ if (!ts.isImportDeclaration(node) || !node.importClause) {
56
+ return;
57
+ }
58
+ const moduleSpecifier = node.moduleSpecifier.text;
59
+ // Check if this import matches any rewritten prefix
60
+ for (const [rewrittenPrefix, originalPrefix] of rewrittenToOriginal) {
61
+ if (moduleSpecifier.startsWith(rewrittenPrefix)) {
62
+ const symbols = this.extractSymbolNames(node.importClause);
63
+ if (symbols.length > 0) {
64
+ // Calculate the original path
65
+ const suffix = moduleSpecifier.slice(rewrittenPrefix.length);
66
+ const originalPath = originalPrefix + suffix;
67
+ imports.push({
68
+ rewrittenPath: moduleSpecifier,
69
+ originalPath,
70
+ symbols,
71
+ isTypeOnly: node.importClause.isTypeOnly ?? false,
72
+ });
73
+ }
74
+ break;
75
+ }
76
+ }
77
+ });
78
+ return imports;
79
+ }
80
+ /**
81
+ * Extracts symbol names from import clause
82
+ */
83
+ extractSymbolNames(importClause) {
84
+ const names = [];
85
+ // Default import
86
+ if (importClause.name) {
87
+ names.push(importClause.name.text);
88
+ }
89
+ // Named imports
90
+ if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) {
91
+ for (const element of importClause.namedBindings.elements) {
92
+ // Use the original name if aliased, otherwise use the imported name
93
+ const originalName = element.propertyName?.text ?? element.name.text;
94
+ names.push(originalName);
95
+ }
96
+ }
97
+ return names;
98
+ }
99
+ /**
100
+ * Groups imports by rewritten path and merges symbols
101
+ */
102
+ groupImportsByPath(imports) {
103
+ const grouped = new Map();
104
+ for (const imp of imports) {
105
+ const existing = grouped.get(imp.rewrittenPath);
106
+ if (existing) {
107
+ for (const symbol of imp.symbols) {
108
+ existing.symbols.add(symbol);
109
+ }
110
+ if (!imp.isTypeOnly) {
111
+ existing.hasValueImport = true;
112
+ }
113
+ }
114
+ else {
115
+ grouped.set(imp.rewrittenPath, {
116
+ originalPath: imp.originalPath,
117
+ symbols: new Set(imp.symbols),
118
+ hasValueImport: !imp.isTypeOnly,
119
+ });
120
+ }
121
+ }
122
+ // Convert to ReexportFile array
123
+ const result = [];
124
+ for (const [rewrittenPath, data] of grouped) {
125
+ // Convert rewritten package path to relative file path
126
+ // e.g., "@libera/contracts/common/request" -> "common/request.ts"
127
+ const relativePath = this.rewrittenPathToRelativePath(rewrittenPath);
128
+ result.push({
129
+ relativePath,
130
+ originalModule: data.originalPath,
131
+ symbols: Array.from(data.symbols).sort(),
132
+ isTypeOnly: !data.hasValueImport,
133
+ });
134
+ }
135
+ return result.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
136
+ }
137
+ /**
138
+ * Converts a rewritten package path to a relative file path
139
+ * e.g., "@libera/contracts/common/request" with prefix "@libera/contracts"
140
+ * -> "common/request.ts"
141
+ */
142
+ rewrittenPathToRelativePath(rewrittenPath) {
143
+ // Find the subpath after the package name
144
+ // Assume format: @scope/package/subpath or package/subpath
145
+ const parts = rewrittenPath.split("/");
146
+ let subpathStart;
147
+ if (parts[0].startsWith("@")) {
148
+ // Scoped package: @scope/package/subpath
149
+ subpathStart = 2;
150
+ }
151
+ else {
152
+ // Regular package: package/subpath
153
+ subpathStart = 1;
154
+ }
155
+ const subpath = parts.slice(subpathStart).join("/");
156
+ // If no subpath, use index.ts
157
+ if (!subpath) {
158
+ return "index.ts";
159
+ }
160
+ return subpath + ".ts";
161
+ }
162
+ /**
163
+ * Generates the content for a re-export file
164
+ */
165
+ generateReexportContent(reexport) {
166
+ const exportKeyword = reexport.isTypeOnly ? "export type" : "export";
167
+ const symbols = reexport.symbols.join(", ");
168
+ return `${exportKeyword} { ${symbols} } from "${reexport.originalModule}";\n`;
169
+ }
170
+ }
171
+ //# sourceMappingURL=reexport-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reexport-generator.js","sourceRoot":"","sources":["../src/reexport-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { DomainEvent, Command, Query } from "./domain/types.js";
2
+ export interface RegistryGeneratorOptions {
3
+ readonly messageRegistryImport: string;
4
+ readonly useNamespace?: boolean;
5
+ }
6
+ export interface ContextMessages {
7
+ readonly contextName: string;
8
+ readonly events: readonly DomainEvent[];
9
+ readonly commands: readonly Command[];
10
+ readonly queries?: readonly Query[];
11
+ readonly importPath?: string;
12
+ }
13
+ export declare class RegistryGenerator {
14
+ private readonly options;
15
+ constructor(options?: Partial<RegistryGeneratorOptions>);
16
+ generate(contexts: readonly ContextMessages[]): string;
17
+ private generateEmptyRegistry;
18
+ private generateWithNamespace;
19
+ private getNamespaceInfos;
20
+ private generateNamespaceImports;
21
+ private generateNamespaceExports;
22
+ private generateNamespaceRegistrations;
23
+ private toNamespace;
24
+ private generateImports;
25
+ private generateRegistrations;
26
+ }
27
+ //# sourceMappingURL=registry-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-generator.d.ts","sourceRoot":"","sources":["../src/registry-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAIrE,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAChC;AAkBD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD,YAAY,OAAO,GAAE,OAAO,CAAC,wBAAwB,CAAM,EAE1D;IAED,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAyBrD;IAED,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,8BAA8B;IAUtC,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,qBAAqB;CAQhC"}
@@ -0,0 +1,104 @@
1
+ const DEFAULT_OPTIONS = {
2
+ messageRegistryImport: "@hexaijs/plugin-contracts-generator/runtime",
3
+ };
4
+ function hasMessages(ctx) {
5
+ return (ctx.events.length > 0 ||
6
+ ctx.commands.length > 0 ||
7
+ (ctx.queries?.length ?? 0) > 0);
8
+ }
9
+ function getAllMessages(ctx) {
10
+ return [...ctx.events, ...ctx.commands, ...(ctx.queries ?? [])];
11
+ }
12
+ export class RegistryGenerator {
13
+ options;
14
+ constructor(options = {}) {
15
+ this.options = { ...DEFAULT_OPTIONS, ...options };
16
+ }
17
+ generate(contexts) {
18
+ const allMessages = contexts.flatMap((ctx) => getAllMessages(ctx).map((message) => ({
19
+ message,
20
+ contextName: ctx.contextName,
21
+ })));
22
+ if (allMessages.length === 0) {
23
+ return this.generateEmptyRegistry();
24
+ }
25
+ if (this.options.useNamespace) {
26
+ return this.generateWithNamespace(contexts, allMessages);
27
+ }
28
+ const imports = this.generateImports(contexts);
29
+ const registrations = this.generateRegistrations(allMessages);
30
+ return [
31
+ imports,
32
+ "",
33
+ "export const messageRegistry = new MessageRegistry()",
34
+ registrations,
35
+ ].join("\n");
36
+ }
37
+ generateEmptyRegistry() {
38
+ return [
39
+ `import { MessageRegistry } from "${this.options.messageRegistryImport}";`,
40
+ "",
41
+ "export const messageRegistry = new MessageRegistry();",
42
+ "",
43
+ ].join("\n");
44
+ }
45
+ generateWithNamespace(contexts, allMessages) {
46
+ const imports = this.generateNamespaceImports(contexts);
47
+ const exports = this.generateNamespaceExports(contexts);
48
+ const registrations = this.generateNamespaceRegistrations(allMessages);
49
+ return [
50
+ imports,
51
+ "",
52
+ exports,
53
+ "",
54
+ "export const messageRegistry = new MessageRegistry()",
55
+ registrations,
56
+ ].join("\n");
57
+ }
58
+ getNamespaceInfos(contexts) {
59
+ return contexts.filter(hasMessages).map((ctx) => ({
60
+ importPath: ctx.importPath ?? `./${ctx.contextName}`,
61
+ namespace: this.toNamespace(ctx.contextName),
62
+ }));
63
+ }
64
+ generateNamespaceImports(contexts) {
65
+ return [
66
+ `import { MessageRegistry } from "${this.options.messageRegistryImport}";`,
67
+ ...this.getNamespaceInfos(contexts).map(({ importPath, namespace }) => `import * as ${namespace} from "${importPath}";`),
68
+ ].join("\n");
69
+ }
70
+ generateNamespaceExports(contexts) {
71
+ return this.getNamespaceInfos(contexts)
72
+ .map(({ importPath, namespace }) => `export * as ${namespace} from "${importPath}";`)
73
+ .join("\n");
74
+ }
75
+ generateNamespaceRegistrations(messages) {
76
+ const lines = messages.map(({ message, contextName }) => {
77
+ const namespace = this.toNamespace(contextName);
78
+ return ` .register(${namespace}.${message.name})`;
79
+ });
80
+ return lines.join("\n") + ";\n";
81
+ }
82
+ toNamespace(contextName) {
83
+ // kebab-case to camelCase
84
+ return contextName.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
85
+ }
86
+ generateImports(contexts) {
87
+ const lines = [
88
+ `import { MessageRegistry } from "${this.options.messageRegistryImport}";`,
89
+ ];
90
+ for (const ctx of contexts) {
91
+ const messageNames = getAllMessages(ctx).map((m) => m.name);
92
+ if (messageNames.length > 0) {
93
+ const importPath = ctx.importPath ?? `./${ctx.contextName}`;
94
+ lines.push(`import { ${messageNames.join(", ")} } from "${importPath}";`);
95
+ }
96
+ }
97
+ return lines.join("\n");
98
+ }
99
+ generateRegistrations(messages) {
100
+ const lines = messages.map(({ message }) => ` .register(${message.name})`);
101
+ return lines.join("\n") + ";\n";
102
+ }
103
+ }
104
+ //# sourceMappingURL=registry-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-generator.js","sourceRoot":"","sources":["../src/registry-generator.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,2 @@
1
- type Version = string | number | undefined;
2
- interface MessageHeaders {
3
- id: string;
4
- type: string;
5
- schemaVersion?: Version;
6
- createdAt: Date;
7
- [key: string]: unknown;
8
- }
9
- interface MessageClass<T = any> {
10
- getSchemaVersion(): Version;
11
- getType(): string;
12
- from(rawPayload: Record<string, unknown>, header?: MessageHeaders): T;
13
- new (payload: any, headers?: any): T;
14
- }
15
- declare class MessageRegistry {
16
- private readonly registry;
17
- register(messageClass: MessageClass): this;
18
- dehydrate<T>(header: MessageHeaders, body: Record<string, unknown>): T;
19
- has(type: string, version?: Version): boolean;
20
- size(): number;
21
- }
22
-
23
- export { type MessageClass, type MessageHeaders, MessageRegistry };
1
+ export { MessageRegistry, type MessageClass, type MessageHeaders, } from "./message-registry.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,cAAc,GACtB,MAAM,uBAAuB,CAAC"}
@@ -1,39 +1,2 @@
1
- // src/runtime/message-registry.ts
2
- var MessageRegistry = class {
3
- registry = /* @__PURE__ */ new Map();
4
- register(messageClass) {
5
- const type = messageClass.getType();
6
- const version = messageClass.getSchemaVersion();
7
- const key = makeKey(type, version);
8
- if (this.registry.has(key)) {
9
- throw new Error(`${format(type, version)} is already registered.`);
10
- }
11
- this.registry.set(key, messageClass);
12
- return this;
13
- }
14
- dehydrate(header, body) {
15
- const { type, schemaVersion } = header;
16
- const key = makeKey(type, schemaVersion);
17
- const messageClass = this.registry.get(key);
18
- if (!messageClass) {
19
- throw new Error(`${format(type, schemaVersion)} is not registered.`);
20
- }
21
- return messageClass.from(body, header);
22
- }
23
- has(type, version) {
24
- return this.registry.has(makeKey(type, version));
25
- }
26
- size() {
27
- return this.registry.size;
28
- }
29
- };
30
- function makeKey(type, version) {
31
- return version !== void 0 ? `${type}:${version}` : type;
32
- }
33
- function format(type, version) {
34
- return version !== void 0 ? `'${type}' (v${version})` : `'${type}'`;
35
- }
36
-
37
- export { MessageRegistry };
38
- //# sourceMappingURL=index.js.map
1
+ export { MessageRegistry, } from "./message-registry.js";
39
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/message-registry.ts"],"names":[],"mappings":";AAmBO,IAAM,kBAAN,MAAsB;AAAA,EACR,QAAA,uBAAe,GAAA,EAA0B;AAAA,EAE1D,SAAS,YAAA,EAAkC;AACvC,IAAA,MAAM,IAAA,GAAO,aAAa,OAAA,EAAQ;AAClC,IAAA,MAAM,OAAA,GAAU,aAAa,gBAAA,EAAiB;AAC9C,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,IAAA,EAAM,OAAO,CAAC,CAAA,uBAAA,CAAyB,CAAA;AAAA,IACrE;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,YAAY,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,SAAA,CAAa,QAAwB,IAAA,EAAkC;AACnE,IAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAc,GAAI,MAAA;AAChC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,aAAa,CAAA;AACvC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAE1C,IAAA,IAAI,CAAC,YAAA,EAAc;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,OAAO,IAAA,EAAM,aAAa,CAAC,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,EACzC;AAAA,EAEA,GAAA,CAAI,MAAc,OAAA,EAA4B;AAC1C,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACnD;AAAA,EAEA,IAAA,GAAe;AACX,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACzB;AACJ;AAEA,SAAS,OAAA,CAAQ,MAAc,OAAA,EAA2B;AACtD,EAAA,OAAO,YAAY,MAAA,GAAY,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,IAAA;AAC1D;AAEA,SAAS,MAAA,CAAO,MAAc,OAAA,EAA2B;AACrD,EAAA,OAAO,OAAA,KAAY,SAAY,CAAA,CAAA,EAAI,IAAI,OAAO,OAAO,CAAA,CAAA,CAAA,GAAM,IAAI,IAAI,CAAA,CAAA,CAAA;AACvE","file":"index.js","sourcesContent":["type Version = string | number | undefined;\n\nexport interface MessageHeaders {\n id: string;\n type: string;\n schemaVersion?: Version;\n createdAt: Date;\n [key: string]: unknown;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface MessageClass<T = any> {\n getSchemaVersion(): Version;\n getType(): string;\n from(rawPayload: Record<string, unknown>, header?: MessageHeaders): T;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (payload: any, headers?: any): T;\n}\n\nexport class MessageRegistry {\n private readonly registry = new Map<string, MessageClass>();\n\n register(messageClass: MessageClass): this {\n const type = messageClass.getType();\n const version = messageClass.getSchemaVersion();\n const key = makeKey(type, version);\n\n if (this.registry.has(key)) {\n throw new Error(`${format(type, version)} is already registered.`);\n }\n\n this.registry.set(key, messageClass);\n return this;\n }\n\n dehydrate<T>(header: MessageHeaders, body: Record<string, unknown>): T {\n const { type, schemaVersion } = header;\n const key = makeKey(type, schemaVersion);\n const messageClass = this.registry.get(key);\n\n if (!messageClass) {\n throw new Error(`${format(type, schemaVersion)} is not registered.`);\n }\n\n return messageClass.from(body, header) as T;\n }\n\n has(type: string, version?: Version): boolean {\n return this.registry.has(makeKey(type, version));\n }\n\n size(): number {\n return this.registry.size;\n }\n}\n\nfunction makeKey(type: string, version?: Version): string {\n return version !== undefined ? `${type}:${version}` : type;\n}\n\nfunction format(type: string, version?: Version): string {\n return version !== undefined ? `'${type}' (v${version})` : `'${type}'`;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,GAGlB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,23 @@
1
+ type Version = string | number | undefined;
2
+ export interface MessageHeaders {
3
+ id: string;
4
+ type: string;
5
+ schemaVersion?: Version;
6
+ createdAt: Date;
7
+ [key: string]: unknown;
8
+ }
9
+ export interface MessageClass<T = any> {
10
+ getSchemaVersion(): Version;
11
+ getType(): string;
12
+ from(rawPayload: Record<string, unknown>, header?: MessageHeaders): T;
13
+ new (payload: any, options?: any): T;
14
+ }
15
+ export declare class MessageRegistry {
16
+ private readonly registry;
17
+ register(messageClass: MessageClass): this;
18
+ dehydrate<T>(header: MessageHeaders, body: Record<string, unknown>): T;
19
+ has(type: string, version?: Version): boolean;
20
+ size(): number;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=message-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/message-registry.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAGD,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACjC,gBAAgB,IAAI,OAAO,CAAC;IAC5B,OAAO,IAAI,MAAM,CAAC;IAClB,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC;IAEtE,KAAK,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;CACxC;AAED,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAWzC;IAED,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAUrE;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAE5C;IAED,IAAI,IAAI,MAAM,CAEb;CACJ"}
@@ -0,0 +1,35 @@
1
+ export class MessageRegistry {
2
+ registry = new Map();
3
+ register(messageClass) {
4
+ const type = messageClass.getType();
5
+ const version = messageClass.getSchemaVersion();
6
+ const key = makeKey(type, version);
7
+ if (this.registry.has(key)) {
8
+ throw new Error(`${format(type, version)} is already registered.`);
9
+ }
10
+ this.registry.set(key, messageClass);
11
+ return this;
12
+ }
13
+ dehydrate(header, body) {
14
+ const { type, schemaVersion } = header;
15
+ const key = makeKey(type, schemaVersion);
16
+ const messageClass = this.registry.get(key);
17
+ if (!messageClass) {
18
+ throw new Error(`${format(type, schemaVersion)} is not registered.`);
19
+ }
20
+ return messageClass.from(body, header);
21
+ }
22
+ has(type, version) {
23
+ return this.registry.has(makeKey(type, version));
24
+ }
25
+ size() {
26
+ return this.registry.size;
27
+ }
28
+ }
29
+ function makeKey(type, version) {
30
+ return version !== undefined ? `${type}:${version}` : type;
31
+ }
32
+ function format(type, version) {
33
+ return version !== undefined ? `'${type}' (v${version})` : `'${type}'`;
34
+ }
35
+ //# sourceMappingURL=message-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-registry.js","sourceRoot":"","sources":["../../src/runtime/message-registry.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,eAAe;IACP,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE5D,QAAQ,CAAC,YAA0B;QAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,SAAS,CAAI,MAAsB,EAAE,IAA6B;QAC9D,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAM,CAAC;IAChD,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,OAAiB;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC9B,CAAC;CACJ;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,OAAiB;IAC5C,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,OAAiB;IAC3C,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { FileSystem } from "./file-system.js";
2
+ import type { DecoratorNames, MessageType } from "./domain/index.js";
3
+ export interface ScannerOptions {
4
+ exclude?: string[];
5
+ fileSystem?: FileSystem;
6
+ decoratorNames?: DecoratorNames;
7
+ /**
8
+ * Filter which message types to scan for.
9
+ * Defaults to all types: ['event', 'command', 'query']
10
+ */
11
+ messageTypes?: MessageType[];
12
+ }
13
+ export declare class Scanner {
14
+ private readonly exclude;
15
+ private readonly fs;
16
+ private readonly decoratorPatterns;
17
+ constructor(options?: ScannerOptions);
18
+ scan(sourceDir: string): Promise<string[]>;
19
+ private containsPublicDecorator;
20
+ }
21
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWrE,MAAM,WAAW,cAAc;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;CAChC;AAED,qBAAa,OAAO;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAW;IAE7C,YAAY,OAAO,GAAE,cAAmB,EAWvC;IAEK,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoB/C;IAED,OAAO,CAAC,uBAAuB;CAGlC"}
@@ -0,0 +1,49 @@
1
+ import { glob } from "glob";
2
+ import { FileReadError } from "./errors.js";
3
+ import { nodeFileSystem } from "./file-system.js";
4
+ import { mergeDecoratorNames } from "./domain/index.js";
5
+ const DEFAULT_EXCLUDE_PATTERNS = [
6
+ "**/node_modules/**",
7
+ "**/dist/**",
8
+ "**/*.d.ts",
9
+ "**/*.test.ts",
10
+ "**/*.spec.ts",
11
+ ];
12
+ export class Scanner {
13
+ exclude;
14
+ fs;
15
+ decoratorPatterns;
16
+ constructor(options = {}) {
17
+ this.exclude = options.exclude ?? DEFAULT_EXCLUDE_PATTERNS;
18
+ this.fs = options.fileSystem ?? nodeFileSystem;
19
+ const names = mergeDecoratorNames(options.decoratorNames);
20
+ const messageTypes = options.messageTypes ?? ['event', 'command', 'query'];
21
+ this.decoratorPatterns = messageTypes.map((type) => {
22
+ const decoratorName = names[type];
23
+ return `@${decoratorName}(`;
24
+ });
25
+ }
26
+ async scan(sourceDir) {
27
+ const files = await glob(`${sourceDir}/**/*.ts`, {
28
+ ignore: this.exclude,
29
+ });
30
+ const result = [];
31
+ for (const file of files) {
32
+ let content;
33
+ try {
34
+ content = await this.fs.readFile(file);
35
+ }
36
+ catch (error) {
37
+ throw new FileReadError(file, { cause: error });
38
+ }
39
+ if (this.containsPublicDecorator(content)) {
40
+ result.push(file);
41
+ }
42
+ }
43
+ return result;
44
+ }
45
+ containsPublicDecorator(content) {
46
+ return this.decoratorPatterns.some(pattern => content.includes(pattern));
47
+ }
48
+ }
49
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAc,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,wBAAwB,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,cAAc;CACjB,CAAC;AAaF,MAAM,OAAO,OAAO;IACC,OAAO,CAAW;IAClB,EAAE,CAAa;IACf,iBAAiB,CAAW;IAE7C,YAAY,OAAO,GAAmB,EAAE;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,wBAAwB,CAAC;QAC3D,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;QAE/C,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE3E,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,IAAI,aAAa,GAAG,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,SAAS,UAAU,EAAE;YAC7C,MAAM,EAAE,IAAI,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACD,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,uBAAuB,CAAC,OAAe;QAC3C,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,CAAC;CACJ"}
@@ -0,0 +1,23 @@
1
+ import type { SourceFile, TypeDefinition, DomainEvent, Command, PrimitiveType, Field, ClassDefinition, ClassImport } from "./domain/index.js";
2
+ import type { FileSystem } from "./file-system.js";
3
+ export declare function createSourceFile(path?: string, absolutePath?: string): SourceFile;
4
+ export declare function createTypeDefinition(name: string, sourceFileOrBody?: SourceFile | TypeDefinition["body"], bodyArg?: TypeDefinition["body"]): TypeDefinition;
5
+ export declare function createEventWithReferenceField(eventName: string, fieldName: string, referencedTypeName: string): DomainEvent;
6
+ export declare function createCommandWithReferenceField(commandName: string, fieldName: string, referencedTypeName: string): Command;
7
+ export declare function createEventWithPrimitiveField(eventName: string, fieldName: string, primitiveName: PrimitiveType["name"]): DomainEvent;
8
+ export declare function createField(name: string, type: Field["type"], optional?: boolean, readonly?: boolean): Field;
9
+ export interface CreateClassDefinitionOptions {
10
+ sourceFile?: SourceFile;
11
+ baseClass?: string;
12
+ imports?: ClassImport[];
13
+ dependencies?: string[];
14
+ exported?: boolean;
15
+ sourceText?: string;
16
+ }
17
+ export declare function createClassDefinition(name: string, options?: CreateClassDefinitionOptions): ClassDefinition;
18
+ export interface InMemoryFileSystem extends FileSystem {
19
+ files: Map<string, string>;
20
+ directories: Set<string>;
21
+ }
22
+ export declare function createInMemoryFileSystem(): InMemoryFileSystem;
23
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,UAAU,EACV,cAAc,EACd,WAAW,EACX,OAAO,EACP,aAAa,EAEb,KAAK,EACL,eAAe,EACf,WAAW,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,kBAAkB,CAAC;AAE9D,wBAAgB,gBAAgB,CAC5B,IAAI,GAAE,MAAkB,EACxB,YAAY,CAAC,EAAE,MAAM,GACtB,UAAU,CAKZ;AAeD,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,EACtD,OAAO,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,GACjC,cAAc,CA8BhB;AAED,wBAAgB,6BAA6B,CACzC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GAC3B,WAAW,CAmBb;AAED,wBAAgB,+BAA+B,CAC3C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GAC3B,OAAO,CAmBT;AAED,wBAAgB,6BAA6B,CACzC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GACrC,WAAW,CAmBb;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,QAAQ,GAAE,OAAe,EACzB,QAAQ,GAAE,OAAe,GAC1B,KAAK,CAOP;AAED,MAAM,WAAW,4BAA4B;IACzC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,4BAAiC,GAC3C,eAAe,CAejB;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IAClD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAqE7D"}