Skip to content

Commit 5b6b4c9

Browse files
authored
[typescript-fetch] allow initOverrides with async function (#12098)
* [typescript-fetch] allow initOverrides with async function * [typescript-fetch] update samples * [typescript-fetch] refactoring initFnction apply * [typescript-fetch] update samples * [typescript-fetch] refactoring create body function * [typescript-fetch] update samples * [typescript-fetch] make interface more flexible * [typescript-fetch] update samples * [typescript-fetch] support 2.x version of typescript & update samples * [typescript-axios] update samples * [typescript-fetch] refactor: add type alias * [typescript-fetch] override with init params even if initOverrides is function * [typescript-fetch] update samples
1 parent f92f8f1 commit 5b6b4c9

File tree

48 files changed

+972
-624
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+972
-624
lines changed

modules/openapi-generator/src/main/resources/typescript-fetch/apis.mustache

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export interface {{classname}}Interface {
5252
* @throws {RequiredError}
5353
* @memberof {{classname}}Interface
5454
*/
55-
{{nickname}}Raw({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit): Promise<runtime.ApiResponse<{{{returnType}}}{{^returnType}}void{{/returnType}}>>;
55+
{{nickname}}Raw({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<runtime.ApiResponse<{{{returnType}}}{{^returnType}}void{{/returnType}}>>;
5656
5757
/**
5858
{{#notes}}
@@ -63,10 +63,10 @@ export interface {{classname}}Interface {
6363
{{/summary}}
6464
*/
6565
{{^useSingleRequestParameter}}
66-
{{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}, {{/allParams}}initOverrides?: RequestInit): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}>;
66+
{{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}, {{/allParams}}initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}>;
6767
{{/useSingleRequestParameter}}
6868
{{#useSingleRequestParameter}}
69-
{{nickname}}({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}>;
69+
{{nickname}}({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}>;
7070
{{/useSingleRequestParameter}}
7171
7272
{{/operation}}
@@ -94,7 +94,7 @@ export class {{classname}} extends runtime.BaseAPI {
9494
* {{&summary}}
9595
{{/summary}}
9696
*/
97-
async {{nickname}}Raw({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit): Promise<runtime.ApiResponse<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
97+
async {{nickname}}Raw({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<runtime.ApiResponse<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
9898
{{#allParams}}
9999
{{#required}}
100100
if (requestParameters.{{paramName}} === null || requestParameters.{{paramName}} === undefined) {
@@ -334,7 +334,7 @@ export class {{classname}} extends runtime.BaseAPI {
334334
{{/summary}}
335335
*/
336336
{{^useSingleRequestParameter}}
337-
async {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}, {{/allParams}}initOverrides?: RequestInit): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}> {
337+
async {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}, {{/allParams}}initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}> {
338338
{{#returnType}}
339339
const response = await this.{{nickname}}Raw({{#allParams.0}}{ {{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}} }, {{/allParams.0}}initOverrides);
340340
return await response.value();
@@ -345,7 +345,7 @@ export class {{classname}} extends runtime.BaseAPI {
345345
}
346346
{{/useSingleRequestParameter}}
347347
{{#useSingleRequestParameter}}
348-
async {{nickname}}({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, {{/allParams.0}}initOverrides?: RequestInit): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}> {
348+
async {{nickname}}({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, {{/allParams.0}}initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<{{{returnType}}}{{^returnType}}void{{/returnType}}> {
349349
{{#returnType}}
350350
const response = await this.{{nickname}}Raw({{#allParams.0}}requestParameters, {{/allParams.0}}initOverrides);
351351
return await response.value();

modules/openapi-generator/src/main/resources/typescript-fetch/runtime.mustache

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ export class Configuration {
7575

7676
export const DefaultConfig = new Configuration();
7777

78-
const isBlob = (value: any) => typeof Blob !== 'undefined' && value instanceof Blob;
79-
8078
/**
8179
* This is the base class for all generated API classes.
8280
*/
@@ -104,37 +102,57 @@ export class BaseAPI {
104102
return this.withMiddleware<T>(...middlewares);
105103
}
106104

107-
protected async request(context: RequestOpts, initOverrides?: RequestInit): Promise<Response> {
108-
const { url, init } = this.createFetchParams(context, initOverrides);
105+
protected async request(context: RequestOpts, initOverrides?: RequestInit | InitOverideFunction): Promise<Response> {
106+
const { url, init } = await this.createFetchParams(context, initOverrides);
109107
const response = await this.fetchApi(url, init);
110108
if (response.status >= 200 && response.status < 300) {
111109
return response;
112110
}
113111
throw new ResponseError(response, 'Response returned an error code');
114112
}
115113

116-
private createFetchParams(context: RequestOpts, initOverrides?: RequestInit) {
114+
private async createFetchParams(context: RequestOpts, initOverrides?: RequestInit | InitOverideFunction) {
117115
let url = this.configuration.basePath + context.path;
118116
if (context.query !== undefined && Object.keys(context.query).length !== 0) {
119117
// only add the querystring to the URL if there are query parameters.
120118
// this is done to avoid urls ending with a "?" character which buggy webservers
121119
// do not handle correctly sometimes.
122120
url += '?' + this.configuration.queryParamsStringify(context.query);
123121
}
124-
const body = ((typeof FormData !== "undefined" && context.body instanceof FormData) || context.body instanceof URLSearchParams || isBlob(context.body))
125-
? context.body
126-
: JSON.stringify(context.body);
127122

128123
const headers = Object.assign({}, this.configuration.headers, context.headers);
129124
Object.keys(headers).forEach(key => headers[key] === undefined ? delete headers[key] : {});
130125

131-
const init = {
126+
const initOverrideFn =
127+
typeof initOverrides === "function"
128+
? initOverrides
129+
: async () => initOverrides;
130+
131+
const initParams = {
132132
method: context.method,
133-
headers: headers,
134-
body,
133+
headers,
134+
body: context.body,
135135
credentials: this.configuration.credentials,
136-
...initOverrides
137136
};
137+
138+
const overridedInit: RequestInit = {
139+
...initParams,
140+
...(await initOverrideFn({
141+
init: initParams,
142+
context,
143+
}))
144+
}
145+
146+
const init: RequestInit = {
147+
...overridedInit,
148+
body:
149+
isFormData(overridedInit.body) ||
150+
overridedInit.body instanceof URLSearchParams ||
151+
isBlob(overridedInit.body)
152+
? overridedInit.body
153+
: JSON.stringify(overridedInit.body),
154+
};
155+
138156
return { url, init };
139157
}
140158

@@ -174,6 +192,14 @@ export class BaseAPI {
174192
}
175193
};
176194

195+
function isBlob(value: any): value is Blob {
196+
return typeof Blob !== 'undefined' && value instanceof Blob
197+
}
198+
199+
function isFormData(value: any): value is FormData {
200+
return typeof FormData !== "undefined" && value instanceof FormData
201+
}
202+
177203
export class ResponseError extends Error {
178204
name: "ResponseError" = "ResponseError";
179205
constructor(public response: Response, msg?: string) {
@@ -202,8 +228,11 @@ export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS'
202228
export type HTTPHeaders = { [key: string]: string };
203229
export type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | HTTPQuery };
204230
export type HTTPBody = Json | FormData | URLSearchParams;
231+
export type HTTPRequestInit = { headers?: HTTPHeaders; method: HTTPMethod; credentials?: RequestCredentials; body?: HTTPBody }
205232
export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original';
206233

234+
export type InitOverideFunction = (requestContext: { init: HTTPRequestInit, context: RequestOpts }) => Promise<RequestInit>
235+
207236
export interface FetchParams {
208237
url: string;
209238
init: RequestInit;

samples/client/petstore/typescript-fetch/builds/default-v3.0/apis/AnotherFakeApi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export class AnotherFakeApi extends runtime.BaseAPI {
3333
* To test special tags and operation ID starting with number
3434
* To test special tags
3535
*/
36-
async _123testSpecialTagsRaw(requestParameters: 123testSpecialTagsRequest, initOverrides?: RequestInit): Promise<runtime.ApiResponse<Client>> {
36+
async _123testSpecialTagsRaw(requestParameters: 123testSpecialTagsRequest, initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<runtime.ApiResponse<Client>> {
3737
if (requestParameters.client === null || requestParameters.client === undefined) {
3838
throw new runtime.RequiredError('client','Required parameter requestParameters.client was null or undefined when calling _123testSpecialTags.');
3939
}
@@ -59,7 +59,7 @@ export class AnotherFakeApi extends runtime.BaseAPI {
5959
* To test special tags and operation ID starting with number
6060
* To test special tags
6161
*/
62-
async _123testSpecialTags(requestParameters: 123testSpecialTagsRequest, initOverrides?: RequestInit): Promise<Client> {
62+
async _123testSpecialTags(requestParameters: 123testSpecialTagsRequest, initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<Client> {
6363
const response = await this._123testSpecialTagsRaw(requestParameters, initOverrides);
6464
return await response.value();
6565
}

samples/client/petstore/typescript-fetch/builds/default-v3.0/apis/DefaultApi.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class DefaultApi extends runtime.BaseAPI {
2727

2828
/**
2929
*/
30-
async fooGetRaw(initOverrides?: RequestInit): Promise<runtime.ApiResponse<InlineResponseDefault>> {
30+
async fooGetRaw(initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<runtime.ApiResponse<InlineResponseDefault>> {
3131
const queryParameters: any = {};
3232

3333
const headerParameters: runtime.HTTPHeaders = {};
@@ -44,7 +44,7 @@ export class DefaultApi extends runtime.BaseAPI {
4444

4545
/**
4646
*/
47-
async fooGet(initOverrides?: RequestInit): Promise<InlineResponseDefault> {
47+
async fooGet(initOverrides?: RequestInit | runtime.InitOverideFunction): Promise<InlineResponseDefault> {
4848
const response = await this.fooGetRaw(initOverrides);
4949
return await response.value();
5050
}

0 commit comments

Comments
 (0)