@auto-engineer/server-generator-nestjs 0.19.1 → 0.21.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.
- package/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-format.log +4 -0
- package/.turbo/turbo-lint.log +4 -0
- package/.turbo/turbo-test.log +13 -0
- package/.turbo/turbo-type-check.log +4 -0
- package/CHANGELOG.md +13 -2
- package/dist/src/codegen/entity-consolidation.d.ts +19 -0
- package/dist/src/codegen/entity-consolidation.d.ts.map +1 -0
- package/dist/src/codegen/entity-consolidation.js +134 -0
- package/dist/src/codegen/entity-consolidation.js.map +1 -0
- package/dist/src/codegen/extract/commands.d.ts +25 -0
- package/dist/src/codegen/extract/commands.d.ts.map +1 -0
- package/dist/src/codegen/extract/commands.js +67 -0
- package/dist/src/codegen/extract/commands.js.map +1 -0
- package/dist/src/codegen/extract/data-sink.d.ts +6 -0
- package/dist/src/codegen/extract/data-sink.d.ts.map +1 -0
- package/dist/src/codegen/extract/data-sink.js +90 -0
- package/dist/src/codegen/extract/data-sink.js.map +1 -0
- package/dist/src/codegen/extract/events.d.ts +10 -0
- package/dist/src/codegen/extract/events.d.ts.map +1 -0
- package/dist/src/codegen/extract/events.js +42 -0
- package/dist/src/codegen/extract/events.js.map +1 -0
- package/dist/src/codegen/extract/fields.d.ts +3 -0
- package/dist/src/codegen/extract/fields.d.ts.map +1 -0
- package/dist/src/codegen/extract/fields.js +9 -0
- package/dist/src/codegen/extract/fields.js.map +1 -0
- package/dist/src/codegen/extract/graphql.d.ts +14 -0
- package/dist/src/codegen/extract/graphql.d.ts.map +1 -0
- package/dist/src/codegen/extract/graphql.js +81 -0
- package/dist/src/codegen/extract/graphql.js.map +1 -0
- package/dist/src/codegen/extract/gwt.d.ts +6 -0
- package/dist/src/codegen/extract/gwt.d.ts.map +1 -0
- package/dist/src/codegen/extract/gwt.js +79 -0
- package/dist/src/codegen/extract/gwt.js.map +1 -0
- package/dist/src/codegen/extract/imports.d.ts +29 -0
- package/dist/src/codegen/extract/imports.d.ts.map +1 -0
- package/dist/src/codegen/extract/imports.js +55 -0
- package/dist/src/codegen/extract/imports.js.map +1 -0
- package/dist/src/codegen/extract/index.d.ts +10 -0
- package/dist/src/codegen/extract/index.d.ts.map +1 -0
- package/dist/src/codegen/extract/index.js +10 -0
- package/dist/src/codegen/extract/index.js.map +1 -0
- package/dist/src/codegen/extract/messages.d.ts +16 -0
- package/dist/src/codegen/extract/messages.d.ts.map +1 -0
- package/dist/src/codegen/extract/messages.js +192 -0
- package/dist/src/codegen/extract/messages.js.map +1 -0
- package/dist/src/codegen/extract/projection.d.ts +5 -0
- package/dist/src/codegen/extract/projection.d.ts.map +1 -0
- package/dist/src/codegen/extract/projection.js +44 -0
- package/dist/src/codegen/extract/projection.js.map +1 -0
- package/dist/src/codegen/extract/query.d.ts +13 -0
- package/dist/src/codegen/extract/query.d.ts.map +1 -0
- package/dist/src/codegen/extract/query.js +18 -0
- package/dist/src/codegen/extract/query.js.map +1 -0
- package/dist/src/codegen/extract/states.d.ts +5 -0
- package/dist/src/codegen/extract/states.d.ts.map +1 -0
- package/dist/src/codegen/extract/states.js +48 -0
- package/dist/src/codegen/extract/states.js.map +1 -0
- package/dist/src/codegen/extract/type-helpers.d.ts +13 -0
- package/dist/src/codegen/extract/type-helpers.d.ts.map +1 -0
- package/dist/src/codegen/extract/type-helpers.js +98 -0
- package/dist/src/codegen/extract/type-helpers.js.map +1 -0
- package/dist/src/codegen/scaffoldFromSchema.d.ts +9 -0
- package/dist/src/codegen/scaffoldFromSchema.d.ts.map +1 -0
- package/dist/src/codegen/scaffoldFromSchema.js +391 -0
- package/dist/src/codegen/scaffoldFromSchema.js.map +1 -0
- package/dist/src/codegen/templates/command/command.ts.ejs +16 -0
- package/dist/src/codegen/templates/command/handler.specs.ts.ejs +50 -0
- package/dist/src/codegen/templates/command/handler.ts.ejs +30 -0
- package/dist/src/codegen/templates/command/input.ts.ejs +23 -0
- package/dist/src/codegen/templates/command/resolver.ts.ejs +56 -0
- package/dist/src/codegen/templates/entity/entity.ts.ejs +35 -0
- package/dist/src/codegen/templates/entity/index.ts.ejs +6 -0
- package/dist/src/codegen/templates/module/app-module.ts.ejs +65 -0
- package/dist/src/codegen/templates/module/domain-module.ts.ejs +46 -0
- package/dist/src/codegen/templates/query/handler.ts.ejs +25 -0
- package/dist/src/codegen/templates/query/query.ts.ejs +1 -0
- package/dist/src/codegen/templates/query/resolver.ts.ejs +20 -0
- package/dist/src/codegen/templates/query/type.ts.ejs +24 -0
- package/dist/src/codegen/types.d.ts +37 -0
- package/dist/src/codegen/types.d.ts.map +1 -0
- package/dist/src/codegen/types.js +2 -0
- package/dist/src/codegen/types.js.map +1 -0
- package/dist/src/codegen/utils/path.d.ts +4 -0
- package/dist/src/codegen/utils/path.d.ts.map +1 -0
- package/dist/src/codegen/utils/path.js +18 -0
- package/dist/src/codegen/utils/path.js.map +1 -0
- package/dist/src/commands/generate-server.d.ts +28 -0
- package/dist/src/commands/generate-server.d.ts.map +1 -0
- package/dist/src/commands/generate-server.js +422 -0
- package/dist/src/commands/generate-server.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/shared/graphql-types.ts +19 -0
- package/dist/src/shared/main.ts +27 -0
- package/dist/src/shared/mikro-orm.config.ts +18 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function isInlineObject(ts: string): boolean;
|
|
2
|
+
export declare function isInlineObjectArray(ts: string): boolean;
|
|
3
|
+
export declare function baseTs(ts: string): string;
|
|
4
|
+
export declare function createIsEnumType(toTsFieldType: (ts: string) => string): (tsType: string) => boolean;
|
|
5
|
+
export declare function createFieldUsesDate(graphqlType: (ts: string) => string): (ts: string) => boolean;
|
|
6
|
+
export declare function createFieldUsesJSON(graphqlType: (ts: string) => string): (ts: string) => boolean;
|
|
7
|
+
export declare function createFieldUsesFloat(graphqlType: (ts: string) => string): (ts: string) => boolean;
|
|
8
|
+
export declare function extractEnumName(tsType: string, toTsFieldType: (ts: string) => string): string;
|
|
9
|
+
export declare function createCollectEnumNames(isEnumType: (tsType: string) => boolean, toTsFieldType: (ts: string) => string): (fields: Array<{
|
|
10
|
+
type?: string;
|
|
11
|
+
tsType?: string;
|
|
12
|
+
}>) => string[];
|
|
13
|
+
//# sourceMappingURL=type-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-helpers.d.ts","sourceRoot":"","sources":["../../../../src/codegen/extract/type-helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,IAC5D,QAAQ,MAAM,KAAG,OAAO,CAsBjC;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,IAC7D,IAAI,MAAM,KAAG,OAAO,CAO7B;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,IAC7D,IAAI,MAAM,KAAG,OAAO,CAO7B;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,IAC9D,IAAI,MAAM,KAAG,OAAO,CAsB7B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAK7F;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,IAC3G,QAAQ,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,KAAG,MAAM,EAAE,CAUrE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export function isInlineObject(ts) {
|
|
2
|
+
return /^\{[\s\S]*\}$/.test((ts ?? '').trim());
|
|
3
|
+
}
|
|
4
|
+
export function isInlineObjectArray(ts) {
|
|
5
|
+
const t = (ts ?? '').trim();
|
|
6
|
+
return /^Array<\{[\s\S]*\}>$/.test(t) || /^\{[\s\S]*\}\[\]$/.test(t);
|
|
7
|
+
}
|
|
8
|
+
export function baseTs(ts) {
|
|
9
|
+
return (ts ?? 'string').replace(/\s*\|\s*null\b/g, '').trim();
|
|
10
|
+
}
|
|
11
|
+
export function createIsEnumType(toTsFieldType) {
|
|
12
|
+
return (tsType) => {
|
|
13
|
+
const converted = toTsFieldType(tsType);
|
|
14
|
+
const base = converted
|
|
15
|
+
.replace(/\s*\|\s*null\b/g, '')
|
|
16
|
+
.replace(/\[\]$/, '')
|
|
17
|
+
.trim();
|
|
18
|
+
return (/^[A-Z][a-zA-Z0-9]*$/.test(base) &&
|
|
19
|
+
![
|
|
20
|
+
'String',
|
|
21
|
+
'Number',
|
|
22
|
+
'Boolean',
|
|
23
|
+
'Date',
|
|
24
|
+
'ID',
|
|
25
|
+
'Int',
|
|
26
|
+
'Float',
|
|
27
|
+
'GraphQLISODateTime',
|
|
28
|
+
'GraphQLJSON',
|
|
29
|
+
'JSON',
|
|
30
|
+
].includes(base));
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function createFieldUsesDate(graphqlType) {
|
|
34
|
+
return (ts) => {
|
|
35
|
+
const b = baseTs(ts);
|
|
36
|
+
const gqlType = graphqlType(b);
|
|
37
|
+
if (gqlType.includes('GraphQLISODateTime'))
|
|
38
|
+
return true;
|
|
39
|
+
if (isInlineObject(b) || isInlineObjectArray(b))
|
|
40
|
+
return /:\s*Date\b/.test(b);
|
|
41
|
+
return false;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function createFieldUsesJSON(graphqlType) {
|
|
45
|
+
return (ts) => {
|
|
46
|
+
const b = baseTs(ts);
|
|
47
|
+
const gqlType = graphqlType(b);
|
|
48
|
+
if (gqlType.includes('GraphQLJSON') || gqlType.includes('JSON'))
|
|
49
|
+
return true;
|
|
50
|
+
if (isInlineObject(b) || isInlineObjectArray(b))
|
|
51
|
+
return /:\s*(unknown|any|object)\b/.test(b);
|
|
52
|
+
return false;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function createFieldUsesFloat(graphqlType) {
|
|
56
|
+
return (ts) => {
|
|
57
|
+
const b = baseTs(ts);
|
|
58
|
+
const gqlType = graphqlType(b);
|
|
59
|
+
if (gqlType.includes('Float'))
|
|
60
|
+
return true;
|
|
61
|
+
if (isInlineObject(b) || isInlineObjectArray(b)) {
|
|
62
|
+
const inner = b.trim().startsWith('Array<')
|
|
63
|
+
? b
|
|
64
|
+
.trim()
|
|
65
|
+
.replace(/^Array<\{/, '{')
|
|
66
|
+
.replace(/}>$/, '}')
|
|
67
|
+
: b.trim().replace(/\[\]$/, '');
|
|
68
|
+
const match = inner.match(/^\{([\s\S]*)\}$/);
|
|
69
|
+
const body = match ? match[1] : '';
|
|
70
|
+
const rawFields = body.split(/[,;]\s*/).filter(Boolean);
|
|
71
|
+
return rawFields.some((f) => {
|
|
72
|
+
const parts = f.split(':');
|
|
73
|
+
const type = parts.slice(1).join(':').trim();
|
|
74
|
+
return type.length > 0 && graphqlType(type).includes('Float');
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function extractEnumName(tsType, toTsFieldType) {
|
|
81
|
+
return toTsFieldType(tsType)
|
|
82
|
+
.replace(/\s*\|\s*null\b/g, '')
|
|
83
|
+
.replace(/\[\]$/, '')
|
|
84
|
+
.trim();
|
|
85
|
+
}
|
|
86
|
+
export function createCollectEnumNames(isEnumType, toTsFieldType) {
|
|
87
|
+
return (fields) => {
|
|
88
|
+
const enumNames = new Set();
|
|
89
|
+
for (const field of fields) {
|
|
90
|
+
const fieldType = field.type ?? field.tsType;
|
|
91
|
+
if (fieldType !== undefined && fieldType !== null && fieldType.length > 0 && isEnumType(fieldType)) {
|
|
92
|
+
enumNames.add(extractEnumName(fieldType, toTsFieldType));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return Array.from(enumNames).sort();
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=type-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-helpers.js","sourceRoot":"","sources":["../../../../src/codegen/extract/type-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Narrative, Model } from '@auto-engineer/narrative';
|
|
2
|
+
export interface FilePlan {
|
|
3
|
+
outputPath: string;
|
|
4
|
+
contents: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function generateScaffoldFilePlans(flows: Narrative[], messages: Model['messages'], integrations?: Model['integrations'], baseDir?: string): Promise<FilePlan[]>;
|
|
7
|
+
export declare function writeScaffoldFilePlans(plans: FilePlan[]): Promise<void>;
|
|
8
|
+
export declare function scaffoldFromSchema(flows: Narrative[], messages: Model['messages'], baseDir?: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=scaffoldFromSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffoldFromSchema.d.ts","sourceRoot":"","sources":["../../../src/codegen/scaffoldFromSchema.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAS,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAiLnE,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0TD,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAC3B,YAAY,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,EACpC,OAAO,SAAe,GACrB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqCrB;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAC3B,OAAO,SAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
import ejs from 'ejs';
|
|
6
|
+
import { ensureDirExists, ensureDirPath, toKebabCase } from './utils/path.js';
|
|
7
|
+
import { camelCase, pascalCase } from 'change-case';
|
|
8
|
+
import prettier from 'prettier';
|
|
9
|
+
import createDebug from 'debug';
|
|
10
|
+
const debug = createDebug('auto:server-generator-nestjs:scaffold');
|
|
11
|
+
import { buildCommandGwtMapping, buildQueryGwtMapping, extractMessagesFromSpecs, extractProjectionName, groupEventImports, getAllEventTypes, getLocalEvents, createEventUnionType, isInlineObject as isInlineObjectHelper, isInlineObjectArray as isInlineObjectArrayHelper, baseTs, createIsEnumType, createFieldUsesDate, createFieldUsesJSON, createFieldUsesFloat, createCollectEnumNames, } from './extract/index.js';
|
|
12
|
+
import { parseGraphQlRequest } from './extract/graphql.js';
|
|
13
|
+
import { getStreamFromSink } from './extract/data-sink.js';
|
|
14
|
+
import { consolidateEntityFields } from './entity-consolidation.js';
|
|
15
|
+
const defaultFilesByType = {
|
|
16
|
+
command: ['command.ts.ejs', 'input.ts.ejs', 'handler.ts.ejs', 'resolver.ts.ejs', 'handler.specs.ts.ejs'],
|
|
17
|
+
query: ['query.ts.ejs', 'type.ts.ejs', 'handler.ts.ejs', 'resolver.ts.ejs'],
|
|
18
|
+
react: [],
|
|
19
|
+
};
|
|
20
|
+
function isStringLiteralUnion(s) {
|
|
21
|
+
return /^"[^"]+"(\s*\|\s*"[^"]+")+$/.test(s.trim()) || /^'[^']+'(\s*\|\s*'[^']+)+$/.test(s.trim());
|
|
22
|
+
}
|
|
23
|
+
function extractStringLiteralValues(unionString) {
|
|
24
|
+
const doubleQuoted = unionString.match(/"([^"]+)"/g);
|
|
25
|
+
const singleQuoted = unionString.match(/'([^']+)'/g);
|
|
26
|
+
const matches = doubleQuoted ?? singleQuoted;
|
|
27
|
+
if (matches === null)
|
|
28
|
+
return [];
|
|
29
|
+
return matches.map((m) => m.slice(1, -1));
|
|
30
|
+
}
|
|
31
|
+
function normalizeUnionString(values) {
|
|
32
|
+
return values
|
|
33
|
+
.slice()
|
|
34
|
+
.sort()
|
|
35
|
+
.map((v) => `'${v}'`)
|
|
36
|
+
.join(' | ');
|
|
37
|
+
}
|
|
38
|
+
function generateEnumName(fieldName, existingNames) {
|
|
39
|
+
const baseName = pascalCase(fieldName);
|
|
40
|
+
if (!existingNames.has(baseName)) {
|
|
41
|
+
return baseName;
|
|
42
|
+
}
|
|
43
|
+
let counter = 2;
|
|
44
|
+
while (existingNames.has(`${baseName}${counter}`)) {
|
|
45
|
+
counter++;
|
|
46
|
+
}
|
|
47
|
+
return `${baseName}${counter}`;
|
|
48
|
+
}
|
|
49
|
+
function processFieldForEnum(field, messageName, unionToEnumName, existingEnumNames) {
|
|
50
|
+
const tsType = field.type;
|
|
51
|
+
if (tsType === null || tsType === undefined)
|
|
52
|
+
return null;
|
|
53
|
+
const cleanType = tsType.replace(/\s*\|\s*null\b/g, '').trim();
|
|
54
|
+
const isUnion = isStringLiteralUnion(cleanType);
|
|
55
|
+
if (!isUnion)
|
|
56
|
+
return null;
|
|
57
|
+
const values = extractStringLiteralValues(cleanType);
|
|
58
|
+
if (values.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
const normalized = normalizeUnionString(values);
|
|
61
|
+
if (unionToEnumName.has(normalized)) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const enumName = generateEnumName(`${messageName}${pascalCase(field.name)}`, existingEnumNames);
|
|
65
|
+
existingEnumNames.add(enumName);
|
|
66
|
+
const enumDef = {
|
|
67
|
+
name: enumName,
|
|
68
|
+
values,
|
|
69
|
+
unionString: normalized,
|
|
70
|
+
};
|
|
71
|
+
unionToEnumName.set(normalized, enumName);
|
|
72
|
+
return enumDef;
|
|
73
|
+
}
|
|
74
|
+
function extractEnumsFromMessages(messages) {
|
|
75
|
+
const unionToEnumName = new Map();
|
|
76
|
+
const enums = [];
|
|
77
|
+
const existingEnumNames = new Set();
|
|
78
|
+
for (const message of messages) {
|
|
79
|
+
if (message.fields === undefined || message.fields === null)
|
|
80
|
+
continue;
|
|
81
|
+
for (const field of message.fields) {
|
|
82
|
+
const enumDef = processFieldForEnum(field, message.name, unionToEnumName, existingEnumNames);
|
|
83
|
+
if (enumDef !== null) {
|
|
84
|
+
enums.push(enumDef);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { enums, unionToEnumName };
|
|
89
|
+
}
|
|
90
|
+
function generateEnumTypeScript(enumDef) {
|
|
91
|
+
const entries = enumDef.values.map((val) => {
|
|
92
|
+
const key = val.toUpperCase().replace(/[^A-Z0-9]/g, '_');
|
|
93
|
+
return ` ${key} = '${val}',`;
|
|
94
|
+
});
|
|
95
|
+
return `import { registerEnumType } from '@nestjs/graphql';
|
|
96
|
+
|
|
97
|
+
export enum ${enumDef.name} {
|
|
98
|
+
${entries.join('\n')}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
registerEnumType(${enumDef.name}, {
|
|
102
|
+
name: '${enumDef.name}',
|
|
103
|
+
});`;
|
|
104
|
+
}
|
|
105
|
+
async function writeEnumsToEntitiesFolder(baseDir, flowName, enums) {
|
|
106
|
+
if (enums.length === 0)
|
|
107
|
+
return;
|
|
108
|
+
const entitiesDir = path.join(baseDir, toKebabCase(flowName), 'entities');
|
|
109
|
+
await ensureDirExists(entitiesDir);
|
|
110
|
+
for (const enumDef of enums) {
|
|
111
|
+
const enumFilePath = path.join(entitiesDir, `${toKebabCase(enumDef.name)}.enum.ts`);
|
|
112
|
+
try {
|
|
113
|
+
await fs.access(enumFilePath);
|
|
114
|
+
debug('Enum file already exists: %s, skipping', enumFilePath);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
const content = generateEnumTypeScript(enumDef);
|
|
119
|
+
const prettierConfig = await prettier.resolveConfig(enumFilePath);
|
|
120
|
+
const formatted = await prettier.format(content, {
|
|
121
|
+
...prettierConfig,
|
|
122
|
+
parser: 'typescript',
|
|
123
|
+
filepath: enumFilePath,
|
|
124
|
+
});
|
|
125
|
+
await fs.writeFile(enumFilePath, formatted, 'utf8');
|
|
126
|
+
debug('Written enum file: %s', enumFilePath);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function renderTemplate(templatePath, data, unionToEnumName = new Map()) {
|
|
131
|
+
const content = await fs.readFile(templatePath, 'utf8');
|
|
132
|
+
const template = ejs.compile(content, {
|
|
133
|
+
async: true,
|
|
134
|
+
escape: (text) => text,
|
|
135
|
+
});
|
|
136
|
+
const isInlineObject = isInlineObjectHelper;
|
|
137
|
+
const isInlineObjectArray = isInlineObjectArrayHelper;
|
|
138
|
+
const convertPrimitiveType = (base) => {
|
|
139
|
+
if (base === 'ID')
|
|
140
|
+
return 'ID';
|
|
141
|
+
if (base === 'Int')
|
|
142
|
+
return 'Int';
|
|
143
|
+
if (base === 'Float')
|
|
144
|
+
return 'Float';
|
|
145
|
+
if (base === 'string')
|
|
146
|
+
return 'String';
|
|
147
|
+
if (base === 'number')
|
|
148
|
+
return 'Float';
|
|
149
|
+
if (base === 'boolean')
|
|
150
|
+
return 'Boolean';
|
|
151
|
+
if (base === 'Date')
|
|
152
|
+
return 'Date';
|
|
153
|
+
return 'String';
|
|
154
|
+
};
|
|
155
|
+
const resolveEnumOrString = (base) => {
|
|
156
|
+
if (!isStringLiteralUnion(base))
|
|
157
|
+
return 'String';
|
|
158
|
+
const values = extractStringLiteralValues(base);
|
|
159
|
+
const normalized = normalizeUnionString(values);
|
|
160
|
+
const enumName = unionToEnumName.get(normalized);
|
|
161
|
+
return enumName ?? 'String';
|
|
162
|
+
};
|
|
163
|
+
const graphqlType = (rawTs) => {
|
|
164
|
+
const t = (rawTs ?? '').trim();
|
|
165
|
+
if (!t)
|
|
166
|
+
return 'String';
|
|
167
|
+
const base = t.replace(/\s*\|\s*null\b/g, '').trim();
|
|
168
|
+
const arr1 = base.match(/^Array<(.*)>$/);
|
|
169
|
+
const arr2 = base.match(/^(.*)\[\]$/);
|
|
170
|
+
if (arr1 !== null)
|
|
171
|
+
return `[${graphqlType(arr1[1].trim())}]`;
|
|
172
|
+
if (arr2 !== null)
|
|
173
|
+
return `[${graphqlType(arr2[1].trim())}]`;
|
|
174
|
+
if (base === 'unknown' || base === 'any')
|
|
175
|
+
return 'GraphQLJSON';
|
|
176
|
+
if (base === 'object')
|
|
177
|
+
return 'JSON';
|
|
178
|
+
if (isInlineObject(base))
|
|
179
|
+
return 'JSON';
|
|
180
|
+
if (isStringLiteralUnion(base))
|
|
181
|
+
return resolveEnumOrString(base);
|
|
182
|
+
return convertPrimitiveType(base);
|
|
183
|
+
};
|
|
184
|
+
const toTsFieldType = (ts) => {
|
|
185
|
+
if (!ts)
|
|
186
|
+
return 'string';
|
|
187
|
+
const t = ts.trim();
|
|
188
|
+
const cleanType = t.replace(/\s*\|\s*null\b/g, '').trim();
|
|
189
|
+
const arr = cleanType.match(/^Array<(.*)>$/);
|
|
190
|
+
if (arr !== null)
|
|
191
|
+
return `${toTsFieldType(arr[1].trim())}[]`;
|
|
192
|
+
if (isStringLiteralUnion(cleanType)) {
|
|
193
|
+
const values = extractStringLiteralValues(cleanType);
|
|
194
|
+
const normalized = normalizeUnionString(values);
|
|
195
|
+
const enumName = unionToEnumName.get(normalized);
|
|
196
|
+
if (enumName !== undefined)
|
|
197
|
+
return enumName;
|
|
198
|
+
}
|
|
199
|
+
return t;
|
|
200
|
+
};
|
|
201
|
+
const isNullable = (rawTs) => /\|\s*null\b/.test(rawTs);
|
|
202
|
+
const isEnumType = createIsEnumType(toTsFieldType);
|
|
203
|
+
const fieldUsesDate = createFieldUsesDate(graphqlType);
|
|
204
|
+
const fieldUsesJSON = createFieldUsesJSON(graphqlType);
|
|
205
|
+
const fieldUsesFloat = createFieldUsesFloat(graphqlType);
|
|
206
|
+
const collectEnumNames = createCollectEnumNames(isEnumType, toTsFieldType);
|
|
207
|
+
const result = await template({
|
|
208
|
+
...data,
|
|
209
|
+
pascalCase,
|
|
210
|
+
toKebabCase,
|
|
211
|
+
camelCase,
|
|
212
|
+
graphqlType,
|
|
213
|
+
isNullable,
|
|
214
|
+
toTsFieldType,
|
|
215
|
+
messages: data.messages,
|
|
216
|
+
message: data.message,
|
|
217
|
+
isInlineObject,
|
|
218
|
+
isInlineObjectArray,
|
|
219
|
+
baseTs,
|
|
220
|
+
isEnumType,
|
|
221
|
+
fieldUsesDate,
|
|
222
|
+
fieldUsesJSON,
|
|
223
|
+
fieldUsesFloat,
|
|
224
|
+
collectEnumNames,
|
|
225
|
+
});
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
async function generateFileForTemplate(templateFile, slice, sliceDir, templateData, unionToEnumName = new Map()) {
|
|
229
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
230
|
+
const templatePath = path.join(__dirname, './templates', slice.type, templateFile);
|
|
231
|
+
const fileName = templateFile
|
|
232
|
+
.replace(/\.ts\.ejs$/, '.ts')
|
|
233
|
+
.replace(/^(command|query|handler|resolver|input|type)\./, `${toKebabCase(slice.name)}.$1.`);
|
|
234
|
+
const outputPath = path.join(sliceDir, fileName);
|
|
235
|
+
const contents = await renderTemplate(templatePath, templateData, unionToEnumName);
|
|
236
|
+
const prettierConfig = await prettier.resolveConfig(outputPath);
|
|
237
|
+
const formattedContents = await prettier.format(contents, {
|
|
238
|
+
...prettierConfig,
|
|
239
|
+
parser: 'typescript',
|
|
240
|
+
filepath: outputPath,
|
|
241
|
+
});
|
|
242
|
+
return { outputPath, contents: formattedContents };
|
|
243
|
+
}
|
|
244
|
+
async function prepareTemplateData(slice, flow, commands, events, states, commandSchemasByName, projectionIdField, projectionSingleton, allMessages, integrations) {
|
|
245
|
+
const { streamPattern, streamId } = getStreamFromSink(slice);
|
|
246
|
+
const gwtMapping = buildCommandGwtMapping(slice);
|
|
247
|
+
const queryGwtMapping = buildQueryGwtMapping(slice);
|
|
248
|
+
const projectionName = extractProjectionName(slice);
|
|
249
|
+
const uniqueCommands = Array.from(new Map(commands.map((c) => [c.type, c])).values());
|
|
250
|
+
const allowedForSlice = new Set(Object.keys(gwtMapping));
|
|
251
|
+
const filteredCommands = allowedForSlice.size > 0 ? uniqueCommands.filter((c) => allowedForSlice.has(c.type)) : uniqueCommands;
|
|
252
|
+
const eventImportGroups = groupEventImports({ currentSliceName: slice.name, events });
|
|
253
|
+
const allEventTypesArray = getAllEventTypes(events);
|
|
254
|
+
const allEventTypes = createEventUnionType(events);
|
|
255
|
+
const localEvents = getLocalEvents(events);
|
|
256
|
+
return {
|
|
257
|
+
flowName: flow.name,
|
|
258
|
+
sliceName: slice.name,
|
|
259
|
+
slice,
|
|
260
|
+
stream: { pattern: streamPattern, id: streamId },
|
|
261
|
+
commands: filteredCommands,
|
|
262
|
+
events,
|
|
263
|
+
states,
|
|
264
|
+
gwtMapping,
|
|
265
|
+
queryGwtMapping,
|
|
266
|
+
commandSchemasByName,
|
|
267
|
+
projectionIdField,
|
|
268
|
+
projectionSingleton,
|
|
269
|
+
projectionName,
|
|
270
|
+
projectionType: projectionName != null ? pascalCase(projectionName) : undefined,
|
|
271
|
+
parsedRequest: slice.type === 'query' && slice.request != null ? parseGraphQlRequest(slice.request) : undefined,
|
|
272
|
+
messages: allMessages,
|
|
273
|
+
message: slice.type === 'query' && allMessages
|
|
274
|
+
? allMessages.find((m) => m.name === slice.server?.data?.[0]?.target?.name)
|
|
275
|
+
: undefined,
|
|
276
|
+
integrations,
|
|
277
|
+
eventImportGroups,
|
|
278
|
+
allEventTypes,
|
|
279
|
+
allEventTypesArray,
|
|
280
|
+
localEvents,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
async function generateFilesForSlice(slice, flow, sliceDir, messages, flows, unionToEnumName, integrations) {
|
|
284
|
+
const templates = defaultFilesByType[slice.type];
|
|
285
|
+
if (!templates?.length) {
|
|
286
|
+
return [];
|
|
287
|
+
}
|
|
288
|
+
const extracted = extractMessagesFromSpecs(slice, messages);
|
|
289
|
+
const templateData = await prepareTemplateData(slice, flow, extracted.commands, extracted.events, extracted.states, extracted.commandSchemasByName, extracted.projectionIdField, extracted.projectionSingleton, messages, integrations);
|
|
290
|
+
const plans = await Promise.all(templates.map((template) => generateFileForTemplate(template, slice, sliceDir, templateData, unionToEnumName)));
|
|
291
|
+
return plans;
|
|
292
|
+
}
|
|
293
|
+
async function generateEntityFiles(entity, entitiesDir, unionToEnumName) {
|
|
294
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
295
|
+
const plans = [];
|
|
296
|
+
const entityTemplatePath = path.join(__dirname, './templates/entity/entity.ts.ejs');
|
|
297
|
+
const indexTemplatePath = path.join(__dirname, './templates/entity/index.ts.ejs');
|
|
298
|
+
const entityTemplateData = { entity, toTsFieldType: (ts) => ts, toKebabCase };
|
|
299
|
+
const entityContents = await renderTemplate(entityTemplatePath, entityTemplateData, unionToEnumName);
|
|
300
|
+
const entityFileName = `${toKebabCase(entity.entityName)}.entity.ts`;
|
|
301
|
+
const entityPath = path.join(entitiesDir, entityFileName);
|
|
302
|
+
const prettierConfig = await prettier.resolveConfig(entityPath);
|
|
303
|
+
const formattedEntity = await prettier.format(entityContents, {
|
|
304
|
+
...prettierConfig,
|
|
305
|
+
parser: 'typescript',
|
|
306
|
+
filepath: entityPath,
|
|
307
|
+
});
|
|
308
|
+
plans.push({ outputPath: entityPath, contents: formattedEntity });
|
|
309
|
+
const indexTemplateData = { entity, toKebabCase };
|
|
310
|
+
const indexContents = await renderTemplate(indexTemplatePath, indexTemplateData, unionToEnumName);
|
|
311
|
+
const indexPath = path.join(entitiesDir, 'index.ts');
|
|
312
|
+
const formattedIndex = await prettier.format(indexContents, {
|
|
313
|
+
...prettierConfig,
|
|
314
|
+
parser: 'typescript',
|
|
315
|
+
filepath: indexPath,
|
|
316
|
+
});
|
|
317
|
+
plans.push({ outputPath: indexPath, contents: formattedIndex });
|
|
318
|
+
return plans;
|
|
319
|
+
}
|
|
320
|
+
async function generateDomainModule(flow, flowDir, unionToEnumName) {
|
|
321
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
322
|
+
const moduleTemplatePath = path.join(__dirname, './templates/module/domain-module.ts.ejs');
|
|
323
|
+
const slices = flow.slices.filter((s) => s.type !== 'experience');
|
|
324
|
+
const templateData = {
|
|
325
|
+
flowName: flow.name,
|
|
326
|
+
slices,
|
|
327
|
+
pascalCase,
|
|
328
|
+
toKebabCase,
|
|
329
|
+
};
|
|
330
|
+
const contents = await renderTemplate(moduleTemplatePath, templateData, unionToEnumName);
|
|
331
|
+
const modulePath = path.join(flowDir, `${toKebabCase(flow.name)}.module.ts`);
|
|
332
|
+
const prettierConfig = await prettier.resolveConfig(modulePath);
|
|
333
|
+
const formattedContents = await prettier.format(contents, {
|
|
334
|
+
...prettierConfig,
|
|
335
|
+
parser: 'typescript',
|
|
336
|
+
filepath: modulePath,
|
|
337
|
+
});
|
|
338
|
+
return { outputPath: modulePath, contents: formattedContents };
|
|
339
|
+
}
|
|
340
|
+
async function generateAppModule(flows, baseDir, unionToEnumName) {
|
|
341
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
342
|
+
const moduleTemplatePath = path.join(__dirname, './templates/module/app-module.ts.ejs');
|
|
343
|
+
const templateData = {
|
|
344
|
+
flows,
|
|
345
|
+
pascalCase,
|
|
346
|
+
toKebabCase,
|
|
347
|
+
};
|
|
348
|
+
const contents = await renderTemplate(moduleTemplatePath, templateData, unionToEnumName);
|
|
349
|
+
const appModulePath = path.join(baseDir, '../app.module.ts');
|
|
350
|
+
const prettierConfig = await prettier.resolveConfig(appModulePath);
|
|
351
|
+
const formattedContents = await prettier.format(contents, {
|
|
352
|
+
...prettierConfig,
|
|
353
|
+
parser: 'typescript',
|
|
354
|
+
filepath: appModulePath,
|
|
355
|
+
});
|
|
356
|
+
return { outputPath: appModulePath, contents: formattedContents };
|
|
357
|
+
}
|
|
358
|
+
export async function generateScaffoldFilePlans(flows, messages, integrations, baseDir = 'src/domain') {
|
|
359
|
+
const { enums, unionToEnumName } = extractEnumsFromMessages(messages ?? []);
|
|
360
|
+
const allPlans = [];
|
|
361
|
+
for (const flow of flows) {
|
|
362
|
+
const flowDir = ensureDirPath(baseDir, toKebabCase(flow.name));
|
|
363
|
+
const entitiesDir = ensureDirPath(flowDir, 'entities');
|
|
364
|
+
await writeEnumsToEntitiesFolder(baseDir, flow.name, enums);
|
|
365
|
+
const entity = consolidateEntityFields(flow, messages ?? [], unionToEnumName);
|
|
366
|
+
const entityPlans = await generateEntityFiles(entity, entitiesDir, unionToEnumName);
|
|
367
|
+
allPlans.push(...entityPlans);
|
|
368
|
+
for (const slice of flow.slices) {
|
|
369
|
+
const sliceDir = ensureDirPath(flowDir, toKebabCase(slice.name));
|
|
370
|
+
const plans = await generateFilesForSlice(slice, flow, sliceDir, messages ?? [], flows, unionToEnumName, integrations);
|
|
371
|
+
allPlans.push(...plans);
|
|
372
|
+
}
|
|
373
|
+
const modulePlan = await generateDomainModule(flow, flowDir, unionToEnumName);
|
|
374
|
+
allPlans.push(modulePlan);
|
|
375
|
+
}
|
|
376
|
+
const appModulePlan = await generateAppModule(flows, baseDir, unionToEnumName);
|
|
377
|
+
allPlans.push(appModulePlan);
|
|
378
|
+
return allPlans;
|
|
379
|
+
}
|
|
380
|
+
export async function writeScaffoldFilePlans(plans) {
|
|
381
|
+
for (const { outputPath, contents } of plans) {
|
|
382
|
+
const dir = path.dirname(outputPath);
|
|
383
|
+
await ensureDirExists(dir);
|
|
384
|
+
await fs.writeFile(outputPath, contents, 'utf8');
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
export async function scaffoldFromSchema(flows, messages, baseDir = 'src/domain') {
|
|
388
|
+
const plans = await generateScaffoldFilePlans(flows, messages, undefined, baseDir);
|
|
389
|
+
await writeScaffoldFilePlans(plans);
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=scaffoldFromSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffoldFromSchema.js","sourceRoot":"","sources":["../../../src/codegen/scaffoldFromSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,uCAAuC,CAAC,CAAC;AAEnE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,cAAc,IAAI,oBAAoB,EACtC,mBAAmB,IAAI,yBAAyB,EAChD,MAAM,EACN,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAA2B,MAAM,2BAA2B,CAAC;AAE7F,MAAM,kBAAkB,GAA6B;IACnD,OAAO,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC;IACxG,KAAK,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;IAC3E,KAAK,EAAE,EAAE;CACV,CAAC;AAaF,SAAS,oBAAoB,CAAC,CAAS;IACrC,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,0BAA0B,CAAC,WAAmB;IACrD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,IAAI,YAAY,CAAC;IAC7C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAgB;IAC5C,OAAO,MAAM;SACV,KAAK,EAAE;SACP,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,IAAI,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB,EAAE,aAA0B;IACrE,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAqC,EACrC,WAAmB,EACnB,eAAoC,EACpC,iBAA8B;IAE9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1B,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEzD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAChG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAmB;QAC9B,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,WAAW,EAAE,UAAU;KACxB,CAAC;IAEF,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,wBAAwB,CAAC,QAA6B;IAC7D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;YAAE,SAAS;QAEtE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;YAC7F,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuB;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO;;cAEK,OAAO,CAAC,IAAI;EACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;mBAGD,OAAO,CAAC,IAAI;WACpB,OAAO,CAAC,IAAI;IACnB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,OAAe,EAAE,QAAgB,EAAE,KAAuB;IAClG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEnC,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEpF,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9B,KAAK,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;gBAC/C,GAAG,cAAc;gBACjB,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE,YAAY;aACvB,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YACpD,KAAK,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAOD,KAAK,UAAU,cAAc,CAC3B,YAAoB,EACpB,IAA6B,EAC7B,kBAAuC,IAAI,GAAG,EAAE;IAEhD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;QACpC,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI;KACvC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC5C,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;IAEtD,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAU,EAAE;QACpD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QACrC,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACvC,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC;QACtC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzC,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE;QACnD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC;QACjD,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,QAAQ,IAAI,QAAQ,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;QAC5C,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;QAC7D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;QAE7D,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAC/D,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QACrC,IAAI,cAAc,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QACxC,IAAI,oBAAoB,CAAC,IAAI,CAAC;YAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEjE,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,EAAU,EAAU,EAAE;QAC3C,IAAI,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC;QACzB,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1D,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;QAE7D,IAAI,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC;QAC9C,CAAC;QAED,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEzE,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC5B,GAAG,IAAI;QACP,UAAU;QACV,WAAW;QACX,SAAS;QACT,WAAW;QACX,UAAU;QACV,aAAa;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc;QACd,mBAAmB;QACnB,MAAM;QACN,UAAU;QACV,aAAa;QACb,aAAa;QACb,cAAc;QACd,gBAAgB;KACjB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,YAAoB,EACpB,KAAY,EACZ,QAAgB,EAChB,YAAqC,EACrC,kBAAuC,IAAI,GAAG,EAAE;IAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,YAAY;SAC1B,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC;SAC5B,OAAO,CAAC,gDAAgD,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAEnF,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;QACxD,GAAG,cAAc;QACjB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAY,EACZ,IAAe,EACf,QAAmB,EACnB,MAAiB,EACjB,MAAiB,EACjB,oBAA6C,EAC7C,iBAAqC,EACrC,mBAAwC,EACxC,WAAiC,EACjC,YAAoC;IAEpC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,MAAM,gBAAgB,GACpB,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IAExG,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,KAAK;QACL,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE;QAChD,QAAQ,EAAE,gBAAgB;QAC1B,MAAM;QACN,MAAM;QACN,UAAU;QACV,eAAe;QACf,oBAAoB;QACpB,iBAAiB;QACjB,mBAAmB;QACnB,cAAc;QACd,cAAc,EAAE,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/E,aAAa,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/G,QAAQ,EAAE,WAAW;QACrB,OAAO,EACL,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,WAAW;YACnC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;YAC3E,CAAC,CAAC,SAAS;QACf,YAAY;QACZ,iBAAiB;QACjB,aAAa;QACb,kBAAkB;QAClB,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAAY,EACZ,IAAe,EACf,QAAgB,EAChB,QAA6B,EAC7B,KAAkB,EAClB,eAAoC,EACpC,YAAoC;IAEpC,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE5D,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,KAAK,EACL,IAAI,EACJ,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,oBAAoB,EAC9B,SAAS,CAAC,iBAAiB,EAC3B,SAAS,CAAC,mBAAmB,EAC7B,QAAQ,EACR,YAAY,CACb,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAC/G,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAA0B,EAC1B,WAAmB,EACnB,eAAoC;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IACpF,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;IAElF,MAAM,kBAAkB,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC;IACtF,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAErG,MAAM,cAAc,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE;QAC5D,GAAG,cAAc;QACjB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAElE,MAAM,iBAAiB,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAClD,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;IAClG,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE;QAC1D,GAAG,cAAc;QACjB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAEhE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAe,EACf,OAAe,EACf,eAAoC;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG;QACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,MAAM;QACN,UAAU;QACV,WAAW;KACZ,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,kBAAkB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE7E,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;QACxD,GAAG,cAAc;QACjB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAAkB,EAClB,OAAe,EACf,eAAoC;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;IAExF,MAAM,YAAY,GAAG;QACnB,KAAK;QACL,UAAU;QACV,WAAW;KACZ,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,kBAAkB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAE7D,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;QACxD,GAAG,cAAc;QACjB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,aAAa;KACxB,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAkB,EAClB,QAA2B,EAC3B,YAAoC,EACpC,OAAO,GAAG,YAAY;IAEtB,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,wBAAwB,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAe,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEvD,MAAM,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QACpF,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,MAAM,qBAAqB,CACvC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,IAAI,EAAE,EACd,KAAK,EACL,eAAe,EACf,YAAY,CACb,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QAC9E,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC/E,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE7B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAiB;IAC5D,KAAK,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAkB,EAClB,QAA2B,EAC3B,OAAO,GAAG,YAAY;IAEtB,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACnF,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const command = commands[0];
|
|
3
|
+
if (!command) return '';
|
|
4
|
+
const enumList = collectEnumNames(command.fields);
|
|
5
|
+
%><% if (enumList.length > 0) { -%>
|
|
6
|
+
import { <%= enumList.join(', ') %> } from '../entities';
|
|
7
|
+
<% } -%>
|
|
8
|
+
|
|
9
|
+
export class <%= pascalCase(command.type) %>Command {
|
|
10
|
+
constructor(
|
|
11
|
+
<% for (let i = 0; i < command.fields.length; i++) { const field = command.fields[i]; -%>
|
|
12
|
+
public readonly <%= field.name %>: <%= toTsFieldType(field.tsType) %>,
|
|
13
|
+
<% } -%>
|
|
14
|
+
public readonly now?: Date,
|
|
15
|
+
) {}
|
|
16
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const command = commands[0];
|
|
3
|
+
if (!command) return '';
|
|
4
|
+
const entityName = pascalCase(flowName) + 'Entity';
|
|
5
|
+
const enumList = collectEnumNames(command.fields);
|
|
6
|
+
%>import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
7
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
8
|
+
import { getRepositoryToken } from '@mikro-orm/nestjs';
|
|
9
|
+
import { <%= pascalCase(command.type) %>Handler } from './<%= toKebabCase(sliceName) %>.handler';
|
|
10
|
+
import { <%= pascalCase(command.type) %>Command } from './<%= toKebabCase(sliceName) %>.command';
|
|
11
|
+
import { <%= entityName %><% if (enumList.length > 0) { %>, <%= enumList.join(', ') %><% } %> } from '../entities';
|
|
12
|
+
|
|
13
|
+
describe('<%= pascalCase(command.type) %>Handler', () => {
|
|
14
|
+
let handler: <%= pascalCase(command.type) %>Handler;
|
|
15
|
+
let mockRepository: Record<string, unknown>;
|
|
16
|
+
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
mockRepository = {
|
|
19
|
+
create: vi.fn(),
|
|
20
|
+
findOne: vi.fn(),
|
|
21
|
+
getEntityManager: vi.fn(() => ({
|
|
22
|
+
persistAndFlush: vi.fn(),
|
|
23
|
+
})),
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
27
|
+
providers: [
|
|
28
|
+
<%= pascalCase(command.type) %>Handler,
|
|
29
|
+
{
|
|
30
|
+
provide: getRepositoryToken(<%= entityName %>),
|
|
31
|
+
useValue: mockRepository,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
}).compile();
|
|
35
|
+
|
|
36
|
+
handler = module.get<<%= pascalCase(command.type) %>Handler>(<%= pascalCase(command.type) %>Handler);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should be defined', () => {
|
|
40
|
+
expect(handler).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// TODO: Add test cases based on GWT specs
|
|
44
|
+
// Example:
|
|
45
|
+
// it('should handle <%= command.type %>', async () => {
|
|
46
|
+
// const command = new <%= pascalCase(command.type) %>Command(...);
|
|
47
|
+
// await handler.execute(command);
|
|
48
|
+
// expect(mockRepository.create).toHaveBeenCalled();
|
|
49
|
+
// });
|
|
50
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<%
|
|
2
|
+
const command = commands[0];
|
|
3
|
+
if (!command) return '';
|
|
4
|
+
const entityName = pascalCase(flowName) + 'Entity';
|
|
5
|
+
const enumList = collectEnumNames(command.fields);
|
|
6
|
+
%>import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
|
|
7
|
+
import { InjectRepository } from '@mikro-orm/nestjs';
|
|
8
|
+
import { EntityRepository } from '@mikro-orm/core';
|
|
9
|
+
import { <%= pascalCase(command.type) %>Command } from './<%= toKebabCase(sliceName) %>.command';
|
|
10
|
+
import { <%= entityName %><% if (enumList.length > 0) { %>, <%= enumList.join(', ') %><% } %> } from '../entities';
|
|
11
|
+
|
|
12
|
+
@CommandHandler(<%= pascalCase(command.type) %>Command)
|
|
13
|
+
export class <%= pascalCase(command.type) %>Handler implements ICommandHandler<<%= pascalCase(command.type) %>Command> {
|
|
14
|
+
constructor(
|
|
15
|
+
@InjectRepository(<%= entityName %>)
|
|
16
|
+
private readonly repository: EntityRepository<<%= entityName %>>,
|
|
17
|
+
) {}
|
|
18
|
+
|
|
19
|
+
async execute(command: <%= pascalCase(command.type) %>Command): Promise<void> {
|
|
20
|
+
// TODO: Implement command handler logic
|
|
21
|
+
// This is a generated stub - implement based on your business rules
|
|
22
|
+
// Example for create operation:
|
|
23
|
+
// const entity = this.repository.create({
|
|
24
|
+
// ...command fields...
|
|
25
|
+
// });
|
|
26
|
+
// await this.repository.getEntityManager().persistAndFlush(entity);
|
|
27
|
+
|
|
28
|
+
throw new Error('Not yet implemented: <%= command.type %>');
|
|
29
|
+
}
|
|
30
|
+
}
|