@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.
- package/README.md +33 -25
- package/dist/ast-utils.d.ts +6 -0
- package/dist/ast-utils.d.ts.map +1 -0
- package/dist/ast-utils.js +73 -0
- package/dist/ast-utils.js.map +1 -0
- package/dist/class-analyzer.d.ts +16 -0
- package/dist/class-analyzer.d.ts.map +1 -0
- package/dist/class-analyzer.js +114 -0
- package/dist/class-analyzer.js.map +1 -0
- package/dist/cli.d.ts +32 -1
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +226 -2480
- package/dist/cli.js.map +1 -1
- package/dist/config-loader.d.ts +24 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +126 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/context-config.d.ts +44 -0
- package/dist/context-config.d.ts.map +1 -0
- package/dist/context-config.js +140 -0
- package/dist/context-config.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +2 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/types.d.ts +182 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +49 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/errors.d.ts +72 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +112 -0
- package/dist/errors.js.map +1 -0
- package/dist/file-copier.d.ts +84 -0
- package/dist/file-copier.d.ts.map +1 -0
- package/dist/file-copier.js +721 -0
- package/dist/file-copier.js.map +1 -0
- package/dist/file-graph-resolver.d.ts +42 -0
- package/dist/file-graph-resolver.d.ts.map +1 -0
- package/dist/file-graph-resolver.js +138 -0
- package/dist/file-graph-resolver.js.map +1 -0
- package/dist/file-system.d.ts +26 -0
- package/dist/file-system.d.ts.map +1 -0
- package/dist/file-system.js +30 -0
- package/dist/file-system.js.map +1 -0
- package/dist/hexai-plugin.d.ts +16 -0
- package/dist/hexai-plugin.d.ts.map +1 -0
- package/dist/hexai-plugin.js +56 -0
- package/dist/hexai-plugin.js.map +1 -0
- package/dist/import-analyzer.d.ts +6 -0
- package/dist/import-analyzer.d.ts.map +1 -0
- package/dist/import-analyzer.js +39 -0
- package/dist/import-analyzer.js.map +1 -0
- package/dist/index.d.ts +39 -531
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -2739
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +21 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +43 -0
- package/dist/logger.js.map +1 -0
- package/dist/parser.d.ts +32 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +202 -0
- package/dist/parser.js.map +1 -0
- package/dist/pipeline.d.ts +57 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +148 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/reexport-generator.d.ts +81 -0
- package/dist/reexport-generator.d.ts.map +1 -0
- package/dist/reexport-generator.js +171 -0
- package/dist/reexport-generator.js.map +1 -0
- package/dist/registry-generator.d.ts +27 -0
- package/dist/registry-generator.d.ts.map +1 -0
- package/dist/registry-generator.js +104 -0
- package/dist/registry-generator.js.map +1 -0
- package/dist/runtime/index.d.ts +2 -23
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +1 -38
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/message-registry.d.ts +23 -0
- package/dist/runtime/message-registry.d.ts.map +1 -0
- package/dist/runtime/message-registry.js +35 -0
- package/dist/runtime/message-registry.js.map +1 -0
- package/dist/scanner.d.ts +21 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +49 -0
- package/dist/scanner.js.map +1 -0
- package/dist/test-utils.d.ts +23 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +188 -0
- package/dist/test-utils.js.map +1 -0
- package/package.json +69 -64
- package/dist/cli-CPg-O4OY.d.ts +0 -214
- package/dist/decorators/index.d.ts +0 -144
- package/dist/decorators/index.js +0 -28
- 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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"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -1,23 +1,2 @@
|
|
|
1
|
-
type
|
|
2
|
-
|
|
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"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -1,39 +1,2 @@
|
|
|
1
|
-
|
|
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/
|
|
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"}
|
package/dist/scanner.js
ADDED
|
@@ -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"}
|