@emfts/codegen 0.0.1-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +39 -0
  2. package/dist/cli/commands/generate-rest-client.d.ts +3 -0
  3. package/dist/cli/commands/generate-rest-client.d.ts.map +1 -0
  4. package/dist/cli/commands/generate-rest-client.js +38 -0
  5. package/dist/cli/commands/generate-rest-client.js.map +1 -0
  6. package/dist/cli/commands/generate.d.ts +3 -0
  7. package/dist/cli/commands/generate.d.ts.map +1 -0
  8. package/dist/cli/commands/generate.js +108 -0
  9. package/dist/cli/commands/generate.js.map +1 -0
  10. package/dist/cli/commands/init.d.ts +3 -0
  11. package/dist/cli/commands/init.d.ts.map +1 -0
  12. package/dist/cli/commands/init.js +57 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +15 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/debug-abstract.d.ts +2 -0
  19. package/dist/debug-abstract.d.ts.map +1 -0
  20. package/dist/debug-abstract.js +25 -0
  21. package/dist/debug-abstract.js.map +1 -0
  22. package/dist/debug-genmodel.d.ts +2 -0
  23. package/dist/debug-genmodel.d.ts.map +1 -0
  24. package/dist/debug-genmodel.js +41 -0
  25. package/dist/debug-genmodel.js.map +1 -0
  26. package/dist/genconfig/GenConfig.d.ts +125 -0
  27. package/dist/genconfig/GenConfig.d.ts.map +1 -0
  28. package/dist/genconfig/GenConfig.js +46 -0
  29. package/dist/genconfig/GenConfig.js.map +1 -0
  30. package/dist/genconfig/GenConfigConverter.d.ts +64 -0
  31. package/dist/genconfig/GenConfigConverter.d.ts.map +1 -0
  32. package/dist/genconfig/GenConfigConverter.js +293 -0
  33. package/dist/genconfig/GenConfigConverter.js.map +1 -0
  34. package/dist/genconfig/GenConfigLoader.d.ts +83 -0
  35. package/dist/genconfig/GenConfigLoader.d.ts.map +1 -0
  36. package/dist/genconfig/GenConfigLoader.js +455 -0
  37. package/dist/genconfig/GenConfigLoader.js.map +1 -0
  38. package/dist/genconfig/index.d.ts +4 -0
  39. package/dist/genconfig/index.d.ts.map +1 -0
  40. package/dist/genconfig/index.js +4 -0
  41. package/dist/genconfig/index.js.map +1 -0
  42. package/dist/generator/CodeGenerator.d.ts +45 -0
  43. package/dist/generator/CodeGenerator.d.ts.map +1 -0
  44. package/dist/generator/CodeGenerator.js +142 -0
  45. package/dist/generator/CodeGenerator.js.map +1 -0
  46. package/dist/generator/GeneratedFile.d.ts +23 -0
  47. package/dist/generator/GeneratedFile.d.ts.map +1 -0
  48. package/dist/generator/GeneratedFile.js +42 -0
  49. package/dist/generator/GeneratedFile.js.map +1 -0
  50. package/dist/generator/GeneratorContext.d.ts +73 -0
  51. package/dist/generator/GeneratorContext.d.ts.map +1 -0
  52. package/dist/generator/GeneratorContext.js +99 -0
  53. package/dist/generator/GeneratorContext.js.map +1 -0
  54. package/dist/generator/GeneratorOptions.d.ts +26 -0
  55. package/dist/generator/GeneratorOptions.d.ts.map +1 -0
  56. package/dist/generator/GeneratorOptions.js +16 -0
  57. package/dist/generator/GeneratorOptions.js.map +1 -0
  58. package/dist/generator/ImportResolver.d.ts +85 -0
  59. package/dist/generator/ImportResolver.d.ts.map +1 -0
  60. package/dist/generator/ImportResolver.js +381 -0
  61. package/dist/generator/ImportResolver.js.map +1 -0
  62. package/dist/generator/RestClientGenerator.d.ts +72 -0
  63. package/dist/generator/RestClientGenerator.d.ts.map +1 -0
  64. package/dist/generator/RestClientGenerator.js +488 -0
  65. package/dist/generator/RestClientGenerator.js.map +1 -0
  66. package/dist/generator/TypeMapper.d.ts +62 -0
  67. package/dist/generator/TypeMapper.d.ts.map +1 -0
  68. package/dist/generator/TypeMapper.js +224 -0
  69. package/dist/generator/TypeMapper.js.map +1 -0
  70. package/dist/generator/index.d.ts +9 -0
  71. package/dist/generator/index.d.ts.map +1 -0
  72. package/dist/generator/index.js +9 -0
  73. package/dist/generator/index.js.map +1 -0
  74. package/dist/generator/modes/BaseGenerator.d.ts +67 -0
  75. package/dist/generator/modes/BaseGenerator.d.ts.map +1 -0
  76. package/dist/generator/modes/BaseGenerator.js +128 -0
  77. package/dist/generator/modes/BaseGenerator.js.map +1 -0
  78. package/dist/generator/modes/DecoratorGenerator.d.ts +28 -0
  79. package/dist/generator/modes/DecoratorGenerator.d.ts.map +1 -0
  80. package/dist/generator/modes/DecoratorGenerator.js +147 -0
  81. package/dist/generator/modes/DecoratorGenerator.js.map +1 -0
  82. package/dist/generator/modes/EmfGenerator.d.ts +22 -0
  83. package/dist/generator/modes/EmfGenerator.d.ts.map +1 -0
  84. package/dist/generator/modes/EmfGenerator.js +202 -0
  85. package/dist/generator/modes/EmfGenerator.js.map +1 -0
  86. package/dist/generator/modes/PlainGenerator.d.ts +16 -0
  87. package/dist/generator/modes/PlainGenerator.d.ts.map +1 -0
  88. package/dist/generator/modes/PlainGenerator.js +95 -0
  89. package/dist/generator/modes/PlainGenerator.js.map +1 -0
  90. package/dist/generator/modes/index.d.ts +5 -0
  91. package/dist/generator/modes/index.d.ts.map +1 -0
  92. package/dist/generator/modes/index.js +5 -0
  93. package/dist/generator/modes/index.js.map +1 -0
  94. package/dist/genmodel/GenClass.d.ts +37 -0
  95. package/dist/genmodel/GenClass.d.ts.map +1 -0
  96. package/dist/genmodel/GenClass.js +14 -0
  97. package/dist/genmodel/GenClass.js.map +1 -0
  98. package/dist/genmodel/GenDataType.d.ts +19 -0
  99. package/dist/genmodel/GenDataType.d.ts.map +1 -0
  100. package/dist/genmodel/GenDataType.js +46 -0
  101. package/dist/genmodel/GenDataType.js.map +1 -0
  102. package/dist/genmodel/GenEnum.d.ts +30 -0
  103. package/dist/genmodel/GenEnum.d.ts.map +1 -0
  104. package/dist/genmodel/GenEnum.js +11 -0
  105. package/dist/genmodel/GenEnum.js.map +1 -0
  106. package/dist/genmodel/GenFeature.d.ts +30 -0
  107. package/dist/genmodel/GenFeature.d.ts.map +1 -0
  108. package/dist/genmodel/GenFeature.js +15 -0
  109. package/dist/genmodel/GenFeature.js.map +1 -0
  110. package/dist/genmodel/GenModel.d.ts +54 -0
  111. package/dist/genmodel/GenModel.d.ts.map +1 -0
  112. package/dist/genmodel/GenModel.js +24 -0
  113. package/dist/genmodel/GenModel.js.map +1 -0
  114. package/dist/genmodel/GenOperation.d.ts +19 -0
  115. package/dist/genmodel/GenOperation.d.ts.map +1 -0
  116. package/dist/genmodel/GenOperation.js +10 -0
  117. package/dist/genmodel/GenOperation.js.map +1 -0
  118. package/dist/genmodel/GenPackage.d.ts +42 -0
  119. package/dist/genmodel/GenPackage.d.ts.map +1 -0
  120. package/dist/genmodel/GenPackage.js +25 -0
  121. package/dist/genmodel/GenPackage.js.map +1 -0
  122. package/dist/genmodel/GenerationMode.d.ts +23 -0
  123. package/dist/genmodel/GenerationMode.d.ts.map +1 -0
  124. package/dist/genmodel/GenerationMode.js +25 -0
  125. package/dist/genmodel/GenerationMode.js.map +1 -0
  126. package/dist/genmodel/index.d.ts +9 -0
  127. package/dist/genmodel/index.d.ts.map +1 -0
  128. package/dist/genmodel/index.js +10 -0
  129. package/dist/genmodel/index.js.map +1 -0
  130. package/dist/index.d.ts +66 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +110 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/loader/EcoreLoader.d.ts +33 -0
  135. package/dist/loader/EcoreLoader.d.ts.map +1 -0
  136. package/dist/loader/EcoreLoader.js +91 -0
  137. package/dist/loader/EcoreLoader.js.map +1 -0
  138. package/dist/loader/index.d.ts +2 -0
  139. package/dist/loader/index.d.ts.map +1 -0
  140. package/dist/loader/index.js +2 -0
  141. package/dist/loader/index.js.map +1 -0
  142. package/dist/templates/partials/decorator/class-file.ejs +98 -0
  143. package/dist/templates/partials/decorator/enum-file.ejs +35 -0
  144. package/dist/templates/partials/decorator/interface-file.ejs +61 -0
  145. package/dist/templates/partials/decorator/model-annotations.ejs +91 -0
  146. package/dist/templates/partials/decorator/package-file.ejs +7 -0
  147. package/dist/templates/partials/emf/class-file.ejs +226 -0
  148. package/dist/templates/partials/emf/enum-file.ejs +36 -0
  149. package/dist/templates/partials/emf/factory-file.ejs +54 -0
  150. package/dist/templates/partials/emf/index-file.ejs +29 -0
  151. package/dist/templates/partials/emf/interface-file.ejs +72 -0
  152. package/dist/templates/partials/emf/package-file.ejs +149 -0
  153. package/dist/templates/partials/plain/class-file.ejs +75 -0
  154. package/dist/templates/partials/plain/enum-file.ejs +28 -0
  155. package/dist/templates/partials/plain/interface-file.ejs +61 -0
  156. package/dist/templates/partials/plain/package-file.ejs +6 -0
  157. package/dist/templates/templates/partials/decorator/class-file.ejs +98 -0
  158. package/dist/templates/templates/partials/decorator/enum-file.ejs +35 -0
  159. package/dist/templates/templates/partials/decorator/interface-file.ejs +61 -0
  160. package/dist/templates/templates/partials/decorator/model-annotations.ejs +91 -0
  161. package/dist/templates/templates/partials/decorator/package-file.ejs +7 -0
  162. package/dist/templates/templates/partials/emf/class-file.ejs +226 -0
  163. package/dist/templates/templates/partials/emf/enum-file.ejs +36 -0
  164. package/dist/templates/templates/partials/emf/factory-file.ejs +54 -0
  165. package/dist/templates/templates/partials/emf/index-file.ejs +29 -0
  166. package/dist/templates/templates/partials/emf/interface-file.ejs +72 -0
  167. package/dist/templates/templates/partials/emf/package-file.ejs +149 -0
  168. package/dist/templates/templates/partials/plain/class-file.ejs +75 -0
  169. package/dist/templates/templates/partials/plain/enum-file.ejs +28 -0
  170. package/dist/templates/templates/partials/plain/interface-file.ejs +61 -0
  171. package/dist/templates/templates/partials/plain/package-file.ejs +6 -0
  172. package/dist/util/EObjectHelper.d.ts +90 -0
  173. package/dist/util/EObjectHelper.d.ts.map +1 -0
  174. package/dist/util/EObjectHelper.js +381 -0
  175. package/dist/util/EObjectHelper.js.map +1 -0
  176. package/dist/util/StringUtils.d.ts +44 -0
  177. package/dist/util/StringUtils.d.ts.map +1 -0
  178. package/dist/util/StringUtils.js +115 -0
  179. package/dist/util/StringUtils.js.map +1 -0
  180. package/dist/util/index.d.ts +3 -0
  181. package/dist/util/index.d.ts.map +1 -0
  182. package/dist/util/index.js +3 -0
  183. package/dist/util/index.js.map +1 -0
  184. package/package.json +60 -0
package/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # emf.ts.codegen
2
+
3
+ TypeScript code generator for [Ecore](https://eclipse.dev/modeling/emf/) models using [emf.ts](https://github.com/eclipse-fennec/emf.ts).
4
+
5
+ ## Features
6
+
7
+ - Generate TypeScript interfaces and classes from `.ecore` models
8
+ - Support for multiple generation modes (plain, decorator-based, EMF-style)
9
+ - REST client generation from Ecore models
10
+ - CLI tool for easy integration into build pipelines
11
+ - Configurable via `.genconfig.xmi` files
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install emfts-codegen
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ### CLI
22
+
23
+ ```bash
24
+ # Generate TypeScript code from an Ecore model
25
+ emfts-codegen generate -m model/my-model.ecore -c model/my-model.genconfig.xmi -o src/generated
26
+
27
+ # Initialize a new genconfig
28
+ emfts-codegen init
29
+ ```
30
+
31
+ ### Programmatic
32
+
33
+ ```typescript
34
+ import { CodeGenerator } from 'emfts-codegen';
35
+ ```
36
+
37
+ ## License
38
+
39
+ [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateRestClientCommand: Command;
3
+ //# sourceMappingURL=generate-rest-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-rest-client.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-rest-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,yBAAyB,SAqClC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { Command } from 'commander';
2
+ import { RestClientGenerator } from '../../generator/RestClientGenerator.js';
3
+ export const generateRestClientCommand = new Command('generate-rest-client')
4
+ .description('Generate TypeScript fetch client from REST API Ecore model + XMI instance')
5
+ .requiredOption('-m, --metamodel <path>', 'Path to rest-api.ecore metamodel')
6
+ .requiredOption('-i, --instance <path>', 'Path to API instance .xmi file')
7
+ .requiredOption('-o, --output <path>', 'Output directory for generated client')
8
+ .option('-v, --verbose', 'Verbose output')
9
+ .action(async (options) => {
10
+ const verbose = options.verbose;
11
+ try {
12
+ if (verbose) {
13
+ console.log('REST API metamodel:', options.metamodel);
14
+ console.log('API instance:', options.instance);
15
+ console.log('Output directory:', options.output);
16
+ }
17
+ const generator = new RestClientGenerator({
18
+ outputDir: options.output,
19
+ verbose,
20
+ });
21
+ console.log('Generating REST client...');
22
+ const files = await generator.generate(options.metamodel, options.instance);
23
+ console.log(`Successfully generated ${files.length} files to ${options.output}`);
24
+ if (verbose) {
25
+ for (const file of files) {
26
+ console.log(' -', file);
27
+ }
28
+ }
29
+ }
30
+ catch (error) {
31
+ console.error('Error:', error instanceof Error ? error.message : error);
32
+ if (verbose && error instanceof Error) {
33
+ console.error(error.stack);
34
+ }
35
+ process.exit(1);
36
+ }
37
+ });
38
+ //# sourceMappingURL=generate-rest-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-rest-client.js","sourceRoot":"","sources":["../../../src/cli/commands/generate-rest-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,OAAO,CAAC,sBAAsB,CAAC;KACzE,WAAW,CAAC,2EAA2E,CAAC;KACxF,cAAc,CAAC,wBAAwB,EAAE,kCAAkC,CAAC;KAC5E,cAAc,CAAC,uBAAuB,EAAE,gCAAgC,CAAC;KACzE,cAAc,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KAC9E,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,mBAAmB,CAAC;YACxC,SAAS,EAAE,OAAO,CAAC,MAAM;YACzB,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjF,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,OAAO,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const generateCommand: Command;
3
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,eAAe,SAuFxB,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { Command } from 'commander';
2
+ import { EcoreLoader } from '../../loader/EcoreLoader.js';
3
+ import { GenConfigLoader } from '../../genconfig/GenConfigLoader.js';
4
+ import { GenConfigConverter } from '../../genconfig/GenConfigConverter.js';
5
+ import { CodeGenerator } from '../../generator/CodeGenerator.js';
6
+ export const generateCommand = new Command('generate')
7
+ .description('Generate TypeScript code from Ecore model')
8
+ .requiredOption('-m, --model <path>', 'Path to .ecore model file')
9
+ .requiredOption('-c, --config <path>', 'Path to .genconfig.xmi file')
10
+ .option('-o, --output <path>', 'Output directory override')
11
+ .option('-v, --verbose', 'Verbose output')
12
+ .action(async (options) => {
13
+ const verbose = options.verbose;
14
+ try {
15
+ if (verbose) {
16
+ console.log('Loading Ecore model:', options.model);
17
+ }
18
+ // Load Ecore model
19
+ const ecoreLoader = new EcoreLoader();
20
+ const ePackage = await ecoreLoader.load(options.model);
21
+ if (verbose) {
22
+ console.log('Loaded package:', getName(ePackage), 'nsURI:', ePackage.getNsURI());
23
+ const classifiers = ePackage.getEClassifiers();
24
+ console.log('Classifiers:', classifiers.length);
25
+ for (const c of classifiers) {
26
+ console.log(' -', getName(c));
27
+ }
28
+ }
29
+ // Load GenConfig
30
+ if (verbose) {
31
+ console.log('Loading GenConfig:', options.config);
32
+ }
33
+ const configLoader = new GenConfigLoader();
34
+ configLoader.registerPackage(ePackage);
35
+ const genConfig = await configLoader.load(options.config);
36
+ // Convert to internal GenModel
37
+ const converter = new GenConfigConverter();
38
+ const genModel = converter.convert(genConfig);
39
+ // Override output directory if specified on command line
40
+ const outputDir = options.output || genConfig.generation.outputDir;
41
+ if (verbose) {
42
+ console.log('Generation mode:', genConfig.generation.mode);
43
+ console.log('Output directory:', outputDir);
44
+ console.log('Generate interfaces:', genConfig.classDefaults?.generateInterface ?? true);
45
+ console.log('Generate classes:', genConfig.classDefaults?.generateImpl ?? true);
46
+ console.log('Generate factory:', genConfig.package.generateFactory);
47
+ }
48
+ // Generate code
49
+ const generator = new CodeGenerator(genModel, {
50
+ outputDirectory: outputDir
51
+ });
52
+ console.log('Generating code...');
53
+ const result = await generator.run();
54
+ // Print diagnostics
55
+ for (const diag of result.diagnostics) {
56
+ if (diag.level === 'error') {
57
+ console.error(`[ERROR] ${diag.message}`);
58
+ }
59
+ else if (diag.level === 'warning') {
60
+ console.warn(`[WARN] ${diag.message}`);
61
+ }
62
+ else if (verbose) {
63
+ console.log(`[INFO] ${diag.message}`);
64
+ }
65
+ }
66
+ if (result.success) {
67
+ console.log(`Successfully generated ${result.files.length} files to ${outputDir}`);
68
+ if (verbose) {
69
+ for (const file of result.files) {
70
+ console.log(' -', file);
71
+ }
72
+ }
73
+ }
74
+ else {
75
+ console.error('Generation failed with errors');
76
+ process.exit(1);
77
+ }
78
+ }
79
+ catch (error) {
80
+ console.error('Error:', error instanceof Error ? error.message : error);
81
+ if (verbose && error instanceof Error) {
82
+ console.error(error.stack);
83
+ }
84
+ process.exit(1);
85
+ }
86
+ });
87
+ /**
88
+ * Get name from ENamedElement (works with both static and dynamic EObjects)
89
+ */
90
+ function getName(obj) {
91
+ // Try direct method first
92
+ if (typeof obj.getName === 'function') {
93
+ return obj.getName() ?? '';
94
+ }
95
+ // Try eGet for dynamic objects
96
+ if (typeof obj.eGet === 'function' && typeof obj.eClass === 'function') {
97
+ const eClass = obj.eClass();
98
+ if (eClass) {
99
+ const nameFeature = eClass.getEStructuralFeature?.('name');
100
+ if (nameFeature) {
101
+ return obj.eGet(nameFeature) ?? '';
102
+ }
103
+ }
104
+ }
105
+ // Fallback to property access
106
+ return obj.name ?? '';
107
+ }
108
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SA6CpB,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { Command } from 'commander';
2
+ import { writeFile } from 'fs/promises';
3
+ import { EcoreLoader } from '../../loader/EcoreLoader.js';
4
+ export const initCommand = new Command('init')
5
+ .description('Initialize a GenConfig file from an Ecore model')
6
+ .requiredOption('-m, --model <path>', 'Path to .ecore model file')
7
+ .option('-o, --output <path>', 'Output path for .genconfig.xmi file')
8
+ .option('--mode <mode>', 'Generation mode: plain, decorator, or emf', 'emf')
9
+ .option('--base-package <package>', 'Base package path for generated code')
10
+ .option('--prefix <prefix>', 'Prefix for generated class names')
11
+ .option('--output-dir <dir>', 'Output directory for generated code', './generated')
12
+ .action(async (options) => {
13
+ try {
14
+ console.log('Loading Ecore model:', options.model);
15
+ // Load Ecore model
16
+ const ecoreLoader = new EcoreLoader();
17
+ const ePackage = await ecoreLoader.load(options.model);
18
+ const packageName = ePackage.getName() || 'Model';
19
+ const nsURI = ePackage.getNsURI() || `http://example.org/${packageName.toLowerCase()}`;
20
+ console.log('Loaded package:', packageName, 'nsURI:', nsURI);
21
+ // Generate prefix from package name (capitalize first letter)
22
+ const prefix = options.prefix || packageName.charAt(0).toUpperCase() + packageName.slice(1);
23
+ const basePackage = options.basePackage || 'org.example';
24
+ const mode = options.mode;
25
+ const outputDir = options.outputDir;
26
+ // Generate GenConfig XMI content
27
+ const xmiContent = generateGenConfigXMI(nsURI, mode, outputDir, prefix, basePackage);
28
+ // Determine output path
29
+ const outputPath = options.output ?? options.model.replace(/\.ecore$/, '.genconfig.xmi');
30
+ // Write file
31
+ await writeFile(outputPath, xmiContent, 'utf-8');
32
+ console.log('Created GenConfig:', outputPath);
33
+ console.log('Mode:', mode);
34
+ console.log('Prefix:', prefix);
35
+ console.log('Base package:', basePackage);
36
+ console.log('Output directory:', outputDir);
37
+ }
38
+ catch (error) {
39
+ console.error('Error:', error instanceof Error ? error.message : error);
40
+ process.exit(1);
41
+ }
42
+ });
43
+ function generateGenConfigXMI(nsURI, mode, outputDir, prefix, basePackage) {
44
+ return `<?xml version="1.0" encoding="UTF-8"?>
45
+ <genconfig:GenConfig
46
+ xmi:version="2.0"
47
+ xmlns:xmi="http://www.omg.org/XMI"
48
+ xmlns:genconfig="http://www.emfts.org/genconfig/1.0"
49
+ ecorePackage="${nsURI}#/">
50
+ <generation mode="${mode}" outputDir="${outputDir}"/>
51
+ <package prefix="${prefix}" basePackage="${basePackage}" generateFactory="true" generatePackage="true" generateIndex="true"/>
52
+ <classDefaults generateInterface="true" generateImpl="true" rootExtendsClass="BasicEObject" rootExtendsInterface="EObject"/>
53
+ <featureDefaults notify="true" property="editable"/>
54
+ </genconfig:GenConfig>
55
+ `;
56
+ }
57
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { generateCommand } from './commands/generate.js';
4
+ import { initCommand } from './commands/init.js';
5
+ import { generateRestClientCommand } from './commands/generate-rest-client.js';
6
+ const program = new Command();
7
+ program
8
+ .name('emfts-codegen')
9
+ .description('TypeScript code generator for Ecore models using emfts')
10
+ .version('1.0.0');
11
+ program.addCommand(generateCommand);
12
+ program.addCommand(initCommand);
13
+ program.addCommand(generateRestClientCommand);
14
+ program.parse();
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;AAE9C,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=debug-abstract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-abstract.d.ts","sourceRoot":"","sources":["../src/debug-abstract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { EcoreLoader } from './loader/EcoreLoader.js';
2
+ import * as EObjectHelper from './util/EObjectHelper.js';
3
+ async function test() {
4
+ const loader = new EcoreLoader();
5
+ const pkg = await loader.load('examples/model/library.ecore');
6
+ console.log('Package name:', EObjectHelper.getName(pkg));
7
+ for (const c of pkg.getEClassifiers()) {
8
+ const name = EObjectHelper.getName(c);
9
+ const hasIsAbstract = typeof c.isAbstract === 'function';
10
+ let isAbstractResult = 'N/A';
11
+ if (hasIsAbstract) {
12
+ try {
13
+ isAbstractResult = String(c.isAbstract());
14
+ }
15
+ catch (e) {
16
+ isAbstractResult = 'ERROR: ' + e.message;
17
+ }
18
+ }
19
+ const isProxy = typeof c.eIsProxy === 'function' && c.eIsProxy();
20
+ const helperResult = EObjectHelper.isAbstract(c);
21
+ console.log(`${name}: hasIsAbstract=${hasIsAbstract}, isAbstract()=${isAbstractResult}, isProxy=${isProxy}, helper=${helperResult}`);
22
+ }
23
+ }
24
+ test().catch(console.error);
25
+ //# sourceMappingURL=debug-abstract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-abstract.js","sourceRoot":"","sources":["../src/debug-abstract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,aAAa,MAAM,yBAAyB,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;QACzD,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,gBAAgB,GAAG,MAAM,CAAE,CAAS,CAAC,UAAU,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,gBAAgB,GAAG,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,OAAQ,CAAS,CAAC,QAAQ,KAAK,UAAU,IAAK,CAAS,CAAC,QAAQ,EAAE,CAAC;QACnF,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAEjD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,mBAAmB,aAAa,kBAAkB,gBAAgB,aAAa,OAAO,YAAY,YAAY,EAAE,CAAC,CAAC;IACvI,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=debug-genmodel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-genmodel.d.ts","sourceRoot":"","sources":["../src/debug-genmodel.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { EcoreLoader } from './loader/EcoreLoader.js';
2
+ import { GenModelXMILoader } from './genmodel/GenModelXMILoader.js';
3
+ import * as EObjectHelper from './util/EObjectHelper.js';
4
+ async function test() {
5
+ // Load ecore
6
+ const ecoreLoader = new EcoreLoader();
7
+ const pkg = await ecoreLoader.load('examples/model/library.ecore');
8
+ const packages = ecoreLoader.getAllPackages();
9
+ console.log('=== Loaded ecore classes ===');
10
+ for (const c of pkg.getEClassifiers()) {
11
+ const name = EObjectHelper.getName(c);
12
+ if (typeof c.isAbstract === 'function') {
13
+ console.log(name + ': isAbstract() = ' + c.isAbstract());
14
+ }
15
+ }
16
+ // Load genmodel
17
+ const genmodelLoader = new GenModelXMILoader();
18
+ const genModel = await genmodelLoader.load('examples/model/library.genmodel', packages);
19
+ console.log('\n=== GenModel ecoreClass references ===');
20
+ for (const genPkg of genModel.genPackages) {
21
+ for (const genClass of genPkg.genClasses) {
22
+ const eClass = genClass.ecoreClass;
23
+ const name = EObjectHelper.getName(eClass);
24
+ const isProxy = typeof eClass.eIsProxy === 'function' && eClass.eIsProxy();
25
+ const hasIsAbstract = typeof eClass.isAbstract === 'function';
26
+ let isAbstractResult = 'N/A';
27
+ if (hasIsAbstract) {
28
+ try {
29
+ isAbstractResult = String(eClass.isAbstract());
30
+ }
31
+ catch (e) {
32
+ isAbstractResult = 'ERROR';
33
+ }
34
+ }
35
+ const helperResult = EObjectHelper.isAbstract(eClass);
36
+ console.log(name + ': isProxy=' + isProxy + ', hasIsAbstract=' + hasIsAbstract + ', isAbstract()=' + isAbstractResult + ', helper=' + helperResult);
37
+ }
38
+ }
39
+ }
40
+ test().catch(console.error);
41
+ //# sourceMappingURL=debug-genmodel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-genmodel.js","sourceRoot":"","sources":["../src/debug-genmodel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,aAAa,MAAM,yBAAyB,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,aAAa;IACb,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,OAAQ,CAAS,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,mBAAmB,GAAI,CAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC;IAExF,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC;YACnC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,OAAQ,MAAc,CAAC,QAAQ,KAAK,UAAU,IAAK,MAAc,CAAC,QAAQ,EAAE,CAAC;YAC7F,MAAM,aAAa,GAAG,OAAQ,MAAc,CAAC,UAAU,KAAK,UAAU,CAAC;YACvE,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAC7B,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,gBAAgB,GAAG,MAAM,CAAE,MAAc,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,gBAAgB,GAAG,OAAO,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,kBAAkB,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;QACtJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,125 @@
1
+ import type { EPackage, EClass, EStructuralFeature } from '@emfts/core';
2
+ /**
3
+ * Generation mode for code output
4
+ */
5
+ export type GenConfigMode = 'emf' | 'decorator' | 'plain';
6
+ /**
7
+ * Property access mode for generated features
8
+ */
9
+ export type GenConfigPropertyMode = 'editable' | 'readonly' | 'none';
10
+ /**
11
+ * Root configuration for TypeScript code generation
12
+ */
13
+ export interface GenConfig {
14
+ /** Reference to the EPackage to generate code for */
15
+ ecorePackage: EPackage;
16
+ /** Generation settings */
17
+ generation: GenerationSettings;
18
+ /** Package settings */
19
+ package: PackageSettings;
20
+ /** Default settings for all classes */
21
+ classDefaults?: ClassDefaults;
22
+ /** Default settings for all features */
23
+ featureDefaults?: FeatureDefaults;
24
+ /** Per-class overrides */
25
+ classOverrides?: ClassOverride[];
26
+ }
27
+ /**
28
+ * Settings controlling how code is generated
29
+ */
30
+ export interface GenerationSettings {
31
+ /** Generation mode: emf, decorator, or plain */
32
+ mode: GenConfigMode;
33
+ /** Output directory for generated files */
34
+ outputDir: string;
35
+ /** File extension (default: .ts) */
36
+ fileExtension?: string;
37
+ /** Custom header comment */
38
+ headerComment?: string;
39
+ }
40
+ /**
41
+ * Settings for package structure and artifacts
42
+ */
43
+ export interface PackageSettings {
44
+ /** Prefix for Package/Factory classes (e.g. 'Library' -> LibraryPackage) */
45
+ prefix: string;
46
+ /** Base package path (e.g. 'org.example' -> org/example/) */
47
+ basePackage?: string;
48
+ /** Generate factory class (default: true) */
49
+ generateFactory?: boolean;
50
+ /** Generate package class (default: true) */
51
+ generatePackage?: boolean;
52
+ /** Generate index.ts barrel file (default: true) */
53
+ generateIndex?: boolean;
54
+ }
55
+ /**
56
+ * Default settings for all generated classes
57
+ */
58
+ export interface ClassDefaults {
59
+ /** Generate interface for each class (default: true) */
60
+ generateInterface?: boolean;
61
+ /** Generate implementation class (default: true) */
62
+ generateImpl?: boolean;
63
+ /** Root class to extend (default: BasicEObject) */
64
+ rootExtendsClass?: string;
65
+ /** Root interface to implement (default: EObject) */
66
+ rootExtendsInterface?: string;
67
+ }
68
+ /**
69
+ * Default settings for all generated features
70
+ */
71
+ export interface FeatureDefaults {
72
+ /** Generate notification in setters (default: true for EMF mode) */
73
+ notify?: boolean;
74
+ /** Property access mode (default: editable) */
75
+ property?: GenConfigPropertyMode;
76
+ }
77
+ /**
78
+ * Override settings for a specific EClass
79
+ */
80
+ export interface ClassOverride {
81
+ /** Reference to the EClass */
82
+ ecoreClass: EClass;
83
+ /** Override: generate interface */
84
+ generateInterface?: boolean;
85
+ /** Override: generate implementation */
86
+ generateImpl?: boolean;
87
+ /** Custom extends class */
88
+ extendsClass?: string;
89
+ /** Additional interfaces to implement */
90
+ implementsInterfaces?: string[];
91
+ /** Per-feature overrides */
92
+ featureOverrides?: FeatureOverride[];
93
+ }
94
+ /**
95
+ * Override settings for a specific EStructuralFeature
96
+ */
97
+ export interface FeatureOverride {
98
+ /** Reference to the EStructuralFeature */
99
+ ecoreFeature: EStructuralFeature;
100
+ /** Override: generate notification */
101
+ notify?: boolean;
102
+ /** Override: property access mode */
103
+ property?: GenConfigPropertyMode;
104
+ /** Custom getter body */
105
+ customGetter?: string;
106
+ /** Custom setter body */
107
+ customSetter?: string;
108
+ }
109
+ /**
110
+ * Create default generation settings
111
+ */
112
+ export declare function createDefaultGenerationSettings(partial?: Partial<GenerationSettings>): GenerationSettings;
113
+ /**
114
+ * Create default package settings
115
+ */
116
+ export declare function createDefaultPackageSettings(prefix: string, partial?: Partial<PackageSettings>): PackageSettings;
117
+ /**
118
+ * Create default class defaults
119
+ */
120
+ export declare function createDefaultClassDefaults(partial?: Partial<ClassDefaults>): ClassDefaults;
121
+ /**
122
+ * Create default feature defaults
123
+ */
124
+ export declare function createDefaultFeatureDefaults(mode: GenConfigMode, partial?: Partial<FeatureDefaults>): FeatureDefaults;
125
+ //# sourceMappingURL=GenConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenConfig.d.ts","sourceRoot":"","sources":["../../src/genconfig/GenConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Create default generation settings
3
+ */
4
+ export function createDefaultGenerationSettings(partial) {
5
+ return {
6
+ mode: 'emf',
7
+ outputDir: './generated',
8
+ fileExtension: '.ts',
9
+ ...partial
10
+ };
11
+ }
12
+ /**
13
+ * Create default package settings
14
+ */
15
+ export function createDefaultPackageSettings(prefix, partial) {
16
+ return {
17
+ prefix,
18
+ generateFactory: true,
19
+ generatePackage: true,
20
+ generateIndex: true,
21
+ ...partial
22
+ };
23
+ }
24
+ /**
25
+ * Create default class defaults
26
+ */
27
+ export function createDefaultClassDefaults(partial) {
28
+ return {
29
+ generateInterface: true,
30
+ generateImpl: true,
31
+ rootExtendsClass: 'BasicEObject',
32
+ rootExtendsInterface: 'EObject',
33
+ ...partial
34
+ };
35
+ }
36
+ /**
37
+ * Create default feature defaults
38
+ */
39
+ export function createDefaultFeatureDefaults(mode, partial) {
40
+ return {
41
+ notify: mode === 'emf',
42
+ property: 'editable',
43
+ ...partial
44
+ };
45
+ }
46
+ //# sourceMappingURL=GenConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenConfig.js","sourceRoot":"","sources":["../../src/genconfig/GenConfig.ts"],"names":[],"mappings":"AA+IA;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,OAAqC;IACnF,OAAO;QACL,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,aAAa;QACxB,aAAa,EAAE,KAAK;QACpB,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAc,EAAE,OAAkC;IAC7F,OAAO;QACL,MAAM;QACN,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,IAAI;QACnB,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAgC;IACzE,OAAO;QACL,iBAAiB,EAAE,IAAI;QACvB,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,cAAc;QAChC,oBAAoB,EAAE,SAAS;QAC/B,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAmB,EAAE,OAAkC;IAClG,OAAO;QACL,MAAM,EAAE,IAAI,KAAK,KAAK;QACtB,QAAQ,EAAE,UAAU;QACpB,GAAG,OAAO;KACX,CAAC;AACJ,CAAC"}