@emfts/codegen 0.0.1-next.8 → 0.0.2-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 (152) hide show
  1. package/dist/cli/commands/generate.d.ts.map +1 -1
  2. package/dist/cli/commands/generate.js +12 -12
  3. package/dist/cli/commands/generate.js.map +1 -1
  4. package/dist/cli/commands/init.d.ts +6 -0
  5. package/dist/cli/commands/init.d.ts.map +1 -1
  6. package/dist/cli/commands/init.js +69 -16
  7. package/dist/cli/commands/init.js.map +1 -1
  8. package/dist/cli/import-mappings.d.ts +5 -0
  9. package/dist/cli/import-mappings.d.ts.map +1 -0
  10. package/dist/cli/import-mappings.js +16 -0
  11. package/dist/cli/import-mappings.js.map +1 -0
  12. package/dist/genconfig/GenConfig.d.ts +14 -0
  13. package/dist/genconfig/GenConfig.d.ts.map +1 -1
  14. package/dist/genconfig/GenConfig.js.map +1 -1
  15. package/dist/genconfig/GenConfigConverter.d.ts.map +1 -1
  16. package/dist/genconfig/GenConfigConverter.js +4 -1
  17. package/dist/genconfig/GenConfigConverter.js.map +1 -1
  18. package/dist/genconfig/GenConfigLoader.d.ts +4 -4
  19. package/dist/genconfig/GenConfigLoader.d.ts.map +1 -1
  20. package/dist/genconfig/GenConfigLoader.js +38 -27
  21. package/dist/genconfig/GenConfigLoader.js.map +1 -1
  22. package/dist/genconfig/model/ClassDefaults.d.ts +12 -0
  23. package/dist/genconfig/model/ClassDefaults.d.ts.map +1 -0
  24. package/dist/genconfig/model/ClassDefaults.js +8 -0
  25. package/dist/genconfig/model/ClassDefaults.js.map +1 -0
  26. package/dist/genconfig/model/ClassDefaultsImpl.d.ts +46 -0
  27. package/dist/genconfig/model/ClassDefaultsImpl.d.ts.map +1 -0
  28. package/dist/genconfig/model/ClassDefaultsImpl.js +205 -0
  29. package/dist/genconfig/model/ClassDefaultsImpl.js.map +1 -0
  30. package/dist/genconfig/model/ClassOverride.d.ts +15 -0
  31. package/dist/genconfig/model/ClassOverride.d.ts.map +1 -0
  32. package/dist/genconfig/model/ClassOverride.js +8 -0
  33. package/dist/genconfig/model/ClassOverride.js.map +1 -0
  34. package/dist/genconfig/model/ClassOverrideImpl.d.ts +53 -0
  35. package/dist/genconfig/model/ClassOverrideImpl.d.ts.map +1 -0
  36. package/dist/genconfig/model/ClassOverrideImpl.js +248 -0
  37. package/dist/genconfig/model/ClassOverrideImpl.js.map +1 -0
  38. package/dist/genconfig/model/FeatureDefaults.d.ts +11 -0
  39. package/dist/genconfig/model/FeatureDefaults.d.ts.map +1 -0
  40. package/dist/genconfig/model/FeatureDefaults.js +8 -0
  41. package/dist/genconfig/model/FeatureDefaults.js.map +1 -0
  42. package/dist/genconfig/model/FeatureDefaultsImpl.d.ts +39 -0
  43. package/dist/genconfig/model/FeatureDefaultsImpl.d.ts.map +1 -0
  44. package/dist/genconfig/model/FeatureDefaultsImpl.js +136 -0
  45. package/dist/genconfig/model/FeatureDefaultsImpl.js.map +1 -0
  46. package/dist/genconfig/model/FeatureOverride.d.ts +14 -0
  47. package/dist/genconfig/model/FeatureOverride.d.ts.map +1 -0
  48. package/dist/genconfig/model/FeatureOverride.js +8 -0
  49. package/dist/genconfig/model/FeatureOverride.js.map +1 -0
  50. package/dist/genconfig/model/FeatureOverrideImpl.d.ts +51 -0
  51. package/dist/genconfig/model/FeatureOverrideImpl.d.ts.map +1 -0
  52. package/dist/genconfig/model/FeatureOverrideImpl.js +241 -0
  53. package/dist/genconfig/model/FeatureOverrideImpl.js.map +1 -0
  54. package/dist/genconfig/model/GenConfig.d.ts +21 -0
  55. package/dist/genconfig/model/GenConfig.d.ts.map +1 -0
  56. package/dist/genconfig/model/GenConfig.js +8 -0
  57. package/dist/genconfig/model/GenConfig.js.map +1 -0
  58. package/dist/genconfig/model/GenConfigFactory.d.ts +56 -0
  59. package/dist/genconfig/model/GenConfigFactory.d.ts.map +1 -0
  60. package/dist/genconfig/model/GenConfigFactory.js +108 -0
  61. package/dist/genconfig/model/GenConfigFactory.js.map +1 -0
  62. package/dist/genconfig/model/GenConfigImpl.d.ts +62 -0
  63. package/dist/genconfig/model/GenConfigImpl.d.ts.map +1 -0
  64. package/dist/genconfig/model/GenConfigImpl.js +283 -0
  65. package/dist/genconfig/model/GenConfigImpl.js.map +1 -0
  66. package/dist/genconfig/model/GenConfigPackage.d.ts +68 -0
  67. package/dist/genconfig/model/GenConfigPackage.d.ts.map +1 -0
  68. package/dist/genconfig/model/GenConfigPackage.js +436 -0
  69. package/dist/genconfig/model/GenConfigPackage.js.map +1 -0
  70. package/dist/genconfig/model/GenerationMode.d.ts +19 -0
  71. package/dist/genconfig/model/GenerationMode.d.ts.map +1 -0
  72. package/dist/genconfig/model/GenerationMode.js +34 -0
  73. package/dist/genconfig/model/GenerationMode.js.map +1 -0
  74. package/dist/genconfig/model/GenerationSettings.d.ts +14 -0
  75. package/dist/genconfig/model/GenerationSettings.d.ts.map +1 -0
  76. package/dist/genconfig/model/GenerationSettings.js +8 -0
  77. package/dist/genconfig/model/GenerationSettings.js.map +1 -0
  78. package/dist/genconfig/model/GenerationSettingsImpl.d.ts +51 -0
  79. package/dist/genconfig/model/GenerationSettingsImpl.d.ts.map +1 -0
  80. package/dist/genconfig/model/GenerationSettingsImpl.js +241 -0
  81. package/dist/genconfig/model/GenerationSettingsImpl.js.map +1 -0
  82. package/dist/genconfig/model/PackageSettings.d.ts +13 -0
  83. package/dist/genconfig/model/PackageSettings.d.ts.map +1 -0
  84. package/dist/genconfig/model/PackageSettings.js +8 -0
  85. package/dist/genconfig/model/PackageSettings.js.map +1 -0
  86. package/dist/genconfig/model/PackageSettingsImpl.d.ts +50 -0
  87. package/dist/genconfig/model/PackageSettingsImpl.d.ts.map +1 -0
  88. package/dist/genconfig/model/PackageSettingsImpl.js +240 -0
  89. package/dist/genconfig/model/PackageSettingsImpl.js.map +1 -0
  90. package/dist/genconfig/model/PropertyMode.d.ts +19 -0
  91. package/dist/genconfig/model/PropertyMode.d.ts.map +1 -0
  92. package/dist/genconfig/model/PropertyMode.js +34 -0
  93. package/dist/genconfig/model/PropertyMode.js.map +1 -0
  94. package/dist/genconfig/model/ReferencedPackage.d.ts +10 -0
  95. package/dist/genconfig/model/ReferencedPackage.d.ts.map +1 -0
  96. package/dist/genconfig/model/ReferencedPackage.js +8 -0
  97. package/dist/genconfig/model/ReferencedPackage.js.map +1 -0
  98. package/dist/genconfig/model/ReferencedPackageImpl.d.ts +38 -0
  99. package/dist/genconfig/model/ReferencedPackageImpl.d.ts.map +1 -0
  100. package/dist/genconfig/model/ReferencedPackageImpl.js +135 -0
  101. package/dist/genconfig/model/ReferencedPackageImpl.js.map +1 -0
  102. package/dist/genconfig/model/index.d.ts +21 -0
  103. package/dist/genconfig/model/index.d.ts.map +1 -0
  104. package/dist/genconfig/model/index.js +22 -0
  105. package/dist/genconfig/model/index.js.map +1 -0
  106. package/dist/generator/CodeGenerator.d.ts.map +1 -1
  107. package/dist/generator/CodeGenerator.js +2 -1
  108. package/dist/generator/CodeGenerator.js.map +1 -1
  109. package/dist/generator/ImportResolver.d.ts.map +1 -1
  110. package/dist/generator/ImportResolver.js +28 -5
  111. package/dist/generator/ImportResolver.js.map +1 -1
  112. package/dist/generator/TypeMapper.d.ts +2 -0
  113. package/dist/generator/TypeMapper.d.ts.map +1 -1
  114. package/dist/generator/TypeMapper.js +48 -3
  115. package/dist/generator/TypeMapper.js.map +1 -1
  116. package/dist/generator/modes/BaseGenerator.d.ts +6 -0
  117. package/dist/generator/modes/BaseGenerator.d.ts.map +1 -1
  118. package/dist/generator/modes/BaseGenerator.js +21 -1
  119. package/dist/generator/modes/BaseGenerator.js.map +1 -1
  120. package/dist/generator/modes/DecoratorGenerator.d.ts +5 -0
  121. package/dist/generator/modes/DecoratorGenerator.d.ts.map +1 -1
  122. package/dist/generator/modes/DecoratorGenerator.js +11 -2
  123. package/dist/generator/modes/DecoratorGenerator.js.map +1 -1
  124. package/dist/generator/modes/EmfGenerator.d.ts +1 -0
  125. package/dist/generator/modes/EmfGenerator.d.ts.map +1 -1
  126. package/dist/generator/modes/EmfGenerator.js +6 -2
  127. package/dist/generator/modes/EmfGenerator.js.map +1 -1
  128. package/dist/genmodel/GenModel.d.ts +2 -0
  129. package/dist/genmodel/GenModel.d.ts.map +1 -1
  130. package/dist/genmodel/GenModel.js.map +1 -1
  131. package/dist/index.js +15 -2
  132. package/dist/index.js.map +1 -1
  133. package/dist/loader/EcoreLoader.d.ts +4 -0
  134. package/dist/loader/EcoreLoader.d.ts.map +1 -1
  135. package/dist/loader/EcoreLoader.js +20 -0
  136. package/dist/loader/EcoreLoader.js.map +1 -1
  137. package/dist/templates/partials/decorator/class-file.ejs +99 -27
  138. package/dist/templates/partials/decorator/enum-file.ejs +1 -1
  139. package/dist/templates/partials/decorator/interface-file.ejs +1 -7
  140. package/dist/templates/partials/decorator/model-annotations.ejs +7 -6
  141. package/dist/templates/partials/decorator/package-file.ejs +4 -2
  142. package/dist/templates/partials/emf/class-file.ejs +75 -10
  143. package/dist/templates/partials/emf/factory-file.ejs +3 -3
  144. package/dist/templates/partials/emf/index-file.ejs +5 -5
  145. package/dist/templates/partials/emf/interface-file.ejs +5 -0
  146. package/dist/templates/partials/emf/package-file.ejs +6 -0
  147. package/dist/templates/partials/plain/class-file.ejs +1 -7
  148. package/dist/templates/partials/plain/interface-file.ejs +1 -7
  149. package/dist/templates/partials/plain/package-file.ejs +1 -1
  150. package/model/genconfig.ecore +21 -0
  151. package/model/genconfig.genconfig.xmi +11 -0
  152. package/package.json +3 -2
@@ -4,9 +4,27 @@
4
4
  const imports = importResolver.resolveImportsForClass(eClass, genPackage, 'emf');
5
5
  const hardcodedCoreTypes = ['BasicEObject', 'EClass', 'EStructuralFeature'];
6
6
  const coreTypeImports = ['EClass', 'EStructuralFeature'];
7
+ const coreValueImports = [];
7
8
  const typeOnlyImports = [];
8
9
  const valueImports = [];
9
10
  const importedNames = new Set();
11
+ // Check if any feature is many-valued (needs EList imports)
12
+ const useEList = typeMapper.useEList;
13
+ const hasManyFeature = features.some(gf => isMany(gf.ecoreFeature));
14
+ const hasManyMixin = (mixinFeatures || []).some(mf => isMany(mf.feature));
15
+ if (useEList && (hasManyFeature || hasManyMixin)) {
16
+ coreTypeImports.push('EList', 'EReference');
17
+ // Determine which factory functions are needed
18
+ const needsContainment = features.some(gf => isMany(gf.ecoreFeature) && isContainment(gf.ecoreFeature))
19
+ || (mixinFeatures || []).some(mf => isMany(mf.feature) && isContainment(mf.feature));
20
+ const needsEObjectList = features.some(gf => isMany(gf.ecoreFeature) && !isContainment(gf.ecoreFeature) && typeMapper.isReference(gf.ecoreFeature))
21
+ || (mixinFeatures || []).some(mf => isMany(mf.feature) && !isContainment(mf.feature) && typeMapper.isReference(mf.feature));
22
+ const needsBasicList = features.some(gf => isMany(gf.ecoreFeature) && typeMapper.isAttribute(gf.ecoreFeature))
23
+ || (mixinFeatures || []).some(mf => isMany(mf.feature) && typeMapper.isAttribute(mf.feature));
24
+ if (needsContainment) coreValueImports.push('createContainmentEList');
25
+ if (needsEObjectList) coreValueImports.push('createEObjectEList');
26
+ if (needsBasicList) coreValueImports.push('createBasicEList');
27
+ }
10
28
  for (const imp of imports) {
11
29
  if (imp.typeName === className || imp.typeName === interfaceName || imp.typeName === extendsClass) continue;
12
30
  if (hardcodedCoreTypes.includes(imp.typeName)) continue;
@@ -46,6 +64,9 @@ for (const imp of (mixinImports || [])) {
46
64
  <% if (!extendsImport) { -%>
47
65
  import { BasicEObject } from '@emfts/core';
48
66
  <% } -%>
67
+ <% if (coreValueImports.length > 0) { -%>
68
+ import { <%- coreValueImports.join(', ') %> } from '@emfts/core';
69
+ <% } -%>
49
70
  import type { <%- coreTypeImports.join(', ') %> } from '@emfts/core';
50
71
  <% for (const imp of typeOnlyImports) { -%>
51
72
  import type { <%- imp.typeName %> } from '<%- imp.importPath %>';
@@ -56,8 +77,8 @@ import { <%- imp.typeName %> } from '<%- imp.importPath %>';
56
77
  <% if (extendsImport) { -%>
57
78
  import { <%- extendsClass %> } from '<%- extendsImport %>';
58
79
  <% } -%>
59
- import type { <%- interfaceName %> } from './<%- interfaceName %>';
60
- import { <%- packagePrefix %>Package } from './<%- packagePrefix %>Package';
80
+ import type { <%- interfaceName %> } from './<%- interfaceName %>.js';
81
+ import { <%- packagePrefix %>Package } from './<%- packagePrefix %>Package.js';
61
82
 
62
83
  /**
63
84
  * Implementation of <%- interfaceName %>
@@ -80,14 +101,14 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
80
101
  const defaultValue = typeMapper.getDefaultValue(feature);
81
102
  const featureIsMany = isMany(feature);
82
103
  -%>
83
- private _<%- featureName %><% if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
104
+ private _<%- featureName %><% if (useEList && featureIsMany) { %>!<% } else if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
84
105
  <% } -%>
85
106
  <% for (const mf of (mixinFeatures || [])) {
86
107
  const featureType = typeMapper.mapFeature(mf.feature);
87
108
  const defaultValue = typeMapper.getDefaultValue(mf.feature);
88
109
  const featureIsMany = isMany(mf.feature);
89
110
  -%>
90
- private _<%- mf.name %><% if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
111
+ private _<%- mf.name %><% if (useEList && featureIsMany) { %>!<% } else if (!featureIsMany && defaultValue === null) { %>?<% } %>: <%- featureType %><% if (defaultValue !== null) { %> = <%- defaultValue %><% } %>;
91
112
  <% } -%>
92
113
 
93
114
  /**
@@ -105,6 +126,27 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
105
126
  const featureIsMany = isMany(feature);
106
127
  const upperName = toUpperSnake(featureName);
107
128
  -%>
129
+ <% if (useEList && featureIsMany) {
130
+ // EList lazy-init getter: creates the right EList on first access
131
+ const isRef = typeMapper.isReference(feature);
132
+ const isCont = isRef && isContainment(feature);
133
+ let factoryCall;
134
+ if (isCont) {
135
+ factoryCall = `createContainmentEList<any>(this, this.eClass().getEStructuralFeature('${featureName}') as EReference)`;
136
+ } else if (isRef) {
137
+ factoryCall = `createEObjectEList(this, this.eClass().getEStructuralFeature('${featureName}') as EReference) as unknown as ${featureType}`;
138
+ } else {
139
+ factoryCall = `createBasicEList<any>(this, this.eClass().getEStructuralFeature('${featureName}')!)`;
140
+ }
141
+ -%>
142
+ get <%- featureName %>(): <%- featureType %> {
143
+ if (!this._<%- featureName %>) {
144
+ this._<%- featureName %> = <%- factoryCall %>;
145
+ }
146
+ return this._<%- featureName %>;
147
+ }
148
+
149
+ <% } else { -%>
108
150
  get <%- featureName %>(): <%- featureType %> {
109
151
  return this._<%- featureName %><% if (!featureIsMany) { %>!<% } %>;
110
152
  }
@@ -134,6 +176,7 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
134
176
  <% } -%>
135
177
  }
136
178
 
179
+ <% } -%>
137
180
  <% } -%>
138
181
  <% } -%>
139
182
  <% for (const mf of (mixinFeatures || [])) {
@@ -177,18 +220,32 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
177
220
  const featureID = this.eClass().getFeatureID(feature);
178
221
  switch (featureID) {
179
222
  <% for (const fid of featureIds) {
180
- const featureType = typeMapper.mapFeature(fid.feature.ecoreFeature);
223
+ const feat = fid.feature.ecoreFeature;
224
+ const featureType = typeMapper.mapFeature(feat);
225
+ const featureName = getName(feat);
226
+ const featureIsMany = isMany(feat);
181
227
  -%>
182
228
  case <%- className %>.<%- fid.name %>:
183
- this.<%- getName(fid.feature.ecoreFeature) %> = newValue as <%- featureType %>;
229
+ <% if (useEList && featureIsMany) { -%>
230
+ this.<%- featureName %>.clear();
231
+ this.<%- featureName %>.addAll(newValue as any[]);
232
+ <% } else { -%>
233
+ this.<%- featureName %> = newValue as <%- featureType %>;
234
+ <% } -%>
184
235
  super.eSet(feature, newValue);
185
236
  break;
186
237
  <% } -%>
187
238
  <% for (const mf of (mixinFeatures || [])) {
188
239
  const featureType = typeMapper.mapFeature(mf.feature);
240
+ const featureIsMany = isMany(mf.feature);
189
241
  -%>
190
242
  case <%- className %>.<%- mf.upperName %>:
243
+ <% if (useEList && featureIsMany) { -%>
244
+ this.<%- mf.name %>.clear();
245
+ this.<%- mf.name %>.addAll(newValue as any[]);
246
+ <% } else { -%>
191
247
  this.<%- mf.name %> = newValue as <%- featureType %>;
248
+ <% } -%>
192
249
  super.eSet(feature, newValue);
193
250
  break;
194
251
  <% } -%>
@@ -210,7 +267,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
210
267
  const featureName = getName(feature);
211
268
  -%>
212
269
  case <%- className %>.<%- fid.name %>:
213
- <% if (featureIsMany) { -%>
270
+ <% if (useEList && featureIsMany) { -%>
271
+ return this._<%- featureName %> !== undefined && !this._<%- featureName %>.isEmpty();
272
+ <% } else if (featureIsMany) { -%>
214
273
  return this._<%- featureName %> !== undefined && this._<%- featureName %>.length > 0;
215
274
  <% } else if (defaultValue !== null) { -%>
216
275
  return this._<%- featureName %> !== <%- defaultValue %>;
@@ -223,7 +282,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
223
282
  const defaultValue = typeMapper.getDefaultValue(mf.feature);
224
283
  -%>
225
284
  case <%- className %>.<%- mf.upperName %>:
226
- <% if (featureIsMany) { -%>
285
+ <% if (useEList && featureIsMany) { -%>
286
+ return this._<%- mf.name %> !== undefined && !this._<%- mf.name %>.isEmpty();
287
+ <% } else if (featureIsMany) { -%>
227
288
  return this._<%- mf.name %> !== undefined && this._<%- mf.name %>.length > 0;
228
289
  <% } else if (defaultValue !== null) { -%>
229
290
  return this._<%- mf.name %> !== <%- defaultValue %>;
@@ -249,7 +310,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
249
310
  const featureName = getName(feature);
250
311
  -%>
251
312
  case <%- className %>.<%- fid.name %>:
252
- <% if (featureIsMany) { -%>
313
+ <% if (useEList && featureIsMany) { -%>
314
+ if (this._<%- featureName %>) this._<%- featureName %>.clear();
315
+ <% } else if (featureIsMany) { -%>
253
316
  this._<%- featureName %> = [];
254
317
  <% } else if (defaultValue !== null) { -%>
255
318
  this._<%- featureName %> = <%- defaultValue %>;
@@ -263,7 +326,9 @@ export <% if (isAbstract) { %>abstract <% } %>class <%- className %> extends <%-
263
326
  const defaultValue = typeMapper.getDefaultValue(mf.feature);
264
327
  -%>
265
328
  case <%- className %>.<%- mf.upperName %>:
266
- <% if (featureIsMany) { -%>
329
+ <% if (useEList && featureIsMany) { -%>
330
+ if (this._<%- mf.name %>) this._<%- mf.name %>.clear();
331
+ <% } else if (featureIsMany) { -%>
267
332
  this._<%- mf.name %> = [];
268
333
  <% } else if (defaultValue !== null) { -%>
269
334
  this._<%- mf.name %> = <%- defaultValue %>;
@@ -2,13 +2,13 @@
2
2
 
3
3
  import { BasicEFactory } from '@emfts/core';
4
4
  import type { EClass, EObject } from '@emfts/core';
5
- import { <%- packageName %>Package } from './<%- packageName %>Package';
5
+ import { <%- packageName %>Package } from './<%- packageName %>Package.js';
6
6
  <% for (const genClass of concreteClasses) {
7
7
  const className = genClass.ecoreClass.getName();
8
8
  const implName = genClass.implClassName || (className + 'Impl');
9
9
  -%>
10
- import type { <%- className %> } from './<%- className %>';
11
- import { <%- implName %> } from './<%- implName %>';
10
+ import type { <%- className %> } from './<%- className %>.js';
11
+ import { <%- implName %> } from './<%- implName %>.js';
12
12
  <% } -%>
13
13
 
14
14
  /**
@@ -1,14 +1,14 @@
1
1
  <%- header %>
2
2
 
3
3
  // Package and Factory
4
- export { <%- packageName %>Package } from './<%- packageName %>Package';
5
- export { <%- packageName %>Factory } from './<%- packageName %>Factory';
4
+ export { <%- packageName %>Package } from './<%- packageName %>Package.js';
5
+ export { <%- packageName %>Factory } from './<%- packageName %>Factory.js';
6
6
 
7
7
  // Interfaces
8
8
  <% for (const genClass of genClasses) {
9
9
  const name = getName(genClass.ecoreClass);
10
10
  -%>
11
- export type { <%- name %> } from './<%- name %>';
11
+ export type { <%- name %> } from './<%- name %>.js';
12
12
  <% } -%>
13
13
 
14
14
  // Implementations (including abstract classes, as they're extended by subclasses)
@@ -16,7 +16,7 @@ export type { <%- name %> } from './<%- name %>';
16
16
  if (!checkIsInterface(genClass.ecoreClass)) {
17
17
  const implName = genClass.implClassName || (getName(genClass.ecoreClass) + 'Impl');
18
18
  -%>
19
- export { <%- implName %> } from './<%- implName %>';
19
+ export { <%- implName %> } from './<%- implName %>.js';
20
20
  <%
21
21
  }
22
22
  } -%>
@@ -25,5 +25,5 @@ export { <%- implName %> } from './<%- implName %>';
25
25
  <% for (const genEnum of genEnums) {
26
26
  const name = getName(genEnum.ecoreEnum);
27
27
  -%>
28
- export { <%- name %>, get<%- name %>, get<%- name %>ByLiteral } from './<%- name %>';
28
+ export { <%- name %>, get<%- name %>, get<%- name %>ByLiteral } from './<%- name %>.js';
29
29
  <% } -%>
@@ -4,6 +4,11 @@
4
4
  const imports = importResolver.resolveImportsForClass(eClass, genPackage, 'emf');
5
5
  const coreTypeImports = ['EObject'];
6
6
  const otherTypeImports = [];
7
+ // Add EList import if any feature is many-valued and useEList is on
8
+ const useEList = typeMapper.useEList;
9
+ if (useEList && features.some(gf => isMany(gf.ecoreFeature))) {
10
+ coreTypeImports.push('EList');
11
+ }
7
12
  for (const imp of imports) {
8
13
  if (imp.typeName === interfaceName) continue;
9
14
  if (imp.importPath === '@emfts/core') {
@@ -94,6 +94,7 @@ if (needsRegistryImport) coreImports.push('EPackageRegistry');
94
94
  -%>
95
95
  import { <%- coreImports.join(', ') %> } from '@emfts/core';
96
96
  import type { EClass, EAttribute, EReference, EEnum } from '@emfts/core';
97
+ import { <%- packageName %>Factory } from './<%- packageName %>Factory.js';
97
98
 
98
99
  /**
99
100
  * <%- packageName %> Package
@@ -138,6 +139,11 @@ export class <%- packageName %>Package extends BasicEPackage {
138
139
  * Initialize package contents
139
140
  */
140
141
  private init(): void {
142
+ // Wire the generated factory so loaded/created instances are typed Impls.
143
+ // eINSTANCE is already assigned at this point, so the factory's back
144
+ // reference to the package resolves without re-entering init()
145
+ this.setEFactoryInstance(<%- packageName %>Factory.eINSTANCE);
146
+
141
147
  <% for (const genClass of genClasses) {
142
148
  const eClass = genClass.ecoreClass;
143
149
  const className = getName(eClass);
@@ -60,14 +60,8 @@ if (superTypes && superTypes.length > 0) {
60
60
  const op = genOp.ecoreOperation;
61
61
  const opName = op.getName();
62
62
  const returnType = op.getEType() ? typeMapper.mapClassifier(op.getEType()) : 'void';
63
- const params = [];
64
- for (const param of op.getEParameters()) {
65
- const paramName = param.getName();
66
- const paramType = typeMapper.mapClassifier(param.getEType());
67
- params.push(`${paramName}: ${paramType}`);
68
- }
69
63
  -%>
70
- <%- opName %>(<%- params.join(', ') %>): <%- returnType %> {
64
+ <%- opName %>(<%- mapParams(op) %>): <%- returnType %> {
71
65
  throw new Error('<%- opName %> not implemented');
72
66
  }
73
67
 
@@ -49,13 +49,7 @@ if (superTypes && superTypes.length > 0) {
49
49
  const op = genOp.ecoreOperation;
50
50
  const opName = op.getName();
51
51
  const returnType = op.getEType() ? typeMapper.mapClassifier(op.getEType()) : 'void';
52
- const params = [];
53
- for (const param of op.getEParameters()) {
54
- const paramName = param.getName();
55
- const paramType = typeMapper.mapClassifier(param.getEType());
56
- params.push(`${paramName}: ${paramType}`);
57
- }
58
52
  -%>
59
- <%- opName %>(<%- params.join(', ') %>): <%- returnType %>;
53
+ <%- opName %>(<%- mapParams(op) %>): <%- returnType %>;
60
54
  <% } -%>
61
55
  }
@@ -2,5 +2,5 @@
2
2
 
3
3
  // Re-export all types from this package
4
4
  <% for (const exp of exports) { -%>
5
- export * from './<%- exp %>';
5
+ export * from './<%- exp %>.js';
6
6
  <% } -%>
@@ -19,6 +19,22 @@
19
19
  <eStructuralFeatures xsi:type="ecore:EReference" name="classDefaults" eType="#//ClassDefaults" containment="true"/>
20
20
  <eStructuralFeatures xsi:type="ecore:EReference" name="featureDefaults" eType="#//FeatureDefaults" containment="true"/>
21
21
  <eStructuralFeatures xsi:type="ecore:EReference" name="classOverrides" upperBound="-1" eType="#//ClassOverride" containment="true"/>
22
+ <eStructuralFeatures xsi:type="ecore:EReference" name="referencedPackages" upperBound="-1" eType="#//ReferencedPackage" containment="true">
23
+ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
24
+ <details key="documentation" value="Import path mappings for cross-package references (equivalent of usedGenPackages in EMF Java genmodels)"/>
25
+ </eAnnotations>
26
+ </eStructuralFeatures>
27
+ </eClassifiers>
28
+
29
+ <!-- ============================================ -->
30
+ <!-- REFERENCED PACKAGE -->
31
+ <!-- ============================================ -->
32
+ <eClassifiers xsi:type="ecore:EClass" name="ReferencedPackage">
33
+ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
34
+ <details key="documentation" value="Maps the nsURI of an external EPackage to the TypeScript import path of its generated code"/>
35
+ </eAnnotations>
36
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="nsURI" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
37
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="importPath" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
22
38
  </eClassifiers>
23
39
 
24
40
  <!-- ============================================ -->
@@ -32,6 +48,11 @@
32
48
  <eStructuralFeatures xsi:type="ecore:EAttribute" name="outputDir" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral="./generated"/>
33
49
  <eStructuralFeatures xsi:type="ecore:EAttribute" name="fileExtension" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral=".ts"/>
34
50
  <eStructuralFeatures xsi:type="ecore:EAttribute" name="headerComment" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
51
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="annotationsPackage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
52
+ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
53
+ <details key="documentation" value="Decorator mode: import ModelClass/Attribute/... decorators from this package instead of generating ModelAnnotations per model"/>
54
+ </eAnnotations>
55
+ </eStructuralFeatures>
35
56
  </eClassifiers>
36
57
 
37
58
  <eClassifiers xsi:type="ecore:EEnum" name="GenerationMode">
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <genconfig:GenConfig
3
+ xmi:version="2.0"
4
+ xmlns:xmi="http://www.omg.org/XMI"
5
+ xmlns:genconfig="http://www.emfts.org/genconfig/1.0"
6
+ ecorePackage="http://www.emfts.org/genconfig/1.0#/">
7
+ <generation mode="emf" outputDir="./src/genconfig"/>
8
+ <package prefix="GenConfig" basePackage="model" generateFactory="true" generatePackage="true" generateIndex="true"/>
9
+ <classDefaults generateInterface="true" generateImpl="true" rootExtendsClass="BasicEObject" rootExtendsInterface="EObject"/>
10
+ <featureDefaults notify="true" property="editable"/>
11
+ </genconfig:GenConfig>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emfts/codegen",
3
- "version": "0.0.1-next.8",
3
+ "version": "0.0.2-next.1",
4
4
  "description": "TypeScript code generator for Ecore models using emfts",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,6 +16,7 @@
16
16
  },
17
17
  "scripts": {
18
18
  "build": "tsc && rm -rf dist/templates && cp -r src/templates dist/templates",
19
+ "generate:genconfig": "npm run build && node dist/cli/index.js generate -m model/genconfig.ecore -c model/genconfig.genconfig.xmi && npm run build",
19
20
  "watch": "tsc --watch",
20
21
  "test": "vitest",
21
22
  "test:run": "vitest run",
@@ -45,7 +46,7 @@
45
46
  "dependencies": {
46
47
  "commander": "^12.0.0",
47
48
  "ejs": "^3.1.10",
48
- "@emfts/core": "^0.1.1-next.2",
49
+ "@emfts/core": "^0.2.0-next.1",
49
50
  "sax": "^1.4.4"
50
51
  },
51
52
  "devDependencies": {