Skip to content

Commit 6b51099

Browse files
committed
Add AxiosRequestOptions with signal and onUploadProgress (#1)
1 parent 17a480b commit 6b51099

16 files changed

+98
-43
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{{>header}}
2+
3+
import { AxiosProgressEvent } from 'axios';
4+
5+
export type AxiosRequestOptions = {
6+
readonly onUploadProgress?: (progress: AxiosProgressEvent) => void;
7+
readonly signal?: AbortSignal;
8+
};

src/templates/core/BaseHttpRequest.hbs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import type { Observable } from 'rxjs';
66

77
import type { ApiRequestOptions } from './ApiRequestOptions';
88
import type { OpenAPIConfig } from './OpenAPI';
9+
{{else equals @root.httpclient 'axios'}}
10+
import type { ApiRequestOptions } from './ApiRequestOptions';
11+
import type { AxiosRequestOptions } from './AxiosRequestOptions';
12+
import type { CancelablePromise } from './CancelablePromise';
13+
import type { OpenAPIConfig } from './OpenAPI';
914
{{else}}
1015
import type { ApiRequestOptions } from './ApiRequestOptions';
1116
import type { CancelablePromise } from './CancelablePromise';
@@ -25,6 +30,8 @@ export abstract class BaseHttpRequest {
2530

2631
{{#equals @root.httpClient 'angular'}}
2732
public abstract request<T>(options: ApiRequestOptions): Observable<T>;
33+
{{else equals @root.httpClient 'axios'}}
34+
public abstract request<T>(options: ApiRequestOptions & AxiosRequestOptions): Promise<T>;
2835
{{else}}
2936
public abstract request<T>(options: ApiRequestOptions): CancelablePromise<T>;
3037
{{/equals}}

src/templates/core/HttpRequest.hbs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ import { BaseHttpRequest } from './BaseHttpRequest';
1010
import type { OpenAPIConfig } from './OpenAPI';
1111
import { OpenAPI } from './OpenAPI';
1212
import { request as __request } from './request';
13+
{{else equals @root.httpClient 'axios'}}
14+
import type { ApiRequestOptions } from './ApiRequestOptions';
15+
import type { AxiosRequestOptions } from './AxiosRequestOptions';
16+
import { BaseHttpRequest } from './BaseHttpRequest';
17+
import type { OpenAPIConfig } from './OpenAPI';
18+
import { request as __request } from './request';
1319
{{else}}
1420
import type { ApiRequestOptions } from './ApiRequestOptions';
1521
import { BaseHttpRequest } from './BaseHttpRequest';
@@ -47,6 +53,14 @@ export class {{httpRequest}} extends BaseHttpRequest {
4753
public override request<T>(options: ApiRequestOptions): Observable<T> {
4854
return __request(this.config, this.http, options);
4955
}
56+
{{else equals @root.httpClient 'axios'}}
57+
/**
58+
* Request method
59+
* @param options The request options from the service
60+
* @returns Promise<T>
61+
* @throws ApiError
62+
*/
63+
public override request<T>(options: ApiRequestOptions & AxiosRequestOptions): Promise<T> {
5064
{{else}}
5165
/**
5266
* Request method

src/templates/core/axios/request.hbs

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
{{>header}}
22

33
import axios from 'axios';
4-
import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios';
4+
import type { AxiosError, AxiosRequestConfig, AxiosResponse, AxiosInstance, AxiosProgressEvent } from 'axios';
55
import FormData from 'form-data';
66

77
import { ApiError } from './ApiError';
88
import type { ApiRequestOptions } from './ApiRequestOptions';
9+
import type { AxiosRequestOptions } from './AxiosRequestOptions';
910
import type { ApiResult } from './ApiResult';
10-
import { CancelablePromise } from './CancelablePromise';
11-
import type { OnCancel } from './CancelablePromise';
1211
import type { OpenAPIConfig } from './OpenAPI';
1312

1413
{{>functions/isDefined}}
@@ -70,33 +69,31 @@ import type { OpenAPIConfig } from './OpenAPI';
7069
* @returns CancelablePromise<T>
7170
* @throws ApiError
7271
*/
73-
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => {
74-
return new CancelablePromise(async (resolve, reject, onCancel) => {
75-
try {
76-
const url = getUrl(config, options);
77-
const formData = getFormData(options);
78-
const body = getRequestBody(options);
79-
const headers = await getHeaders(config, options, formData);
80-
81-
if (!onCancel.isCancelled) {
82-
const response = await sendRequest<T>(config, options, url, body, formData, headers, onCancel, axiosClient);
83-
const responseBody = getResponseBody(response);
84-
const responseHeader = getResponseHeader(response, options.responseHeader);
85-
86-
const result: ApiResult = {
87-
url,
88-
ok: isSuccess(response.status),
89-
status: response.status,
90-
statusText: response.statusText,
91-
body: responseHeader ?? responseBody,
92-
};
93-
94-
catchErrorCodes(options, result);
95-
96-
resolve(result.body);
97-
}
98-
} catch (error) {
99-
reject(error);
100-
}
101-
});
72+
export const request = async <T>(
73+
config: OpenAPIConfig,
74+
options: ApiRequestOptions & AxiosRequestOptions,
75+
axiosClient: AxiosInstance = axios
76+
): Promise<T> => {
77+
const url = getUrl(config, options);
78+
const formData = getFormData(options);
79+
const body = getRequestBody(options);
80+
const headers = await getHeaders(config, options, formData);
81+
82+
options.signal?.throwIfAborted();
83+
84+
const response = await sendRequest<T>(config, options, url, body, formData, headers, axiosClient);
85+
const responseBody = getResponseBody(response);
86+
const responseHeader = getResponseHeader(response, options.responseHeader);
87+
88+
const result: ApiResult = {
89+
url,
90+
ok: isSuccess(response.status),
91+
status: response.status,
92+
statusText: response.statusText,
93+
body: responseHeader ?? responseBody,
94+
};
95+
96+
catchErrorCodes(options, result);
97+
98+
return result.body as T;
10299
};

src/templates/core/axios/sendRequest.hbs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
11
export const sendRequest = async <T>(
22
config: OpenAPIConfig,
3-
options: ApiRequestOptions,
3+
options: ApiRequestOptions & AxiosRequestOptions,
44
url: string,
55
body: any,
66
formData: FormData | undefined,
77
headers: Record<string, string>,
8-
onCancel: OnCancel,
98
axiosClient: AxiosInstance
109
): Promise<AxiosResponse<T>> => {
11-
const source = axios.CancelToken.source();
12-
1310
const requestConfig: AxiosRequestConfig = {
1411
url,
1512
headers,
1613
data: body ?? formData,
1714
method: options.method,
1815
withCredentials: config.WITH_CREDENTIALS,
1916
withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false,
20-
cancelToken: source.token,
2117
validateStatus: isSuccess,
18+
signal: options.signal,
19+
onUploadProgress: options.onUploadProgress
2220
};
2321

24-
onCancel(() => source.cancel('The user aborted a request.'));
25-
2622
try {
2723
return await axiosClient.request(requestConfig);
2824
} catch (error) {

src/templates/exportService.hbs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ import type { {{{this}}} } from '../models/{{{this}}}';
1717
{{/each}}
1818

1919
{{/if}}
20-
{{#notEquals @root.httpClient 'angular'}}
20+
{{#equals @root.httpClient 'angular'}}
21+
{{else equals @root.httpClient 'axios'}}
22+
import type { AxiosRequestOptions } from '../core/AxiosRequestOptions';
23+
{{else}}
2124
import type { CancelablePromise } from '../core/CancelablePromise';
22-
{{/notEquals}}
25+
{{/equals}}
2326
{{#if @root.exportClient}}
2427
{{#equals @root.httpClient 'angular'}}
2528
import { BaseHttpRequest } from '../core/BaseHttpRequest';
@@ -74,6 +77,9 @@ export class {{{name}}}{{{@root.postfix}}} {
7477
{{#equals @root.httpClient 'angular'}}
7578
public {{{name}}}({{>parameters}}): Observable<{{>result}}> {
7679
return this.httpRequest.request({
80+
{{else equals @root.httpClient 'axios'}}
81+
public {{{name}}}({{>parameters}} options?: AxiosRequestOptions): Promise<{{>result}}> {
82+
return this.httpRequest.request({
7783
{{else}}
7884
public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
7985
return this.httpRequest.request({
@@ -82,6 +88,9 @@ export class {{{name}}}{{{@root.postfix}}} {
8288
{{#equals @root.httpClient 'angular'}}
8389
public {{{name}}}({{>parameters}}): Observable<{{>result}}> {
8490
return __request(OpenAPI, this.http, {
91+
{{else equals @root.httpClient 'axios'}}
92+
public static {{{name}}}({{>parameters}} options?: AxiosRequestOptions): Promise<{{>result}}> {
93+
return __request(OpenAPI, {
8594
{{else}}
8695
public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
8796
return __request(OpenAPI, {
@@ -144,6 +153,9 @@ export class {{{name}}}{{{@root.postfix}}} {
144153
{{{code}}}: `{{{escapeDescription description}}}`,
145154
{{/each}}
146155
},
156+
{{#equals @root.httpClient 'axios'}}
157+
...options,
158+
{{/equals}}
147159
{{/if}}
148160
});
149161
}

src/utils/registerHandlebarTemplates.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ describe('registerHandlebarTemplates', () => {
1515
expect(templates.core.settings).toBeDefined();
1616
expect(templates.core.apiError).toBeDefined();
1717
expect(templates.core.apiRequestOptions).toBeDefined();
18+
expect(templates.core.axiosRequestOptions).toBeDefined();
1819
expect(templates.core.apiResult).toBeDefined();
1920
expect(templates.core.request).toBeDefined();
2021
});

src/utils/registerHandlebarTemplates.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import axiosGetResponseBody from '../templates/core/axios/getResponseBody.hbs';
1717
import axiosGetResponseHeader from '../templates/core/axios/getResponseHeader.hbs';
1818
import axiosRequest from '../templates/core/axios/request.hbs';
1919
import axiosSendRequest from '../templates/core/axios/sendRequest.hbs';
20+
import templateCoreAxiosRequestOptions from '../templates/core/AxiosRequestOptions.hbs';
2021
import templateCoreBaseHttpRequest from '../templates/core/BaseHttpRequest.hbs';
2122
import templateCancelablePromise from '../templates/core/CancelablePromise.hbs';
2223
import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs';
@@ -97,6 +98,7 @@ export interface Templates {
9798
settings: Handlebars.TemplateDelegate;
9899
apiError: Handlebars.TemplateDelegate;
99100
apiRequestOptions: Handlebars.TemplateDelegate;
101+
axiosRequestOptions: Handlebars.TemplateDelegate;
100102
apiResult: Handlebars.TemplateDelegate;
101103
cancelablePromise: Handlebars.TemplateDelegate;
102104
request: Handlebars.TemplateDelegate;
@@ -129,6 +131,7 @@ export const registerHandlebarTemplates = (root: {
129131
settings: Handlebars.template(templateCoreSettings),
130132
apiError: Handlebars.template(templateCoreApiError),
131133
apiRequestOptions: Handlebars.template(templateCoreApiRequestOptions),
134+
axiosRequestOptions: Handlebars.template(templateCoreAxiosRequestOptions),
132135
apiResult: Handlebars.template(templateCoreApiResult),
133136
cancelablePromise: Handlebars.template(templateCancelablePromise),
134137
request: Handlebars.template(templateCoreRequest),

src/utils/writeClient.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ describe('writeClient', () => {
2828
settings: () => 'settings',
2929
apiError: () => 'apiError',
3030
apiRequestOptions: () => 'apiRequestOptions',
31+
axiosRequestOptions: () => 'axiosRequestOptions',
3132
apiResult: () => 'apiResult',
3233
cancelablePromise: () => 'cancelablePromise',
3334
request: () => 'request',

src/utils/writeClientClass.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ describe('writeClientClass', () => {
2828
settings: () => 'settings',
2929
apiError: () => 'apiError',
3030
apiRequestOptions: () => 'apiRequestOptions',
31+
axiosRequestOptions: () => 'axiosRequestOptions',
3132
apiResult: () => 'apiResult',
3233
cancelablePromise: () => 'cancelablePromise',
3334
request: () => 'request',

0 commit comments

Comments
 (0)