Skip to content

Commit defa8bd

Browse files
paulgrotzkegergan
authored andcommitted
Change request response to including body & header for all clients, fix tests
1 parent d2cb910 commit defa8bd

Some content is hidden

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

44 files changed

+4779
-3642
lines changed

package-lock.json

Lines changed: 4059 additions & 2990 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@essquare/typescript-openapi-codegen",
3-
"version": "0.3.2",
3+
"version": "1.0.0",
44
"description": "Library that generates Typescript clients based on the OpenAPI specification.",
55
"author": "Ferdi Koomen",
66
"homepage": "https://github.com/essquare/typescript-openapi-codegen",
@@ -43,9 +43,9 @@
4343
],
4444
"scripts": {
4545
"clean": "rimraf ./dist ./test/generated ./test/e2e/generated ./samples/generated ./coverage ./node_modules/.cache",
46-
"build": "rollup --config --environment NODE_ENV:development",
47-
"build:watch": "rollup --config --environment NODE_ENV:development --watch",
48-
"release": "rollup --config --environment NODE_ENV:production",
46+
"build": "rollup --config --bundleConfigAsCjs --environment NODE_ENV:development",
47+
"build:watch": "rollup --config --bundleConfigAsCjs --environment NODE_ENV:development --watch",
48+
"release": "rollup --config --bundleConfigAsCjs --environment NODE_ENV:production",
4949
"validate": "tsc --project tsconfig.json --noEmit",
5050
"run": "node ./test/index.js",
5151
"test": "jest --selectProjects UNIT",
@@ -61,7 +61,7 @@
6161
"dependencies": {
6262
"camelcase": "^6.3.0",
6363
"commander": "^9.3.0",
64-
"fs-extra": "^10.1.0",
64+
"fs-extra": "^11.1.1",
6565
"handlebars": "^4.7.7",
6666
"json-schema-ref-parser": "^9.0.9"
6767
},
@@ -77,47 +77,47 @@
7777
"@angular/platform-browser": "14.0.1",
7878
"@angular/platform-browser-dynamic": "14.0.1",
7979
"@angular/router": "14.0.1",
80-
"@babel/cli": "7.18.10",
81-
"@babel/core": "7.18.13",
82-
"@babel/preset-env": "7.19.0",
83-
"@babel/preset-typescript": "7.18.6",
84-
"@rollup/plugin-commonjs": "22.0.2",
85-
"@rollup/plugin-node-resolve": "13.3.0",
86-
"@rollup/plugin-typescript": "8.5.0",
80+
"@babel/cli": "7.21.0",
81+
"@babel/core": "7.21.4",
82+
"@babel/preset-env": "7.21.4",
83+
"@babel/preset-typescript": "7.21.4",
84+
"@rollup/plugin-commonjs": "24.1.0",
85+
"@rollup/plugin-node-resolve": "15.0.2",
86+
"@rollup/plugin-terser": "0.4.1",
87+
"@rollup/plugin-typescript": "11.1.0",
8788
"@types/cross-spawn": "6.0.2",
88-
"@types/express": "4.17.13",
89-
"@types/fs-extra": "^9.0.13",
90-
"@types/glob": "7.2.0",
91-
"@types/jest": "28.1.8",
92-
"@types/node": "18.7.17",
93-
"@types/node-fetch": "2.6.1",
89+
"@types/express": "4.17.17",
90+
"@types/fs-extra": "^11.0.1",
91+
"@types/glob": "8.1.0",
92+
"@types/jest": "29.5.1",
93+
"@types/node": "18.16.1",
94+
"@types/node-fetch": "2.6.3",
9495
"@types/qs": "6.9.7",
95-
"@typescript-eslint/eslint-plugin": "5.36.2",
96-
"@typescript-eslint/parser": "5.37.0",
96+
"@typescript-eslint/eslint-plugin": "5.59.1",
97+
"@typescript-eslint/parser": "5.59.1",
9798
"abort-controller": "3.0.0",
98-
"axios": "^1.1.3",
99-
"bson": "^4.7.0",
99+
"axios": "^1.3.6",
100+
"bson": "^5.2.0",
100101
"codecov": "3.8.3",
101102
"cross-spawn": "7.0.3",
102-
"eslint": "8.23.1",
103-
"eslint-config-prettier": "8.5.0",
103+
"eslint": "8.39.0",
104+
"eslint-config-prettier": "8.8.0",
104105
"eslint-plugin-prettier": "4.2.1",
105-
"eslint-plugin-simple-import-sort": "7.0.0",
106-
"express": "4.18.1",
106+
"eslint-plugin-simple-import-sort": "10.0.0",
107+
"express": "4.18.2",
107108
"form-data": "4.0.0",
108-
"glob": "8.0.3",
109-
"jest": "28.1.3",
110-
"jest-cli": "28.1.3",
111-
"prettier": "2.7.1",
112-
"puppeteer": "15.5.0",
113-
"qs": "6.11.0",
114-
"rimraf": "3.0.2",
115-
"rollup": "2.79.0",
116-
"rollup-plugin-terser": "7.0.2",
109+
"glob": "10.2.2",
110+
"jest": "29.5.0",
111+
"jest-cli": "29.5.0",
112+
"prettier": "2.8.8",
113+
"puppeteer": "19.11.1",
114+
"qs": "6.11.1",
115+
"rimraf": "5.0.0",
116+
"rollup": "3.21.0",
117117
"rxjs": "7.5.6",
118118
"ts-node": "10.9.1",
119-
"tslib": "2.4.0",
120-
"typescript": "4.7.3",
119+
"tslib": "2.5.0",
120+
"typescript": "4.7.4",
121121
"zone.js": "0.11.8"
122122
},
123123
"resolutions": {

rollup.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import commonjs from '@rollup/plugin-commonjs';
22
import { nodeResolve } from '@rollup/plugin-node-resolve';
3+
import terser from '@rollup/plugin-terser';
34
import typescript from '@rollup/plugin-typescript';
45
import { readFileSync } from 'fs';
56
import { precompile } from 'handlebars';
67
import { dirname, extname, resolve } from 'path';
7-
import { terser } from 'rollup-plugin-terser';
88

99
/**
1010
* Custom plugin to parse handlebar imports and precompile

src/templates/core/ApiError.hbs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,23 @@
33
import type { ApiRequestOptions } from './ApiRequestOptions';
44
import type { ApiResult } from './ApiResult';
55

6-
export class ApiError extends Error {
6+
export class ApiError<T> extends Error {
77
public readonly url: string;
88
public readonly status: number;
99
public readonly statusText: string;
1010
public readonly body: any;
11+
public readonly headers: any;
1112
public readonly request: ApiRequestOptions;
1213

13-
constructor(request: ApiRequestOptions, response: ApiResult, message: string) {
14+
constructor(request: ApiRequestOptions, response: ApiResult<T>, message: string) {
1415
super(message);
1516

1617
this.name = 'ApiError';
1718
this.url = response.url;
1819
this.status = response.status;
1920
this.statusText = response.statusText;
2021
this.body = response.body;
22+
this.headers = response.headers;
2123
this.request = request;
2224
}
2325
}

src/templates/core/ApiResult.hbs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{{>header}}
22

3-
export type ApiResult = {
3+
export type ApiResult<T> = {
44
readonly url: string;
55
readonly ok: boolean;
66
readonly status: number;
77
readonly statusText: string;
8-
readonly body: any;
8+
readonly body: T;
9+
readonly headers?: any;
910
};

src/templates/core/BaseHttpRequest.hbs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import type { Observable } from 'rxjs';
66

77
import type { ApiRequestOptions } from './ApiRequestOptions';
88
import type { OpenAPIConfig } from './OpenAPI';
9+
import type { ApiResult } from './ApiResult';
910
{{else}}
1011
import type { ApiRequestOptions } from './ApiRequestOptions';
1112
import type { CancelablePromise } from './CancelablePromise';
1213
import type { OpenAPIConfig } from './OpenAPI';
14+
import type { ApiResult } from './ApiResult';
1315
{{/equals}}
1416

1517
export abstract class BaseHttpRequest {
@@ -24,8 +26,8 @@ export abstract class BaseHttpRequest {
2426
{{/equals}}
2527

2628
{{#equals @root.httpClient 'angular'}}
27-
public abstract request<T>(options: ApiRequestOptions): Observable<T>;
29+
public abstract request<T>(options: ApiRequestOptions): Observable<ApiResult<T>>;
2830
{{else}}
29-
public abstract request<T>(options: ApiRequestOptions): CancelablePromise<T>;
31+
public abstract request<T>(options: ApiRequestOptions): CancelablePromise<ApiResult<T>>;
3032
{{/equals}}
3133
}

src/templates/core/HttpRequest.hbs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import { BaseHttpRequest } from './BaseHttpRequest';
1010
import type { OpenAPIConfig } from './OpenAPI';
1111
import { OpenAPI } from './OpenAPI';
1212
import { request as __request } from './request';
13+
import type { ApiResult } from './ApiResult';
1314
{{else}}
1415
import type { ApiRequestOptions } from './ApiRequestOptions';
1516
import { BaseHttpRequest } from './BaseHttpRequest';
1617
import type { CancelablePromise } from './CancelablePromise';
1718
import type { OpenAPIConfig } from './OpenAPI';
1819
import { request as __request } from './request';
20+
import type { ApiResult } from './ApiResult';
1921
{{/equals}}
2022

2123
{{#equals @root.httpClient 'angular'}}
@@ -41,21 +43,21 @@ export class {{httpRequest}} extends BaseHttpRequest {
4143
/**
4244
* Request method
4345
* @param options The request options from the service
44-
* @returns Observable<T>
46+
* @returns Observable<ApiResult<T>>
4547
* @throws ApiError
4648
*/
47-
public override request<T>(options: ApiRequestOptions): Observable<T> {
49+
public override request<T>(options: ApiRequestOptions): Observable<ApiResult<T>> {
4850
return __request(this.config, this.http, options);
4951
}
5052
{{else}}
5153
/**
5254
* Request method
5355
* @param options The request options from the service
54-
* @returns CancelablePromise<T>
56+
* @returns CancelablePromise<ApiResult<T>>
5557
* @throws ApiError
5658
*/
57-
public override request<T>(options: ApiRequestOptions): CancelablePromise<T> {
58-
return __request(this.config, options);
59+
public override request<T>(options: ApiRequestOptions): CancelablePromise<ApiResult<T>> {
60+
return __request<T>(this.config, options);
5961
}
6062
{{/equals}}
6163
}
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
const getResponseBody = <T>(response: HttpResponse<T>): T | undefined => {
2-
if (response.status !== 204 && response.body !== null) {
3-
return response.body;
4-
}
5-
return undefined;
6-
};
1+
const getResponseBody = <T>(response: HttpResponse<T>): T => {
2+
return response.body as T;
3+
};
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
const getResponseHeader = <T>(response: HttpResponse<T>, responseHeader?: string): string | undefined => {
2-
if (responseHeader) {
3-
const value = response.headers.get(responseHeader);
4-
if (isString(value)) {
5-
return value;
6-
}
7-
}
8-
return undefined;
9-
};
1+
const getResponseHeader = <T>(response: HttpResponse<T>) => {
2+
const headerMap:Record<string, string> = {};
3+
response.headers.keys().forEach(key => {
4+
const headerValue = response.headers.get(key);
5+
if(headerValue){
6+
headerMap[key] = headerValue;
7+
}
8+
})
9+
return headerMap;
10+
};

src/templates/core/angular/request.hbs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ import type { OpenAPIConfig } from './OpenAPI';
7373
* @param config The OpenAPI configuration object
7474
* @param http The Angular HTTP client
7575
* @param options The request options from the service
76-
* @returns Observable<T>
76+
* @returns Observable<ApiResult<T>>
7777
* @throws ApiError
7878
*/
79-
export const request = <T>(config: OpenAPIConfig, http: HttpClient, options: ApiRequestOptions): Observable<T> => {
79+
export const request = <T>(config: OpenAPIConfig, http: HttpClient, options: ApiRequestOptions): Observable<ApiResult<T>> => {
8080
const url = getUrl(config, options);
8181
const formData = getFormData(options);
8282
const body = getRequestBody(options);
@@ -85,16 +85,17 @@ export const request = <T>(config: OpenAPIConfig, http: HttpClient, options: Api
8585
switchMap(headers => {
8686
return sendRequest<T>(config, options, http, url, formData, body, headers);
8787
}),
88-
map(response => {
88+
map((response: HttpResponse<T>) => {
8989
const responseBody = getResponseBody(response);
90-
const responseHeader = getResponseHeader(response, options.responseHeader);
90+
const responseHeader = getResponseHeader(response);
9191
return {
9292
url,
9393
ok: response.ok,
9494
status: response.status,
9595
statusText: response.statusText,
96-
body: responseHeader ?? responseBody,
97-
} as ApiResult;
96+
body: responseBody,
97+
headers: responseHeader,
98+
} as ApiResult<T>;
9899
}),
99100
catchError((error: HttpErrorResponse) => {
100101
if (!error.status) {
@@ -106,13 +107,13 @@ export const request = <T>(config: OpenAPIConfig, http: HttpClient, options: Api
106107
status: error.status,
107108
statusText: error.statusText,
108109
body: error.error ?? error.statusText,
109-
} as ApiResult);
110+
} as ApiResult<T>);
110111
}),
111-
map(result => {
112+
map((result: ApiResult<T>) => {
112113
catchErrorCodes(options, result);
113-
return result.body as T;
114+
return result;
114115
}),
115-
catchError((error: ApiError) => {
116+
catchError((error: ApiError<T>) => {
116117
return throwError(error);
117118
}),
118119
);

0 commit comments

Comments
 (0)