swagger-typescript-api 13.0.0-experimental-1 → 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 (81) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +22 -12
  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 +113 -8
  11. package/index.js +158 -135
  12. package/package.json +35 -30
  13. package/src/code-formatter.js +28 -13
  14. package/src/code-gen-process.js +357 -259
  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 +167 -95
  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 +69 -60
  35. package/src/schema-parser/schema-parser-fabric.js +131 -0
  36. package/src/schema-parser/schema-parser.js +208 -427
  37. package/src/schema-parser/schema-utils.js +123 -58
  38. package/src/schema-parser/util/enum-key-resolver.js +26 -0
  39. package/src/schema-routes/schema-routes.js +1225 -0
  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-formatter.js +33 -18
  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 +52 -60
  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/README.md +17 -17
  57. package/templates/base/README.md +7 -7
  58. package/templates/base/data-contract-jsdoc.ejs +37 -37
  59. package/templates/base/data-contracts.ejs +40 -27
  60. package/templates/base/enum-data-contract.ejs +12 -12
  61. package/templates/base/http-client.ejs +3 -3
  62. package/templates/base/http-clients/axios-http-client.ejs +139 -138
  63. package/templates/base/http-clients/fetch-http-client.ejs +224 -224
  64. package/templates/base/interface-data-contract.ejs +10 -10
  65. package/templates/base/object-field-jsdoc.ejs +28 -28
  66. package/templates/base/route-docs.ejs +30 -30
  67. package/templates/base/route-name.ejs +42 -42
  68. package/templates/base/route-type.ejs +22 -21
  69. package/templates/base/type-data-contract.ejs +15 -15
  70. package/templates/default/README.md +6 -6
  71. package/templates/default/api.ejs +69 -68
  72. package/templates/default/procedure-call.ejs +100 -100
  73. package/templates/default/route-types.ejs +32 -32
  74. package/templates/modular/README.md +6 -6
  75. package/templates/modular/api.ejs +28 -28
  76. package/templates/modular/procedure-call.ejs +100 -100
  77. package/templates/modular/route-types.ejs +18 -18
  78. package/src/schema-parser/schema-processor.js +0 -79
  79. package/src/schema-parser/schema-routes.js +0 -950
  80. package/src/templates.js +0 -182
  81. package/src/translators/JavaScript.js +0 -60
@@ -1,100 +1,100 @@
1
- <%
2
- const { utils, route, config } = it;
3
- const { requestBodyInfo, responseBodyInfo, specificArgNameResolver } = route;
4
- const { _, getInlineParseContent, getParseContent, parseSchema, getComponentByRef, require } = utils;
5
- const { parameters, path, method, payload, query, formData, security, requestParams } = route.request;
6
- const { type, errorType, contentTypes } = route.response;
7
- const { HTTP_CLIENT, RESERVED_REQ_PARAMS_ARG_NAMES } = config.constants;
8
- const routeDocs = await includeFile("@base/route-docs", { config, route, utils });
9
- const queryName = (query && query.name) || "query";
10
- const pathParams = _.values(parameters);
11
- const pathParamsNames = _.map(pathParams, "name");
12
-
13
- const isFetchTemplate = config.httpClientType === HTTP_CLIENT.FETCH;
14
-
15
- const requestConfigParam = {
16
- name: specificArgNameResolver.resolve(RESERVED_REQ_PARAMS_ARG_NAMES),
17
- optional: true,
18
- type: "RequestParams",
19
- defaultValue: "{}",
20
- }
21
-
22
- const argToTmpl = ({ name, optional, type, defaultValue }) => `${name}${!defaultValue && optional ? '?' : ''}: ${type}${defaultValue ? ` = ${defaultValue}` : ''}`;
23
-
24
- const rawWrapperArgs = config.extractRequestParams ?
25
- _.compact([
26
- requestParams && {
27
- name: pathParams.length ? `{ ${_.join(pathParamsNames, ", ")}, ...${queryName} }` : queryName,
28
- optional: false,
29
- type: await getInlineParseContent(requestParams),
30
- },
31
- ...(!requestParams ? pathParams : []),
32
- payload,
33
- requestConfigParam,
34
- ]) :
35
- _.compact([
36
- ...pathParams,
37
- query,
38
- payload,
39
- requestConfigParam,
40
- ])
41
-
42
- const wrapperArgs = _
43
- // Sort by optionality
44
- .sortBy(rawWrapperArgs, [o => o.optional])
45
- .map(argToTmpl)
46
- .join(', ')
47
-
48
- // RequestParams["type"]
49
- const requestContentKind = {
50
- "JSON": "ContentType.Json",
51
- "URL_ENCODED": "ContentType.UrlEncoded",
52
- "FORM_DATA": "ContentType.FormData",
53
- "TEXT": "ContentType.Text",
54
- }
55
- // RequestParams["format"]
56
- const responseContentKind = {
57
- "JSON": '"json"',
58
- "IMAGE": '"blob"',
59
- "FORM_DATA": isFetchTemplate ? '"formData"' : '"document"'
60
- }
61
-
62
- const bodyTmpl = _.get(payload, "name") || null;
63
- const queryTmpl = (query != null && queryName) || null;
64
- const bodyContentKindTmpl = requestContentKind[requestBodyInfo.contentKind] || null;
65
- const responseFormatTmpl = responseContentKind[responseBodyInfo.success && responseBodyInfo.success.schema && responseBodyInfo.success.schema.contentKind] || null;
66
- const securityTmpl = security ? 'true' : null;
67
-
68
- const describeReturnType = () => {
69
- if (!config.toJS) return "";
70
-
71
- switch(config.httpClientType) {
72
- case HTTP_CLIENT.AXIOS: {
73
- return `Promise<AxiosResponse<${type}>>`
74
- }
75
- default: {
76
- return `Promise<HttpResponse<${type}, ${errorType}>`
77
- }
78
- }
79
- }
80
-
81
- %>
82
- /**
83
- <%~ routeDocs.description %>
84
-
85
- *<% /* Here you can add some other JSDoc tags */ %>
86
-
87
- <%~ routeDocs.lines %>
88
-
89
- */
90
- <%~ route.routeName.usage %> = (<%~ wrapperArgs %>)<%~ config.toJS ? `: ${describeReturnType()}` : "" %> =>
91
- <%~ config.singleHttpClient ? 'this.http.request' : 'this.request' %><<%~ type %>, <%~ errorType %>>({
92
- path: `<%~ path %>`,
93
- method: '<%~ _.upperCase(method) %>',
94
- <%~ queryTmpl ? `query: ${queryTmpl},` : '' %>
95
- <%~ bodyTmpl ? `body: ${bodyTmpl},` : '' %>
96
- <%~ securityTmpl ? `secure: ${securityTmpl},` : '' %>
97
- <%~ bodyContentKindTmpl ? `type: ${bodyContentKindTmpl},` : '' %>
98
- <%~ responseFormatTmpl ? `format: ${responseFormatTmpl},` : '' %>
99
- ...<%~ _.get(requestConfigParam, "name") %>,
100
- })
1
+ <%
2
+ const { utils, route, config } = it;
3
+ const { requestBodyInfo, responseBodyInfo, specificArgNameResolver } = route;
4
+ const { _, getInlineParseContent, getParseContent, parseSchema, getComponentByRef, require } = utils;
5
+ const { parameters, path, method, payload, query, formData, security, requestParams } = route.request;
6
+ const { type, errorType, contentTypes } = route.response;
7
+ const { HTTP_CLIENT, RESERVED_REQ_PARAMS_ARG_NAMES } = config.constants;
8
+ const routeDocs = includeFile("@base/route-docs", { config, route, utils });
9
+ const queryName = (query && query.name) || "query";
10
+ const pathParams = _.values(parameters);
11
+ const pathParamsNames = _.map(pathParams, "name");
12
+
13
+ const isFetchTemplate = config.httpClientType === HTTP_CLIENT.FETCH;
14
+
15
+ const requestConfigParam = {
16
+ name: specificArgNameResolver.resolve(RESERVED_REQ_PARAMS_ARG_NAMES),
17
+ optional: true,
18
+ type: "RequestParams",
19
+ defaultValue: "{}",
20
+ }
21
+
22
+ const argToTmpl = ({ name, optional, type, defaultValue }) => `${name}${!defaultValue && optional ? '?' : ''}: ${type}${defaultValue ? ` = ${defaultValue}` : ''}`;
23
+
24
+ const rawWrapperArgs = config.extractRequestParams ?
25
+ _.compact([
26
+ requestParams && {
27
+ name: pathParams.length ? `{ ${_.join(pathParamsNames, ", ")}, ...${queryName} }` : queryName,
28
+ optional: false,
29
+ type: getInlineParseContent(requestParams),
30
+ },
31
+ ...(!requestParams ? pathParams : []),
32
+ payload,
33
+ requestConfigParam,
34
+ ]) :
35
+ _.compact([
36
+ ...pathParams,
37
+ query,
38
+ payload,
39
+ requestConfigParam,
40
+ ])
41
+
42
+ const wrapperArgs = _
43
+ // Sort by optionality
44
+ .sortBy(rawWrapperArgs, [o => o.optional])
45
+ .map(argToTmpl)
46
+ .join(', ')
47
+
48
+ // RequestParams["type"]
49
+ const requestContentKind = {
50
+ "JSON": "ContentType.Json",
51
+ "URL_ENCODED": "ContentType.UrlEncoded",
52
+ "FORM_DATA": "ContentType.FormData",
53
+ "TEXT": "ContentType.Text",
54
+ }
55
+ // RequestParams["format"]
56
+ const responseContentKind = {
57
+ "JSON": '"json"',
58
+ "IMAGE": '"blob"',
59
+ "FORM_DATA": isFetchTemplate ? '"formData"' : '"document"'
60
+ }
61
+
62
+ const bodyTmpl = _.get(payload, "name") || null;
63
+ const queryTmpl = (query != null && queryName) || null;
64
+ const bodyContentKindTmpl = requestContentKind[requestBodyInfo.contentKind] || null;
65
+ const responseFormatTmpl = responseContentKind[responseBodyInfo.success && responseBodyInfo.success.schema && responseBodyInfo.success.schema.contentKind] || null;
66
+ const securityTmpl = security ? 'true' : null;
67
+
68
+ const describeReturnType = () => {
69
+ if (!config.toJS) return "";
70
+
71
+ switch(config.httpClientType) {
72
+ case HTTP_CLIENT.AXIOS: {
73
+ return `Promise<AxiosResponse<${type}>>`
74
+ }
75
+ default: {
76
+ return `Promise<HttpResponse<${type}, ${errorType}>`
77
+ }
78
+ }
79
+ }
80
+
81
+ %>
82
+ /**
83
+ <%~ routeDocs.description %>
84
+
85
+ *<% /* Here you can add some other JSDoc tags */ %>
86
+
87
+ <%~ routeDocs.lines %>
88
+
89
+ */
90
+ <%~ route.routeName.usage %> = (<%~ wrapperArgs %>)<%~ config.toJS ? `: ${describeReturnType()}` : "" %> =>
91
+ <%~ config.singleHttpClient ? 'this.http.request' : 'this.request' %><<%~ type %>, <%~ errorType %>>({
92
+ path: `<%~ path %>`,
93
+ method: '<%~ _.upperCase(method) %>',
94
+ <%~ queryTmpl ? `query: ${queryTmpl},` : '' %>
95
+ <%~ bodyTmpl ? `body: ${bodyTmpl},` : '' %>
96
+ <%~ securityTmpl ? `secure: ${securityTmpl},` : '' %>
97
+ <%~ bodyContentKindTmpl ? `type: ${bodyContentKindTmpl},` : '' %>
98
+ <%~ responseFormatTmpl ? `format: ${responseFormatTmpl},` : '' %>
99
+ ...<%~ _.get(requestConfigParam, "name") %>,
100
+ })
@@ -1,18 +1,18 @@
1
- <%
2
- const { utils, config, route, modelTypes } = it;
3
- const { _, pascalCase } = utils;
4
- const { routes, moduleName } = route;
5
- const dataContracts = config.modular ? _.map(modelTypes, "name") : [];
6
-
7
- %>
8
- <% if (dataContracts.length) { %>
9
- import { <%~ dataContracts.join(", ") %> } from "./<%~ config.fileNames.dataContracts %>"
10
- <% } %>
11
-
12
- export namespace <%~ pascalCase(moduleName) %> {
13
- <% for await (const route of routes) { %>
14
-
15
-
16
- <%~ await includeFile('@base/route-type.ejs', { ...it, route }) %>
17
- <% } %>
18
- }
1
+ <%
2
+ const { utils, config, route, modelTypes } = it;
3
+ const { _, pascalCase } = utils;
4
+ const { routes, moduleName } = route;
5
+ const dataContracts = config.modular ? _.map(modelTypes, "name") : [];
6
+
7
+ %>
8
+ <% if (dataContracts.length) { %>
9
+ import { <%~ dataContracts.join(", ") %> } from "./<%~ config.fileNames.dataContracts %>"
10
+ <% } %>
11
+
12
+ export namespace <%~ pascalCase(moduleName) %> {
13
+ <% for (const route of routes) { %>
14
+
15
+ <%~ includeFile('@base/route-type.ejs', { ...it, route }) %>
16
+
17
+ <% } %>
18
+ }
@@ -1,79 +0,0 @@
1
- const { SCHEMA_TYPES } = require("../constants.js");
2
- const _ = require("lodash");
3
- const { SchemaFormatters } = require("./schema-formatters");
4
- const { internalCase } = require("../util/internal-case");
5
- const { SchemaUtils } = require("./schema-utils");
6
- const { camelCase } = require("lodash");
7
- const { pascalCase } = require("../util/pascal-case");
8
- const { SchemaParser } = require("./schema-parser");
9
-
10
- class SchemaProcessor {
11
- /**
12
- * @type {CodeGenConfig}
13
- */
14
- config;
15
-
16
- /**
17
- * @type {SchemaComponentsMap}
18
- */
19
- schemaComponentsMap;
20
- /**
21
- * @type {TypeNameFormatter}
22
- */
23
- typeNameFormatter;
24
- /**
25
- * @type {SchemaFormatters}
26
- */
27
- schemaFormatters;
28
-
29
- /**
30
- * @type {SchemaUtils}
31
- */
32
- schemaUtils;
33
-
34
- /**
35
- * @type {((schema, typeName) => SchemaParser)}
36
- */
37
- createSchemaParser;
38
-
39
- constructor(config, logger, templates, schemaComponentsMap, typeNameFormatter) {
40
- this.config = config;
41
- this.schemaComponentsMap = schemaComponentsMap;
42
- this.typeNameFormatter = typeNameFormatter;
43
- this.schemaFormatters = new SchemaFormatters(config, logger, this, templates);
44
- this.schemaUtils = new SchemaUtils(config, schemaComponentsMap, typeNameFormatter);
45
- this.createSchemaParser = SchemaParser.create.bind(
46
- null,
47
- config,
48
- schemaComponentsMap,
49
- typeNameFormatter,
50
- this.schemaFormatters,
51
- this.schemaUtils,
52
- );
53
- }
54
-
55
- /**
56
- *
57
- * @param schema {any}
58
- * @param typeName {null | string}
59
- * @return {Promise<Record<string, any>>}
60
- */
61
- parseSchema = async (schema, typeName = null) => {
62
- const schemaParser = this.createSchemaParser(schema, typeName);
63
- return await schemaParser.parse();
64
- };
65
-
66
- getInlineParseContent = async (schema, typeName) => {
67
- const parser = this.createSchemaParser(schema, typeName);
68
- return await parser.getInlineContent();
69
- };
70
-
71
- getParseContent = async (schema, typeName) => {
72
- const parser = this.createSchemaParser(schema, typeName);
73
- return await parser.getContent();
74
- };
75
- }
76
-
77
- module.exports = {
78
- SchemaProcessor,
79
- };