Skip to content

Commit dc03536

Browse files
authored
Merge pull request #1 from Cancer-Expert-Now/master
Merge everything
2 parents dde099e + 866f8ef commit dc03536

File tree

9 files changed

+145
-19
lines changed

9 files changed

+145
-19
lines changed

src/templates/core/OpenAPI.hbs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
11
{{>header}}
22

3+
4+
{{#equals @root.httpClient 'fetch'}}{{>fetch/responseType}}{{/equals}}
5+
{{#equals @root.httpClient 'xhr'}}{{>xhr/responseType}}{{/equals}}
6+
{{#equals @root.httpClient 'node'}}{{>node/responseType}}{{/equals}}
7+
38
type Resolver<T> = () => Promise<T>;
49
type Headers = Record<string, string>;
510

11+
import { ApiResult } from './ApiResult';
12+
import { ApiRequestOptions } from './ApiRequestOptions';
13+
14+
export interface RequestHookParams {
15+
url: string;
16+
options: ApiRequestOptions;
17+
}
18+
19+
export interface ResponseHookParams {
20+
url: string;
21+
result: ApiResult;
22+
response?: ResponseImplementation;
23+
}
24+
625
type Config = {
726
BASE: string;
827
VERSION: string;
928
WITH_CREDENTIALS: boolean;
29+
REQUEST_HOOK?(params: RequestHookParams): Promise<RequestHookParams>;
30+
RESPONSE_HOOK?(result: ResponseHookParams): Promise<ApiResult>
1031
TOKEN?: string | Resolver<string>;
1132
USERNAME?: string | Resolver<string>;
1233
PASSWORD?: string | Resolver<string>;

src/templates/core/fetch/request.hbs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,30 @@ import { OpenAPI } from './OpenAPI';
5555
*/
5656
export async function request(options: ApiRequestOptions): Promise<ApiResult> {
5757
const url = getUrl(options);
58-
const response = await sendRequest(options, url);
58+
59+
// Pre-hook on request if a function is provided.
60+
const requestHookResult = OpenAPI.REQUEST_HOOK ?
61+
(await OpenAPI.REQUEST_HOOK({ url, options})) : { url, options };
62+
63+
64+
const response = await sendRequest(requestHookResult.options, requestHookResult.url);
5965
const responseBody = await getResponseBody(response);
60-
const responseHeader = getResponseHeader(response, options.responseHeader);
66+
const responseHeader = getResponseHeader(response, requestHookResult.options.responseHeader);
67+
6168

62-
const result: ApiResult = {
69+
let result: ApiResult = {
6370
url,
6471
ok: response.ok,
6572
status: response.status,
6673
statusText: response.statusText,
67-
body: responseHeader || responseBody,
74+
body: responseHeader || responseBody
6875
};
6976

77+
// Post-request Hook if provided
78+
result = OpenAPI.RESPONSE_HOOK ? await OpenAPI.RESPONSE_HOOK({url, result, response}) : result;
79+
7080
catchErrors(options, result);
81+
82+
7183
return result;
7284
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
type ResponseImplementation = Response;
2+

src/templates/core/node/request.hbs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,26 @@ import { OpenAPI } from './OpenAPI';
5959
*/
6060
export async function request(options: ApiRequestOptions): Promise<ApiResult> {
6161
const url = getUrl(options);
62-
const response = await sendRequest(options, url);
62+
63+
// Pre-hook on request if a function is provided.
64+
const requestHookResult = OpenAPI.REQUEST_HOOK ?
65+
(await OpenAPI.REQUEST_HOOK({ url, options})) : { url, options };
66+
67+
const response = await sendRequest(requestHookResult.options, requestHookResult.url);
6368
const responseBody = await getResponseBody(response);
64-
const responseHeader = getResponseHeader(response, options.responseHeader);
69+
const responseHeader = getResponseHeader(response, requestHookResult.options.responseHeader);
6570

6671
const result: ApiResult = {
6772
url,
6873
ok: response.ok,
6974
status: response.status,
7075
statusText: response.statusText,
71-
body: responseHeader || responseBody,
76+
body: responseHeader || responseBody
7277
};
7378

79+
// Post-request Hook if provided
80+
result = OpenAPI.RESPONSE_HOOK ? await OpenAPI.RESPONSE_HOOK({url, result, response}) : result;
81+
7482
catchErrors(options, result);
7583
return result;
7684
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import { Response as ResponseImplementation } from 'node-fetch';

src/templates/core/xhr/request.hbs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,27 @@ import { OpenAPI } from './OpenAPI';
5858
*/
5959
export async function request(options: ApiRequestOptions): Promise<ApiResult> {
6060
const url = getUrl(options);
61-
const response = await sendRequest(options, url);
62-
const responseBody = getResponseBody(response);
63-
const responseHeader = getResponseHeader(response, options.responseHeader);
61+
62+
// Pre-hook on request if a function is provided.
63+
const requestHookResult = OpenAPI.REQUEST_HOOK ?
64+
(await OpenAPI.REQUEST_HOOK({ url, options})) : { url, options };
65+
66+
const response = await sendRequest(requestHookResult.options, requestHookResult.url);
67+
const responseBody = await getResponseBody(response);
68+
const responseHeader = getResponseHeader(response, requestHookResult.options.responseHeader);
69+
6470

6571
const result: ApiResult = {
6672
url,
6773
ok: isSuccess(response.status),
6874
status: response.status,
6975
statusText: response.statusText,
70-
body: responseHeader || responseBody,
76+
body: responseHeader || responseBody
7177
};
7278

79+
// Post-request Hook if provided
80+
result = OpenAPI.RESPONSE_HOOK ? await OpenAPI.RESPONSE_HOOK({url, result, response}) : result;
81+
7382
catchErrors(options, result);
7483
return result;
7584
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
type ResponseImplementation = XMLHttpRequest;

src/utils/registerHandlebarTemplates.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs';
99
import fetchGetResponseHeader from '../templates/core/fetch/getResponseHeader.hbs';
1010
import fetchRequest from '../templates/core/fetch/request.hbs';
1111
import fetchSendRequest from '../templates/core/fetch/sendRequest.hbs';
12+
import fetchResponseType from '../templates/core/fetch/responseType.hbs';
1213
import functionCatchErrors from '../templates/core/functions/catchErrors.hbs';
1314
import functionGetFormData from '../templates/core/functions/getFormData.hbs';
1415
import functionGetQueryString from '../templates/core/functions/getQueryString.hbs';
@@ -26,6 +27,7 @@ import nodeGetResponseBody from '../templates/core/node/getResponseBody.hbs';
2627
import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs';
2728
import nodeRequest from '../templates/core/node/request.hbs';
2829
import nodeSendRequest from '../templates/core/node/sendRequest.hbs';
30+
import nodeResponseType from '../templates/core/node/responseType.hbs';
2931
import templateCoreSettings from '../templates/core/OpenAPI.hbs';
3032
import templateCoreRequest from '../templates/core/request.hbs';
3133
import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs';
@@ -34,6 +36,7 @@ import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs';
3436
import xhrGetResponseHeader from '../templates/core/xhr/getResponseHeader.hbs';
3537
import xhrRequest from '../templates/core/xhr/request.hbs';
3638
import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs';
39+
import xhrResponseType from '../templates/core/xhr/responseType.hbs';
3740
import templateExportModel from '../templates/exportModel.hbs';
3841
import templateExportSchema from '../templates/exportSchema.hbs';
3942
import templateExportService from '../templates/exportService.hbs';
@@ -156,6 +159,7 @@ export function registerHandlebarTemplates(): Templates {
156159
Handlebars.registerPartial('fetch/getResponseHeader', Handlebars.template(fetchGetResponseHeader));
157160
Handlebars.registerPartial('fetch/sendRequest', Handlebars.template(fetchSendRequest));
158161
Handlebars.registerPartial('fetch/request', Handlebars.template(fetchRequest));
162+
Handlebars.registerPartial('fetch/responseType', Handlebars.template(fetchResponseType));
159163

160164
// Specific files for the xhr client implementation
161165
Handlebars.registerPartial('xhr/getHeaders', Handlebars.template(xhrGetHeaders));
@@ -164,6 +168,7 @@ export function registerHandlebarTemplates(): Templates {
164168
Handlebars.registerPartial('xhr/getResponseHeader', Handlebars.template(xhrGetResponseHeader));
165169
Handlebars.registerPartial('xhr/sendRequest', Handlebars.template(xhrSendRequest));
166170
Handlebars.registerPartial('xhr/request', Handlebars.template(xhrRequest));
171+
Handlebars.registerPartial('xhr/responseType', Handlebars.template(xhrResponseType));
167172

168173
// Specific files for the node client implementation
169174
Handlebars.registerPartial('node/getHeaders', Handlebars.template(nodeGetHeaders));
@@ -172,6 +177,7 @@ export function registerHandlebarTemplates(): Templates {
172177
Handlebars.registerPartial('node/getResponseHeader', Handlebars.template(nodeGetResponseHeader));
173178
Handlebars.registerPartial('node/sendRequest', Handlebars.template(nodeSendRequest));
174179
Handlebars.registerPartial('node/request', Handlebars.template(nodeRequest));
180+
Handlebars.registerPartial('node/responseType', Handlebars.template(nodeResponseType));
175181

176182
return templates;
177183
}

test/__snapshots__/index.spec.js.snap

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,34 @@ exports[`v2 should generate: ./test/generated/v2/core/OpenAPI.ts 1`] = `
5757
"/* istanbul ignore file */
5858
/* tslint:disable */
5959
/* eslint-disable */
60+
61+
type ResponseImplementation = Response;
62+
63+
64+
6065
type Resolver<T> = () => Promise<T>;
6166
type Headers = Record<string, string>;
6267

68+
import { ApiResult } from './ApiResult';
69+
import { ApiRequestOptions } from './ApiRequestOptions';
70+
71+
export interface RequestHookParams {
72+
url: string;
73+
options: ApiRequestOptions;
74+
}
75+
76+
export interface ResponseHookParams {
77+
url: string;
78+
result: ApiResult;
79+
response?: ResponseImplementation;
80+
}
81+
6382
type Config = {
6483
BASE: string;
6584
VERSION: string;
6685
WITH_CREDENTIALS: boolean;
86+
REQUEST_HOOK?(params: RequestHookParams): Promise<RequestHookParams>;
87+
RESPONSE_HOOK?(result: ResponseHookParams): Promise<ApiResult>
6788
TOKEN?: string | Resolver<string>;
6889
USERNAME?: string | Resolver<string>;
6990
PASSWORD?: string | Resolver<string>;
@@ -268,19 +289,31 @@ function catchErrors(options: ApiRequestOptions, result: ApiResult): void {
268289
*/
269290
export async function request(options: ApiRequestOptions): Promise<ApiResult> {
270291
const url = getUrl(options);
271-
const response = await sendRequest(options, url);
292+
293+
// Pre-hook on request if a function is provided.
294+
const requestHookResult = OpenAPI.REQUEST_HOOK ?
295+
(await OpenAPI.REQUEST_HOOK({ url, options})) : { url, options };
296+
297+
298+
const response = await sendRequest(requestHookResult.options, requestHookResult.url);
272299
const responseBody = await getResponseBody(response);
273-
const responseHeader = getResponseHeader(response, options.responseHeader);
300+
const responseHeader = getResponseHeader(response, requestHookResult.options.responseHeader);
274301

275-
const result: ApiResult = {
302+
303+
let result: ApiResult = {
276304
url,
277305
ok: response.ok,
278306
status: response.status,
279307
statusText: response.statusText,
280-
body: responseHeader || responseBody,
308+
body: responseHeader || responseBody
281309
};
282310

311+
// Post-request Hook if provided
312+
result = OpenAPI.RESPONSE_HOOK ? await OpenAPI.RESPONSE_HOOK({url, result, response}) : result;
313+
283314
catchErrors(options, result);
315+
316+
284317
return result;
285318
}
286319

@@ -2300,13 +2333,34 @@ exports[`v3 should generate: ./test/generated/v3/core/OpenAPI.ts 1`] = `
23002333
"/* istanbul ignore file */
23012334
/* tslint:disable */
23022335
/* eslint-disable */
2336+
2337+
type ResponseImplementation = Response;
2338+
2339+
2340+
23032341
type Resolver<T> = () => Promise<T>;
23042342
type Headers = Record<string, string>;
23052343

2344+
import { ApiResult } from './ApiResult';
2345+
import { ApiRequestOptions } from './ApiRequestOptions';
2346+
2347+
export interface RequestHookParams {
2348+
url: string;
2349+
options: ApiRequestOptions;
2350+
}
2351+
2352+
export interface ResponseHookParams {
2353+
url: string;
2354+
result: ApiResult;
2355+
response?: ResponseImplementation;
2356+
}
2357+
23062358
type Config = {
23072359
BASE: string;
23082360
VERSION: string;
23092361
WITH_CREDENTIALS: boolean;
2362+
REQUEST_HOOK?(params: RequestHookParams): Promise<RequestHookParams>;
2363+
RESPONSE_HOOK?(result: ResponseHookParams): Promise<ApiResult>
23102364
TOKEN?: string | Resolver<string>;
23112365
USERNAME?: string | Resolver<string>;
23122366
PASSWORD?: string | Resolver<string>;
@@ -2511,19 +2565,31 @@ function catchErrors(options: ApiRequestOptions, result: ApiResult): void {
25112565
*/
25122566
export async function request(options: ApiRequestOptions): Promise<ApiResult> {
25132567
const url = getUrl(options);
2514-
const response = await sendRequest(options, url);
2568+
2569+
// Pre-hook on request if a function is provided.
2570+
const requestHookResult = OpenAPI.REQUEST_HOOK ?
2571+
(await OpenAPI.REQUEST_HOOK({ url, options})) : { url, options };
2572+
2573+
2574+
const response = await sendRequest(requestHookResult.options, requestHookResult.url);
25152575
const responseBody = await getResponseBody(response);
2516-
const responseHeader = getResponseHeader(response, options.responseHeader);
2576+
const responseHeader = getResponseHeader(response, requestHookResult.options.responseHeader);
25172577

2518-
const result: ApiResult = {
2578+
2579+
let result: ApiResult = {
25192580
url,
25202581
ok: response.ok,
25212582
status: response.status,
25222583
statusText: response.statusText,
2523-
body: responseHeader || responseBody,
2584+
body: responseHeader || responseBody
25242585
};
25252586

2587+
// Post-request Hook if provided
2588+
result = OpenAPI.RESPONSE_HOOK ? await OpenAPI.RESPONSE_HOOK({url, result, response}) : result;
2589+
25262590
catchErrors(options, result);
2591+
2592+
25272593
return result;
25282594
}
25292595

0 commit comments

Comments
 (0)