diff --git a/README.md b/README.md index b851329a8..b8c22d881 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ $ openapi --help --name Custom client class name --useOptions Use options instead of arguments --useUnionTypes Use union types instead of enums + --useNullForNoContent Use null for returning instead of undefined if a response returns 204 no content --exportCore Write core files to disk (default: true) --exportServices Write services to disk (default: true) --exportModels Write models to disk (default: true) diff --git a/bin/index.js b/bin/index.js index 32f2fecbc..14c12012c 100755 --- a/bin/index.js +++ b/bin/index.js @@ -16,6 +16,7 @@ const params = program .option('--name ', 'Custom client class name') .option('--useOptions', 'Use options instead of arguments') .option('--useUnionTypes', 'Use union types instead of enums') + .option('--useNullForNoContent', 'Use null for returning instead of undefined if a response returns 204 no content') .option('--exportCore ', 'Write core files to disk', true) .option('--exportServices ', 'Write services to disk', true) .option('--exportModels ', 'Write models to disk', true) @@ -37,6 +38,7 @@ if (OpenAPI) { clientName: params.name, useOptions: params.useOptions, useUnionTypes: params.useUnionTypes, + useNullForNoContent: params.useNullForNoContent, exportCore: JSON.parse(params.exportCore) === true, exportServices: JSON.parse(params.exportServices) === true, exportModels: JSON.parse(params.exportModels) === true, diff --git a/bin/index.spec.js b/bin/index.spec.js index 6030c07c8..5972176d3 100755 --- a/bin/index.spec.js +++ b/bin/index.spec.js @@ -24,6 +24,7 @@ describe('bin', () => { 'fetch', '--useOptions', '--useUnionTypes', + '--useNullForNoContent', '--exportCore', 'true', '--exportServices', diff --git a/docs/basic-usage.md b/docs/basic-usage.md index d02da0888..fa54fd85f 100644 --- a/docs/basic-usage.md +++ b/docs/basic-usage.md @@ -13,6 +13,7 @@ $ openapi --help --name Custom client class name --useOptions Use options instead of arguments --useUnionTypes Use union types instead of enums + --useNullForNoContent Use null for returning instead of undefined if a response returns 204 no content --exportCore Write core files to disk (default: true) --exportServices Write services to disk (default: true) --exportModels Write models to disk (default: true) diff --git a/src/index.ts b/src/index.ts index e63919085..9d73b246a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,6 +19,7 @@ export type Options = { clientName?: string; useOptions?: boolean; useUnionTypes?: boolean; + useNullForNoContent?: boolean; exportCore?: boolean; exportServices?: boolean; exportModels?: boolean; @@ -40,6 +41,7 @@ export type Options = { * @param clientName Custom client class name * @param useOptions Use options or arguments functions * @param useUnionTypes Use union types instead of enums + * @param useNullForNoContent Use null for no content responses * @param exportCore Generate core client classes * @param exportServices Generate services * @param exportModels Generate models @@ -57,6 +59,7 @@ export const generate = async ({ clientName, useOptions = false, useUnionTypes = false, + useNullForNoContent = false, exportCore = true, exportServices = true, exportModels = true, @@ -72,6 +75,7 @@ export const generate = async ({ const templates = registerHandlebarTemplates({ httpClient, useUnionTypes, + useNullForNoContent, useOptions, }); @@ -87,6 +91,7 @@ export const generate = async ({ httpClient, useOptions, useUnionTypes, + useNullForNoContent, exportCore, exportServices, exportModels, @@ -111,6 +116,7 @@ export const generate = async ({ httpClient, useOptions, useUnionTypes, + useNullForNoContent, exportCore, exportServices, exportModels, diff --git a/src/templates/core/angular/getResponseBody.hbs b/src/templates/core/angular/getResponseBody.hbs index 73653784c..49c896379 100644 --- a/src/templates/core/angular/getResponseBody.hbs +++ b/src/templates/core/angular/getResponseBody.hbs @@ -1,6 +1,11 @@ -export const getResponseBody = (response: HttpResponse): T | undefined => { +export const getResponseBody = (response: HttpResponse): T | {{#if @root.useNullForNoContent}}null{{else}}undefined{{/if}} => { + if (response.status !== 204 && response.body !== null) { return response.body; } + {{#if @root.useNullForNoContent}} + return null; + {{else}} return undefined; + {{/if}} }; diff --git a/src/templates/core/axios/getResponseBody.hbs b/src/templates/core/axios/getResponseBody.hbs index c73057c3c..db55e54a2 100644 --- a/src/templates/core/axios/getResponseBody.hbs +++ b/src/templates/core/axios/getResponseBody.hbs @@ -2,5 +2,9 @@ export const getResponseBody = (response: AxiosResponse): any => { if (response.status !== 204) { return response.data; } + {{#if @root.useNullForNoContent}} + return null; + {{else}} return undefined; + {{/if}} }; diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 1011380ee..29cd5d83e 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -15,5 +15,9 @@ export const getResponseBody = async (response: Response): Promise => { console.error(error); } } + {{#if @root.useNullForNoContent}} + return null; + {{else}} return undefined; + {{/if}} }; diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 1011380ee..29cd5d83e 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -15,5 +15,9 @@ export const getResponseBody = async (response: Response): Promise => { console.error(error); } } + {{#if @root.useNullForNoContent}} + return null; + {{else}} return undefined; + {{/if}} }; diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index ccf83b1ff..f5b13c827 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -15,5 +15,9 @@ export const getResponseBody = (xhr: XMLHttpRequest): any => { console.error(error); } } + {{#if @root.useNullForNoContent}} + return null; + {{else}} return undefined; + {{/if}} }; diff --git a/src/utils/registerHandlebarTemplates.spec.ts b/src/utils/registerHandlebarTemplates.spec.ts index 5e1302384..be420ebe9 100644 --- a/src/utils/registerHandlebarTemplates.spec.ts +++ b/src/utils/registerHandlebarTemplates.spec.ts @@ -7,6 +7,7 @@ describe('registerHandlebarTemplates', () => { httpClient: HttpClient.FETCH, useOptions: false, useUnionTypes: false, + useNullForNoContent: false, }); expect(templates.index).toBeDefined(); expect(templates.exports.model).toBeDefined(); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..745e993bb 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -113,6 +113,7 @@ export const registerHandlebarTemplates = (root: { httpClient: HttpClient; useOptions: boolean; useUnionTypes: boolean; + useNullForNoContent: boolean; }): Templates => { registerHandlebarHelpers(root); diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 3c06a95a5..2bfc3e284 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -43,6 +43,7 @@ describe('writeClient', () => { HttpClient.FETCH, false, false, + false, true, true, true, diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index cea2f3d88..02547375a 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -40,6 +40,7 @@ export const writeClient = async ( httpClient: HttpClient, useOptions: boolean, useUnionTypes: boolean, + useNullForNoContent: boolean, exportCore: boolean, exportServices: boolean, exportModels: boolean, @@ -63,7 +64,7 @@ export const writeClient = async ( if (exportCore) { await rmdir(outputPathCore); await mkdir(outputPathCore); - await writeClientCore(client, templates, outputPathCore, httpClient, indent, clientName, request); + await writeClientCore(client, templates, outputPathCore, httpClient, indent, clientName, request, useNullForNoContent); } if (exportServices) { diff --git a/src/utils/writeClientCore.ts b/src/utils/writeClientCore.ts index 6d35849d2..d0a84420c 100644 --- a/src/utils/writeClientCore.ts +++ b/src/utils/writeClientCore.ts @@ -26,7 +26,8 @@ export const writeClientCore = async ( httpClient: HttpClient, indent: Indent, clientName?: string, - request?: string + request?: string, + useNullForNoContent?: boolean, ): Promise => { const httpRequest = getHttpRequestName(httpClient); const context = { @@ -35,6 +36,7 @@ export const writeClientCore = async ( httpRequest, server: client.server, version: client.version, + useNullForNoContent, }; await writeFile(resolve(outputPath, 'OpenAPI.ts'), i(templates.core.settings(context), indent)); diff --git a/test/index.js b/test/index.js index 6d276c412..67140aaab 100644 --- a/test/index.js +++ b/test/index.js @@ -10,6 +10,7 @@ const generate = async (input, output) => { httpClient: OpenAPI.HttpClient.FETCH, useOptions: true, useUnionTypes: false, + useNullForNoContent: false, exportCore: true, exportSchemas: true, exportModels: true, diff --git a/test/index.spec.ts b/test/index.spec.ts index 78a0197d5..961f04b32 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -11,6 +11,7 @@ describe('v2', () => { httpClient: HttpClient.FETCH, useOptions: false, useUnionTypes: false, + useNullForNoContent: false, exportCore: true, exportSchemas: true, exportModels: true, @@ -32,6 +33,7 @@ describe('v3', () => { httpClient: HttpClient.FETCH, useOptions: false, useUnionTypes: false, + useNullForNoContent: false, exportCore: true, exportSchemas: true, exportModels: true, diff --git a/types/index.d.ts b/types/index.d.ts index e2b5247e0..e7fb57674 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -19,6 +19,7 @@ export type Options = { clientName?: string; useOptions?: boolean; useUnionTypes?: boolean; + useNullForNoContent?: boolean; exportCore?: boolean; exportServices?: boolean; exportModels?: boolean;