Skip to content

Commit 2182aba

Browse files
authored
Merge pull request #40 from nicolas-chaulet/fix/generics-flag
fix(types): add explicit flag for generics
2 parents cbb633e + 9a5f2aa commit 2182aba

27 files changed

+140
-74
lines changed

bin/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const params = program
2323
.option('--exportSchemas <value>', 'Write schemas to disk', false)
2424
.option('--indent <value>', 'Indentation options [4, 2, tab]', '4')
2525
.option('--postfixServices <value>', 'Service name postfix', 'Service')
26+
.option('--serviceResponse [value]', 'Define shape of returned value from service calls')
2627
.option('--useDateType <value>', 'Output Date instead of string for the format "date-time" in the models', false)
2728
.option('--useOperationId <value>', 'Use operation id to generate operation names', true)
2829
.option('--postfixModels <value>', 'Model name postfix')
@@ -55,6 +56,7 @@ if (OpenAPI) {
5556
postfixModels: params.postfixModels,
5657
postfixServices: params.postfixServices,
5758
request: params.request,
59+
serviceResponse: params.serviceResponse,
5860
useDateType: JSON.parse(params.useDateType) === true,
5961
useOperationId: JSON.parse(params.useOperationId) === true,
6062
useOptions: JSON.parse(params.useOptions) === true,

src/client/interfaces/Options.d.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { HttpClient } from '../../HttpClient';
2-
import { Indent } from '../interfaces/Indent';
2+
import { Indent } from '../../Indent';
3+
4+
export type ServiceResponse = 'body' | 'generics' | 'response';
35

46
export interface Options {
57
autoformat?: boolean;
@@ -15,6 +17,7 @@ export interface Options {
1517
postfixModels?: string;
1618
postfixServices?: string;
1719
request?: string;
20+
serviceResponse?: ServiceResponse;
1821
useDateType?: boolean;
1922
useOperationId?: boolean;
2023
useOptions?: boolean;

src/index.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,24 @@ export { Indent } from './Indent';
1717
* Generate the OpenAPI client. This method will read the OpenAPI specification and based on the
1818
* given language it will generate the client, including the typed models, validation schemas,
1919
* service layer, etc.
20-
* @param input The relative location of the OpenAPI spec
21-
* @param output The relative location of the output directory
22-
* @param httpClient The selected httpClient (fetch, xhr, node or axios)
23-
* @param clientName Custom client class name
24-
* @param useOptions Use options or arguments functions
25-
* @param useUnionTypes Use union types instead of enums
2620
* @param autoformat Process generated files with autoformatter
21+
* @param clientName Custom client class name
2722
* @param exportCore Generate core client classes
28-
* @param exportServices Generate services
2923
* @param exportModels Generate models
3024
* @param exportSchemas Generate schemas
31-
* @param useDateType Output Date instead of string for the format "date-time" in the models
32-
* @param useOperationId should the operationId be used when generating operation names
25+
* @param exportServices Generate services
26+
* @param httpClient The selected httpClient (fetch, xhr, node or axios)
3327
* @param indent Indentation options (4, 2 or tab)
34-
* @param postfixServices Service name postfix
28+
* @param input The relative location of the OpenAPI spec
29+
* @param output The relative location of the output directory
3530
* @param postfixModels Model name postfix
31+
* @param postfixServices Service name postfix
3632
* @param request Path to custom request file
33+
* @param serviceResponse Define shape of returned value from service calls
34+
* @param useDateType Output Date instead of string for the format "date-time" in the models
35+
* @param useOperationId should the operationId be used when generating operation names
36+
* @param useOptions Use options or arguments functions
37+
* @param useUnionTypes Use union types instead of enums
3738
* @param write Write the files to disk (true or false)
3839
*/
3940
export const generate = async (options: Options): Promise<void> => {
@@ -46,6 +47,7 @@ export const generate = async (options: Options): Promise<void> => {
4647
indent = Indent.SPACE_4,
4748
postfixModels = '',
4849
postfixServices = 'Service',
50+
serviceResponse = 'body',
4951
useDateType = false,
5052
useOptions = false,
5153
useUnionTypes = false,
@@ -55,6 +57,7 @@ export const generate = async (options: Options): Promise<void> => {
5557
const openApiVersion = getOpenApiVersion(openApi);
5658
const templates = registerHandlebarTemplates({
5759
httpClient,
60+
serviceResponse,
5861
useUnionTypes,
5962
useOptions,
6063
});
@@ -90,6 +93,7 @@ export const generate = async (options: Options): Promise<void> => {
9093
indent,
9194
postfixModels,
9295
postfixServices,
96+
serviceResponse,
9397
useDateType,
9498
useOptions,
9599
useUnionTypes,

src/templates/core/axios/request.hbs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import type { OpenAPIConfig } from './OpenAPI';
6464
* @param config The OpenAPI configuration object
6565
* @param options The request options from the service
6666
* @param axiosClient The axios client instance to use
67-
* @returns CancelablePromise<T>
67+
* @returns CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}>
6868
* @throws ApiError
6969
*/
7070
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, axiosClient: AxiosInstance = axios): CancelablePromise<T> => {
@@ -90,7 +90,11 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions, ax
9090

9191
catchErrorCodes(options, result);
9292

93+
{{#equals @root.serviceResponse 'generics'}}
9394
resolve(config.RESULT === 'raw' ? result : result.body);
95+
{{else}}
96+
resolve({{#equals @root.serviceResponse 'body'}}result.body{{else}}result{{/equals}});
97+
{{/equals}}
9498
}
9599
} catch (error) {
96100
reject(error);

src/templates/core/fetch/request.hbs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ import type { OpenAPIConfig } from './OpenAPI';
5656
* Request method
5757
* @param config The OpenAPI configuration object
5858
* @param options The request options from the service
59-
* @returns CancelablePromise<T>
59+
* @returns CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}>
6060
* @throws ApiError
6161
*/
62-
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
62+
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}> => {
6363
return new CancelablePromise(async (resolve, reject, onCancel) => {
6464
try {
6565
const url = getUrl(config, options);
@@ -82,7 +82,11 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): C
8282

8383
catchErrorCodes(options, result);
8484

85+
{{#equals @root.serviceResponse 'generics'}}
8586
resolve(config.RESULT === 'raw' ? result : result.body);
87+
{{else}}
88+
resolve({{#equals @root.serviceResponse 'body'}}result.body{{else}}result{{/equals}});
89+
{{/equals}}
8690
}
8791
} catch (error) {
8892
reject(error);

src/templates/core/node/request.hbs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ import type { OpenAPIConfig } from './OpenAPI';
6161
* Request method
6262
* @param config The OpenAPI configuration object
6363
* @param options The request options from the service
64-
* @returns CancelablePromise<T>
64+
* @returns CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}>
6565
* @throws ApiError
6666
*/
67-
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
67+
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}> => {
6868
return new CancelablePromise(async (resolve, reject, onCancel) => {
6969
try {
7070
const url = getUrl(config, options);
@@ -87,7 +87,11 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): C
8787

8888
catchErrorCodes(options, result);
8989

90+
{{#equals @root.serviceResponse 'generics'}}
9091
resolve(config.RESULT === 'raw' ? result : result.body);
92+
{{else}}
93+
resolve({{#equals @root.serviceResponse 'body'}}result.body{{else}}result{{/equals}});
94+
{{/equals}}
9195
}
9296
} catch (error) {
9397
reject(error);

src/templates/core/request.hbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals~}}
2-
{{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals~}}
3-
{{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals~}}
41
{{~#equals @root.httpClient 'angular'}}{{>angular/request}}{{/equals~}}
2+
{{~#equals @root.httpClient 'axios'}}{{>axios/request}}{{/equals~}}
3+
{{~#equals @root.httpClient 'fetch'}}{{>fetch/request}}{{/equals~}}
54
{{~#equals @root.httpClient 'node'}}{{>node/request}}{{/equals~}}
5+
{{~#equals @root.httpClient 'xhr'}}{{>xhr/request}}{{/equals~}}

src/templates/core/xhr/request.hbs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ import type { OpenAPIConfig } from './OpenAPI';
5959
* Request method
6060
* @param config The OpenAPI configuration object
6161
* @param options The request options from the service
62-
* @returns CancelablePromise<T>
62+
* @returns CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}>
6363
* @throws ApiError
6464
*/
65-
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> => {
65+
export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise<{{#equals @root.serviceResponse 'response'}}ApiResult<T>{{else}}T{{/equals}}> => {
6666
return new CancelablePromise(async (resolve, reject, onCancel) => {
6767
try {
6868
const url = getUrl(config, options);
@@ -85,7 +85,11 @@ export const request = <T>(config: OpenAPIConfig, options: ApiRequestOptions): C
8585

8686
catchErrorCodes(options, result);
8787

88+
{{#equals @root.serviceResponse 'generics'}}
8889
resolve(config.RESULT === 'raw' ? result : result.body);
90+
{{else}}
91+
resolve({{#equals @root.serviceResponse 'body'}}result.body{{else}}result{{/equals}});
92+
{{/equals}}
8993
}
9094
} catch (error) {
9195
reject(error);

src/templates/exportService.hbs

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

1919
{{/if}}
20+
{{#equals @root.serviceResponse 'response'}}
21+
import type { ApiResult } from '../core/ApiResult';
22+
{{/equals}}
2023
{{#notEquals @root.httpClient 'angular'}}
2124
import type { CancelablePromise } from '../core/CancelablePromise';
2225
{{/notEquals}}
@@ -28,19 +31,24 @@ import type { BaseHttpRequest } from '../core/BaseHttpRequest';
2831
{{/equals}}
2932
{{else}}
3033
{{#if @root.useOptions}}
34+
{{#equals @root.serviceResponse 'generics'}}
3135
import { mergeOpenApiConfig, OpenAPI } from '../core/OpenAPI';
3236
import { request as __request } from '../core/request';
3337
import type { TApiResponse, TConfig, TResult } from '../core/types';
3438
{{else}}
3539
import { OpenAPI } from '../core/OpenAPI';
3640
import { request as __request } from '../core/request';
41+
{{/equals}}
42+
{{else}}
43+
import { OpenAPI } from '../core/OpenAPI';
44+
import { request as __request } from '../core/request';
3745
{{/if}}
3846
{{/if}}
3947

4048
{{#if @root.useOptions}}
4149
{{#each operations}}
4250
{{#if parameters}}
43-
type {{{nameOperationDataType name}}} = {
51+
export type {{{nameOperationDataType name}}} = {
4452
{{#each parameters}}
4553
{{{name}}}{{>isRequired}}: {{>type}},
4654
{{/each}}

src/templates/partials/destructureData.hbs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,23 @@ const {
88
} = data;
99
{{/if}}
1010
{{/if}}
11-
{{~else~}}
11+
{{else~}}
1212
{{#if @root.useOptions~}}
13+
{{~#notEquals @root.serviceResponse 'generics'~}}
14+
{{~#if parameters~}}
15+
const {
16+
{{#each parameters}}
17+
{{{name}}}{{#if default}} = {{{default}}}{{/if}},
18+
{{/each}}
19+
} = data;
20+
{{/if}}
21+
{{else}}
1322
const {
1423
{{#each parameters}}
1524
{{{name}}}{{#if default}} = {{{default}}}{{/if}},
1625
{{/each}}
1726
...overrides
1827
} = data;
28+
{{/notEquals}}
29+
{{/if}}
1930
{{/if}}
20-
{{~/if~}}

0 commit comments

Comments
 (0)