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.
Files changed (75) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1 -1
  3. package/cli/constants.js +3 -3
  4. package/cli/execute.js +52 -31
  5. package/cli/index.d.ts +1 -2
  6. package/cli/index.js +18 -17
  7. package/cli/operations/display-help.js +51 -29
  8. package/cli/parse-args.js +3 -3
  9. package/cli/process-option.js +28 -20
  10. package/index.d.ts +99 -7
  11. package/index.js +158 -136
  12. package/package.json +35 -30
  13. package/src/code-formatter.js +28 -13
  14. package/src/code-gen-process.js +367 -264
  15. package/src/commands/generate-templates/configuration.js +2 -2
  16. package/src/commands/generate-templates/index.js +1 -2
  17. package/src/commands/generate-templates/templates-gen-process.js +62 -35
  18. package/src/component-type-name-resolver.js +44 -0
  19. package/src/configuration.js +166 -98
  20. package/src/constants.js +28 -22
  21. package/src/index.js +3 -4
  22. package/src/schema-components-map.js +39 -23
  23. package/src/schema-parser/base-schema-parsers/array.js +43 -0
  24. package/src/schema-parser/base-schema-parsers/complex.js +51 -0
  25. package/src/schema-parser/base-schema-parsers/discriminator.js +301 -0
  26. package/src/schema-parser/base-schema-parsers/enum.js +158 -0
  27. package/src/schema-parser/base-schema-parsers/object.js +105 -0
  28. package/src/schema-parser/base-schema-parsers/primitive.js +63 -0
  29. package/src/schema-parser/complex-schema-parsers/all-of.js +26 -0
  30. package/src/schema-parser/complex-schema-parsers/any-of.js +34 -0
  31. package/src/schema-parser/complex-schema-parsers/not.js +9 -0
  32. package/src/schema-parser/complex-schema-parsers/one-of.js +27 -0
  33. package/src/schema-parser/mono-schema-parser.js +48 -0
  34. package/src/schema-parser/schema-formatters.js +58 -44
  35. package/src/schema-parser/schema-parser-fabric.js +131 -0
  36. package/src/schema-parser/schema-parser.js +212 -361
  37. package/src/schema-parser/schema-utils.js +158 -33
  38. package/src/schema-parser/util/enum-key-resolver.js +26 -0
  39. package/src/{schema-parser → schema-routes}/schema-routes.js +472 -203
  40. package/src/schema-routes/util/specific-arg-name-resolver.js +26 -0
  41. package/src/schema-walker.js +93 -0
  42. package/src/swagger-schema-resolver.js +61 -28
  43. package/src/templates-worker.js +240 -0
  44. package/src/translators/javascript.js +83 -0
  45. package/src/translators/translator.js +35 -0
  46. package/src/{type-name.js → type-name-formatter.js} +35 -20
  47. package/src/util/file-system.js +30 -14
  48. package/src/util/id.js +2 -2
  49. package/src/util/internal-case.js +1 -1
  50. package/src/util/logger.js +46 -20
  51. package/src/util/name-resolver.js +50 -58
  52. package/src/util/object-assign.js +7 -3
  53. package/src/util/pascal-case.js +1 -1
  54. package/src/util/request.js +5 -5
  55. package/src/util/sort-by-property.js +17 -0
  56. package/templates/base/data-contract-jsdoc.ejs +37 -37
  57. package/templates/base/data-contracts.ejs +40 -28
  58. package/templates/base/enum-data-contract.ejs +12 -12
  59. package/templates/base/http-client.ejs +2 -2
  60. package/templates/base/http-clients/axios-http-client.ejs +139 -138
  61. package/templates/base/http-clients/fetch-http-client.ejs +224 -224
  62. package/templates/base/interface-data-contract.ejs +10 -10
  63. package/templates/base/object-field-jsdoc.ejs +28 -28
  64. package/templates/base/route-docs.ejs +30 -30
  65. package/templates/base/route-name.ejs +42 -42
  66. package/templates/base/route-type.ejs +22 -21
  67. package/templates/base/type-data-contract.ejs +15 -15
  68. package/templates/default/api.ejs +69 -65
  69. package/templates/default/procedure-call.ejs +100 -100
  70. package/templates/default/route-types.ejs +32 -28
  71. package/templates/modular/api.ejs +28 -28
  72. package/templates/modular/procedure-call.ejs +100 -100
  73. package/templates/modular/route-types.ejs +18 -18
  74. package/src/templates.js +0 -177
  75. package/src/translators/JavaScript.js +0 -60
@@ -1,5 +1,5 @@
1
- const { objectAssign } = require("../../util/object-assign");
2
- const { HTTP_CLIENT, PROJECT_VERSION } = require("../../constants");
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 _ = require("lodash");
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 _ = require("lodash");
2
- const { TemplatesGenConfig } = require("./configuration");
3
- const { FileSystem } = require("../../util/file-system");
4
- const { Logger } = require("../../util/logger");
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: "templates/base",
25
- httpClientTemplates: "templates/base/http-clients",
26
- moduleApiTemplates: "templates/modular",
27
- defaultApiTemplates: "templates/default",
23
+ baseTemplates: 'templates/base',
24
+ httpClientTemplates: 'templates/base/http-clients',
25
+ moduleApiTemplates: 'templates/modular',
26
+ defaultApiTemplates: 'templates/default',
28
27
  };
29
28
 
30
- importTemplatePrefixes = ["@base", "@modular", "@default"];
29
+ importTemplatePrefixes = ['@base', '@modular', '@default'];
31
30
 
32
31
  constructor(config) {
33
32
  this.config = new TemplatesGenConfig(config);
34
- this.logger = new Logger(this.config);
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('start generating source templates ".ejs" for code generator');
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("preparing output directory for source templates");
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 = this.fileSystem.pathIsExist(templateEjsPath);
63
- const templateEtaPathExist = this.fileSystem.pathIsExist(templateEtaPath);
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(`source templates has been successfully created in "${outputPath}"`);
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(this.paths.baseTemplates);
106
- const httpClientTemplates = this.getTemplateNamesFromDir(this.paths.httpClientTemplates);
107
- const apiTemplatesPath = this.config.modular ? this.paths.moduleApiTemplates : this.paths.defaultApiTemplates;
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(`${this.paths.httpClientTemplates}/${usingHttpClientTemplate}`),
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 === "http-client.ejs" && httpClientTemplateContent) ||
125
- this.fixTemplateContent(this.getTemplateContent(`${this.paths.baseTemplates}/${fileName}`));
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(this.getTemplateContent(`${apiTemplatesPath}/${fileName}`)),
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\\\("(${this.importTemplatePrefixes.map((v) => `(${v})`).join("|")})\/`,
147
- "g",
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\\\(\`(${this.importTemplatePrefixes.map((v) => `(${v})`).join("|")})\/`,
152
- "g",
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\\\(\'(${this.importTemplatePrefixes.map((v) => `(${v})`).join("|")})\/`,
157
- "g",
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, "includeFile(`./")
185
+ .replace(importsRegExp2, 'includeFile(`./')
163
186
  .replace(importsRegExp3, "includeFile('./");
164
187
  };
165
188
 
166
189
  getTemplateNamesFromDir = (dir) => {
167
- return this.fileSystem.readDir(path.resolve(this.rootDir, dir)).filter((file) => file.endsWith(".ejs"));
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(path.resolve(this.rootDir, pathToFile));
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
+ };