@goast/typescript 0.0.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 (70) hide show
  1. package/README.md +11 -0
  2. package/assets/client/fetch/types.ts +9 -0
  3. package/assets/client/fetch/url-builder.ts +36 -0
  4. package/assets/service/angular/api-configuration.ts +18 -0
  5. package/assets/service/angular/base-service.ts +29 -0
  6. package/assets/service/angular/request-builder.ts +368 -0
  7. package/assets/service/angular/response-handlers.ts +127 -0
  8. package/assets/service/angular/strict-http-response.ts +8 -0
  9. package/cjs/index.js +9 -0
  10. package/cjs/lib/common-results.js +2 -0
  11. package/cjs/lib/config.js +15 -0
  12. package/cjs/lib/file-builder.js +244 -0
  13. package/cjs/lib/generators/file-generator.js +26 -0
  14. package/cjs/lib/generators/index.js +7 -0
  15. package/cjs/lib/generators/models/index.js +6 -0
  16. package/cjs/lib/generators/models/model-generator.js +317 -0
  17. package/cjs/lib/generators/models/models-generator.js +67 -0
  18. package/cjs/lib/generators/models/models.js +6 -0
  19. package/cjs/lib/generators/services/angular-services/angular-service-generator.js +360 -0
  20. package/cjs/lib/generators/services/angular-services/angular-services-generator.js +122 -0
  21. package/cjs/lib/generators/services/angular-services/index.js +6 -0
  22. package/cjs/lib/generators/services/angular-services/models.js +5 -0
  23. package/cjs/lib/generators/services/fetch-clients/fetch-client-generator.js +240 -0
  24. package/cjs/lib/generators/services/fetch-clients/fetch-clients-generator.js +83 -0
  25. package/cjs/lib/generators/services/fetch-clients/index.js +6 -0
  26. package/cjs/lib/generators/services/fetch-clients/models.js +5 -0
  27. package/cjs/lib/import-collection.js +116 -0
  28. package/cjs/lib/utils.js +56 -0
  29. package/cjs/package.json +1 -0
  30. package/esm/index.js +6 -0
  31. package/esm/lib/common-results.js +1 -0
  32. package/esm/lib/config.js +12 -0
  33. package/esm/lib/file-builder.js +240 -0
  34. package/esm/lib/generators/file-generator.js +22 -0
  35. package/esm/lib/generators/index.js +4 -0
  36. package/esm/lib/generators/models/index.js +3 -0
  37. package/esm/lib/generators/models/model-generator.js +313 -0
  38. package/esm/lib/generators/models/models-generator.js +63 -0
  39. package/esm/lib/generators/models/models.js +3 -0
  40. package/esm/lib/generators/services/angular-services/angular-service-generator.js +356 -0
  41. package/esm/lib/generators/services/angular-services/angular-services-generator.js +118 -0
  42. package/esm/lib/generators/services/angular-services/index.js +3 -0
  43. package/esm/lib/generators/services/angular-services/models.js +2 -0
  44. package/esm/lib/generators/services/fetch-clients/fetch-client-generator.js +236 -0
  45. package/esm/lib/generators/services/fetch-clients/fetch-clients-generator.js +79 -0
  46. package/esm/lib/generators/services/fetch-clients/index.js +3 -0
  47. package/esm/lib/generators/services/fetch-clients/models.js +2 -0
  48. package/esm/lib/import-collection.js +112 -0
  49. package/esm/lib/utils.js +48 -0
  50. package/package.json +29 -0
  51. package/types/index.d.ts +6 -0
  52. package/types/lib/common-results.d.ts +11 -0
  53. package/types/lib/config.d.ts +13 -0
  54. package/types/lib/file-builder.d.ts +110 -0
  55. package/types/lib/generators/file-generator.d.ts +11 -0
  56. package/types/lib/generators/index.d.ts +4 -0
  57. package/types/lib/generators/models/index.d.ts +3 -0
  58. package/types/lib/generators/models/model-generator.d.ts +40 -0
  59. package/types/lib/generators/models/models-generator.d.ts +23 -0
  60. package/types/lib/generators/models/models.d.ts +29 -0
  61. package/types/lib/generators/services/angular-services/angular-service-generator.d.ts +53 -0
  62. package/types/lib/generators/services/angular-services/angular-services-generator.d.ts +29 -0
  63. package/types/lib/generators/services/angular-services/index.d.ts +3 -0
  64. package/types/lib/generators/services/angular-services/models.d.ts +41 -0
  65. package/types/lib/generators/services/fetch-clients/fetch-client-generator.d.ts +43 -0
  66. package/types/lib/generators/services/fetch-clients/fetch-clients-generator.d.ts +24 -0
  67. package/types/lib/generators/services/fetch-clients/index.d.ts +3 -0
  68. package/types/lib/generators/services/fetch-clients/models.d.ts +34 -0
  69. package/types/lib/import-collection.d.ts +21 -0
  70. package/types/lib/utils.d.ts +6 -0
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultTypeScriptModelsGeneratorConfig = exports.defaultTypeScriptModelGeneratorConfig = void 0;
4
+ const config_1 = require("../../config");
5
+ exports.defaultTypeScriptModelGeneratorConfig = Object.assign(Object.assign({}, config_1.defaultTypeScriptGeneratorConfig), { fileNameCasing: 'kebab', typeNameCasing: 'pascal', enumGeneration: 'union', immutableTypes: false, inlineUnnamedSchemas: true, modelsDirPath: 'models', typeDeclaration: 'type' });
6
+ exports.defaultTypeScriptModelsGeneratorConfig = Object.assign(Object.assign({}, exports.defaultTypeScriptModelGeneratorConfig), { indexFilePath: 'models.ts' });
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultTypeScriptAngularServiceGenerator = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const fs_extra_1 = require("fs-extra");
7
+ const core_1 = require("@goast/core");
8
+ const file_builder_1 = require("../../../file-builder");
9
+ const file_generator_1 = require("../../file-generator");
10
+ class DefaultTypeScriptAngularServiceGenerator extends file_generator_1.TypeScriptFileGenerator {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.httpClientType = {
14
+ name: 'HttpClient',
15
+ module: '@angular/common/http',
16
+ };
17
+ this.httpContextType = {
18
+ name: 'HttpContext',
19
+ module: '@angular/common/http',
20
+ };
21
+ this.httpResponseType = {
22
+ name: 'HttpResponse',
23
+ module: '@angular/common/http',
24
+ };
25
+ this.observableType = {
26
+ name: 'Observable',
27
+ module: 'rxjs',
28
+ };
29
+ this.rxjsFilterType = {
30
+ name: 'filter',
31
+ module: 'rxjs',
32
+ };
33
+ this.rxjsMapType = {
34
+ name: 'map',
35
+ module: 'rxjs',
36
+ };
37
+ }
38
+ getApiConfigurationType(ctx) {
39
+ return { name: 'ApiConfiguration', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'api-configuration.ts') };
40
+ }
41
+ getBaseServiceType(ctx) {
42
+ return { name: 'BaseService', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'base-service.ts') };
43
+ }
44
+ getStrictHttpResponseType(ctx) {
45
+ return { name: 'StrictHttpResponse', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'strict-http-response.ts') };
46
+ }
47
+ getRequestBuilderType(ctx) {
48
+ return { name: 'RequestBuilder', module: (0, path_1.resolve)(this.getUtilsDirPath(ctx), 'request-builder.ts') };
49
+ }
50
+ generate(ctx) {
51
+ const filePath = this.getServiceFilePath(ctx);
52
+ const name = this.getServiceClassName(ctx);
53
+ console.log(`Generating service ${name} in ${filePath}...`);
54
+ (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(filePath));
55
+ const serviceBuilder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
56
+ this.generateServiceFileContent(ctx, serviceBuilder);
57
+ (0, fs_1.writeFileSync)(filePath, serviceBuilder.toString());
58
+ return {
59
+ filePath,
60
+ component: name,
61
+ responseModels: {},
62
+ imports: [{ kind: 'file', name, modulePath: filePath }],
63
+ };
64
+ }
65
+ generateServiceFileContent(ctx, builder) {
66
+ builder
67
+ .append((builder) => builder.forEach(ctx.service.endpoints, (builder, endpoint) => this.generateEndpointParamsType(ctx, builder, endpoint), { separator: '\n' }))
68
+ .ensurePreviousLineEmpty()
69
+ .append((builder) => this.generateClass(ctx, builder));
70
+ }
71
+ // protected generateResponseModels(ctx: Context): Output['responseModels'] {
72
+ // const filePath = this.get;
73
+ // const builder = new TypeScriptFileBuilder();
74
+ // }
75
+ //protected generateResponseModelsFileContent(ctx: Context, builder: Builder) {}
76
+ generateEndpointParamsType(ctx, builder, endpoint) {
77
+ if (!this.hasEndpointParams(ctx, endpoint)) {
78
+ return;
79
+ }
80
+ const params = [];
81
+ for (const parameter of endpoint.parameters) {
82
+ const schema = parameter.schema;
83
+ params.push((builder) => builder.appendProperty({
84
+ name: this.toPropertyName(ctx, parameter.name),
85
+ documentation: parameter.description,
86
+ type: schema ? (builder) => builder.appendModelUsage(ctx.input.models[schema.id]) : this.getAnyType(ctx),
87
+ isOptional: !parameter.required,
88
+ }));
89
+ }
90
+ if (endpoint.requestBody !== undefined) {
91
+ const body = endpoint.requestBody;
92
+ const schema = body.content[0].schema;
93
+ params.push((builder) => builder.appendProperty({
94
+ name: 'body',
95
+ documentation: body.description,
96
+ type: schema ? (builder) => builder.appendModelUsage(ctx.input.models[schema.id]) : this.getAnyType(ctx),
97
+ isOptional: !body.required,
98
+ }));
99
+ }
100
+ builder.appendTypeDeclaration({
101
+ name: this.getEndpointParamsTypeName(ctx, endpoint),
102
+ documentation: `Parameters for operation ${this.getEndpointMethodName(ctx, endpoint)}`,
103
+ type: (builder) => builder.appendCodeBlock(...params),
104
+ });
105
+ }
106
+ generateClass(ctx, builder) {
107
+ builder.appendClass(this.getClassOptions(ctx));
108
+ }
109
+ generateClassContent(ctx, builder) {
110
+ builder
111
+ .append((builder) => this.generateConstructor(ctx, builder))
112
+ .forEach(ctx.service.endpoints, (builder, endpoint) => builder.ensurePreviousLineEmpty().append((builder) => this.generateEndpoint(ctx, builder, endpoint)));
113
+ }
114
+ generateConstructor(ctx, builder) {
115
+ builder.appendConstructor(this.getConstructorOptions(ctx));
116
+ }
117
+ generateConstructorContent(ctx, builder) {
118
+ builder.appendLine('super(config, http);');
119
+ }
120
+ generateEndpoint(ctx, builder, endpoint) {
121
+ builder
122
+ .append((builder) => this.generateEndpointPathProperty(ctx, builder, endpoint))
123
+ .ensurePreviousLineEmpty()
124
+ .append((builder) => this.generateEndpointResponseMethod(ctx, builder, endpoint))
125
+ .ensurePreviousLineEmpty()
126
+ .append((builder) => this.generateEndpointMethod(ctx, builder, endpoint));
127
+ }
128
+ generateEndpointPathProperty(ctx, builder, endpoint) {
129
+ builder.appendProperty(this.getEndpointPathPropertyOptions(ctx, endpoint));
130
+ }
131
+ generateEndpointResponseMethod(ctx, builder, endpoint) {
132
+ builder.appendMethod(this.getEndpointResponseMethodOptions(ctx, endpoint));
133
+ }
134
+ generateEndpointResponseMethodContent(ctx, builder, endpoint) {
135
+ var _a, _b;
136
+ builder
137
+ .append('const rb = new ')
138
+ .appendExternalTypeUsage(this.getRequestBuilderType(ctx))
139
+ .appendParameters('this.rootUrl', `${this.getServiceClassName(ctx)}.${this.getEndpointPathPropertyName(ctx, endpoint)}`, this.toStringLiteral(ctx, endpoint.method))
140
+ .appendLine(';');
141
+ if (this.hasEndpointParams(ctx, endpoint)) {
142
+ builder.append('if (params) ').appendCodeBlock((builder) => builder
143
+ .forEach(endpoint.parameters.filter((x) => x.target === 'path' || x.target === 'query' || x.target === 'header'), (builder, parameter) => builder
144
+ .append('rb.', parameter.target)
145
+ .appendParameters(this.toStringLiteral(ctx, parameter.name), `params.${(0, core_1.toCasing)(parameter.name, 'camel')}`, (builder) => builder.appendObjectLiteral(parameter.style !== undefined
146
+ ? `style: ${this.toStringLiteral(ctx, parameter.style)}`
147
+ : undefined, parameter.explode !== undefined ? `explode: ${parameter.explode ? 'true' : 'false'}` : undefined))
148
+ .appendLine(';'))
149
+ .if(endpoint.requestBody !== undefined, (builder) => {
150
+ var _a, _b, _c;
151
+ return builder
152
+ .append('rb.body')
153
+ .appendParameters('params.body', this.toStringLiteral(ctx, (_c = (_b = (_a = endpoint.requestBody) === null || _a === void 0 ? void 0 : _a.content[0]) === null || _b === void 0 ? void 0 : _b.type) !== null && _c !== void 0 ? _c : 'application/json'))
154
+ .appendLine(';');
155
+ }));
156
+ }
157
+ const response = this.getEndpointSuccessResponse(ctx, endpoint);
158
+ const accept = (_b = (_a = response === null || response === void 0 ? void 0 : response.contentOptions[0]) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : '*/*';
159
+ const responseType = accept.includes('json') ? 'json' : 'text';
160
+ builder
161
+ .ensurePreviousLineEmpty()
162
+ .append('this.http.request')
163
+ .appendParameters((builder) => builder
164
+ .append('rb.build')
165
+ .appendParameters((builder) => builder.appendObjectLiteral(`responseType: ${this.toStringLiteral(ctx, responseType)}`, `accept: ${this.toStringLiteral(ctx, accept)}`, 'context: context')))
166
+ .append('.pipe')
167
+ .appendParameters((builder) => builder.appendExternalTypeUsage(this.rxjsFilterType).appendParameters((builder) => builder.appendFunction({
168
+ parameters: ['r: any'],
169
+ body: (builder) => builder.append('r instanceof ').appendExternalTypeUsage(this.httpResponseType),
170
+ singleLine: true,
171
+ })), (builder) => builder.appendExternalTypeUsage(this.rxjsMapType).appendParameters((builder) => {
172
+ var _a;
173
+ return builder.appendFunction({
174
+ parameters: [{ name: 'r', type: this.httpResponseType, genericArguments: ['any'] }],
175
+ body: ((_a = response === null || response === void 0 ? void 0 : response.contentOptions) === null || _a === void 0 ? void 0 : _a[0])
176
+ ? (builder) => builder
177
+ .append('r as ')
178
+ .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
179
+ .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))
180
+ : (builder) => builder
181
+ .parenthesize('()', (builder) => builder
182
+ .append('r as ')
183
+ .appendExternalTypeUsage(this.httpResponseType)
184
+ .appendGenericArguments('any'))
185
+ .append('.clone')
186
+ .appendParameters((builder) => builder.appendObjectLiteral('body: undefined'))
187
+ .append(' as ')
188
+ .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
189
+ .appendGenericArguments('void'),
190
+ singleLine: true,
191
+ });
192
+ }))
193
+ .appendLine(';');
194
+ }
195
+ generateEndpointMethod(ctx, builder, endpoint) {
196
+ builder.appendMethod(this.getEndpointMethodOptions(ctx, endpoint));
197
+ }
198
+ generateEndpointMethodContent(ctx, builder, endpoint) {
199
+ builder
200
+ .append('return this.', this.getEndpointResponseMethodName(ctx, endpoint))
201
+ .appendParameters(this.hasEndpointParams(ctx, endpoint) ? 'params' : undefined, 'context')
202
+ .append('.pipe')
203
+ .appendParameters((builder) => builder
204
+ .appendExternalTypeUsage(this.rxjsMapType)
205
+ .append('((r: ')
206
+ .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
207
+ .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))
208
+ .append(') => r.body as ')
209
+ .append((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))
210
+ .append(')'))
211
+ .appendLine(';');
212
+ }
213
+ getClassOptions(ctx) {
214
+ return {
215
+ name: this.getServiceClassName(ctx),
216
+ documentation: ctx.service.description,
217
+ annotations: [
218
+ {
219
+ name: 'Injectable',
220
+ module: '@angular/core',
221
+ args: [(builder) => builder.appendObjectLiteral(`providedIn: ${this.toStringLiteral(ctx, 'root')}`)],
222
+ },
223
+ ],
224
+ extends: (builder) => builder.appendExternalTypeUsage(this.getBaseServiceType(ctx)),
225
+ body: (builder) => this.generateClassContent(ctx, builder),
226
+ };
227
+ }
228
+ getConstructorOptions(ctx) {
229
+ return {
230
+ parameters: [
231
+ { name: 'config', type: (builder) => builder.appendExternalTypeUsage(this.getApiConfigurationType(ctx)) },
232
+ { name: 'http', type: (builder) => builder.appendExternalTypeUsage(this.httpClientType) },
233
+ ],
234
+ body: (builder) => this.generateConstructorContent(ctx, builder),
235
+ };
236
+ }
237
+ getEndpointPathPropertyOptions(ctx, endpoint) {
238
+ return {
239
+ name: this.getEndpointPathPropertyName(ctx, endpoint),
240
+ documentation: ctx.config.exposePathProperties
241
+ ? `Path part for operation ${this.getEndpointMethodName(ctx, endpoint)}`
242
+ : undefined,
243
+ isStatic: true,
244
+ accessibility: ctx.config.exposePathProperties ? 'public' : 'protected',
245
+ isReadonly: true,
246
+ initializer: this.toStringLiteral(ctx, endpoint.path),
247
+ };
248
+ }
249
+ getEndpointMethodParams(ctx, endpoint) {
250
+ const params = [];
251
+ if (this.hasEndpointParams(ctx, endpoint)) {
252
+ params.push({
253
+ name: 'params',
254
+ type: this.getEndpointParamsTypeName(ctx, endpoint),
255
+ });
256
+ }
257
+ params.push({
258
+ name: 'context',
259
+ isOptional: true,
260
+ type: (builder) => builder.appendExternalTypeUsage(this.httpContextType),
261
+ });
262
+ return params;
263
+ }
264
+ generateEndpointSuccessResponseSchema(ctx, builder, endpoint) {
265
+ var _a;
266
+ const successResponse = this.getEndpointSuccessResponse(ctx, endpoint);
267
+ const schema = (_a = successResponse === null || successResponse === void 0 ? void 0 : successResponse.contentOptions[0]) === null || _a === void 0 ? void 0 : _a.schema;
268
+ if (schema) {
269
+ const model = ctx.input.models[schema.id];
270
+ if (model) {
271
+ builder.appendModelUsage(model);
272
+ }
273
+ else {
274
+ builder.append(this.getAnyType(ctx));
275
+ }
276
+ }
277
+ else {
278
+ builder.append('void');
279
+ }
280
+ }
281
+ getEndpointResponseMethodOptions(ctx, endpoint) {
282
+ return {
283
+ name: this.getEndpointResponseMethodName(ctx, endpoint),
284
+ accessibility: ctx.config.exposeResponseMethods ? 'public' : 'protected',
285
+ documentation: ctx.config.exposeResponseMethods
286
+ ? [
287
+ endpoint.summary,
288
+ endpoint.description,
289
+ 'This method provides access to the full `HttpResponse`, allowing access to response headers.\n' +
290
+ `To access only the response body, use \`${this.getEndpointMethodName(ctx, endpoint)}()\` instead.`,
291
+ ]
292
+ .filter((x) => x)
293
+ .join('\n\n')
294
+ : undefined,
295
+ parameters: this.getEndpointMethodParams(ctx, endpoint),
296
+ returnType: (builder) => builder
297
+ .appendExternalTypeUsage(this.observableType)
298
+ .appendGenericArguments((builder) => builder
299
+ .appendExternalTypeUsage(this.getStrictHttpResponseType(ctx))
300
+ .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint))),
301
+ body: (builder) => this.generateEndpointResponseMethodContent(ctx, builder, endpoint),
302
+ };
303
+ }
304
+ getEndpointMethodOptions(ctx, endpoint) {
305
+ return {
306
+ name: this.getEndpointMethodName(ctx, endpoint),
307
+ accessibility: 'public',
308
+ documentation: [
309
+ endpoint.summary,
310
+ endpoint.description,
311
+ ctx.config.exposeResponseMethods
312
+ ? 'This method provides access only to the response body.\n' +
313
+ `To access the full response (for headers, for example), \`${this.getEndpointResponseMethodName(ctx, endpoint)}()\` instead.`
314
+ : undefined,
315
+ ]
316
+ .filter((x) => x)
317
+ .join('\n\n'),
318
+ parameters: this.getEndpointMethodParams(ctx, endpoint),
319
+ returnType: ctx.config.clientMethodFlavor === 'response-handler'
320
+ ? 'void'
321
+ : (builder) => builder
322
+ .appendExternalTypeUsage(this.observableType)
323
+ .appendGenericArguments((builder) => this.generateEndpointSuccessResponseSchema(ctx, builder, endpoint)),
324
+ body: (builder) => this.generateEndpointMethodContent(ctx, builder, endpoint),
325
+ };
326
+ }
327
+ getEndpointSuccessResponse(ctx, endpoint) {
328
+ var _a;
329
+ return ((_a = endpoint.responses.find((x) => x.statusCode && x.statusCode >= 200 && x.statusCode < 300)) !== null && _a !== void 0 ? _a : endpoint.responses.find((x) => x.statusCode === undefined));
330
+ }
331
+ getServiceClassName(ctx) {
332
+ return this.toTypeName(ctx, ctx.service.name);
333
+ }
334
+ hasEndpointParams(ctx, endpoint) {
335
+ return endpoint.parameters.length > 0 || endpoint.requestBody !== undefined;
336
+ }
337
+ getEndpointParamsTypeName(ctx, endpoint) {
338
+ return (0, core_1.toCasing)(this.getEndpointMethodName(ctx, endpoint), 'pascal') + 'Params';
339
+ }
340
+ getEndpointPathPropertyName(ctx, endpoint) {
341
+ return this.getEndpointMethodName(ctx, endpoint) + 'Path';
342
+ }
343
+ getEndpointMethodName(ctx, endpoint) {
344
+ return this.toMethodName(ctx, endpoint.name);
345
+ }
346
+ getEndpointResponseMethodName(ctx, endpoint) {
347
+ return this.getEndpointMethodName(ctx, endpoint) + '$Response';
348
+ }
349
+ getServiceFilePath(ctx) {
350
+ return (0, path_1.resolve)(ctx.config.outputDir, ctx.config.servicesDirPath, `${(0, core_1.toCasing)(ctx.service.name, ctx.config.fileNameCasing)}.ts`);
351
+ }
352
+ getResponseModelsFilePath(ctx) {
353
+ var _a;
354
+ return (0, path_1.resolve)(ctx.config.outputDir, (_a = ctx.config.responseModelsDirPath) !== null && _a !== void 0 ? _a : 'models/responses', `${(0, core_1.toCasing)(ctx.service.name, ctx.config.responseModelsFileNameCasing)}.ts`);
355
+ }
356
+ getUtilsDirPath(ctx) {
357
+ return (0, path_1.resolve)(ctx.config.outputDir, ctx.config.utilsDirPath);
358
+ }
359
+ }
360
+ exports.DefaultTypeScriptAngularServiceGenerator = DefaultTypeScriptAngularServiceGenerator;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeScriptAngularServicesGenerator = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const fs_extra_1 = require("fs-extra");
7
+ const core_1 = require("@goast/core");
8
+ const angular_service_generator_1 = require("./angular-service-generator");
9
+ const models_1 = require("./models");
10
+ const file_builder_1 = require("../../../file-builder");
11
+ const import_collection_1 = require("../../../import-collection");
12
+ const utils_1 = require("../../../utils");
13
+ class TypeScriptAngularServicesGenerator extends core_1.OpenApiServicesGenerationProviderBase {
14
+ constructor(clientGeneratorFactory) {
15
+ super();
16
+ this._clientGeneratorFactory =
17
+ clientGeneratorFactory !== null && clientGeneratorFactory !== void 0 ? clientGeneratorFactory : core_1.Factory.fromValue(new angular_service_generator_1.DefaultTypeScriptAngularServiceGenerator());
18
+ }
19
+ initResult() {
20
+ return {
21
+ services: {},
22
+ servicesIndexFilePath: undefined,
23
+ responseModelsIndexFilePath: undefined,
24
+ };
25
+ }
26
+ buildContext(context, config) {
27
+ return this.getProviderContext(context, config, models_1.defaultTypeScriptAngularServicesGeneratorConfig);
28
+ }
29
+ onGenerate(ctx) {
30
+ const output = super.onGenerate(ctx);
31
+ this.copyUtilsFiles(ctx);
32
+ output.servicesIndexFilePath = this.generateServicesIndexFile(ctx);
33
+ return output;
34
+ }
35
+ generateService(ctx, service) {
36
+ const clientGenerator = this._clientGeneratorFactory.create();
37
+ return clientGenerator.generate(Object.assign(Object.assign({}, ctx), { service }));
38
+ }
39
+ addServiceResult(ctx, service, result) {
40
+ ctx.output.services[service.id] = result;
41
+ }
42
+ generateServicesIndexFile(ctx) {
43
+ if (!this.shouldGenerateServicesIndexFile(ctx)) {
44
+ return undefined;
45
+ }
46
+ const filePath = this.getServicesIndexFilePath(ctx);
47
+ console.log(`Generating index file to ${filePath}...`);
48
+ (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(filePath));
49
+ const builder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
50
+ this.generateServicesIndexFileContent(ctx, builder);
51
+ (0, fs_extra_1.writeFileSync)(filePath, builder.toString());
52
+ return filePath;
53
+ }
54
+ getServicesIndexFilePath(ctx) {
55
+ var _a;
56
+ return (0, path_1.resolve)(ctx.config.outputDir, (_a = ctx.config.indexFilePath) !== null && _a !== void 0 ? _a : 'clients.ts');
57
+ }
58
+ shouldGenerateServicesIndexFile(ctx) {
59
+ return (0, core_1.notNullish)(ctx.config.indexFilePath);
60
+ }
61
+ generateServicesIndexFileContent(ctx, builder) {
62
+ const exports = new import_collection_1.ImportExportCollection();
63
+ for (const serviceId in ctx.output.services) {
64
+ const service = ctx.output.services[serviceId];
65
+ exports.addExport(service.component, service.filePath);
66
+ }
67
+ exports.writeTo(builder);
68
+ }
69
+ generateResponseModelsIndexFile(ctx) {
70
+ if (!this.shouldGenerateResponseModelsIndexFile(ctx)) {
71
+ return undefined;
72
+ }
73
+ const filePath = this.getResponseModelsIndexFilePath(ctx);
74
+ console.log(`Generating response models index file to ${filePath}...`);
75
+ (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(filePath));
76
+ const builder = new file_builder_1.TypeScriptFileBuilder(filePath, ctx.config);
77
+ this.generateResponseModelsIndexFileContent(ctx, builder);
78
+ (0, fs_extra_1.writeFileSync)(filePath, builder.toString());
79
+ return filePath;
80
+ }
81
+ getResponseModelsIndexFilePath(ctx) {
82
+ var _a;
83
+ return (0, path_1.resolve)(ctx.config.outputDir, (_a = ctx.config.responseModelsIndexFilePath) !== null && _a !== void 0 ? _a : 'responses.ts');
84
+ }
85
+ shouldGenerateResponseModelsIndexFile(ctx) {
86
+ return (0, core_1.notNullish)(ctx.config.responseModelsDirPath) && (0, core_1.notNullish)(ctx.config.responseModelsIndexFilePath);
87
+ }
88
+ generateResponseModelsIndexFileContent(ctx, builder) {
89
+ const exports = new import_collection_1.ImportExportCollection();
90
+ for (const serviceId in ctx.output.services) {
91
+ const service = ctx.output.services[serviceId];
92
+ for (const operationId in service.responseModels) {
93
+ const responseModel = service.responseModels[operationId];
94
+ if (responseModel.filePath) {
95
+ exports.addExport(responseModel.component, responseModel.filePath);
96
+ }
97
+ }
98
+ }
99
+ exports.writeTo(builder);
100
+ }
101
+ copyUtilsFiles(ctx) {
102
+ const sourceDir = (0, path_1.resolve)((0, path_1.dirname)(require.resolve('@goast/typescript')), '../assets/service/angular');
103
+ const targetDir = (0, path_1.resolve)(ctx.config.outputDir, ctx.config.utilsDirPath);
104
+ (0, fs_extra_1.ensureDirSync)(targetDir);
105
+ const files = ['api-configuration.ts', 'base-service.ts', 'request-builder.ts', 'strict-http-response.ts'];
106
+ if (ctx.config.clientMethodFlavor === 'response-handler') {
107
+ files.push('response-handler.ts');
108
+ }
109
+ const rootUrl = this.getRootUrl(ctx);
110
+ for (const file of files) {
111
+ const fileContent = (0, fs_1.readFileSync)((0, path_1.resolve)(sourceDir, file))
112
+ .toString()
113
+ .replace(/@ROOT_URL@/g, rootUrl);
114
+ (0, fs_extra_1.writeFileSync)((0, path_1.resolve)(targetDir, file), fileContent);
115
+ }
116
+ }
117
+ getRootUrl(ctx) {
118
+ var _a, _b, _c, _d, _e, _f;
119
+ return (0, utils_1.modifyString)((_f = (_e = (_d = (_c = ((_a = ctx.data.services[0].$src) !== null && _a !== void 0 ? _a : (_b = ctx.data.services[0].endpoints[0]) === null || _b === void 0 ? void 0 : _b.$src)) === null || _c === void 0 ? void 0 : _c.document.servers) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.url) !== null && _f !== void 0 ? _f : '/', ctx.config.rootUrl);
120
+ }
121
+ }
122
+ exports.TypeScriptAngularServicesGenerator = TypeScriptAngularServicesGenerator;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./angular-service-generator"), exports);
5
+ tslib_1.__exportStar(require("./angular-services-generator"), exports);
6
+ tslib_1.__exportStar(require("./models"), exports);
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultTypeScriptAngularServicesGeneratorConfig = void 0;
4
+ const config_1 = require("../../../config");
5
+ exports.defaultTypeScriptAngularServicesGeneratorConfig = Object.assign(Object.assign({}, config_1.defaultTypeScriptGeneratorConfig), { fileNameCasing: { casing: 'kebab', suffix: '.service' }, responseModelsFileNameCasing: { casing: 'kebab', suffix: '-responses.model' }, exposeResponseMethods: false, exposePathProperties: false, clientMethodFlavor: 'default', servicesDirPath: 'services', responseModelsDirPath: 'models/responses', utilsDirPath: 'utils', indexFilePath: 'services.ts', responseModelsIndexFilePath: 'responses.ts' });