swagger-typescript-api 12.0.4 → 13.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/LICENSE +21 -21
- package/README.md +1 -1
- package/cli/constants.js +3 -3
- package/cli/execute.js +52 -31
- package/cli/index.d.ts +1 -2
- package/cli/index.js +18 -17
- package/cli/operations/display-help.js +51 -29
- package/cli/parse-args.js +3 -3
- package/cli/process-option.js +28 -20
- package/index.d.ts +99 -7
- package/index.js +158 -136
- package/package.json +35 -30
- package/src/code-formatter.js +28 -13
- package/src/code-gen-process.js +367 -264
- package/src/commands/generate-templates/configuration.js +2 -2
- package/src/commands/generate-templates/index.js +1 -2
- package/src/commands/generate-templates/templates-gen-process.js +62 -35
- package/src/component-type-name-resolver.js +44 -0
- package/src/configuration.js +166 -98
- package/src/constants.js +28 -22
- package/src/index.js +3 -4
- package/src/schema-components-map.js +39 -23
- package/src/schema-parser/base-schema-parsers/array.js +43 -0
- package/src/schema-parser/base-schema-parsers/complex.js +51 -0
- package/src/schema-parser/base-schema-parsers/discriminator.js +301 -0
- package/src/schema-parser/base-schema-parsers/enum.js +158 -0
- package/src/schema-parser/base-schema-parsers/object.js +105 -0
- package/src/schema-parser/base-schema-parsers/primitive.js +63 -0
- package/src/schema-parser/complex-schema-parsers/all-of.js +26 -0
- package/src/schema-parser/complex-schema-parsers/any-of.js +34 -0
- package/src/schema-parser/complex-schema-parsers/not.js +9 -0
- package/src/schema-parser/complex-schema-parsers/one-of.js +27 -0
- package/src/schema-parser/mono-schema-parser.js +48 -0
- package/src/schema-parser/schema-formatters.js +58 -44
- package/src/schema-parser/schema-parser-fabric.js +131 -0
- package/src/schema-parser/schema-parser.js +212 -361
- package/src/schema-parser/schema-utils.js +158 -33
- package/src/schema-parser/util/enum-key-resolver.js +26 -0
- package/src/{schema-parser → schema-routes}/schema-routes.js +472 -203
- package/src/schema-routes/util/specific-arg-name-resolver.js +26 -0
- package/src/schema-walker.js +93 -0
- package/src/swagger-schema-resolver.js +61 -28
- package/src/templates-worker.js +240 -0
- package/src/translators/javascript.js +83 -0
- package/src/translators/translator.js +35 -0
- package/src/{type-name.js → type-name-formatter.js} +35 -20
- package/src/util/file-system.js +30 -14
- package/src/util/id.js +2 -2
- package/src/util/internal-case.js +1 -1
- package/src/util/logger.js +46 -20
- package/src/util/name-resolver.js +50 -58
- package/src/util/object-assign.js +7 -3
- package/src/util/pascal-case.js +1 -1
- package/src/util/request.js +5 -5
- package/src/util/sort-by-property.js +17 -0
- package/templates/base/data-contract-jsdoc.ejs +37 -37
- package/templates/base/data-contracts.ejs +40 -28
- package/templates/base/enum-data-contract.ejs +12 -12
- package/templates/base/http-client.ejs +2 -2
- package/templates/base/http-clients/axios-http-client.ejs +139 -138
- package/templates/base/http-clients/fetch-http-client.ejs +224 -224
- package/templates/base/interface-data-contract.ejs +10 -10
- package/templates/base/object-field-jsdoc.ejs +28 -28
- package/templates/base/route-docs.ejs +30 -30
- package/templates/base/route-name.ejs +42 -42
- package/templates/base/route-type.ejs +22 -21
- package/templates/base/type-data-contract.ejs +15 -15
- package/templates/default/api.ejs +69 -65
- package/templates/default/procedure-call.ejs +100 -100
- package/templates/default/route-types.ejs +32 -28
- package/templates/modular/api.ejs +28 -28
- package/templates/modular/procedure-call.ejs +100 -100
- package/templates/modular/route-types.ejs +18 -18
- package/src/templates.js +0 -177
- package/src/translators/JavaScript.js +0 -60
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const { objectAssign } = require(
|
|
2
|
-
const { HTTP_CLIENT, PROJECT_VERSION } = require(
|
|
1
|
+
const { objectAssign } = require('../../util/object-assign');
|
|
2
|
+
const { HTTP_CLIENT, PROJECT_VERSION } = require('../../constants');
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @type {GenerateTemplatesParams}}
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
// License text available at https://opensource.org/licenses/MIT
|
|
7
7
|
// Repository https://github.com/acacode/swagger-typescript-api
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
const { TemplatesGenProcess } = require("./templates-gen-process");
|
|
9
|
+
const { TemplatesGenProcess } = require('./templates-gen-process');
|
|
11
10
|
|
|
12
11
|
module.exports = {
|
|
13
12
|
generateTemplates: async (config) => {
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
const
|
|
2
|
-
const {
|
|
3
|
-
const {
|
|
4
|
-
const
|
|
5
|
-
const path = require("path");
|
|
1
|
+
const { TemplatesGenConfig } = require('./configuration');
|
|
2
|
+
const { FileSystem } = require('../../util/file-system');
|
|
3
|
+
const { Logger } = require('../../util/logger');
|
|
4
|
+
const path = require('path');
|
|
6
5
|
|
|
7
6
|
class TemplatesGenProcess {
|
|
8
7
|
/**
|
|
@@ -18,33 +17,35 @@ class TemplatesGenProcess {
|
|
|
18
17
|
*/
|
|
19
18
|
logger;
|
|
20
19
|
|
|
21
|
-
rootDir = path.resolve(__dirname,
|
|
20
|
+
rootDir = path.resolve(__dirname, '../../../');
|
|
22
21
|
|
|
23
22
|
paths = {
|
|
24
|
-
baseTemplates:
|
|
25
|
-
httpClientTemplates:
|
|
26
|
-
moduleApiTemplates:
|
|
27
|
-
defaultApiTemplates:
|
|
23
|
+
baseTemplates: 'templates/base',
|
|
24
|
+
httpClientTemplates: 'templates/base/http-clients',
|
|
25
|
+
moduleApiTemplates: 'templates/modular',
|
|
26
|
+
defaultApiTemplates: 'templates/default',
|
|
28
27
|
};
|
|
29
28
|
|
|
30
|
-
importTemplatePrefixes = [
|
|
29
|
+
importTemplatePrefixes = ['@base', '@modular', '@default'];
|
|
31
30
|
|
|
32
31
|
constructor(config) {
|
|
33
32
|
this.config = new TemplatesGenConfig(config);
|
|
34
|
-
this.logger = new Logger(this
|
|
35
|
-
this.fileSystem = new FileSystem();
|
|
33
|
+
this.logger = new Logger(this);
|
|
34
|
+
this.fileSystem = new FileSystem(this);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
/**
|
|
39
38
|
* @return {Promise<GenerateTemplatesOutput>}
|
|
40
39
|
*/
|
|
41
40
|
async start() {
|
|
42
|
-
this.logger.event(
|
|
41
|
+
this.logger.event(
|
|
42
|
+
'start generating source templates ".ejs" for code generator',
|
|
43
|
+
);
|
|
43
44
|
|
|
44
45
|
const templates = this.getTemplates();
|
|
45
46
|
|
|
46
47
|
if (this.config.output) {
|
|
47
|
-
this.logger.log(
|
|
48
|
+
this.logger.log('preparing output directory for source templates');
|
|
48
49
|
const outputPath = path.resolve(process.cwd(), this.config.output);
|
|
49
50
|
|
|
50
51
|
if (this.fileSystem.pathIsExist(outputPath)) {
|
|
@@ -59,8 +60,10 @@ class TemplatesGenProcess {
|
|
|
59
60
|
const templateName = this.fileSystem.cropExtension(template.name);
|
|
60
61
|
const templateEjsPath = path.resolve(outputPath, `${templateName}.ejs`);
|
|
61
62
|
const templateEtaPath = path.resolve(outputPath, `${templateName}.eta`);
|
|
62
|
-
const templateEjsPathExist =
|
|
63
|
-
|
|
63
|
+
const templateEjsPathExist =
|
|
64
|
+
this.fileSystem.pathIsExist(templateEjsPath);
|
|
65
|
+
const templateEtaPathExist =
|
|
66
|
+
this.fileSystem.pathIsExist(templateEtaPath);
|
|
64
67
|
|
|
65
68
|
const templateNotExist = !templateEjsPathExist && !templateEtaPathExist;
|
|
66
69
|
|
|
@@ -90,7 +93,9 @@ class TemplatesGenProcess {
|
|
|
90
93
|
}
|
|
91
94
|
});
|
|
92
95
|
|
|
93
|
-
this.logger.success(
|
|
96
|
+
this.logger.success(
|
|
97
|
+
`source templates has been successfully created in "${outputPath}"`,
|
|
98
|
+
);
|
|
94
99
|
}
|
|
95
100
|
|
|
96
101
|
return {
|
|
@@ -102,27 +107,37 @@ class TemplatesGenProcess {
|
|
|
102
107
|
|
|
103
108
|
getTemplates = () => {
|
|
104
109
|
const outputFiles = [];
|
|
105
|
-
const baseTemplates = this.getTemplateNamesFromDir(
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
const baseTemplates = this.getTemplateNamesFromDir(
|
|
111
|
+
this.paths.baseTemplates,
|
|
112
|
+
);
|
|
113
|
+
const httpClientTemplates = this.getTemplateNamesFromDir(
|
|
114
|
+
this.paths.httpClientTemplates,
|
|
115
|
+
);
|
|
116
|
+
const apiTemplatesPath = this.config.modular
|
|
117
|
+
? this.paths.moduleApiTemplates
|
|
118
|
+
: this.paths.defaultApiTemplates;
|
|
108
119
|
const apiTemplates = this.getTemplateNamesFromDir(apiTemplatesPath);
|
|
109
120
|
|
|
110
121
|
const usingHttpClientTemplate = httpClientTemplates.find((template) =>
|
|
111
122
|
template.startsWith(`${this.config.httpClientType}-`),
|
|
112
123
|
);
|
|
113
124
|
|
|
114
|
-
let httpClientTemplateContent =
|
|
125
|
+
let httpClientTemplateContent = '';
|
|
115
126
|
|
|
116
127
|
if (usingHttpClientTemplate) {
|
|
117
128
|
httpClientTemplateContent = this.fixTemplateContent(
|
|
118
|
-
this.getTemplateContent(
|
|
129
|
+
this.getTemplateContent(
|
|
130
|
+
`${this.paths.httpClientTemplates}/${usingHttpClientTemplate}`,
|
|
131
|
+
),
|
|
119
132
|
);
|
|
120
133
|
}
|
|
121
134
|
|
|
122
135
|
for (const fileName of baseTemplates) {
|
|
123
136
|
const templateContent =
|
|
124
|
-
(fileName ===
|
|
125
|
-
this.fixTemplateContent(
|
|
137
|
+
(fileName === 'http-client.ejs' && httpClientTemplateContent) ||
|
|
138
|
+
this.fixTemplateContent(
|
|
139
|
+
this.getTemplateContent(`${this.paths.baseTemplates}/${fileName}`),
|
|
140
|
+
);
|
|
126
141
|
|
|
127
142
|
outputFiles.push({
|
|
128
143
|
name: fileName,
|
|
@@ -133,7 +148,9 @@ class TemplatesGenProcess {
|
|
|
133
148
|
for (const fileName of apiTemplates) {
|
|
134
149
|
outputFiles.push({
|
|
135
150
|
name: fileName,
|
|
136
|
-
content: this.fixTemplateContent(
|
|
151
|
+
content: this.fixTemplateContent(
|
|
152
|
+
this.getTemplateContent(`${apiTemplatesPath}/${fileName}`),
|
|
153
|
+
),
|
|
137
154
|
});
|
|
138
155
|
}
|
|
139
156
|
|
|
@@ -143,32 +160,42 @@ class TemplatesGenProcess {
|
|
|
143
160
|
fixTemplateContent = (content) => {
|
|
144
161
|
// includeFile("@base/
|
|
145
162
|
const importsRegExp1 = new RegExp(
|
|
146
|
-
`includeFile
|
|
147
|
-
|
|
163
|
+
`includeFile\\("(${this.importTemplatePrefixes
|
|
164
|
+
.map((v) => `(${v})`)
|
|
165
|
+
.join('|')})/`,
|
|
166
|
+
'g',
|
|
148
167
|
);
|
|
149
168
|
// includeFile(`@base/
|
|
150
169
|
const importsRegExp2 = new RegExp(
|
|
151
|
-
`includeFile
|
|
152
|
-
|
|
170
|
+
`includeFile\\(\`(${this.importTemplatePrefixes
|
|
171
|
+
.map((v) => `(${v})`)
|
|
172
|
+
.join('|')})/`,
|
|
173
|
+
'g',
|
|
153
174
|
);
|
|
154
175
|
// includeFile('@base/
|
|
155
176
|
const importsRegExp3 = new RegExp(
|
|
156
|
-
`includeFile
|
|
157
|
-
|
|
177
|
+
`includeFile\\('(${this.importTemplatePrefixes
|
|
178
|
+
.map((v) => `(${v})`)
|
|
179
|
+
.join('|')})/`,
|
|
180
|
+
'g',
|
|
158
181
|
);
|
|
159
182
|
|
|
160
183
|
return content
|
|
161
184
|
.replace(importsRegExp1, 'includeFile("./')
|
|
162
|
-
.replace(importsRegExp2,
|
|
185
|
+
.replace(importsRegExp2, 'includeFile(`./')
|
|
163
186
|
.replace(importsRegExp3, "includeFile('./");
|
|
164
187
|
};
|
|
165
188
|
|
|
166
189
|
getTemplateNamesFromDir = (dir) => {
|
|
167
|
-
return this.fileSystem
|
|
190
|
+
return this.fileSystem
|
|
191
|
+
.readDir(path.resolve(this.rootDir, dir))
|
|
192
|
+
.filter((file) => file.endsWith('.ejs'));
|
|
168
193
|
};
|
|
169
194
|
|
|
170
195
|
getTemplateContent = (pathToFile) => {
|
|
171
|
-
return this.fileSystem.getFileContent(
|
|
196
|
+
return this.fileSystem.getFileContent(
|
|
197
|
+
path.resolve(this.rootDir, pathToFile),
|
|
198
|
+
);
|
|
172
199
|
};
|
|
173
200
|
}
|
|
174
201
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const { getRandomInt } = require('./util/random');
|
|
2
|
+
const { NameResolver } = require('./util/name-resolver');
|
|
3
|
+
|
|
4
|
+
class ComponentTypeNameResolver extends NameResolver {
|
|
5
|
+
counter = 1;
|
|
6
|
+
fallbackNameCounter = 1;
|
|
7
|
+
countersByVariant = new Map();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @param {CodeGenConfig} config;
|
|
11
|
+
* @param {Logger} logger;
|
|
12
|
+
* @param {string[]} reservedNames
|
|
13
|
+
*/
|
|
14
|
+
constructor(config, logger, reservedNames) {
|
|
15
|
+
super(config, logger, reservedNames, (variants) => {
|
|
16
|
+
const randomVariant = variants[getRandomInt(0, variants.length - 1)];
|
|
17
|
+
if (randomVariant) {
|
|
18
|
+
if (!this.countersByVariant.has(randomVariant)) {
|
|
19
|
+
this.countersByVariant.set(randomVariant, 0);
|
|
20
|
+
}
|
|
21
|
+
const variantCounter = this.countersByVariant.get(randomVariant) + 1;
|
|
22
|
+
this.countersByVariant.set(randomVariant, variantCounter);
|
|
23
|
+
const dirtyResolvedName = `${randomVariant}${variantCounter}`;
|
|
24
|
+
this.logger.debug(
|
|
25
|
+
'generated dirty resolved type name for component - ',
|
|
26
|
+
dirtyResolvedName,
|
|
27
|
+
);
|
|
28
|
+
return dirtyResolvedName;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const fallbackName = `${this.config.componentTypeNameResolver}${this
|
|
32
|
+
.fallbackNameCounter++}`;
|
|
33
|
+
this.logger.debug(
|
|
34
|
+
'generated fallback type name for component - ',
|
|
35
|
+
fallbackName,
|
|
36
|
+
);
|
|
37
|
+
return fallbackName;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
ComponentTypeNameResolver,
|
|
44
|
+
};
|