From 9680e9c7444c29ce70fd139b85761490365c0035 Mon Sep 17 00:00:00 2001 From: Sjoerd Mulder Date: Tue, 21 Dec 2021 14:24:00 +0100 Subject: [PATCH] Allow FormData as body argument --- src/templates/core/fetch/getHeaders.hbs | 2 +- src/templates/core/fetch/getRequestBody.hbs | 2 +- src/templates/core/fetch/request.hbs | 3 +++ src/templates/core/functions/isFormData.hbs | 3 +++ src/templates/core/node/getHeaders.hbs | 2 +- src/templates/core/node/getRequestBody.hbs | 2 +- src/templates/core/xhr/getHeaders.hbs | 2 +- src/templates/core/xhr/getRequestBody.hbs | 2 +- src/utils/registerHandlebarTemplates.ts | 2 ++ test/__snapshots__/index.spec.js.snap | 16 ++++++++++++---- 10 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 src/templates/core/functions/isFormData.hbs diff --git a/src/templates/core/fetch/getHeaders.hbs b/src/templates/core/fetch/getHeaders.hbs index 71efdd96..261cc9b8 100644 --- a/src/templates/core/fetch/getHeaders.hbs +++ b/src/templates/core/fetch/getHeaders.hbs @@ -33,7 +33,7 @@ async function getHeaders(options: ApiRequestOptions): Promise { headers.append('Content-Type', options.body.type || 'application/octet-stream'); } else if (isString(options.body)) { headers.append('Content-Type', 'text/plain'); - } else { + } else if (!isFormData(options.body)) { headers.append('Content-Type', 'application/json'); } } diff --git a/src/templates/core/fetch/getRequestBody.hbs b/src/templates/core/fetch/getRequestBody.hbs index 7ce4045c..5167ec72 100644 --- a/src/templates/core/fetch/getRequestBody.hbs +++ b/src/templates/core/fetch/getRequestBody.hbs @@ -2,7 +2,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined { if (options.body) { if (options.mediaType?.includes('/json')) { return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body)) { + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { return options.body; } else { return JSON.stringify(options.body); diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index b37002be..ecb988de 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -19,6 +19,9 @@ import { OpenAPI } from './OpenAPI'; {{>functions/isBlob}} +{{>functions/isFormData}} + + {{>functions/base64}} diff --git a/src/templates/core/functions/isFormData.hbs b/src/templates/core/functions/isFormData.hbs new file mode 100644 index 00000000..6e26ecfc --- /dev/null +++ b/src/templates/core/functions/isFormData.hbs @@ -0,0 +1,3 @@ +function isFormData(value: any): value is FormData { + return value instanceof FormData; +} \ No newline at end of file diff --git a/src/templates/core/node/getHeaders.hbs b/src/templates/core/node/getHeaders.hbs index 53ecfc74..c8dcc9ff 100644 --- a/src/templates/core/node/getHeaders.hbs +++ b/src/templates/core/node/getHeaders.hbs @@ -33,7 +33,7 @@ async function getHeaders(options: ApiRequestOptions): Promise { headers.append('Content-Type', 'application/octet-stream'); } else if (isString(options.body)) { headers.append('Content-Type', 'text/plain'); - } else { + } else if (!isFormData(options.body)) { headers.append('Content-Type', 'application/json'); } } diff --git a/src/templates/core/node/getRequestBody.hbs b/src/templates/core/node/getRequestBody.hbs index 79ba7a8e..3cf835ba 100644 --- a/src/templates/core/node/getRequestBody.hbs +++ b/src/templates/core/node/getRequestBody.hbs @@ -2,7 +2,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined { if (options.body) { if (options.mediaType?.includes('/json')) { return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body)) { + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { return options.body as any; } else { return JSON.stringify(options.body); diff --git a/src/templates/core/xhr/getHeaders.hbs b/src/templates/core/xhr/getHeaders.hbs index bc85b084..bdb7db74 100644 --- a/src/templates/core/xhr/getHeaders.hbs +++ b/src/templates/core/xhr/getHeaders.hbs @@ -33,7 +33,7 @@ async function getHeaders(options: ApiRequestOptions): Promise { headers.append('Content-Type', options.body.type || 'application/octet-stream'); } else if (isString(options.body)) { headers.append('Content-Type', 'text/plain'); - } else { + } else if (!isFormData(options.body)) { headers.append('Content-Type', 'application/json'); } } diff --git a/src/templates/core/xhr/getRequestBody.hbs b/src/templates/core/xhr/getRequestBody.hbs index bd9d689e..c94aca18 100644 --- a/src/templates/core/xhr/getRequestBody.hbs +++ b/src/templates/core/xhr/getRequestBody.hbs @@ -2,7 +2,7 @@ function getRequestBody(options: ApiRequestOptions): any { if (options.body) { if (options.mediaType?.includes('/json')) { return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body)) { + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { return options.body; } else { return JSON.stringify(options.body); diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index fe5a6b1a..94601601 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -24,6 +24,7 @@ import functionGetQueryString from '../templates/core/functions/getQueryString.h import functionGetUrl from '../templates/core/functions/getUrl.hbs'; import functionIsBlob from '../templates/core/functions/isBlob.hbs'; import functionIsDefined from '../templates/core/functions/isDefined.hbs'; +import functionIsFormData from '../templates/core/functions/isFormData.hbs'; import functionIsString from '../templates/core/functions/isString.hbs'; import functionIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs'; import functionIsSuccess from '../templates/core/functions/isSuccess.hbs'; @@ -157,6 +158,7 @@ export function registerHandlebarTemplates(root: { Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl)); Handlebars.registerPartial('functions/isBlob', Handlebars.template(functionIsBlob)); Handlebars.registerPartial('functions/isDefined', Handlebars.template(functionIsDefined)); + Handlebars.registerPartial('functions/isFormData', Handlebars.template(functionIsFormData)); Handlebars.registerPartial('functions/isString', Handlebars.template(functionIsString)); Handlebars.registerPartial('functions/isStringWithValue', Handlebars.template(functionIsStringWithValue)); Handlebars.registerPartial('functions/isSuccess', Handlebars.template(functionIsSuccess)); diff --git a/test/__snapshots__/index.spec.js.snap b/test/__snapshots__/index.spec.js.snap index 8d3251f8..092a3147 100644 --- a/test/__snapshots__/index.spec.js.snap +++ b/test/__snapshots__/index.spec.js.snap @@ -233,6 +233,10 @@ function isBlob(value: any): value is Blob { return value instanceof Blob; } +function isFormData(value: any): value is FormData { + return value instanceof FormData; +} + function base64(str: string): string { try { return btoa(str); @@ -347,7 +351,7 @@ async function getHeaders(options: ApiRequestOptions): Promise { headers.append('Content-Type', options.body.type || 'application/octet-stream'); } else if (isString(options.body)) { headers.append('Content-Type', 'text/plain'); - } else { + } else if (!isFormData(options.body)) { headers.append('Content-Type', 'application/json'); } } @@ -359,7 +363,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined { if (options.body) { if (options.mediaType?.includes('/json')) { return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body)) { + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { return options.body; } else { return JSON.stringify(options.body); @@ -2896,6 +2900,10 @@ function isBlob(value: any): value is Blob { return value instanceof Blob; } +function isFormData(value: any): value is FormData { + return value instanceof FormData; +} + function base64(str: string): string { try { return btoa(str); @@ -3010,7 +3018,7 @@ async function getHeaders(options: ApiRequestOptions): Promise { headers.append('Content-Type', options.body.type || 'application/octet-stream'); } else if (isString(options.body)) { headers.append('Content-Type', 'text/plain'); - } else { + } else if (!isFormData(options.body)) { headers.append('Content-Type', 'application/json'); } } @@ -3022,7 +3030,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined { if (options.body) { if (options.mediaType?.includes('/json')) { return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body)) { + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { return options.body; } else { return JSON.stringify(options.body);