Skip to content

Commit d11d7c1

Browse files
authored
Merge pull request ferdikoomen#740 from sjoerdmulder/feature/formdata-as-body
Allow FormData as body argument
2 parents 800236d + 9680e9c commit d11d7c1

File tree

10 files changed

+26
-10
lines changed

10 files changed

+26
-10
lines changed

src/templates/core/fetch/getHeaders.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
3333
headers.append('Content-Type', options.body.type || 'application/octet-stream');
3434
} else if (isString(options.body)) {
3535
headers.append('Content-Type', 'text/plain');
36-
} else {
36+
} else if (!isFormData(options.body)) {
3737
headers.append('Content-Type', 'application/json');
3838
}
3939
}

src/templates/core/fetch/getRequestBody.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined {
22
if (options.body) {
33
if (options.mediaType?.includes('/json')) {
44
return JSON.stringify(options.body)
5-
} else if (isString(options.body) || isBlob(options.body)) {
5+
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
66
return options.body;
77
} else {
88
return JSON.stringify(options.body);

src/templates/core/fetch/request.hbs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import { OpenAPI } from './OpenAPI';
1919
{{>functions/isBlob}}
2020

2121

22+
{{>functions/isFormData}}
23+
24+
2225
{{>functions/base64}}
2326

2427

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function isFormData(value: any): value is FormData {
2+
return value instanceof FormData;
3+
}

src/templates/core/node/getHeaders.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
3333
headers.append('Content-Type', 'application/octet-stream');
3434
} else if (isString(options.body)) {
3535
headers.append('Content-Type', 'text/plain');
36-
} else {
36+
} else if (!isFormData(options.body)) {
3737
headers.append('Content-Type', 'application/json');
3838
}
3939
}

src/templates/core/node/getRequestBody.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined {
22
if (options.body) {
33
if (options.mediaType?.includes('/json')) {
44
return JSON.stringify(options.body)
5-
} else if (isString(options.body) || isBlob(options.body)) {
5+
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
66
return options.body as any;
77
} else {
88
return JSON.stringify(options.body);

src/templates/core/xhr/getHeaders.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
3333
headers.append('Content-Type', options.body.type || 'application/octet-stream');
3434
} else if (isString(options.body)) {
3535
headers.append('Content-Type', 'text/plain');
36-
} else {
36+
} else if (!isFormData(options.body)) {
3737
headers.append('Content-Type', 'application/json');
3838
}
3939
}

src/templates/core/xhr/getRequestBody.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ function getRequestBody(options: ApiRequestOptions): any {
22
if (options.body) {
33
if (options.mediaType?.includes('/json')) {
44
return JSON.stringify(options.body)
5-
} else if (isString(options.body) || isBlob(options.body)) {
5+
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
66
return options.body;
77
} else {
88
return JSON.stringify(options.body);

src/utils/registerHandlebarTemplates.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import functionGetQueryString from '../templates/core/functions/getQueryString.h
2424
import functionGetUrl from '../templates/core/functions/getUrl.hbs';
2525
import functionIsBlob from '../templates/core/functions/isBlob.hbs';
2626
import functionIsDefined from '../templates/core/functions/isDefined.hbs';
27+
import functionIsFormData from '../templates/core/functions/isFormData.hbs';
2728
import functionIsString from '../templates/core/functions/isString.hbs';
2829
import functionIsStringWithValue from '../templates/core/functions/isStringWithValue.hbs';
2930
import functionIsSuccess from '../templates/core/functions/isSuccess.hbs';
@@ -157,6 +158,7 @@ export function registerHandlebarTemplates(root: {
157158
Handlebars.registerPartial('functions/getUrl', Handlebars.template(functionGetUrl));
158159
Handlebars.registerPartial('functions/isBlob', Handlebars.template(functionIsBlob));
159160
Handlebars.registerPartial('functions/isDefined', Handlebars.template(functionIsDefined));
161+
Handlebars.registerPartial('functions/isFormData', Handlebars.template(functionIsFormData));
160162
Handlebars.registerPartial('functions/isString', Handlebars.template(functionIsString));
161163
Handlebars.registerPartial('functions/isStringWithValue', Handlebars.template(functionIsStringWithValue));
162164
Handlebars.registerPartial('functions/isSuccess', Handlebars.template(functionIsSuccess));

test/__snapshots__/index.spec.js.snap

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,10 @@ function isBlob(value: any): value is Blob {
233233
return value instanceof Blob;
234234
}
235235

236+
function isFormData(value: any): value is FormData {
237+
return value instanceof FormData;
238+
}
239+
236240
function base64(str: string): string {
237241
try {
238242
return btoa(str);
@@ -347,7 +351,7 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
347351
headers.append('Content-Type', options.body.type || 'application/octet-stream');
348352
} else if (isString(options.body)) {
349353
headers.append('Content-Type', 'text/plain');
350-
} else {
354+
} else if (!isFormData(options.body)) {
351355
headers.append('Content-Type', 'application/json');
352356
}
353357
}
@@ -359,7 +363,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined {
359363
if (options.body) {
360364
if (options.mediaType?.includes('/json')) {
361365
return JSON.stringify(options.body)
362-
} else if (isString(options.body) || isBlob(options.body)) {
366+
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
363367
return options.body;
364368
} else {
365369
return JSON.stringify(options.body);
@@ -2933,6 +2937,10 @@ function isBlob(value: any): value is Blob {
29332937
return value instanceof Blob;
29342938
}
29352939

2940+
function isFormData(value: any): value is FormData {
2941+
return value instanceof FormData;
2942+
}
2943+
29362944
function base64(str: string): string {
29372945
try {
29382946
return btoa(str);
@@ -3047,7 +3055,7 @@ async function getHeaders(options: ApiRequestOptions): Promise<Headers> {
30473055
headers.append('Content-Type', options.body.type || 'application/octet-stream');
30483056
} else if (isString(options.body)) {
30493057
headers.append('Content-Type', 'text/plain');
3050-
} else {
3058+
} else if (!isFormData(options.body)) {
30513059
headers.append('Content-Type', 'application/json');
30523060
}
30533061
}
@@ -3059,7 +3067,7 @@ function getRequestBody(options: ApiRequestOptions): BodyInit | undefined {
30593067
if (options.body) {
30603068
if (options.mediaType?.includes('/json')) {
30613069
return JSON.stringify(options.body)
3062-
} else if (isString(options.body) || isBlob(options.body)) {
3070+
} else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
30633071
return options.body;
30643072
} else {
30653073
return JSON.stringify(options.body);

0 commit comments

Comments
 (0)