@devlearning/swagger-generator 0.0.37 → 1.0.0
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.
- package/.vscode/launch.json +8 -2
- package/README.md +3 -1
- package/autogeneration/output/api.autogenerated.ts +2144 -5
- package/autogeneration/output/model.autogenerated.ts +2789 -0
- package/dist/api.constants.js +7 -1
- package/dist/generator-old.js +369 -0
- package/dist/generator.js +223 -216
- package/dist/generators-writers/angular/api-angular-writer.js +111 -0
- package/dist/generators-writers/angular/constants.js +28 -0
- package/dist/generators-writers/angular/model-angular-writer.js +42 -0
- package/dist/generators-writers/nextjs/api-nextjs-writer.js +127 -0
- package/dist/generators-writers/nextjs/constants.js +4 -0
- package/dist/generators-writers/nextjs/model-nextjs-writer.js +41 -0
- package/dist/generators-writers/utils.js +20 -0
- package/dist/index.js +7 -5
- package/dist/model.constants.js +1 -4
- package/dist/models/api-dto.js +1 -0
- package/dist/models/enum-value-dto.js +1 -0
- package/dist/models/model-dto.js +1 -0
- package/dist/models/parameter-dto.js +1 -0
- package/dist/models/property-dto.js +1 -0
- package/dist/models/swagger/swagger-component-property.js +1 -0
- package/dist/models/swagger/swagger-component.js +1 -0
- package/dist/models/swagger/swagger-content.js +1 -0
- package/dist/models/swagger/swagger-info.js +1 -0
- package/dist/models/swagger/swagger-method.js +1 -0
- package/dist/models/swagger/swagger-schema.js +1 -0
- package/dist/models/swagger/swagger.js +1 -0
- package/dist/models/type-dto.js +1 -0
- package/package.json +6 -3
- package/src/api.constants.ts +7 -1
- package/src/generator-old.ts +450 -0
- package/src/generator.ts +246 -231
- package/src/generators-writers/angular/api-angular-writer.ts +139 -0
- package/src/generators-writers/angular/constants.ts +36 -0
- package/src/generators-writers/angular/model-angular-writer.ts +60 -0
- package/src/generators-writers/nextjs/api-nextjs-writer.ts +157 -0
- package/src/generators-writers/nextjs/constants.ts +5 -0
- package/src/generators-writers/nextjs/model-nextjs-writer.ts +59 -0
- package/src/generators-writers/utils.ts +27 -0
- package/src/index.ts +7 -5
- package/src/model.constants.ts +0 -7
- package/src/models/api-dto.ts +17 -0
- package/src/models/enum-value-dto.ts +4 -0
- package/src/models/model-dto.ts +9 -0
- package/src/models/parameter-dto.ts +8 -0
- package/src/models/property-dto.ts +5 -0
- package/src/models/type-dto.ts +4 -0
- package/src/swagger-downloader.ts +1 -1
- package/tsconfig.json +1 -1
- /package/src/models/{swagger-component-property.ts → swagger/swagger-component-property.ts} +0 -0
- /package/src/models/{swagger-component.ts → swagger/swagger-component.ts} +0 -0
- /package/src/models/{swagger-content.ts → swagger/swagger-content.ts} +0 -0
- /package/src/models/{swagger-info.ts → swagger/swagger-info.ts} +0 -0
- /package/src/models/{swagger-method.ts → swagger/swagger-method.ts} +0 -0
- /package/src/models/{swagger-schema.ts → swagger/swagger-schema.ts} +0 -0
- /package/src/models/{swagger.ts → swagger/swagger.ts} +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const API_PRE = `import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Observable, catchError, map } from 'rxjs';
|
|
3
|
+
import * as Models from './model.autogenerated';
|
|
4
|
+
import { HttpHeaders } from "@angular/common/http";
|
|
5
|
+
|
|
6
|
+
export const httpOptions = {
|
|
7
|
+
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const httpOptionsMultipart = {};
|
|
11
|
+
|
|
12
|
+
export abstract class ApiAutogeneratedService {
|
|
13
|
+
constructor(
|
|
14
|
+
public _http: HttpClient,
|
|
15
|
+
public _baseUrl: string,
|
|
16
|
+
) { }
|
|
17
|
+
|
|
18
|
+
protected abstract _momentToString(moment: moment.Moment): string;
|
|
19
|
+
protected abstract _handleRequest<T>(request: T): T;
|
|
20
|
+
protected abstract _handleMultipart<T>(request: T): FormData;
|
|
21
|
+
protected abstract _handleResponse<T>(response: T): T;
|
|
22
|
+
protected abstract _handleError(error: any, obs: any): Observable<never>;
|
|
23
|
+
`;
|
|
24
|
+
export const API_POST = `}`;
|
|
25
|
+
export const MODEL_PRE = `import * as moment from 'moment';
|
|
26
|
+
`;
|
|
27
|
+
export const MODEL_POST = `
|
|
28
|
+
`;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { MODEL_POST, MODEL_PRE } from './constants.js';
|
|
3
|
+
export class ModelAngularWriter {
|
|
4
|
+
_outputDirectory;
|
|
5
|
+
constructor(_outputDirectory) {
|
|
6
|
+
this._outputDirectory = _outputDirectory;
|
|
7
|
+
}
|
|
8
|
+
write(models) {
|
|
9
|
+
let modelString = '';
|
|
10
|
+
models.forEach(model => {
|
|
11
|
+
modelString += this._modelString(model);
|
|
12
|
+
});
|
|
13
|
+
this._writeFile(modelString);
|
|
14
|
+
}
|
|
15
|
+
_modelString(model) {
|
|
16
|
+
let modelString = `
|
|
17
|
+
export ${model.modelType} ${model.name} {
|
|
18
|
+
${this._properties(model)}${this._enumValues(model)}
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
return modelString;
|
|
22
|
+
}
|
|
23
|
+
_properties(model) {
|
|
24
|
+
let propertiesString = '';
|
|
25
|
+
model.properties.forEach(property => {
|
|
26
|
+
propertiesString += ` ${property.name}${property.nullable ? '?' : ''}: ${property.typeName};\n`;
|
|
27
|
+
});
|
|
28
|
+
return propertiesString.trimEnd();
|
|
29
|
+
}
|
|
30
|
+
_enumValues(model) {
|
|
31
|
+
let enumValuesString = '';
|
|
32
|
+
model.enumValues.forEach(enumValue => {
|
|
33
|
+
enumValuesString += ` ${enumValue.name} = ${enumValue.value},\n`;
|
|
34
|
+
});
|
|
35
|
+
return enumValuesString.trimEnd();
|
|
36
|
+
}
|
|
37
|
+
_writeFile(models) {
|
|
38
|
+
fs.writeFileSync(this._outputDirectory + "/model.autogenerated.ts", `${MODEL_PRE}
|
|
39
|
+
${models}
|
|
40
|
+
${MODEL_POST}`, { flag: 'w' });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { API_PRE } from './constants.js';
|
|
3
|
+
import { Utils } from '../utils.js';
|
|
4
|
+
export class ApiNextJsWriter {
|
|
5
|
+
_outputDirectory;
|
|
6
|
+
constructor(_outputDirectory) {
|
|
7
|
+
this._outputDirectory = _outputDirectory;
|
|
8
|
+
}
|
|
9
|
+
write(apis) {
|
|
10
|
+
let apiString = '';
|
|
11
|
+
apis.forEach(api => {
|
|
12
|
+
apiString += this._apiString(api);
|
|
13
|
+
});
|
|
14
|
+
this._writeFile(apiString);
|
|
15
|
+
}
|
|
16
|
+
_apiString(api) {
|
|
17
|
+
let apiNameNormalized = Utils.toCamelCase(Utils.getApiNameNormalized(api.name));
|
|
18
|
+
let parametersString = this._parameters(api);
|
|
19
|
+
let queryParametersPreparation = this._queryParametersPreparation(api);
|
|
20
|
+
let requestPreparation = this._requestPreparation(api);
|
|
21
|
+
let queryParameters = this._queryParameters(api);
|
|
22
|
+
let returnTypeString = this._returnType(api);
|
|
23
|
+
let haveRequest = api.haveRequest;
|
|
24
|
+
let method = api.method.toLowerCase();
|
|
25
|
+
let httpOptions = api.isMultiPart ? 'httpOptionsMultiPart' : 'httpOptions';
|
|
26
|
+
let preparation = `${queryParametersPreparation}
|
|
27
|
+
${requestPreparation}`.trim();
|
|
28
|
+
preparation = preparation.length > 0 ? ` ${preparation}\n ` : '';
|
|
29
|
+
//\`\${API_BASE_URL}
|
|
30
|
+
let apiString = `
|
|
31
|
+
export const ${apiNameNormalized} = async (${parametersString}): Promise<${returnTypeString}> {
|
|
32
|
+
${preparation}const response = await axios.${method}<${returnTypeString}>(${api.url}${queryParameters}\`${haveRequest ? ', wrappedRequest' : ''});
|
|
33
|
+
return response.data;
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
return apiString;
|
|
37
|
+
}
|
|
38
|
+
_parameters(api) {
|
|
39
|
+
let parametersString = '';
|
|
40
|
+
api.parameters.forEach(parameter => {
|
|
41
|
+
parametersString += `${parameter.name}${parameter.nullable ? '?' : ''}: ${parameter.typeName}, `;
|
|
42
|
+
});
|
|
43
|
+
if (api.parameters.length > 0)
|
|
44
|
+
parametersString = parametersString.substring(0, parametersString.length - 2);
|
|
45
|
+
return parametersString;
|
|
46
|
+
}
|
|
47
|
+
_returnType(api) {
|
|
48
|
+
return api.returnType ? api.returnType.typeName : 'any';
|
|
49
|
+
}
|
|
50
|
+
_queryParametersPreparation(api) {
|
|
51
|
+
let queryParametersPreparation = '';
|
|
52
|
+
api.parameters.forEach(parameter => {
|
|
53
|
+
if (parameter.isQuery) {
|
|
54
|
+
queryParametersPreparation += this._queryParametersPreparationStatement(parameter);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return `${queryParametersPreparation}`;
|
|
58
|
+
}
|
|
59
|
+
_queryParametersPreparationStatement(parameter) {
|
|
60
|
+
if (parameter.nullable) {
|
|
61
|
+
if (Utils.isDate(parameter.swaggerParameter?.schema)) {
|
|
62
|
+
return ` let ${parameter.name}Param: string = ${parameter.name} != null && ${parameter.name} != undefined && ${parameter.name}.isValid() ? encodeURIComponent(this._momentToString(${parameter.name})) : '';
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return ` let ${parameter.name}Param: string = ${parameter.name} != null && ${parameter.name} != undefined ? encodeURIComponent('' + ${parameter.name}) : '';
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (Utils.isDate(parameter.swaggerParameter?.schema)) {
|
|
72
|
+
return ` let ${parameter.name}Param: string = encodeURIComponent(this._momentToString(${parameter.name}));
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return ` let ${parameter.name}Param: string = encodeURIComponent('' + ${parameter.name});
|
|
77
|
+
`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
_queryParameters(api) {
|
|
82
|
+
let queryParameters = '';
|
|
83
|
+
api.parameters.forEach(parameter => {
|
|
84
|
+
if (parameter.isQuery) {
|
|
85
|
+
queryParameters += this._queryParametersStatement(parameter);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
if (queryParameters.length > 0) {
|
|
89
|
+
queryParameters = '?' + queryParameters.substring(0, queryParameters.length - 1);
|
|
90
|
+
}
|
|
91
|
+
return queryParameters;
|
|
92
|
+
}
|
|
93
|
+
_queryParametersStatement(parameter) {
|
|
94
|
+
if (parameter.swaggerParameter == null)
|
|
95
|
+
return '';
|
|
96
|
+
if (!parameter.isQuery)
|
|
97
|
+
return '';
|
|
98
|
+
return `${parameter.name}=\${${parameter.name}Param}&`;
|
|
99
|
+
// if (parameter.isEnum) {
|
|
100
|
+
// return `${parameter.name}=\${` + parameter.name + `Param}&`;
|
|
101
|
+
// } else {
|
|
102
|
+
// return `${parameter.name}=\${` + parameter.name + `}&`;
|
|
103
|
+
// }
|
|
104
|
+
// if (parameter.swaggerParameter.schema.$ref != null) {
|
|
105
|
+
// if (this.isEnum(parameter.schema.$ref) != null) {
|
|
106
|
+
// parameters += `${this.toFirstLetterLowercase(parameter.name)}=\${` + this.toFirstLetterLowercase(parameter.name) + `Param}&`;;
|
|
107
|
+
// } else {
|
|
108
|
+
// throw new Error("retrieveQueryParameters unmanaged parameter.schema.$ref");
|
|
109
|
+
// }
|
|
110
|
+
// } else {
|
|
111
|
+
// parameters += `${this.toFirstLetterLowercase(parameter.name)}=\${` + this.toFirstLetterLowercase(parameter.name) + `Param}&`;
|
|
112
|
+
// }
|
|
113
|
+
// let paramName = Utils.toFirstLetterLowercase(parameter.name);
|
|
114
|
+
// return `${parameter.swaggerParameter?.name}=\${${paramName}Param}&`;
|
|
115
|
+
}
|
|
116
|
+
_requestPreparation(api) {
|
|
117
|
+
if (!api.haveRequest) {
|
|
118
|
+
return ``;
|
|
119
|
+
}
|
|
120
|
+
return ` let wrappedRequest = this._handleRequest(request);
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
_writeFile(apis) {
|
|
124
|
+
fs.writeFileSync(this._outputDirectory + "/api.autogenerated.ts", `${API_PRE}
|
|
125
|
+
${apis}`, { flag: 'w' });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
export class ModelNextJsWriter {
|
|
3
|
+
_outputDirectory;
|
|
4
|
+
constructor(_outputDirectory) {
|
|
5
|
+
this._outputDirectory = _outputDirectory;
|
|
6
|
+
}
|
|
7
|
+
write(models) {
|
|
8
|
+
let modelString = '';
|
|
9
|
+
models.forEach(model => {
|
|
10
|
+
modelString += this._modelString(model);
|
|
11
|
+
});
|
|
12
|
+
this._writeFile(modelString);
|
|
13
|
+
}
|
|
14
|
+
_modelString(model) {
|
|
15
|
+
let modelString = `
|
|
16
|
+
export ${model.modelType} ${model.name} {
|
|
17
|
+
${this._properties(model)}${this._enumValues(model)}
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
return modelString;
|
|
21
|
+
}
|
|
22
|
+
_properties(model) {
|
|
23
|
+
let propertiesString = '';
|
|
24
|
+
model.properties.forEach(property => {
|
|
25
|
+
propertiesString += ` ${property.name}${property.nullable ? '?' : ''}: ${property.typeName};\n`;
|
|
26
|
+
});
|
|
27
|
+
return propertiesString.trimEnd();
|
|
28
|
+
}
|
|
29
|
+
_enumValues(model) {
|
|
30
|
+
let enumValuesString = '';
|
|
31
|
+
model.enumValues.forEach(enumValue => {
|
|
32
|
+
enumValuesString += ` ${enumValue.name} = ${enumValue.value},\n`;
|
|
33
|
+
});
|
|
34
|
+
return enumValuesString.trimEnd();
|
|
35
|
+
}
|
|
36
|
+
_writeFile(models) {
|
|
37
|
+
fs.writeFileSync(this._outputDirectory + "/model.autogenerated.ts", `
|
|
38
|
+
${models}
|
|
39
|
+
`, { flag: 'w' });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export class Utils {
|
|
2
|
+
static getApiNameNormalized(apiName) {
|
|
3
|
+
let normalizedApiName = apiName.replace('/api/v{version}/', '').replaceAll('/', '_');
|
|
4
|
+
if (normalizedApiName.charAt(0) == '_') {
|
|
5
|
+
normalizedApiName = normalizedApiName.slice(1);
|
|
6
|
+
}
|
|
7
|
+
return this.toFirstLetterLowercase(normalizedApiName);
|
|
8
|
+
}
|
|
9
|
+
static toFirstLetterLowercase(value) {
|
|
10
|
+
return value.charAt(0).toLowerCase() + value.slice(1);
|
|
11
|
+
}
|
|
12
|
+
static toCamelCase(input) {
|
|
13
|
+
return input.replace(/_([a-zA-Z])/g, (_, letter) => letter.toUpperCase());
|
|
14
|
+
}
|
|
15
|
+
static isDate(schema) {
|
|
16
|
+
if (!schema)
|
|
17
|
+
return false;
|
|
18
|
+
return schema.type == 'string' && schema.format == 'date-time';
|
|
19
|
+
}
|
|
20
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
import { Generator } from './generator.js';
|
|
3
3
|
import { SwaggerDownloader } from './swagger-downloader.js';
|
|
4
4
|
var args = process.argv.slice(2);
|
|
5
|
-
if (args.length !==
|
|
6
|
-
console.log("Warning: Requires
|
|
7
|
-
console.log("node index.js [swaggerJsonUrl] [outputDirectory]");
|
|
5
|
+
if (args.length !== 4) {
|
|
6
|
+
console.log("Warning: Requires 3 arguments");
|
|
7
|
+
console.log("node index.js [swaggerJsonUrl] [outputDirectory] [angular|next] [moment|date-fns]");
|
|
8
8
|
process.exit();
|
|
9
9
|
}
|
|
10
10
|
const swaggerJsonUrl = args[0];
|
|
11
11
|
const outputDirectory = args[1];
|
|
12
|
+
const outputFormat = args[2] == 'next' ? 'next' : 'angular';
|
|
13
|
+
const dateLib = args[3] == 'moment' ? 'moment' : 'date-fns';
|
|
12
14
|
//const excludedModels = ['Type', 'MethodBase', 'Assembly', 'MethodInfo']
|
|
13
15
|
// const apiUrl = args[0]//"http://localhost:5208";
|
|
14
16
|
// const version = args[1]; //"1";
|
|
@@ -16,7 +18,7 @@ const outputDirectory = args[1];
|
|
|
16
18
|
const swaggerDownloader = new SwaggerDownloader();
|
|
17
19
|
swaggerDownloader.download(new URL(swaggerJsonUrl))
|
|
18
20
|
.then(swaggerDoc => {
|
|
19
|
-
return new Generator(swaggerDoc, outputDirectory);
|
|
21
|
+
return new Generator(swaggerDoc, outputDirectory, outputFormat, dateLib);
|
|
20
22
|
})
|
|
21
|
-
.then(generator => { generator.
|
|
23
|
+
.then(generator => { generator.generate(); });
|
|
22
24
|
// require('./index.js')({swaggerDownloader});
|
package/dist/model.constants.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devlearning/swagger-generator",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"dev": "ts-node --esm ./src/index.ts http://localhost:7550/swagger/ApiGateway/swagger.json autogeneration/output",
|
|
9
|
-
"debug": "npx tsx src/index.ts http://localhost:
|
|
9
|
+
"debug-angular": "npx tsx src/index.ts http://localhost:5208/swagger/v1/swagger.json autogeneration/output angular moment",
|
|
10
|
+
"debug-nextjs": "npx tsx src/index.ts http://localhost:5208/swagger/v1/swagger.json autogeneration/output next date-fns",
|
|
10
11
|
"deploy": "npx tsc && npm publish"
|
|
11
12
|
},
|
|
12
13
|
"bin": {
|
|
@@ -16,13 +17,15 @@
|
|
|
16
17
|
"author": "",
|
|
17
18
|
"license": "ISC",
|
|
18
19
|
"dependencies": {
|
|
20
|
+
"cli-progress": "^3.12.0",
|
|
19
21
|
"node-fetch": "^3.3.2"
|
|
20
22
|
},
|
|
21
23
|
"node-fetch": "^3.3.2",
|
|
22
24
|
"devDependencies": {
|
|
25
|
+
"@types/cli-progress": "^3.11.6",
|
|
23
26
|
"@types/node": "^18.15.0",
|
|
24
27
|
"ts-node": "^10.9.1",
|
|
25
28
|
"tsconfig-paths": "^4.2.0",
|
|
26
29
|
"typescript": "^5.1.6"
|
|
27
30
|
}
|
|
28
|
-
}
|
|
31
|
+
}
|
package/src/api.constants.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
export const API_PRE =
|
|
2
2
|
`import { HttpClient } from '@angular/common/http';
|
|
3
3
|
import { Observable, catchError, map } from 'rxjs';
|
|
4
|
-
import { httpOptions, httpOptionsMultipart } from 'src/app/core/utils/http-options';
|
|
5
4
|
import * as Models from './model.autogenerated';
|
|
5
|
+
import { HttpHeaders } from "@angular/common/http";
|
|
6
|
+
|
|
7
|
+
export const httpOptions = {
|
|
8
|
+
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const httpOptionsMultipart = {};
|
|
6
12
|
|
|
7
13
|
export abstract class ApiAutogeneratedService {
|
|
8
14
|
constructor(
|