Skip to content

Commit 63252dd

Browse files
authored
Merge pull request #1021 from swagger-api/joshuafc-patch-1
Joshuafc patch 1
2 parents 574ed86 + b95e677 commit 63252dd

File tree

6 files changed

+56
-36
lines changed

6 files changed

+56
-36
lines changed

src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
import io.swagger.codegen.v3.generators.util.OpenAPIUtil;
1111
import io.swagger.v3.oas.models.media.ArraySchema;
1212
import io.swagger.v3.oas.models.media.BooleanSchema;
13+
import io.swagger.v3.oas.models.media.BinarySchema;
1314
import io.swagger.v3.oas.models.media.ComposedSchema;
1415
import io.swagger.v3.oas.models.media.DateSchema;
1516
import io.swagger.v3.oas.models.media.DateTimeSchema;
17+
import io.swagger.v3.oas.models.media.FileSchema;
1618
import io.swagger.v3.oas.models.media.IntegerSchema;
1719
import io.swagger.v3.oas.models.media.MapSchema;
1820
import io.swagger.v3.oas.models.media.NumberSchema;
@@ -238,17 +240,24 @@ public CodegenModel fromModel(String name, Schema schema, Map<String, Schema> al
238240

239241
@Override
240242
public String getTypeDeclaration(Schema propertySchema) {
241-
if (propertySchema instanceof ArraySchema) {
242-
Schema inner = ((ArraySchema) propertySchema).getItems();
243-
return String.format("%s<%s>", getSchemaType(propertySchema), getTypeDeclaration(inner));
244-
} else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
245-
Schema inner = (Schema) propertySchema.getAdditionalProperties();
246-
return String.format("{ [key, string]: %s;}", getTypeDeclaration(inner));
243+
Schema inner;
244+
if(propertySchema instanceof ArraySchema) {
245+
ArraySchema arraySchema = (ArraySchema)propertySchema;
246+
inner = arraySchema.getItems();
247+
return this.getSchemaType(propertySchema) + "<" + this.getTypeDeclaration(inner) + ">";
248+
} else if(propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) {
249+
inner = (Schema) propertySchema.getAdditionalProperties();
250+
return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }";
247251
} else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) {
248-
Schema inner = new ObjectSchema();
249-
return String.format("{ [key, string]: %s;}", getTypeDeclaration(inner));
252+
inner = new ObjectSchema();
253+
return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }";
254+
} else if(propertySchema instanceof FileSchema || propertySchema instanceof BinarySchema) {
255+
return "Blob";
256+
} else if(propertySchema instanceof ObjectSchema) {
257+
return "any";
258+
} else {
259+
return super.getTypeDeclaration(propertySchema);
250260
}
251-
return super.getTypeDeclaration(propertySchema);
252261
}
253262

254263
@Override

src/main/resources/handlebars/typescript-axios/apiInner.mustache

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/* eslint-disable */
33
{{>licenseInfo}}
44

5-
import globalAxios, { AxiosPromise, AxiosInstance } from 'axios';
5+
import globalAxios, { AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';
66
import { Configuration } from '{{apiRelativeToRoot}}configuration';
77
// Some imports not used depending on template conditions
88
// @ts-ignore
@@ -26,17 +26,17 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur
2626
* @summary {{&summary}}
2727
{{/summary}}
2828
{{#parameters}}
29-
* @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
29+
* @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
3030
{{/parameters}}
3131
* @param {*} [options] Override http request option.
3232
* @throws {RequiredError}
3333
*/
34-
{{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: any = {}): Promise<RequestArgs> => {
34+
{{nickname}}{{#isForm}}Form{{/isForm}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
3535
{{#parameters}}
3636
{{#required}}
3737
// verify required parameter '{{paramName}}' is not null or undefined
3838
if ({{paramName}} === null || {{paramName}} === undefined) {
39-
throw new RequiredError('{{paramName}}','Required parameter {{paramName}} was null or undefined when calling {{nickname}}.');
39+
throw new RequiredError('{{paramName}}','Required parameter {{paramName}} was null or undefined when calling {{nickname}}{{#isForm}}Form{{/isForm}}.');
4040
}
4141
{{/required}}
4242
{{/parameters}}
@@ -48,7 +48,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur
4848
if (configuration) {
4949
baseOptions = configuration.baseOptions;
5050
}
51-
const localVarRequestOptions = { method: '{{httpMethod}}', ...baseOptions, ...options};
51+
const localVarRequestOptions :AxiosRequestConfig = { method: '{{httpMethod}}', ...baseOptions, ...options};
5252
const localVarHeaderParameter = {} as any;
5353
const localVarQueryParameter = {} as any;{{#vendorExtensions}}{{#hasFormParams}}
5454
const localVarFormParams = new {{^multipartFormData}}URLSearchParams(){{/multipartFormData}}{{#multipartFormData}}FormData(){{/multipartFormData}};{{/hasFormParams}}{{/vendorExtensions}}
@@ -151,6 +151,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur
151151
152152
{{/headerParams}}
153153
{{#vendorExtensions}}
154+
{{#isForm}}
154155
{{#formParams}}
155156
{{#isListContainer}}
156157
if ({{paramName}}) {
@@ -170,11 +171,12 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur
170171
localVarFormParams.append('{{baseName}}', {{paramName}} as any);{{/multipartFormData}}
171172
}
172173
{{/isListContainer}}
173-
{{/formParams}}{{/vendorExtensions}}
174-
{{#vendorExtensions}}{{#hasFormParams}}{{^multipartFormData}}
174+
{{/formParams}}{{/isForm}}{{/vendorExtensions}}
175+
{{#vendorExtensions}}{{#isForm}}{{#hasFormParams}}{{^multipartFormData}}
175176
localVarHeaderParameter['Content-Type'] = 'application/x-www-form-urlencoded';{{/multipartFormData}}{{#multipartFormData}}
176177
localVarHeaderParameter['Content-Type'] = 'multipart/form-data';{{/multipartFormData}}
177-
{{/hasFormParams}}{{/vendorExtensions}}
178+
{{/hasFormParams}}{{/isForm}}{{/vendorExtensions}}
179+
{{^isForm}}
178180
{{#bodyParam}}
179181
{{^consumes}}
180182
localVarHeaderParameter['Content-Type'] = 'application/json';
@@ -184,23 +186,28 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur
184186
{{/consumes.0}}
185187
186188
{{/bodyParam}}
189+
{{/isForm}}
187190
const query = new URLSearchParams(localVarUrlObj.search);
188191
for (const key in localVarQueryParameter) {
189192
query.set(key, localVarQueryParameter[key]);
190193
}
191-
for (const key in options.query) {
192-
query.set(key, options.query[key]);
194+
for (const key in options.params) {
195+
query.set(key, options.params[key]);
193196
}
194197
localVarUrlObj.search = (new URLSearchParams(query)).toString();
195198
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
196199
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
200+
{{#isForm}}
197201
{{#hasFormParams}}
198202
localVarRequestOptions.data = localVarFormParams{{#vendorExtensions}}{{^multipartFormData}}.toString(){{/multipartFormData}}{{/vendorExtensions}};
199203
{{/hasFormParams}}
204+
{{/isForm}}
205+
{{^isForm}}
200206
{{#bodyParam}}
201207
const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
202208
localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || "");
203209
{{/bodyParam}}
210+
{{/isForm}}
204211
205212
return {
206213
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
@@ -227,15 +234,15 @@ export const {{classname}}Fp = function(configuration?: Configuration) {
227234
* @summary {{&summary}}
228235
{{/summary}}
229236
{{#parameters}}
230-
* @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
237+
* @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
231238
{{/parameters}}
232239
* @param {*} [options] Override http request option.
233240
* @throws {RequiredError}
234241
*/
235-
async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> {
236-
const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options);
242+
async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>>> {
243+
const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options);
237244
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
238-
const axiosRequestArgs = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
245+
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
239246
return axios.request(axiosRequestArgs);
240247
};
241248
},
@@ -259,13 +266,13 @@ export const {{classname}}Factory = function (configuration?: Configuration, bas
259266
* @summary {{&summary}}
260267
{{/summary}}
261268
{{#parameters}}
262-
* @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
269+
* @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
263270
{{/parameters}}
264271
* @param {*} [options] Override http request option.
265272
* @throws {RequiredError}
266273
*/
267-
{{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
268-
return {{classname}}Fp(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath));
274+
async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<AxiosResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> {
275+
return {{classname}}Fp(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath));
269276
},
270277
{{/contents}}
271278
{{/operation}}
@@ -288,13 +295,13 @@ export interface {{classname}}Interface {
288295
* @summary {{&summary}}
289296
{{/summary}}
290297
{{#parameters}}
291-
* @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
298+
* @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
292299
{{/parameters}}
293300
* @param {*} [options] Override http request option.
294301
* @throws {RequiredError}
295302
* @memberof {{classname}}Interface
296303
*/
297-
{{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>;
304+
async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<AxiosResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>>;
298305

299306
{{/contents}}
300307
{{/operation}}
@@ -322,14 +329,14 @@ export class {{classname}} extends BaseAPI {
322329
* @summary {{&summary}}
323330
{{/summary}}
324331
{{#parameters}}
325-
* @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
332+
* @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
326333
{{/parameters}}
327334
* @param {*} [options] Override http request option.
328335
* @throws {RequiredError}
329336
* @memberof {{classname}}
330337
*/
331-
public {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any) {
332-
return {{classname}}Fp(this.configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath));
338+
public async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig) : Promise<AxiosResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> {
339+
return {{classname}}Fp(this.configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath));
333340
}
334341
{{^@last}}
335342

src/main/resources/handlebars/typescript-axios/baseApi.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import { Configuration } from "./configuration";
66
// Some imports not used depending on template conditions
77
// @ts-ignore
8-
import globalAxios, { AxiosPromise, AxiosInstance } from 'axios';
8+
import globalAxios, { AxiosRequestConfig, AxiosInstance } from 'axios';
99

1010
export const BASE_PATH = "{{{basePath}}}".replace(/\/+$/, "");
1111

@@ -27,7 +27,7 @@ export const COLLECTION_FORMATS = {
2727
*/
2828
export interface RequestArgs {
2929
url: string;
30-
options: any;
30+
options: AxiosRequestConfig;
3131
}
3232

3333
/**

src/main/resources/handlebars/typescript-axios/index.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44

55
export * from "./api";
66
export * from "./configuration";
7+
export * from "./models";
78
{{#withSeparateModelsAndApi}}export * from "./{{tsModelPackage}}";{{/withSeparateModelsAndApi}}

src/main/resources/handlebars/typescript-axios/model.mustache

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import { {{class}} } from './{{filename}}';{{/allOf}}{{/hasAllOf}}{{#hasOneOf}}{{#oneOf}}
66
import { {{class}} } from './{{filename}}';{{/oneOf}}{{/hasOneOf}}{{^hasAllOf}}{{^hasOneOf}}{{#imports}}
77
import { {{class}} } from './{{filename}}';{{/imports}}{{/hasOneOf}}{{/hasAllOf}}{{/withSeparateModelsAndApi}}
8+
{{#imports}}
9+
import { {{class}} } from './{{filename}}';
10+
{{/imports}}
811
{{#models}}{{#model}}
912
{{#isEnum}}{{>modelEnum}}{{/isEnum}}{{#oneOf}}{{#@first}}{{>modelOneOf}}{{/@first}}{{/oneOf}}{{#allOf}}{{#@first}}{{>modelAllOf}}{{/@first}}{{/allOf}}{{^isEnum}}{{^oneOf}}{{^allOf}}{{>modelGeneric}}{{/allOf}}{{/oneOf}}{{/isEnum}}
1013
{{/model}}{{/models}}

src/main/resources/handlebars/typescript-axios/modelGeneric.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ export interface {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{
1111
{{#vars}}
1212
/**
1313
* {{{description}}}
14-
* @type {{braces "left"}}{{datatype}}{{braces "right"}}
15-
* @memberof {{classname}}
14+
* @type {{braces "left"}}{{{datatype}}}{{braces "right"}}
15+
* @memberof {{{classname}}}
1616
{{#deprecated}}
1717
* @deprecated
1818
{{/deprecated}}
1919
*/
20-
{{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}};
20+
{{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}};
2121
{{/vars}}
2222
}{{#hasEnums}}
2323

0 commit comments

Comments
 (0)