@devlearning/swagger-generator 1.0.9 → 1.0.11

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 (34) hide show
  1. package/autogeneration/output/api.autogenerated.ts +95 -0
  2. package/autogeneration/output/model.autogenerated.ts +69 -0
  3. package/dist/api.constants.js +24 -0
  4. package/dist/generator-old.js +369 -0
  5. package/dist/generator.js +483 -0
  6. package/dist/generators-writers/angular/api-angular-writer.js +114 -0
  7. package/dist/generators-writers/angular/constants.js +28 -0
  8. package/dist/generators-writers/angular/model-angular-writer.js +42 -0
  9. package/dist/generators-writers/nextjs/api-nextjs-writer.js +127 -0
  10. package/dist/generators-writers/nextjs/constants.js +5 -0
  11. package/dist/generators-writers/nextjs/model-nextjs-writer.js +41 -0
  12. package/dist/generators-writers/utils.js +20 -0
  13. package/dist/index.js +24 -0
  14. package/dist/model.constants.js +1 -0
  15. package/dist/models/api-dto.js +1 -0
  16. package/dist/models/enum-value-dto.js +1 -0
  17. package/dist/models/model-dto.js +1 -0
  18. package/dist/models/parameter-dto.js +1 -0
  19. package/dist/models/property-dto.js +1 -0
  20. package/dist/models/swagger/swagger-component-property.js +1 -0
  21. package/dist/models/swagger/swagger-component.js +1 -0
  22. package/dist/models/swagger/swagger-content.js +1 -0
  23. package/dist/models/swagger/swagger-info.js +1 -0
  24. package/dist/models/swagger/swagger-method.js +1 -0
  25. package/dist/models/swagger/swagger-schema.js +1 -0
  26. package/dist/models/swagger/swagger.js +1 -0
  27. package/dist/models/type-dto.js +1 -0
  28. package/dist/swagger-downloader.js +9 -0
  29. package/package.json +1 -1
  30. package/src/generator.ts +170 -110
  31. package/src/generators-writers/angular/api-angular-writer.ts +2 -1
  32. package/src/models/swagger/swagger-component-property.ts +2 -0
  33. package/src/models/type-dto.ts +4 -1
  34. package/tsconfig.json +1 -2
package/src/generator.ts CHANGED
@@ -15,7 +15,7 @@ import { ModelNextJsWriter } from './generators-writers/nextjs/model-nextjs-writ
15
15
  import { ModelAngularWriter } from './generators-writers/angular/model-angular-writer.js';
16
16
  import { PropertyDto } from './models/property-dto.js';
17
17
  import { EnumValueDto } from './models/enum-value-dto.js';
18
- import pkg from '../package.json' assert { type: 'json' };
18
+ import { SwaggerContent } from './models/swagger/swagger-content.js';
19
19
 
20
20
  const contentTypeApplicationJson = 'application/json';
21
21
  const contentTypeMultipartFormData = 'multipart/form-data';
@@ -53,8 +53,6 @@ export class Generator {
53
53
  }
54
54
 
55
55
  generate() {
56
- console.info(`%c[Swagger API Generator] Version ${pkg.version}`, 'color: #4CAF50; font-weight: bold;');
57
-
58
56
  console.info('%c[Swagger API Generator] %cStarting to parse Swagger JSON file...', 'color: #4CAF50; font-weight: bold;', 'color: #2196F3;');
59
57
 
60
58
  this.computeApi();
@@ -82,7 +80,7 @@ export class Generator {
82
80
  url: apiName.replace('{version}', '1'),
83
81
  method: apiMethod,
84
82
  parameters: this.computeParameters(apiName, apiSwaggerMethod),
85
- returnType: this.computeReturnType(apiSwaggerMethod),
83
+ returnType: this.computeResponseType(apiSwaggerMethod),
86
84
  swaggerMethodKey: apiSwaggerMethodKey,
87
85
  swaggerMethod: apiSwaggerMethod,
88
86
  haveRequest: apiSwaggerMethod.requestBody != null,
@@ -95,41 +93,48 @@ export class Generator {
95
93
  computeModel() {
96
94
  this._barModels.start(Object.getOwnPropertyNames(this._swagger.paths).length, 0);
97
95
 
98
- let usedTypes: string[] = [];
96
+ let usedTypes: TypeDto[] = [];
99
97
  let usedMultiPart: string[] = [];
100
98
 
101
- for (let index = 0; index < Object.getOwnPropertyNames(this._swagger.paths).length; index++) {
102
- const apiName = Object.getOwnPropertyNames(this._swagger.paths)[index];
103
- const apiSwaggerMethodKey = this._swagger.paths[apiName];
104
- const apiMethod = Object.getOwnPropertyNames(apiSwaggerMethodKey)[0];
105
- const apiSwaggerMethod = apiSwaggerMethodKey[apiMethod];
106
-
107
- // if (apiName == "/api/v{version}/TicketFile/Create") {
108
- // debugger
109
- // }
110
-
111
- let parametersRefType = apiSwaggerMethod.parameters?.filter(x => x.in == 'query' && x.schema?.$ref != null).map(x => x.schema.$ref.replace('#/components/schemas/', ''))
112
- if (parametersRefType) {
113
- usedTypes = usedTypes.concat(parametersRefType);
114
- this._barModels.update(index, { message: `Models parsing... ${usedTypes}` });
115
-
116
- if (apiSwaggerMethod.responses[200].content[contentTypeApplicationJson]?.schema.$ref != null) {
117
- usedTypes.push(apiSwaggerMethod.responses[200].content[contentTypeApplicationJson].schema.$ref.replace('#/components/schemas/', ''));
118
- }
119
-
120
- if (apiSwaggerMethod.requestBody?.content[contentTypeApplicationJson]?.schema?.$ref) {
121
- usedTypes.push(apiSwaggerMethod.requestBody?.content[contentTypeApplicationJson]?.schema?.$ref.replace('#/components/schemas/', ''));
122
- }
99
+ // for (let index = 0; index < Object.getOwnPropertyNames(this._swagger.paths).length; index++) {
100
+ // const apiName = Object.getOwnPropertyNames(this._swagger.paths)[index];
101
+ // const apiSwaggerMethodKey = this._swagger.paths[apiName];
102
+ // const apiMethod = Object.getOwnPropertyNames(apiSwaggerMethodKey)[0];
103
+ // const apiSwaggerMethod = apiSwaggerMethodKey[apiMethod];
104
+
105
+ // const parametersRefType = apiSwaggerMethod.parameters?.filter(x => x.in == 'query' && x.schema?.$ref != null).map(x => x.schema.$ref.replace('#/components/schemas/', ''));
106
+ // if (parametersRefType) {
107
+ // usedTypes = usedTypes.concat(parametersRefType);
108
+ // }
109
+
110
+ // const responseRefType = this.computeRequestBodyType(apiSwaggerMethod!);
111
+ // if (responseRefType && !responseRefType.isVoid && !responseRefType.isNativeType) {
112
+ // usedTypes = usedTypes.concat(responseRefType.typeName);
113
+ // }
114
+
115
+ // const contentRefType = this.computeResponseType(apiSwaggerMethod!);
116
+ // if (contentRefType && !contentRefType.isVoid && !contentRefType.isNativeType) {
117
+ // usedTypes = usedTypes.concat(contentRefType.typeName);
118
+ // }
119
+ // }
120
+
121
+ for (let index = 0; index < this._apis.length; index++) {
122
+ if (this._apis[index].returnType && this._apis[index].returnType!.isTypeReference) {
123
+ usedTypes.push(this._apis[index].returnType!);
124
+ }
123
125
 
124
- if (apiSwaggerMethod.requestBody?.content[contentTypeMultipartFormData]?.schema != null) {
125
- usedMultiPart.push(apiName);
126
- }
126
+ if (this._apis[index].parameters) {
127
+ this._apis[index].parameters.forEach(parameter => {
128
+ if (parameter.isTypeReference) {
129
+ usedTypes.push(parameter);
130
+ }
131
+ });
127
132
  }
128
133
  }
129
134
 
130
- this.retrieveNestedObjects(usedTypes);
135
+ usedTypes = [...new Set(usedTypes.map(item => item))]; // distinct
131
136
 
132
- usedTypes = [...new Set(usedTypes.map(item => item))]; // [ 'A', 'B']
137
+ this.retrieveNestedObjects(usedTypes);
133
138
 
134
139
  let models = ``;
135
140
  if (this._swagger.components != null
@@ -140,11 +145,6 @@ export class Generator {
140
145
  for (let index = 0; index < Object.getOwnPropertyNames(this._swagger.components.schemas).length; index++) {
141
146
  const modelName = Object.getOwnPropertyNames(this._swagger.components.schemas)[index];
142
147
 
143
- if (usedTypes.indexOf(modelName) < 0) {
144
- // console.debug(`\tModel SKIP - ${modelName}`);
145
- continue
146
- };
147
-
148
148
  const swaggerComponent = this._swagger.components.schemas[modelName];
149
149
 
150
150
  // console.debug(`\tModel - ${modelName}`);
@@ -210,68 +210,100 @@ export class Generator {
210
210
  if (!swaggerMethod || swaggerMethod == null) return [];
211
211
 
212
212
  let parameters: ParameterDto[] = [];
213
-
214
- if (swaggerMethod.requestBody != null && swaggerMethod.requestBody.content[contentTypeMultipartFormData] != null) {
215
- var modelName = this.getApiNameNormalized(apiName);
216
- parameters.push({
217
- name: 'request',
218
- typeName: modelName,
219
- nullable: false,
220
- isQuery: false,
221
- isEnum: false,
222
- isNativeType: false,
223
- });
224
- } else {
225
- if (swaggerMethod.requestBody != null) {
213
+ try {
214
+ if (swaggerMethod.requestBody != null && swaggerMethod.requestBody.content[contentTypeMultipartFormData] != null) {
215
+ var modelName = this.getApiNameNormalized(apiName);
226
216
  parameters.push({
227
217
  name: 'request',
228
- typeName: swaggerMethod.requestBody.content[contentTypeApplicationJson].schema.$ref.replace('#/components/schemas/', ''),
218
+ typeName: modelName,
229
219
  nullable: false,
230
220
  isQuery: false,
231
221
  isEnum: false,
222
+ isTypeReference: true,
232
223
  isNativeType: false,
224
+ isArray: false,
225
+ isVoid: false,
233
226
  });
234
227
  } else {
235
- swaggerMethod.parameters?.filter(x => x.in == 'query').forEach(parameter => {
236
- if (parameter.schema.$ref != null) {
237
- parameters.push({
238
- name: this.toFirstLetterLowercase(parameter.name),
239
- typeName: parameter.schema.$ref.replace('#/components/schemas/', ''),
240
- nullable: !parameter.required,
241
- swaggerParameter: parameter,
242
- isQuery: true,
243
- isEnum: this.isEnum(parameter.schema.$ref),
244
- isNativeType: false,
245
- });
246
- } else {
247
- parameters.push({
248
- name: this.toFirstLetterLowercase(parameter.name),
249
- typeName: this.getNativeType(parameter.schema),
250
- nullable: !parameter.required,
251
- swaggerParameter: parameter,
252
- isQuery: true,
253
- isEnum: false,
254
- isNativeType: true,
255
- });
256
- }
257
- });
228
+ if (swaggerMethod.requestBody != null) {
229
+ parameters.push({
230
+ name: 'request',
231
+ typeName: swaggerMethod.requestBody.content[contentTypeApplicationJson].schema.$ref.replace('#/components/schemas/', ''),
232
+ nullable: false,
233
+ isQuery: false,
234
+ isEnum: false,
235
+ isTypeReference: true,
236
+ isNativeType: false,
237
+ isArray: false,
238
+ isVoid: false,
239
+ });
240
+ } else {
241
+ swaggerMethod.parameters?.filter(x => x.in == 'query').forEach(parameter => {
242
+ if (parameter.schema.$ref != null) {
243
+ parameters.push({
244
+ name: this.toFirstLetterLowercase(parameter.name),
245
+ typeName: parameter.schema.$ref.replace('#/components/schemas/', ''),
246
+ nullable: !parameter.required,
247
+ swaggerParameter: parameter,
248
+ isQuery: true,
249
+ isEnum: this.isEnum(parameter.schema.$ref),
250
+ isTypeReference: false,
251
+ isNativeType: false,
252
+ isArray: false,
253
+ isVoid: false,
254
+ });
255
+ } else {
256
+ parameters.push({
257
+ name: this.toFirstLetterLowercase(parameter.name),
258
+ typeName: this.getNativeType(parameter.schema),
259
+ nullable: !parameter.required,
260
+ swaggerParameter: parameter,
261
+ isQuery: true,
262
+ isEnum: false,
263
+ isTypeReference: false,
264
+ isNativeType: true,
265
+ isArray: false,
266
+ isVoid: false,
267
+ });
268
+ }
269
+ });
270
+ }
258
271
  }
272
+ } catch (error) {
273
+ console.error(`\t\tError in ${apiName} - Attenzione forse hai dimenticato IActionResult e non hai tipizzato il tipo restituito dal servizio`);
259
274
  }
260
275
  return parameters;
261
276
  }
262
277
 
263
- computeReturnType(swaggerMethod: SwaggerMethod) {
278
+ computeResponseType(swaggerMethod: SwaggerMethod) {
264
279
  if (swaggerMethod.responses[200] == null) {
265
280
  return <TypeDto>{
266
281
  typeName: 'void',
267
282
  nullable: false,
283
+ isVoid: true,
268
284
  }
269
285
  }
270
286
 
287
+ return this.computeSwaggerContentType(swaggerMethod.responses[200].content[contentTypeApplicationJson]);
288
+ }
289
+
290
+ computeRequestBodyType(swaggerMethod: SwaggerMethod) {
291
+ if (swaggerMethod.requestBody == null) {
292
+ return <TypeDto>{
293
+ typeName: 'void',
294
+ nullable: false,
295
+ isVoid: true,
296
+ }
297
+ }
298
+
299
+ return this.computeSwaggerContentType(swaggerMethod.requestBody.content[contentTypeApplicationJson]);
300
+ }
301
+
302
+ computeSwaggerContentType(swaggerContent: SwaggerContent) {
271
303
  try {
272
- if (swaggerMethod.responses[200].content[contentTypeApplicationJson].schema.$ref != null)
304
+ if (swaggerContent.schema.$ref != null)
273
305
  return <TypeDto>{
274
- typeName: this.getObjectName(swaggerMethod.responses[200]?.content[contentTypeApplicationJson].schema.$ref),
306
+ typeName: this.getObjectName(swaggerContent.schema.$ref),
275
307
  nullable: false,
276
308
  isNativeType: false,
277
309
  };
@@ -281,19 +313,20 @@ export class Generator {
281
313
  throw new Error(errorMessage);
282
314
  }
283
315
 
284
- if (swaggerMethod.responses[200]?.content[contentTypeApplicationJson].schema.type != null) {
285
- let schema = swaggerMethod.responses[200]?.content[contentTypeApplicationJson].schema;
316
+ if (swaggerContent.schema.type != null) {
317
+ let schema = swaggerContent.schema;
286
318
  if (schema.type == 'array') {
287
319
  if (schema.items.$ref != null) {
288
320
  return <TypeDto>{
289
- typeName: `${this.getObjectName(schema.items.$ref)}[]`,
321
+ typeName: `${this.getObjectName(schema.items.$ref)}`,
290
322
  nullable: false,
291
323
  isNativeType: false,
324
+ isArray: true,
292
325
  };
293
326
  }
294
327
  } else {
295
328
  return <TypeDto>{
296
- typeName: this.getNativeType(swaggerMethod.responses[200]?.content[contentTypeApplicationJson].schema),
329
+ typeName: this.getNativeType(swaggerContent.schema),
297
330
  nullable: false,
298
331
  isNativeType: true,
299
332
  };
@@ -304,7 +337,7 @@ export class Generator {
304
337
 
305
338
  } else {
306
339
  return <TypeDto>{
307
- typeName: this.getNativeType(swaggerMethod.responses[200]?.content[contentTypeApplicationJson].schema),
340
+ typeName: this.getNativeType(swaggerContent.schema),
308
341
  nullable: false,
309
342
  isNativeType: true,
310
343
  };
@@ -315,36 +348,51 @@ export class Generator {
315
348
  if (swaggerComponentProperty.$ref != null)
316
349
  return {
317
350
  typeName: swaggerComponentProperty.$ref.replace('#/components/schemas/', ''),
351
+ isTypeReference: true,
318
352
  isNativeType: false,
319
- nullable: false,
353
+ nullable: swaggerComponentProperty.nullable ?? false,
354
+ isArray: false,
355
+ isVoid: false,
320
356
  };
321
357
 
322
358
  if (swaggerComponentProperty.type != null && swaggerComponentProperty.type == 'array')
323
359
  if (swaggerComponentProperty.items.$ref != null)
324
360
  return {
325
- typeName: `${this.getObjectName(swaggerComponentProperty.items.$ref)}[]`,
361
+ typeName: `${this.getObjectName(swaggerComponentProperty.items.$ref)}`,
362
+ isTypeReference: true,
326
363
  isNativeType: false,
327
- nullable: false,
364
+ nullable: swaggerComponentProperty.nullable ?? false,
365
+ isArray: true,
366
+ isVoid: false,
328
367
  };
329
368
  else
330
369
  return {
331
370
  typeName: this.getNativeType(swaggerComponentProperty),
332
- isNativeType: false,
333
- nullable: true,
371
+ isTypeReference: false,
372
+ isNativeType: true,
373
+ nullable: swaggerComponentProperty.nullable ?? false,
374
+ isArray: false,
375
+ isVoid: false,
334
376
  };
335
377
 
336
378
  if (swaggerComponentProperty.type != null)
337
379
  return {
338
380
  typeName: this.getNativeType(swaggerComponentProperty),
339
- isNativeType: false,
340
- nullable: true,
381
+ isTypeReference: false,
382
+ isNativeType: true,
383
+ nullable: swaggerComponentProperty.nullable ?? false,
384
+ isArray: false,
385
+ isVoid: false,
341
386
  };
342
387
 
343
388
  if (swaggerComponentProperty.type == null)
344
389
  return {
345
- typeName: 'null',
390
+ typeName: 'void',
391
+ isTypeReference: false,
346
392
  isNativeType: false,
347
- nullable: true,
393
+ nullable: swaggerComponentProperty.nullable ?? false,
394
+ isArray: false,
395
+ isVoid: true,
348
396
  };
349
397
 
350
398
  console.error("unmanaged swaggerMethodInfo", swaggerComponentProperty);
@@ -384,7 +432,7 @@ export class Generator {
384
432
  properties.push({
385
433
  ...type,
386
434
  name: propertyName,
387
- nullable: true,
435
+ nullable: type.nullable,
388
436
  });
389
437
  }
390
438
 
@@ -419,32 +467,44 @@ export class Generator {
419
467
  return values;
420
468
  }
421
469
 
422
- retrieveNestedObjects(usedTypes: string[]) {
470
+ retrieveNestedObjects(usedTypes: TypeDto[]) {
423
471
  for (let i = 0; i < usedTypes.length; i++) {
424
- const swaggerCopmponent = this._swagger.components.schemas[usedTypes[i]];
425
- // const name = usedTypes[i]
426
- // const modelName = <string>Object.getOwnPropertyNames(this._swagger.components.schemas)[name];
472
+ const swaggerCopmponent = this._swagger.components.schemas[usedTypes[i].typeName];
427
473
  this.retrieveNestedObjectsRecursive(swaggerCopmponent, usedTypes);
428
474
  }
429
475
  }
430
476
 
431
- retrieveNestedObjectsRecursive(swaggerComponent: SwaggerComponent, usedTypes: string[]) {
432
- if (!swaggerComponent.properties) return;
477
+ retrieveNestedObjectsRecursive(swaggerComponent: SwaggerComponent, usedTypes: TypeDto[]) {
478
+ try {
479
+ if (!swaggerComponent.properties) return;
433
480
 
434
- for (let j = 0; j < Object.getOwnPropertyNames(swaggerComponent.properties).length; j++) {
435
- const propertyName = Object.getOwnPropertyNames(swaggerComponent.properties)[j];
436
- let nestedUsedType = '';
437
- if (swaggerComponent.properties[propertyName].$ref != null) {
438
- nestedUsedType = swaggerComponent.properties[propertyName].$ref.replace('#/components/schemas/', '');
439
- } else if (swaggerComponent.properties[propertyName].type == 'array' && swaggerComponent.properties[propertyName].items.$ref != null) {
440
- nestedUsedType = swaggerComponent.properties[propertyName].items.$ref.replace('#/components/schemas/', '');
441
- }
481
+ for (let j = 0; j < Object.getOwnPropertyNames(swaggerComponent.properties).length; j++) {
482
+ const propertyName = Object.getOwnPropertyNames(swaggerComponent.properties)[j];
442
483
 
443
- if (nestedUsedType != '' && usedTypes.findIndex(x => x == nestedUsedType) == -1) {
444
- usedTypes.push(nestedUsedType);
445
- let nested = this._swagger.components.schemas[nestedUsedType];
446
- this.retrieveNestedObjectsRecursive(nested, usedTypes);
484
+ let nestedUsedType = '';
485
+
486
+ if (swaggerComponent.properties[propertyName].$ref != null) {
487
+ nestedUsedType = swaggerComponent.properties[propertyName].$ref.replace('#/components/schemas/', '');
488
+ } else if (swaggerComponent.properties[propertyName].type == 'array' && swaggerComponent.properties[propertyName].items.$ref != null) {
489
+ nestedUsedType = swaggerComponent.properties[propertyName].items.$ref.replace('#/components/schemas/', '');
490
+ }
491
+
492
+ if (nestedUsedType != '' && usedTypes.findIndex(x => x.typeName == nestedUsedType) == -1) {
493
+ let nested = this._swagger.components.schemas[nestedUsedType];
494
+ usedTypes.push({
495
+ typeName: nestedUsedType,
496
+ isTypeReference: nested.type == 'object',
497
+ isNativeType: nested.type != 'object',
498
+ nullable: false,
499
+ isArray: false,
500
+ isVoid: false,
501
+ //potrebbe essere un enum
502
+ });
503
+ this.retrieveNestedObjectsRecursive(nested, usedTypes);
504
+ }
447
505
  }
506
+ } catch (error) {
507
+ debugger
448
508
  }
449
509
  }
450
510
 
@@ -63,7 +63,8 @@ export class ApiAngularWriter {
63
63
 
64
64
  private _returnType(api: ApiDto) {
65
65
  const prefixType = !api.returnType?.isNativeType ? 'Models.' : '';
66
- return api.returnType ? `${prefixType}${api.returnType.typeName}` : 'any';
66
+ const isArray = api.returnType?.isArray ? '[]' : '';
67
+ return api.returnType ? `${prefixType}${api.returnType.typeName}${isArray}` : 'any';
67
68
  }
68
69
 
69
70
  private _queryParametersPreparation(api: ApiDto) {
@@ -6,4 +6,6 @@ export interface SwaggerComponentProperty {
6
6
  format: string;
7
7
  items: SwaggerSchema;
8
8
  properties: { [key: string]: SwaggerComponentProperty; };
9
+ nullable: boolean;
10
+ minLength: number;
9
11
  }
@@ -1,5 +1,8 @@
1
- export interface TypeDto{
1
+ export interface TypeDto {
2
2
  typeName: string;
3
3
  nullable: boolean;
4
4
  isNativeType: boolean;
5
+ isTypeReference: boolean;
6
+ isVoid: boolean;
7
+ isArray: boolean;
5
8
  }
package/tsconfig.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "ES2022",
4
- "module": "NodeNext",
4
+ "module": "ES2022",
5
5
  "baseUrl": "./src",
6
6
  "moduleResolution": "NodeNext",
7
- "resolveJsonModule": true,
8
7
  "paths": {
9
8
  "@src/*": [
10
9
  "*"