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,28 +1,40 @@
|
|
|
1
|
-
<%
|
|
2
|
-
const { modelTypes, utils, config } = it;
|
|
3
|
-
const { formatDescription, require, _, Ts } = utils;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
},
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
<%
|
|
2
|
+
const { modelTypes, utils, config } = it;
|
|
3
|
+
const { formatDescription, require, _, Ts } = utils;
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
const buildGenerics = (contract) => {
|
|
7
|
+
if (!contract.genericArgs || !contract.genericArgs.length) return '';
|
|
8
|
+
|
|
9
|
+
return '<' + contract.genericArgs.map(({ name, default: defaultType, extends: extendsType }) => {
|
|
10
|
+
return [
|
|
11
|
+
name,
|
|
12
|
+
extendsType && `extends ${extendsType}`,
|
|
13
|
+
defaultType && `= ${defaultType}`,
|
|
14
|
+
].join('')
|
|
15
|
+
}).join(',') + '>'
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const dataContractTemplates = {
|
|
19
|
+
enum: (contract) => {
|
|
20
|
+
return `enum ${contract.name} {\r\n${contract.content} \r\n }`;
|
|
21
|
+
},
|
|
22
|
+
interface: (contract) => {
|
|
23
|
+
return `interface ${contract.name}${buildGenerics(contract)} {\r\n${contract.content}}`;
|
|
24
|
+
},
|
|
25
|
+
type: (contract) => {
|
|
26
|
+
return `type ${contract.name}${buildGenerics(contract)} = ${contract.content}`;
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
%>
|
|
30
|
+
|
|
31
|
+
<% if (config.internalTemplateOptions.addUtilRequiredKeysType) { %>
|
|
32
|
+
type <%~ config.Ts.CodeGenKeyword.UtilRequiredKeys %><T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>
|
|
33
|
+
<% } %>
|
|
34
|
+
|
|
35
|
+
<% for (const contract of modelTypes) { %>
|
|
36
|
+
<%~ includeFile('@base/data-contract-jsdoc.ejs', { ...it, data: { ...contract, ...contract.typeData } }) %>
|
|
37
|
+
<%~ contract.internal ? '' : 'export'%> <%~ (dataContractTemplates[contract.typeIdentifier] || dataContractTemplates.type)(contract) %>
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
<% } %>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
<%
|
|
2
|
-
const { contract, utils, config } = it;
|
|
3
|
-
const { formatDescription, require, _ } = utils;
|
|
4
|
-
const { name, $content } = contract;
|
|
5
|
-
%>
|
|
6
|
-
<% if (config.generateUnionEnums) { %>
|
|
7
|
-
export type <%~ name %> = <%~ _.map($content, ({ value }) => value).join(" | ") %>
|
|
8
|
-
<% } else { %>
|
|
9
|
-
export enum <%~ name %> {
|
|
10
|
-
<%~ _.map($content, ({ key, value }) => `${key} = ${value}`).join(",\n") %>
|
|
11
|
-
}
|
|
12
|
-
<% } %>
|
|
1
|
+
<%
|
|
2
|
+
const { contract, utils, config } = it;
|
|
3
|
+
const { formatDescription, require, _ } = utils;
|
|
4
|
+
const { name, $content } = contract;
|
|
5
|
+
%>
|
|
6
|
+
<% if (config.generateUnionEnums) { %>
|
|
7
|
+
export type <%~ name %> = <%~ _.map($content, ({ value }) => value).join(" | ") %>
|
|
8
|
+
<% } else { %>
|
|
9
|
+
export enum <%~ name %> {
|
|
10
|
+
<%~ _.map($content, ({ key, value }) => `${key} = ${value}`).join(",\n") %>
|
|
11
|
+
}
|
|
12
|
+
<% } %>
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
<% const { config } = it; %>
|
|
2
|
-
<% /* https://github.com/acacode/swagger-typescript-api/tree/next/templates/base/http-clients/ */ %>
|
|
1
|
+
<% const { config } = it; %>
|
|
2
|
+
<% /* https://github.com/acacode/swagger-typescript-api/tree/next/templates/base/http-clients/ */ %>
|
|
3
3
|
<%~ includeFile(`@base/http-clients/${config.httpClientType}-http-client`, it) %>
|
|
@@ -1,138 +1,139 @@
|
|
|
1
|
-
<%
|
|
2
|
-
const { apiConfig, generateResponses, config } = it;
|
|
3
|
-
%>
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
path
|
|
14
|
-
|
|
15
|
-
type
|
|
16
|
-
|
|
17
|
-
query
|
|
18
|
-
|
|
19
|
-
format
|
|
20
|
-
|
|
21
|
-
body
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
private
|
|
43
|
-
private
|
|
44
|
-
private
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
this.
|
|
49
|
-
this.
|
|
50
|
-
this.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
...
|
|
63
|
-
...
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
...(
|
|
67
|
-
...(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
...(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
1
|
+
<%
|
|
2
|
+
const { apiConfig, generateResponses, config } = it;
|
|
3
|
+
%>
|
|
4
|
+
|
|
5
|
+
import type { AxiosInstance, AxiosRequestConfig, HeadersDefaults, ResponseType, AxiosResponse } from "axios";
|
|
6
|
+
import axios from "axios";
|
|
7
|
+
|
|
8
|
+
export type QueryParamsType = Record<string | number, any>;
|
|
9
|
+
|
|
10
|
+
export interface FullRequestParams extends Omit<AxiosRequestConfig, "data" | "params" | "url" | "responseType"> {
|
|
11
|
+
/** set parameter to `true` for call `securityWorker` for this request */
|
|
12
|
+
secure?: boolean;
|
|
13
|
+
/** request path */
|
|
14
|
+
path: string;
|
|
15
|
+
/** content type of request body */
|
|
16
|
+
type?: ContentType;
|
|
17
|
+
/** query params */
|
|
18
|
+
query?: QueryParamsType;
|
|
19
|
+
/** format of response (i.e. response.json() -> format: "json") */
|
|
20
|
+
format?: ResponseType;
|
|
21
|
+
/** request body */
|
|
22
|
+
body?: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type RequestParams = Omit<FullRequestParams, "body" | "method" | "query" | "path">;
|
|
26
|
+
|
|
27
|
+
export interface ApiConfig<SecurityDataType = unknown> extends Omit<AxiosRequestConfig, "data" | "cancelToken"> {
|
|
28
|
+
securityWorker?: (securityData: SecurityDataType | null) => Promise<AxiosRequestConfig | void> | AxiosRequestConfig | void;
|
|
29
|
+
secure?: boolean;
|
|
30
|
+
format?: ResponseType;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export enum ContentType {
|
|
34
|
+
Json = "application/json",
|
|
35
|
+
FormData = "multipart/form-data",
|
|
36
|
+
UrlEncoded = "application/x-www-form-urlencoded",
|
|
37
|
+
Text = "text/plain",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export class HttpClient<SecurityDataType = unknown> {
|
|
41
|
+
public instance: AxiosInstance;
|
|
42
|
+
private securityData: SecurityDataType | null = null;
|
|
43
|
+
private securityWorker?: ApiConfig<SecurityDataType>["securityWorker"];
|
|
44
|
+
private secure?: boolean;
|
|
45
|
+
private format?: ResponseType;
|
|
46
|
+
|
|
47
|
+
constructor({ securityWorker, secure, format, ...axiosConfig }: ApiConfig<SecurityDataType> = {}) {
|
|
48
|
+
this.instance = axios.create({ ...axiosConfig, baseURL: axiosConfig.baseURL || "<%~ apiConfig.baseUrl %>" })
|
|
49
|
+
this.secure = secure;
|
|
50
|
+
this.format = format;
|
|
51
|
+
this.securityWorker = securityWorker;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public setSecurityData = (data: SecurityDataType | null) => {
|
|
55
|
+
this.securityData = data
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
protected mergeRequestParams(params1: AxiosRequestConfig, params2?: AxiosRequestConfig): AxiosRequestConfig {
|
|
59
|
+
const method = params1.method || (params2 && params2.method)
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
...this.instance.defaults,
|
|
63
|
+
...params1,
|
|
64
|
+
...(params2 || {}),
|
|
65
|
+
headers: {
|
|
66
|
+
...((method && this.instance.defaults.headers[method.toLowerCase() as keyof HeadersDefaults]) || {}),
|
|
67
|
+
...(params1.headers || {}),
|
|
68
|
+
...((params2 && params2.headers) || {}),
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected stringifyFormItem(formItem: unknown) {
|
|
74
|
+
if (typeof formItem === "object" && formItem !== null) {
|
|
75
|
+
return JSON.stringify(formItem);
|
|
76
|
+
} else {
|
|
77
|
+
return `${formItem}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
protected createFormData(input: Record<string, unknown>): FormData {
|
|
82
|
+
return Object.keys(input || {}).reduce((formData, key) => {
|
|
83
|
+
const property = input[key];
|
|
84
|
+
const propertyContent: any[] = (property instanceof Array) ? property : [property]
|
|
85
|
+
|
|
86
|
+
for (const formItem of propertyContent) {
|
|
87
|
+
const isFileType = formItem instanceof Blob || formItem instanceof File;
|
|
88
|
+
formData.append(
|
|
89
|
+
key,
|
|
90
|
+
isFileType ? formItem : this.stringifyFormItem(formItem)
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return formData;
|
|
95
|
+
}, new FormData());
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public request = async <T = any, _E = any>({
|
|
99
|
+
secure,
|
|
100
|
+
path,
|
|
101
|
+
type,
|
|
102
|
+
query,
|
|
103
|
+
format,
|
|
104
|
+
body,
|
|
105
|
+
...params
|
|
106
|
+
<% if (config.unwrapResponseData) { %>
|
|
107
|
+
}: FullRequestParams): Promise<T> => {
|
|
108
|
+
<% } else { %>
|
|
109
|
+
}: FullRequestParams): Promise<AxiosResponse<T>> => {
|
|
110
|
+
<% } %>
|
|
111
|
+
const secureParams = ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {};
|
|
112
|
+
const requestParams = this.mergeRequestParams(params, secureParams);
|
|
113
|
+
const responseFormat = (format || this.format) || undefined;
|
|
114
|
+
|
|
115
|
+
if (type === ContentType.FormData && body && body !== null && typeof body === "object") {
|
|
116
|
+
body = this.createFormData(body as Record<string, unknown>);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (type === ContentType.Text && body && body !== null && typeof body !== "string") {
|
|
120
|
+
body = JSON.stringify(body);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return this.instance.request({
|
|
124
|
+
...requestParams,
|
|
125
|
+
headers: {
|
|
126
|
+
...(requestParams.headers || {}),
|
|
127
|
+
...(type && type !== ContentType.FormData ? { "Content-Type": type } : {}),
|
|
128
|
+
},
|
|
129
|
+
params: query,
|
|
130
|
+
responseType: responseFormat,
|
|
131
|
+
data: body,
|
|
132
|
+
url: path,
|
|
133
|
+
<% if (config.unwrapResponseData) { %>
|
|
134
|
+
}).then(response => response.data);
|
|
135
|
+
<% } else { %>
|
|
136
|
+
});
|
|
137
|
+
<% } %>
|
|
138
|
+
};
|
|
139
|
+
}
|