Skip to content

Commit 15cc452

Browse files
committed
feat: Per-request OpenAPI config overrides
1 parent 3dee68a commit 15cc452

25 files changed

+6073
-686
lines changed

docs/authorization.md

+19
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,22 @@ const getToken = async () => {
2222

2323
OpenAPI.TOKEN = getToken;
2424
```
25+
26+
Also, you can pass `TOKEN` or any OpenAPI configuration params to method call.
27+
```typescript
28+
const organizations = new OrganizationsService();
29+
OpenAPI.BASE = 'https://example.com/api';
30+
31+
express.use(async (req, res) => {
32+
const response = await organizations.createOrganization(
33+
{
34+
name: 'OrgName',
35+
description: 'OrgDescription',
36+
},
37+
{
38+
TOKEN: getToken(req)
39+
}
40+
);
41+
res.send(response);
42+
})
43+
```

src/templates/core/BaseHttpRequest.hbs

+5-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ export abstract class BaseHttpRequest {
2323
constructor(public readonly config: OpenAPIConfig) {}
2424
{{/equals}}
2525

26+
public abstract request<T>(
27+
options: ApiRequestOptions,
28+
configOverrides?: OpenAPIConfig,
2629
{{#equals @root.httpClient 'angular'}}
27-
public abstract request<T>(options: ApiRequestOptions): Observable<T>;
30+
): Observable<T>;
2831
{{else}}
29-
public abstract request<T>(options: ApiRequestOptions): CancelablePromise<T>;
32+
): CancelablePromise<T>;
3033
{{/equals}}
3134
}

src/templates/core/HttpRequest.hbs

+18-12
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,31 @@ export class {{httpRequest}} extends BaseHttpRequest {
3737
}
3838
{{/equals}}
3939

40-
{{#equals @root.httpClient 'angular'}}
4140
/**
4241
* Request method
4342
* @param options The request options from the service
43+
* @param [configOverrides] Overrides OpenAPIConfig
44+
{{#equals @root.httpClient 'angular'}}
4445
* @returns Observable<T>
45-
* @throws ApiError
46-
*/
47-
public override request<T>(options: ApiRequestOptions): Observable<T> {
48-
return __request(this.config, this.http, options);
49-
}
5046
{{else}}
51-
/**
52-
* Request method
53-
* @param options The request options from the service
5447
* @returns CancelablePromise<T>
48+
{{/equals}}
5549
* @throws ApiError
5650
*/
57-
public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {
58-
return __request(this.config, options);
59-
}
51+
public override request<T>(
52+
options: ApiRequestOptions,
53+
configOverrides?: OpenAPIConfig,
54+
{{#equals @root.httpClient 'angular'}}
55+
): Observable<T> {
56+
{{else}}
57+
): CancelablePromise<T> {
6058
{{/equals}}
59+
return __request(
60+
{...this.config, ...configOverrides},
61+
{{#equals @root.httpClient 'angular'}}
62+
this.http,
63+
{{/equals}}
64+
options,
65+
);
66+
}
6167
}

src/templates/exportService.hbs

+87-66
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ import { BaseHttpRequest } from '../core/BaseHttpRequest';
2626
{{else}}
2727
import type { BaseHttpRequest } from '../core/BaseHttpRequest';
2828
{{/equals}}
29+
import type { OpenAPIConfig } from '../core/OpenAPI';
2930
{{else}}
31+
import type { OpenAPIConfig } from '../core/OpenAPI';
3032
import { OpenAPI } from '../core/OpenAPI';
3133
import { request as __request } from '../core/request';
3234
{{/if}}
@@ -63,6 +65,7 @@ export class {{{name}}}{{{@root.postfix}}} {
6365
{{#each parameters}}
6466
* @param {{{name}}} {{#if description}}{{{escapeComment description}}}{{/if}}
6567
{{/each}}
68+
* @param [configOverrides] Overrides OpenAPIConfig
6669
{{/if}}
6770
{{/unless}}
6871
{{#each results}}
@@ -71,81 +74,99 @@ export class {{{name}}}{{{@root.postfix}}} {
7174
* @throws ApiError
7275
*/
7376
{{#if @root.exportClient}}
77+
public {{{name}}}(
78+
{{>parameters}}
79+
configOverrides?: OpenAPIConfig,
7480
{{#equals @root.httpClient 'angular'}}
75-
public {{{name}}}({{>parameters}}): Observable<{{>result}}> {
76-
return this.httpRequest.request({
81+
): Observable<{{>result}}> {
7782
{{else}}
78-
public {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
79-
return this.httpRequest.request({
83+
): CancelablePromise<{{>result}}> {
8084
{{/equals}}
85+
return this.httpRequest.request(
8186
{{else}}
8287
{{#equals @root.httpClient 'angular'}}
83-
public {{{name}}}({{>parameters}}): Observable<{{>result}}> {
84-
return __request(OpenAPI, this.http, {
88+
public {{{name}}}(
89+
{{>parameters}}
90+
configOverrides?: OpenAPIConfig,
91+
): Observable<{{>result}}> {
92+
return __request(
93+
{...OpenAPI, ...configOverrides},
94+
this.http,
8595
{{else}}
86-
public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
87-
return __request(OpenAPI, {
96+
public static {{{name}}}(
97+
{{>parameters}}
98+
configOverrides?: OpenAPIConfig,
99+
): CancelablePromise<{{>result}}> {
100+
return __request(
101+
{...OpenAPI, ...configOverrides},
88102
{{/equals}}
89103
{{/if}}
90-
method: '{{{method}}}',
91-
url: '{{{path}}}',
92-
{{#if parametersPath}}
93-
path: {
94-
{{#each parametersPath}}
95-
'{{{prop}}}': {{{name}}},
96-
{{/each}}
97-
},
98-
{{/if}}
99-
{{#if parametersCookie}}
100-
cookies: {
101-
{{#each parametersCookie}}
102-
'{{{prop}}}': {{{name}}},
103-
{{/each}}
104-
},
105-
{{/if}}
106-
{{#if parametersHeader}}
107-
headers: {
108-
{{#each parametersHeader}}
109-
'{{{prop}}}': {{{name}}},
110-
{{/each}}
111-
},
112-
{{/if}}
113-
{{#if parametersQuery}}
114-
query: {
115-
{{#each parametersQuery}}
116-
'{{{prop}}}': {{{name}}},
117-
{{/each}}
118-
},
119-
{{/if}}
120-
{{#if parametersForm}}
121-
formData: {
122-
{{#each parametersForm}}
123-
'{{{prop}}}': {{{name}}},
124-
{{/each}}
125-
},
126-
{{/if}}
127-
{{#if parametersBody}}
128-
{{#equals parametersBody.in 'formData'}}
129-
formData: {{{parametersBody.name}}},
130-
{{/equals}}
131-
{{#equals parametersBody.in 'body'}}
132-
body: {{{parametersBody.name}}},
133-
{{/equals}}
134-
{{#if parametersBody.mediaType}}
135-
mediaType: '{{{parametersBody.mediaType}}}',
136-
{{/if}}
137-
{{/if}}
138-
{{#if responseHeader}}
139-
responseHeader: '{{{responseHeader}}}',
140-
{{/if}}
141-
{{#if errors}}
142-
errors: {
143-
{{#each errors}}
144-
{{{code}}}: `{{{escapeDescription description}}}`,
145-
{{/each}}
104+
{
105+
method: '{{{method}}}',
106+
url: '{{{path}}}',
107+
{{#if parametersPath}}
108+
path: {
109+
{{#each parametersPath}}
110+
'{{{prop}}}': {{{name}}},
111+
{{/each}}
112+
},
113+
{{/if}}
114+
{{#if parametersCookie}}
115+
cookies: {
116+
{{#each parametersCookie}}
117+
'{{{prop}}}': {{{name}}},
118+
{{/each}}
119+
},
120+
{{/if}}
121+
{{#if parametersHeader}}
122+
headers: {
123+
{{#each parametersHeader}}
124+
'{{{prop}}}': {{{name}}},
125+
{{/each}}
126+
},
127+
{{/if}}
128+
{{#if parametersQuery}}
129+
query: {
130+
{{#each parametersQuery}}
131+
'{{{prop}}}': {{{name}}},
132+
{{/each}}
133+
},
134+
{{/if}}
135+
{{#if parametersForm}}
136+
formData: {
137+
{{#each parametersForm}}
138+
'{{{prop}}}': {{{name}}},
139+
{{/each}}
140+
},
141+
{{/if}}
142+
{{#if parametersBody}}
143+
{{#equals parametersBody.in 'formData'}}
144+
formData: {{{parametersBody.name}}},
145+
{{/equals}}
146+
{{#equals parametersBody.in 'body'}}
147+
body: {{{parametersBody.name}}},
148+
{{/equals}}
149+
{{#if parametersBody.mediaType}}
150+
mediaType: '{{{parametersBody.mediaType}}}',
151+
{{/if}}
152+
{{/if}}
153+
{{#if responseHeader}}
154+
responseHeader: '{{{responseHeader}}}',
155+
{{/if}}
156+
{{#if errors}}
157+
errors: {
158+
{{#each errors}}
159+
{{{code}}}: `{{{escapeDescription description}}}`,
160+
{{/each}}
161+
},
162+
{{/if}}
163+
{{#if @root.exportClient}}
146164
},
147-
{{/if}}
148-
});
165+
configOverrides,
166+
{{else}}
167+
}
168+
{{/if}}
169+
);
149170
}
150171

151172
{{/each}}

src/templates/partials/parameters.hbs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{{#if parameters}}
2-
{{#if @root.useOptions~}}
2+
{{#if @root.useOptions}}
33
{
44
{{#each parameters}}
55
{{{name}}}{{#if default}} = {{{default}}}{{/if}},
@@ -18,9 +18,8 @@
1818
{{/ifdef}}
1919
{{{name}}}{{>isRequired}}: {{>type}},
2020
{{/each}}
21-
}
22-
{{~else}}
23-
21+
},
22+
{{else}}
2423
{{#each parameters}}
2524
{{{name}}}{{>isRequired}}: {{>type}}{{#if default}} = {{{default}}}{{/if}},
2625
{{/each}}

0 commit comments

Comments
 (0)