@devlearning/swagger-generator 1.1.1 → 1.1.3

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 (87) hide show
  1. package/.vscode/launch.json +28 -28
  2. package/README.md +209 -209
  3. package/dist/api.constants.d.ts +2 -0
  4. package/dist/api.constants.js +22 -22
  5. package/dist/generator-old.d.ts +0 -0
  6. package/dist/generator-old.js +1 -1
  7. package/dist/generator.d.ts +41 -0
  8. package/dist/generator.js +63 -45
  9. package/dist/generators-writers/angular/api-angular-writer.d.ts +15 -0
  10. package/dist/generators-writers/angular/api-angular-writer.js +22 -19
  11. package/dist/generators-writers/angular/constants.d.ts +4 -0
  12. package/dist/generators-writers/angular/constants.js +24 -24
  13. package/dist/generators-writers/angular/model-angular-writer.d.ts +10 -0
  14. package/dist/generators-writers/angular/model-angular-writer.js +11 -8
  15. package/dist/generators-writers/angular/normalizator.d.ts +3 -0
  16. package/dist/generators-writers/angular/normalizator.js +37 -0
  17. package/dist/generators-writers/dart/api-dart-writer.d.ts +11 -0
  18. package/dist/generators-writers/dart/api-dart-writer.js +2 -2
  19. package/dist/generators-writers/dart/model-dart-writer.d.ts +9 -0
  20. package/dist/generators-writers/dart/model-dart-writer.js +2 -2
  21. package/dist/generators-writers/dart/models/import-definition-dart.d.ts +5 -0
  22. package/dist/generators-writers/dart/normalizator.d.ts +10 -0
  23. package/dist/generators-writers/dart/templates/api.mustache +49 -49
  24. package/dist/generators-writers/dart/templates/enum.mustache +14 -14
  25. package/dist/generators-writers/dart/templates/model.mustache +17 -17
  26. package/dist/generators-writers/nextjs/api-nextjs-writer.d.ts +15 -0
  27. package/dist/generators-writers/nextjs/api-nextjs-writer.js +13 -13
  28. package/dist/generators-writers/nextjs/constants.d.ts +1 -0
  29. package/dist/generators-writers/nextjs/constants.js +4 -4
  30. package/dist/generators-writers/nextjs/model-nextjs-writer.d.ts +10 -0
  31. package/dist/generators-writers/nextjs/model-nextjs-writer.js +6 -6
  32. package/dist/generators-writers/utils.d.ts +13 -0
  33. package/dist/generators-writers/utils.js +9 -1
  34. package/dist/index.d.ts +17 -0
  35. package/dist/model.constants.d.ts +0 -0
  36. package/dist/model.constants.js +1 -1
  37. package/dist/models/api-dto.d.ts +18 -0
  38. package/dist/models/enum-value-dto.d.ts +4 -0
  39. package/dist/models/model-dto.d.ts +9 -0
  40. package/dist/models/parameter-dto.d.ts +7 -0
  41. package/dist/models/property-dto.d.ts +4 -0
  42. package/dist/models/swagger/swagger-component-property.d.ts +1 -0
  43. package/dist/models/swagger/swagger-component.d.ts +10 -0
  44. package/dist/models/swagger/swagger-content.d.ts +4 -0
  45. package/dist/models/swagger/swagger-info.d.ts +4 -0
  46. package/dist/models/swagger/swagger-method.d.ts +9 -0
  47. package/dist/models/swagger/swagger-schema.d.ts +12 -0
  48. package/dist/models/swagger/swagger.d.ts +47 -0
  49. package/dist/models/type-dto.d.ts +8 -0
  50. package/dist/swagger-downloader.d.ts +5 -0
  51. package/dist/templates/api.mustache +29 -0
  52. package/dist/templates/model.mustache +18 -0
  53. package/package.json +45 -45
  54. package/src/api.constants.ts +26 -26
  55. package/src/generator-old.ts +449 -449
  56. package/src/generator.ts +599 -582
  57. package/src/generators-writers/angular/api-angular-writer.ts +146 -141
  58. package/src/generators-writers/angular/constants.ts +36 -36
  59. package/src/generators-writers/angular/model-angular-writer.ts +65 -62
  60. package/src/generators-writers/angular/normalizator.ts +42 -0
  61. package/src/generators-writers/dart/api-dart-writer.ts +198 -198
  62. package/src/generators-writers/dart/model-dart-writer.ts +162 -162
  63. package/src/generators-writers/dart/models/import-definition-dart.ts +5 -5
  64. package/src/generators-writers/dart/normalizator.ts +72 -72
  65. package/src/generators-writers/dart/templates/api.mustache +49 -49
  66. package/src/generators-writers/dart/templates/enum.mustache +14 -14
  67. package/src/generators-writers/dart/templates/model.mustache +17 -17
  68. package/src/generators-writers/nextjs/api-nextjs-writer.ts +156 -156
  69. package/src/generators-writers/nextjs/constants.ts +5 -5
  70. package/src/generators-writers/nextjs/model-nextjs-writer.ts +61 -61
  71. package/src/generators-writers/utils.ts +90 -78
  72. package/src/index.ts +96 -96
  73. package/src/models/api-dto.ts +17 -17
  74. package/src/models/enum-value-dto.ts +3 -3
  75. package/src/models/model-dto.ts +9 -9
  76. package/src/models/parameter-dto.ts +7 -7
  77. package/src/models/property-dto.ts +4 -4
  78. package/src/models/swagger/swagger-component-property.ts +11 -11
  79. package/src/models/swagger/swagger-component.ts +17 -17
  80. package/src/models/swagger/swagger-content.ts +4 -4
  81. package/src/models/swagger/swagger-info.ts +3 -3
  82. package/src/models/swagger/swagger-method.ts +7 -7
  83. package/src/models/swagger/swagger-schema.ts +20 -20
  84. package/src/models/swagger/swagger.ts +38 -38
  85. package/src/models/type-dto.ts +7 -7
  86. package/src/swagger-downloader.ts +12 -12
  87. package/tsconfig.json +33 -28
@@ -1,199 +1,199 @@
1
- import fs, { writeFileSync } from 'fs';
2
- import { ApiDto } from '@src/models/api-dto.js';
3
- import { Utils } from '../utils.js';
4
- import { ParameterDto } from '@src/models/parameter-dto.js';
5
- import * as Mustache from 'mustache';
6
- import { CommandLineArgs } from '@src/index.js';
7
- import { ModelDto } from '@src/models/model-dto.js';
8
- import { TypeDto } from '@src/models/type-dto.js';
9
- import { ImportDefinitionDart } from './models/import-definition-dart.js';
10
- import { Normalizator } from './normalizator.js';
11
- import path from 'path';
12
- import { fileURLToPath } from 'url';
13
-
14
- interface ApiDefinitionDart {
15
- package: string;
16
- outputDirectory: string;
17
- filename: string;
18
- apiClassName: string;
19
- imports: string[];
20
- endpoints: EndpointDefinitionDart[];
21
- }
22
-
23
- interface EndpointDefinitionDart {
24
- methodName: string;
25
- httpMethod: HttpMethodDart;
26
- path: string;
27
- responseType: string;
28
- isResponseNativeType: boolean;
29
- haveRequest: boolean;
30
- requestType?: string; // solo se haveRequest è true
31
- queryParams?: Parameter[],
32
- }
33
-
34
- interface Parameter {
35
- name: string;
36
- type: string; // "string", "int", ecc
37
- nullable: boolean;
38
- }
39
-
40
- type HttpMethodDart = 'get' | 'post' | 'put' | 'delete' | 'patch';
41
-
42
-
43
- export class ApiDartWriter {
44
- private _commandLineArgs: CommandLineArgs;
45
-
46
- constructor(commandLineArgs: CommandLineArgs) {
47
- this._commandLineArgs = commandLineArgs;
48
- }
49
-
50
- write(apis: ApiDto[], models: ModelDto[]) {
51
- const __filename = fileURLToPath(import.meta.url);
52
- const __dirname = path.dirname(__filename);
53
- const templatePath = path.join(__dirname, 'templates', 'api.mustache');
54
- const template = fs.readFileSync(templatePath, 'utf-8');
55
- let importDirectory = this._commandLineArgs.outputDirectory;
56
- if (importDirectory.startsWith('lib/')) {
57
- importDirectory = importDirectory.slice('lib/'.length);
58
- }
59
-
60
- const grouped = this._groupByTag(apis);
61
-
62
- for (const [tag, apis] of Object.entries(grouped)) {
63
- console.log(`Api: ${tag}`);
64
-
65
- let subPath = '';
66
- let filename = '';
67
- let apiClassName = '';
68
-
69
- subPath = Utils.toDartFileName(tag);
70
- filename = `${Utils.toDartFileName(tag + 'Api')}`;
71
- apiClassName = `${Utils.toDartClassName(tag + 'Api')}`;
72
-
73
- var apiDefinition = <ApiDefinitionDart>{
74
- package: this._commandLineArgs.package,
75
- outputDirectory: this._commandLineArgs.outputDirectory,
76
- filename: filename,
77
- apiClassName: apiClassName,
78
- }
79
-
80
- var endpoints = <EndpointDefinitionDart[]>[];
81
- var imports = <ImportDefinitionDart[]>[];
82
-
83
- for (const api of apis) {
84
- var requestType: string | undefined = undefined;
85
- requestType = api.haveRequest ? api.parameters[0]?.typeName || 'void' : undefined;
86
- requestType = requestType?.split('.').pop()!
87
- requestType = Utils.toDartClassName(requestType);
88
-
89
-
90
-
91
- var responseType: string = 'void';
92
- responseType = api.returnType ? api.returnType.typeName : 'void';
93
- responseType = responseType?.split('.').pop()!;
94
- if (api.returnType?.isNativeType) {
95
- responseType = Normalizator.mapTsTypeToDart(responseType);
96
- } else {
97
- responseType = Utils.toDartClassName(responseType) ?? responseType;
98
- }
99
-
100
- var methodName = Utils.getNormalizedApiPath(api.name);
101
- if (methodName.startsWith(Utils.toFirstLetterLowercase(tag))) {
102
- methodName = methodName.slice(tag.length);
103
- methodName = Utils.toFirstLetterLowercase(methodName);
104
- }
105
-
106
- // console.debug(`\tAPI - ${apiName} - ${apiMethod}`);
107
- if (methodName.toLowerCase().indexOf("productsave") >= 0) {
108
- debugger
109
- }
110
-
111
- const endpoint = <EndpointDefinitionDart>{
112
- methodName: methodName,
113
- httpMethod: api.method.toLowerCase() as HttpMethodDart,
114
- path: api.url,
115
- responseType: responseType,
116
- isResponseNativeType: api.returnType ? api.returnType.isNativeType : true,
117
- haveRequest: api.haveRequest,
118
- requestType: requestType,
119
- };
120
-
121
- if (api.parameters && api.parameters.length > 0 && !api.haveRequest) {
122
- endpoint.queryParams = api.parameters
123
- .map(p => ({
124
- name: p.name,
125
- type: p.typeName ? Normalizator.mapTsTypeToDart(p.typeName)! : 'String',
126
- nullable: p.nullable
127
- }));
128
- }
129
-
130
- if (api.haveRequest && api.parameters[0]?.typeName) {
131
- if (imports.findIndex(x => x.type.typeName == api.parameters[0]?.typeName) == -1) {
132
- models.forEach(model => {
133
- if (model.typeName === api.parameters[0]?.typeName) {
134
- const normalizedInfo = Normalizator.getNormalizedInfo(model);
135
- imports.push({
136
- type: api.parameters[0],
137
- import: `import 'package:${this._commandLineArgs.package}/${importDirectory}/${normalizedInfo.subPath}/${normalizedInfo.filename}.dart';`
138
- });
139
- }
140
- });
141
- }
142
- }
143
-
144
- if (api.returnType && !api.returnType.isNativeType) {
145
- if (imports.findIndex(x => x.type.typeName == api.returnType!.typeName) == -1) {
146
- models.forEach(model => {
147
- if (model.typeName === api.returnType!.typeName) {
148
- const normalizedInfo = Normalizator.getNormalizedInfo(model);
149
- imports.push({
150
- type: api.returnType!,
151
- import: `import 'package:${this._commandLineArgs.package}/${importDirectory}/${normalizedInfo.subPath}/${normalizedInfo.filename}.dart';`
152
- });
153
- }
154
- });
155
- }
156
- }
157
-
158
- endpoints.push(endpoint);
159
- }
160
-
161
- apiDefinition.endpoints = endpoints;
162
- apiDefinition.imports = imports.map(i => i.import);
163
-
164
- let destinationPath = `${this._commandLineArgs.outputDirectory}/${subPath}/api`;
165
-
166
- Utils.ensureDirectorySync(`${destinationPath}`);
167
-
168
- var result = Mustache.default.render(template, apiDefinition);
169
- writeFileSync(`${destinationPath}/${apiDefinition.filename}.dart`, result, 'utf-8');
170
- }
171
- }
172
-
173
- private _toPascalCase(input: string): string {
174
- return input
175
- .replace(/[_\- ]+/g, ' ') // sostituisce underscore, dash e spazi con uno spazio singolo
176
- .trim() // rimuove spazi iniziali/finali
177
- .split(' ') // divide in parole
178
- .map(word =>
179
- word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
180
- )
181
- .join('');
182
- }
183
-
184
- private _normalizeApiClassName(input: string): string {
185
- return input
186
- .replace(/\./g, '');
187
- }
188
-
189
- private _groupByTag(apis: ApiDto[]) {
190
- const groupedByRole = apis.reduce<Record<string, ApiDto[]>>((acc, api) => {
191
- if (!acc[api.tag]) {
192
- acc[api.tag] = [];
193
- }
194
- acc[api.tag].push(api);
195
- return acc;
196
- }, {});
197
- return groupedByRole;
198
- }
1
+ import fs, { writeFileSync } from 'fs';
2
+ import { ApiDto } from '@src/models/api-dto.js';
3
+ import { Utils } from '../utils.js';
4
+ import { ParameterDto } from '@src/models/parameter-dto.js';
5
+ import * as Mustache from 'mustache';
6
+ import { CommandLineArgs } from '@src/index.js';
7
+ import { ModelDto } from '@src/models/model-dto.js';
8
+ import { TypeDto } from '@src/models/type-dto.js';
9
+ import { ImportDefinitionDart } from './models/import-definition-dart.js';
10
+ import { Normalizator } from './normalizator.js';
11
+ import path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+
14
+ interface ApiDefinitionDart {
15
+ package: string;
16
+ outputDirectory: string;
17
+ filename: string;
18
+ apiClassName: string;
19
+ imports: string[];
20
+ endpoints: EndpointDefinitionDart[];
21
+ }
22
+
23
+ interface EndpointDefinitionDart {
24
+ methodName: string;
25
+ httpMethod: HttpMethodDart;
26
+ path: string;
27
+ responseType: string;
28
+ isResponseNativeType: boolean;
29
+ haveRequest: boolean;
30
+ requestType?: string; // solo se haveRequest è true
31
+ queryParams?: Parameter[],
32
+ }
33
+
34
+ interface Parameter {
35
+ name: string;
36
+ type: string; // "string", "int", ecc
37
+ nullable: boolean;
38
+ }
39
+
40
+ type HttpMethodDart = 'get' | 'post' | 'put' | 'delete' | 'patch';
41
+
42
+
43
+ export class ApiDartWriter {
44
+ private _commandLineArgs: CommandLineArgs;
45
+
46
+ constructor(commandLineArgs: CommandLineArgs) {
47
+ this._commandLineArgs = commandLineArgs;
48
+ }
49
+
50
+ write(apis: ApiDto[], models: ModelDto[]) {
51
+ const __filename = fileURLToPath(import.meta.url);
52
+ const __dirname = path.dirname(__filename);
53
+ const templatePath = path.join(__dirname, 'templates', 'api.mustache');
54
+ const template = fs.readFileSync(templatePath, 'utf-8');
55
+ let importDirectory = this._commandLineArgs.outputDirectory;
56
+ if (importDirectory.startsWith('lib/')) {
57
+ importDirectory = importDirectory.slice('lib/'.length);
58
+ }
59
+
60
+ const grouped = this._groupByTag(apis);
61
+
62
+ for (const [tag, apis] of Object.entries(grouped)) {
63
+ console.log(`Api: ${tag}`);
64
+
65
+ let subPath = '';
66
+ let filename = '';
67
+ let apiClassName = '';
68
+
69
+ subPath = Utils.toDartFileName(tag);
70
+ filename = `${Utils.toDartFileName(tag + 'Api')}`;
71
+ apiClassName = `${Utils.toDartClassName(tag + 'Api')}`;
72
+
73
+ var apiDefinition = <ApiDefinitionDart>{
74
+ package: this._commandLineArgs.package,
75
+ outputDirectory: this._commandLineArgs.outputDirectory,
76
+ filename: filename,
77
+ apiClassName: apiClassName,
78
+ }
79
+
80
+ var endpoints = <EndpointDefinitionDart[]>[];
81
+ var imports = <ImportDefinitionDart[]>[];
82
+
83
+ for (const api of apis) {
84
+ var requestType: string | undefined = undefined;
85
+ requestType = api.haveRequest ? api.parameters[0]?.typeName || 'void' : undefined;
86
+ requestType = requestType?.split('.').pop()!
87
+ requestType = Utils.toDartClassName(requestType);
88
+
89
+
90
+
91
+ var responseType: string = 'void';
92
+ responseType = api.returnType ? api.returnType.typeName : 'void';
93
+ responseType = responseType?.split('.').pop()!;
94
+ if (api.returnType?.isNativeType) {
95
+ responseType = Normalizator.mapTsTypeToDart(responseType);
96
+ } else {
97
+ responseType = Utils.toDartClassName(responseType) ?? responseType;
98
+ }
99
+
100
+ var methodName = Utils.getNormalizedApiPathDart(api.name);
101
+ if (methodName.startsWith(Utils.toFirstLetterLowercase(tag))) {
102
+ methodName = methodName.slice(tag.length);
103
+ methodName = Utils.toFirstLetterLowercase(methodName);
104
+ }
105
+
106
+ // console.debug(`\tAPI - ${apiName} - ${apiMethod}`);
107
+ if (methodName.toLowerCase().indexOf("productsave") >= 0) {
108
+ debugger
109
+ }
110
+
111
+ const endpoint = <EndpointDefinitionDart>{
112
+ methodName: methodName,
113
+ httpMethod: api.method.toLowerCase() as HttpMethodDart,
114
+ path: api.url,
115
+ responseType: responseType,
116
+ isResponseNativeType: api.returnType ? api.returnType.isNativeType : true,
117
+ haveRequest: api.haveRequest,
118
+ requestType: requestType,
119
+ };
120
+
121
+ if (api.parameters && api.parameters.length > 0 && !api.haveRequest) {
122
+ endpoint.queryParams = api.parameters
123
+ .map(p => ({
124
+ name: p.name,
125
+ type: p.typeName ? Normalizator.mapTsTypeToDart(p.typeName)! : 'String',
126
+ nullable: p.nullable
127
+ }));
128
+ }
129
+
130
+ if (api.haveRequest && api.parameters[0]?.typeName) {
131
+ if (imports.findIndex(x => x.type.typeName == api.parameters[0]?.typeName) == -1) {
132
+ models.forEach(model => {
133
+ if (model.typeName === api.parameters[0]?.typeName) {
134
+ const normalizedInfo = Normalizator.getNormalizedInfo(model);
135
+ imports.push({
136
+ type: api.parameters[0],
137
+ import: `import 'package:${this._commandLineArgs.package}/${importDirectory}/${normalizedInfo.subPath}/${normalizedInfo.filename}.dart';`
138
+ });
139
+ }
140
+ });
141
+ }
142
+ }
143
+
144
+ if (api.returnType && !api.returnType.isNativeType) {
145
+ if (imports.findIndex(x => x.type.typeName == api.returnType!.typeName) == -1) {
146
+ models.forEach(model => {
147
+ if (model.typeName === api.returnType!.typeName) {
148
+ const normalizedInfo = Normalizator.getNormalizedInfo(model);
149
+ imports.push({
150
+ type: api.returnType!,
151
+ import: `import 'package:${this._commandLineArgs.package}/${importDirectory}/${normalizedInfo.subPath}/${normalizedInfo.filename}.dart';`
152
+ });
153
+ }
154
+ });
155
+ }
156
+ }
157
+
158
+ endpoints.push(endpoint);
159
+ }
160
+
161
+ apiDefinition.endpoints = endpoints;
162
+ apiDefinition.imports = imports.map(i => i.import);
163
+
164
+ let destinationPath = `${this._commandLineArgs.outputDirectory}/${subPath}/api`;
165
+
166
+ Utils.ensureDirectorySync(`${destinationPath}`);
167
+
168
+ var result = Mustache.render(template, apiDefinition);
169
+ writeFileSync(`${destinationPath}/${apiDefinition.filename}.dart`, result, 'utf-8');
170
+ }
171
+ }
172
+
173
+ private _toPascalCase(input: string): string {
174
+ return input
175
+ .replace(/[_\- ]+/g, ' ') // sostituisce underscore, dash e spazi con uno spazio singolo
176
+ .trim() // rimuove spazi iniziali/finali
177
+ .split(' ') // divide in parole
178
+ .map(word =>
179
+ word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
180
+ )
181
+ .join('');
182
+ }
183
+
184
+ private _normalizeApiClassName(input: string): string {
185
+ return input
186
+ .replace(/\./g, '');
187
+ }
188
+
189
+ private _groupByTag(apis: ApiDto[]) {
190
+ const groupedByRole = apis.reduce<Record<string, ApiDto[]>>((acc, api) => {
191
+ if (!acc[api.tag]) {
192
+ acc[api.tag] = [];
193
+ }
194
+ acc[api.tag].push(api);
195
+ return acc;
196
+ }, {});
197
+ return groupedByRole;
198
+ }
199
199
  }