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.
- package/LICENSE +21 -21
- package/README.md +22 -12
- 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 +113 -8
- package/index.js +158 -135
- package/package.json +35 -30
- package/src/code-formatter.js +28 -13
- package/src/code-gen-process.js +357 -259
- 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 +167 -95
- 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 +69 -60
- package/src/schema-parser/schema-parser-fabric.js +131 -0
- package/src/schema-parser/schema-parser.js +208 -427
- package/src/schema-parser/schema-utils.js +123 -58
- package/src/schema-parser/util/enum-key-resolver.js +26 -0
- package/src/schema-routes/schema-routes.js +1225 -0
- 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-formatter.js +33 -18
- 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 +52 -60
- 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/README.md +17 -17
- package/templates/base/README.md +7 -7
- package/templates/base/data-contract-jsdoc.ejs +37 -37
- package/templates/base/data-contracts.ejs +40 -27
- package/templates/base/enum-data-contract.ejs +12 -12
- package/templates/base/http-client.ejs +3 -3
- 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/README.md +6 -6
- package/templates/default/api.ejs +69 -68
- package/templates/default/procedure-call.ejs +100 -100
- package/templates/default/route-types.ejs +32 -32
- package/templates/modular/README.md +6 -6
- 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/schema-parser/schema-processor.js +0 -79
- package/src/schema-parser/schema-routes.js +0 -950
- package/src/templates.js +0 -182
- 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 =
|
|
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:
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
};
|