@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
@@ -0,0 +1,488 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { writeFile, mkdir } from 'fs/promises';
3
+ import { dirname, join } from 'path';
4
+ import { getFeatureValue, getName } from '../util/EObjectHelper.js';
5
+ /**
6
+ * Generates TypeScript fetch clients from rest-api.ecore + XMI instance
7
+ */
8
+ export class RestClientGenerator {
9
+ options;
10
+ constructor(options) {
11
+ this.options = options;
12
+ }
13
+ /**
14
+ * Load the REST API metamodel and instance, then generate client code
15
+ */
16
+ async generate(metamodelPath, instancePath) {
17
+ const model = await this.loadModel(metamodelPath, instancePath);
18
+ return this.generateFiles(model);
19
+ }
20
+ /**
21
+ * Load and parse the XMI model into ApiModel
22
+ */
23
+ async loadModel(metamodelPath, instancePath) {
24
+ const { BasicResourceSet, XMIResource, URI, getEcorePackage, ECORE_NS_URI } = await import('@emfts/core');
25
+ // Initialize
26
+ getEcorePackage();
27
+ // Create resource set
28
+ const resourceSet = new BasicResourceSet();
29
+ resourceSet.getPackageRegistry().set(ECORE_NS_URI, getEcorePackage());
30
+ // Load rest-api.ecore metamodel
31
+ const metamodelContent = await readFile(metamodelPath, 'utf-8');
32
+ const metamodelUri = URI.createURI(metamodelPath);
33
+ const metamodelResource = new XMIResource(metamodelUri);
34
+ metamodelResource.setResourceSet(resourceSet);
35
+ metamodelResource.loadFromString(metamodelContent);
36
+ const metamodelContents = metamodelResource.getContents();
37
+ if (metamodelContents.length === 0) {
38
+ throw new Error(`No content found in metamodel ${metamodelPath}`);
39
+ }
40
+ const restApiPackage = metamodelContents[0];
41
+ const nsURI = restApiPackage.getNsURI();
42
+ if (nsURI) {
43
+ resourceSet.getPackageRegistry().set(nsURI, restApiPackage);
44
+ }
45
+ if (this.options.verbose) {
46
+ console.log('Loaded REST API metamodel:', getName(restApiPackage), 'nsURI:', nsURI);
47
+ }
48
+ // Load nsc-api.xmi instance
49
+ const instanceContent = await readFile(instancePath, 'utf-8');
50
+ const instanceUri = URI.createURI(instancePath);
51
+ const instanceResource = new XMIResource(instanceUri);
52
+ instanceResource.setResourceSet(resourceSet);
53
+ instanceResource.loadFromString(instanceContent);
54
+ const instanceErrors = instanceResource.getErrors();
55
+ if (instanceErrors.length > 0) {
56
+ console.error('Errors loading API instance:', instanceErrors.map(e => e.message).join(', '));
57
+ }
58
+ const instanceContents = instanceResource.getContents();
59
+ if (instanceContents.length === 0) {
60
+ throw new Error(`No content found in instance ${instancePath}`);
61
+ }
62
+ const restApi = instanceContents[0];
63
+ if (this.options.verbose) {
64
+ const eClassName = getName(restApi.eClass());
65
+ console.log('Loaded API instance, root type:', eClassName);
66
+ }
67
+ // Extract model data from dynamic EObjects
68
+ return this.extractModel(restApi);
69
+ }
70
+ /**
71
+ * Extract ApiModel from dynamic EObject tree
72
+ */
73
+ extractModel(restApi) {
74
+ const baseUrl = getFeatureValue(restApi, 'baseUrl') || '';
75
+ const resources = getFeatureValue(restApi, 'resources') || [];
76
+ const resourceModels = [];
77
+ for (const resource of resources) {
78
+ resourceModels.push(this.extractResource(resource));
79
+ }
80
+ return { baseUrl, resources: resourceModels };
81
+ }
82
+ extractResource(resource) {
83
+ const name = getFeatureValue(resource, 'name') || 'UnknownResource';
84
+ const path = getFeatureValue(resource, 'path') || '';
85
+ const endpoints = getFeatureValue(resource, 'endpoints') || [];
86
+ const endpointModels = [];
87
+ for (const endpoint of endpoints) {
88
+ endpointModels.push(this.extractEndpoint(endpoint));
89
+ }
90
+ return { name, path, endpoints: endpointModels };
91
+ }
92
+ extractEndpoint(endpoint) {
93
+ const method = getFeatureValue(endpoint, 'method');
94
+ // Enum value: could be the literal name or an object with getName()
95
+ let methodStr = 'GET';
96
+ if (method !== null && method !== undefined) {
97
+ if (typeof method === 'string') {
98
+ methodStr = method;
99
+ }
100
+ else if (typeof method === 'object' && method !== null) {
101
+ methodStr = getName(method) || String(method);
102
+ }
103
+ else {
104
+ // Numeric enum value
105
+ const methodMap = { 0: 'GET', 1: 'POST', 2: 'PUT', 3: 'DELETE' };
106
+ methodStr = methodMap[Number(method)] || 'GET';
107
+ }
108
+ }
109
+ const parameters = getFeatureValue(endpoint, 'parameters') || [];
110
+ const paramModels = [];
111
+ for (const param of parameters) {
112
+ paramModels.push(this.extractParameter(param));
113
+ }
114
+ return {
115
+ name: getFeatureValue(endpoint, 'name') || 'unknown',
116
+ path: getFeatureValue(endpoint, 'path') || '',
117
+ method: methodStr,
118
+ produces: getFeatureValue(endpoint, 'produces') || undefined,
119
+ consumes: getFeatureValue(endpoint, 'consumes') || undefined,
120
+ description: getFeatureValue(endpoint, 'description') || undefined,
121
+ responseType: getFeatureValue(endpoint, 'responseType') || undefined,
122
+ responseWrapper: getFeatureValue(endpoint, 'responseWrapper') || undefined,
123
+ parameters: paramModels,
124
+ };
125
+ }
126
+ extractParameter(param) {
127
+ const paramType = getFeatureValue(param, 'paramType');
128
+ let paramTypeStr = 'PATH';
129
+ if (paramType !== null && paramType !== undefined) {
130
+ if (typeof paramType === 'string') {
131
+ paramTypeStr = paramType;
132
+ }
133
+ else if (typeof paramType === 'object' && paramType !== null) {
134
+ paramTypeStr = getName(paramType) || String(paramType);
135
+ }
136
+ else {
137
+ const typeMap = { 0: 'PATH', 1: 'QUERY', 2: 'BODY' };
138
+ paramTypeStr = typeMap[Number(paramType)] || 'PATH';
139
+ }
140
+ }
141
+ return {
142
+ name: getFeatureValue(param, 'name') || 'unknown',
143
+ paramType: paramTypeStr,
144
+ dataType: getFeatureValue(param, 'dataType') || 'string',
145
+ required: getFeatureValue(param, 'required') === true,
146
+ };
147
+ }
148
+ /**
149
+ * Generate all TypeScript files
150
+ */
151
+ async generateFiles(model) {
152
+ const files = [];
153
+ // Generate api-base.ts
154
+ files.push({
155
+ path: 'api-base.ts',
156
+ content: this.generateApiBase(),
157
+ });
158
+ // Generate per-resource API classes
159
+ for (const resource of model.resources) {
160
+ files.push({
161
+ path: `${resource.name}Api.ts`,
162
+ content: this.generateResourceApi(resource),
163
+ });
164
+ }
165
+ // Generate index.ts barrel export
166
+ files.push({
167
+ path: 'index.ts',
168
+ content: this.generateIndex(model),
169
+ });
170
+ // Write files to disk
171
+ const writtenFiles = [];
172
+ for (const file of files) {
173
+ const fullPath = join(this.options.outputDir, file.path);
174
+ await mkdir(dirname(fullPath), { recursive: true });
175
+ await writeFile(fullPath, file.content, 'utf-8');
176
+ writtenFiles.push(fullPath);
177
+ if (this.options.verbose) {
178
+ console.log(' Generated:', fullPath);
179
+ }
180
+ }
181
+ return writtenFiles;
182
+ }
183
+ /**
184
+ * Generate api-base.ts with shared utilities
185
+ */
186
+ generateApiBase() {
187
+ return `/*
188
+ * This file was generated by emfts-codegen REST client generator.
189
+ * DO NOT EDIT - changes will be overwritten.
190
+ *
191
+ * @generated
192
+ */
193
+ import { XMIResource, URI, BasicResourceSet, type EPackage, type EObject } from '@emfts/core'
194
+
195
+ export const BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:8080'
196
+
197
+ export class ApiError extends Error {
198
+ status: number
199
+
200
+ constructor(status: number, message: string) {
201
+ super(message)
202
+ this.name = 'ApiError'
203
+ this.status = status
204
+ }
205
+ }
206
+
207
+ const registeredPackages: Map<string, EPackage> = new Map()
208
+
209
+ /**
210
+ * Register an EPackage for XML deserialization.
211
+ * Call this once per model package before using the API clients.
212
+ */
213
+ export function registerPackage(pkg: EPackage): void {
214
+ const nsURI = pkg.getNsURI()
215
+ if (nsURI) {
216
+ registeredPackages.set(nsURI, pkg)
217
+ }
218
+ }
219
+
220
+ function createResourceSet(): BasicResourceSet {
221
+ const rs = new BasicResourceSet()
222
+ for (const [nsURI, pkg] of registeredPackages) {
223
+ rs.getPackageRegistry().set(nsURI, pkg)
224
+ }
225
+ return rs
226
+ }
227
+
228
+ /**
229
+ * Deserialize an XML/XMI string into a single EObject.
230
+ */
231
+ export function deserializeXml(xml: string): EObject {
232
+ const rs = createResourceSet()
233
+ const resource = new XMIResource(URI.createURI('response.xml'))
234
+ resource.setResourceSet(rs)
235
+ resource.loadFromString(xml)
236
+ const contents = resource.getContents()
237
+ if (contents.size() === 0) {
238
+ throw new Error('Empty XML response')
239
+ }
240
+ return contents.get(0)
241
+ }
242
+
243
+ /**
244
+ * Deserialize an XML/XMI string that contains a Response wrapper.
245
+ * Extracts the 'data' list from the wrapper.
246
+ */
247
+ export function deserializeXmlList(xml: string): EObject[] {
248
+ const root = deserializeXml(xml)
249
+ const eClass = root.eClass()
250
+ const dataFeature = eClass.getEStructuralFeature('data')
251
+ if (dataFeature) {
252
+ const data = root.eGet(dataFeature)
253
+ return Array.isArray(data) ? data : data ? [data] : []
254
+ }
255
+ // If no 'data' feature, return root as single-element list
256
+ return [root]
257
+ }
258
+
259
+ /**
260
+ * Serialize an EObject to XML/XMI string.
261
+ */
262
+ export function serializeXml(eObject: EObject): string {
263
+ const resource = new XMIResource(URI.createURI('request.xml'))
264
+ resource.getContents().push(eObject)
265
+ return resource.saveToString()
266
+ }
267
+ `;
268
+ }
269
+ /**
270
+ * Generate a TypeScript API class for a REST resource
271
+ */
272
+ generateResourceApi(resource) {
273
+ const lines = [];
274
+ // Header
275
+ lines.push(`/*`);
276
+ lines.push(` * This file was generated by emfts-codegen REST client generator.`);
277
+ lines.push(` * DO NOT EDIT - changes will be overwritten.`);
278
+ lines.push(` *`);
279
+ lines.push(` * @generated`);
280
+ lines.push(` */`);
281
+ lines.push(`import type { EObject } from '@emfts/core'`);
282
+ lines.push(`import { BASE_URL, ApiError, deserializeXml, deserializeXmlList, serializeXml } from './api-base.js'`);
283
+ lines.push(``);
284
+ // Class
285
+ lines.push(`export class ${resource.name}Api {`);
286
+ for (const endpoint of resource.endpoints) {
287
+ lines.push(``);
288
+ this.generateEndpointMethod(lines, resource, endpoint);
289
+ }
290
+ lines.push(`}`);
291
+ lines.push(``);
292
+ return lines.join('\n');
293
+ }
294
+ /**
295
+ * Generate a single endpoint method
296
+ */
297
+ generateEndpointMethod(lines, resource, endpoint) {
298
+ const pathParams = endpoint.parameters.filter(p => p.paramType === 'PATH');
299
+ const queryParams = endpoint.parameters.filter(p => p.paramType === 'QUERY');
300
+ const bodyParam = endpoint.parameters.find(p => p.paramType === 'BODY');
301
+ // Determine return type
302
+ const returnType = this.getReturnType(endpoint);
303
+ // Build method signature
304
+ const methodParams = this.buildMethodParams(pathParams, queryParams, bodyParam);
305
+ // JSDoc
306
+ if (endpoint.description) {
307
+ lines.push(` /**`);
308
+ lines.push(` * ${endpoint.description}`);
309
+ lines.push(` */`);
310
+ }
311
+ lines.push(` async ${endpoint.name}(${methodParams}): Promise<${returnType}> {`);
312
+ // Build URL
313
+ this.generateUrlConstruction(lines, resource, endpoint, pathParams, queryParams);
314
+ // Build fetch options
315
+ const needsOptions = endpoint.method !== 'GET' || bodyParam;
316
+ if (needsOptions) {
317
+ lines.push(` const options: RequestInit = {`);
318
+ lines.push(` method: '${endpoint.method}',`);
319
+ if (bodyParam || endpoint.consumes) {
320
+ const contentType = endpoint.consumes || 'application/json';
321
+ if (bodyParam && bodyParam.dataType === 'xml') {
322
+ lines.push(` headers: { 'Content-Type': '${contentType}' },`);
323
+ lines.push(` body: serializeXml(${bodyParam.name}),`);
324
+ }
325
+ else if (bodyParam && (bodyParam.dataType === 'Blob' || contentType === 'application/pdf')) {
326
+ lines.push(` headers: { 'Content-Type': '${contentType}' },`);
327
+ lines.push(` body: ${bodyParam.name},`);
328
+ }
329
+ else if (bodyParam) {
330
+ lines.push(` headers: { 'Content-Type': '${contentType}' },`);
331
+ lines.push(` body: ${bodyParam.name},`);
332
+ }
333
+ }
334
+ lines.push(` }`);
335
+ lines.push(` const response = await fetch(url, options)`);
336
+ }
337
+ else {
338
+ lines.push(` const response = await fetch(url)`);
339
+ }
340
+ // Error handling
341
+ lines.push(` if (!response.ok) {`);
342
+ lines.push(` throw new ApiError(response.status, await response.text())`);
343
+ lines.push(` }`);
344
+ // Response handling
345
+ this.generateResponseHandling(lines, endpoint);
346
+ lines.push(` }`);
347
+ }
348
+ /**
349
+ * Generate URL construction code
350
+ */
351
+ generateUrlConstruction(lines, resource, endpoint, pathParams, queryParams) {
352
+ // Build path with template literals
353
+ let fullPath = resource.path + endpoint.path;
354
+ // Replace {param} with ${encodeURIComponent(param)}
355
+ for (const param of pathParams) {
356
+ fullPath = fullPath.replace(`{${param.name}}`, `\${encodeURIComponent(${param.name})}`);
357
+ }
358
+ if (queryParams.length === 0) {
359
+ lines.push(` const url = \`\${BASE_URL}${fullPath}\``);
360
+ }
361
+ else {
362
+ lines.push(` const params = new URLSearchParams()`);
363
+ for (const param of queryParams) {
364
+ if (param.dataType === 'string[]') {
365
+ if (param.required) {
366
+ lines.push(` for (const v of ${param.name}) { params.append('${param.name}', v) }`);
367
+ }
368
+ else {
369
+ lines.push(` if (${param.name}) { for (const v of ${param.name}) { params.append('${param.name}', v) } }`);
370
+ }
371
+ }
372
+ else {
373
+ if (param.required) {
374
+ lines.push(` params.set('${param.name}', ${param.name})`);
375
+ }
376
+ else {
377
+ lines.push(` if (${param.name} !== undefined) { params.set('${param.name}', ${param.name}) }`);
378
+ }
379
+ }
380
+ }
381
+ lines.push(` const query = params.toString()`);
382
+ lines.push(` const url = \`\${BASE_URL}${fullPath}\${query ? '?' + query : ''}\``);
383
+ }
384
+ }
385
+ /**
386
+ * Generate response handling code based on endpoint config
387
+ */
388
+ generateResponseHandling(lines, endpoint) {
389
+ if (endpoint.produces === 'application/pdf') {
390
+ // Binary response
391
+ lines.push(` return response.blob()`);
392
+ }
393
+ else if (endpoint.responseWrapper) {
394
+ // Wrapped XML response (list)
395
+ lines.push(` if (response.status === 204) return []`);
396
+ lines.push(` const xml = await response.text()`);
397
+ lines.push(` return deserializeXmlList(xml)`);
398
+ }
399
+ else if (endpoint.responseType && endpoint.produces === 'application/xml') {
400
+ // Direct XML response
401
+ lines.push(` const xml = await response.text()`);
402
+ lines.push(` return deserializeXml(xml)`);
403
+ }
404
+ // else: void return, no body handling needed
405
+ }
406
+ /**
407
+ * Build method parameter string
408
+ */
409
+ buildMethodParams(pathParams, queryParams, bodyParam) {
410
+ const params = [];
411
+ for (const p of pathParams) {
412
+ params.push(`${p.name}: ${this.mapDataType(p.dataType)}`);
413
+ }
414
+ for (const p of queryParams) {
415
+ const tsType = this.mapDataType(p.dataType);
416
+ if (p.required) {
417
+ params.push(`${p.name}: ${tsType}`);
418
+ }
419
+ else {
420
+ params.push(`${p.name}?: ${tsType}`);
421
+ }
422
+ }
423
+ if (bodyParam) {
424
+ const tsType = this.mapBodyType(bodyParam, undefined);
425
+ params.push(`${bodyParam.name}: ${tsType}`);
426
+ }
427
+ return params.join(', ');
428
+ }
429
+ /**
430
+ * Determine the TypeScript return type for an endpoint
431
+ */
432
+ getReturnType(endpoint) {
433
+ if (endpoint.produces === 'application/pdf') {
434
+ return 'Blob';
435
+ }
436
+ if (endpoint.responseWrapper) {
437
+ return 'EObject[]';
438
+ }
439
+ if (endpoint.responseType && endpoint.produces === 'application/xml') {
440
+ return 'EObject';
441
+ }
442
+ return 'void';
443
+ }
444
+ /**
445
+ * Map data type string to TypeScript type
446
+ */
447
+ mapDataType(dataType) {
448
+ switch (dataType) {
449
+ case 'string': return 'string';
450
+ case 'string[]': return 'string[]';
451
+ case 'number': return 'number';
452
+ case 'boolean': return 'boolean';
453
+ case 'Blob': return 'Blob';
454
+ default: return 'string';
455
+ }
456
+ }
457
+ /**
458
+ * Map body parameter type
459
+ */
460
+ mapBodyType(param, consumes) {
461
+ if (param.dataType === 'Blob' || param.dataType === 'File') {
462
+ return 'Blob';
463
+ }
464
+ if (param.dataType === 'xml') {
465
+ return 'EObject';
466
+ }
467
+ return 'unknown';
468
+ }
469
+ /**
470
+ * Generate barrel export index.ts
471
+ */
472
+ generateIndex(model) {
473
+ const lines = [];
474
+ lines.push(`/*`);
475
+ lines.push(` * This file was generated by emfts-codegen REST client generator.`);
476
+ lines.push(` * DO NOT EDIT - changes will be overwritten.`);
477
+ lines.push(` *`);
478
+ lines.push(` * @generated`);
479
+ lines.push(` */`);
480
+ lines.push(`export { BASE_URL, ApiError, registerPackage, deserializeXml, deserializeXmlList, serializeXml } from './api-base.js'`);
481
+ for (const resource of model.resources) {
482
+ lines.push(`export { ${resource.name}Api } from './${resource.name}Api.js'`);
483
+ }
484
+ lines.push(``);
485
+ return lines.join('\n');
486
+ }
487
+ }
488
+ //# sourceMappingURL=RestClientGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RestClientGenerator.js","sourceRoot":"","sources":["../../src/generator/RestClientGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { EClassifier, EStructuralFeature, EAttribute, EReference, EGenericType } from '@emfts/core';
2
+ /**
3
+ * Maps Ecore types to TypeScript types
4
+ */
5
+ export declare class TypeMapper {
6
+ private customMappings;
7
+ constructor();
8
+ private initDefaultMappings;
9
+ /**
10
+ * Add a custom type mapping
11
+ */
12
+ addMapping(ecoreName: string, tsType: string): void;
13
+ /**
14
+ * Map an EClassifier to TypeScript type
15
+ */
16
+ mapClassifier(classifier: EClassifier | null): string;
17
+ /**
18
+ * Map an EStructuralFeature to TypeScript type string
19
+ */
20
+ mapFeature(feature: EStructuralFeature): string;
21
+ /**
22
+ * Map the base type of a feature (without array wrapper)
23
+ */
24
+ mapFeatureBaseType(feature: EStructuralFeature): string;
25
+ /**
26
+ * Map an EGenericType to TypeScript type string
27
+ */
28
+ mapGenericType(genericType: EGenericType): string;
29
+ /**
30
+ * Get the default value for a type
31
+ */
32
+ getDefaultValue(feature: EStructuralFeature): string | null;
33
+ /**
34
+ * Convert a default value literal to TypeScript
35
+ */
36
+ private convertDefaultValue;
37
+ /**
38
+ * Get default value for a TypeScript type
39
+ */
40
+ private getTypeDefault;
41
+ /**
42
+ * Check if a classifier is an EEnum
43
+ */
44
+ isEEnum(classifier: EClassifier): boolean;
45
+ /**
46
+ * Check if a classifier is an EClass
47
+ */
48
+ isEClass(classifier: EClassifier): boolean;
49
+ /**
50
+ * Check if a classifier is an EDataType
51
+ */
52
+ isEDataType(classifier: EClassifier): boolean;
53
+ /**
54
+ * Check if a feature is an attribute
55
+ */
56
+ isAttribute(feature: EStructuralFeature): feature is EAttribute;
57
+ /**
58
+ * Check if a feature is a reference
59
+ */
60
+ isReference(feature: EStructuralFeature): feature is EReference;
61
+ }
62
+ //# sourceMappingURL=TypeMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeMapper.d.ts","sourceRoot":"","sources":["../../src/generator/TypeMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA4B,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGnI;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAAkC;;IAMxD,OAAO,CAAC,mBAAmB;IAoC3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAInD;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM;IAmBrD;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM;IAU/C;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM;IAMvD;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,YAAY,GAAG,MAAM;IAuBjD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI;IAqB3D;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,OAAO,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO;IAUzC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO;IAU1C;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO;IAU7C;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,IAAI,UAAU;IAI/D;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,IAAI,UAAU;CAGhE"}