From bd0ca27856cee8f8e35ce36e5fa2e4d5b6e8aabb Mon Sep 17 00:00:00 2001 From: Ben Carp Date: Sat, 17 Apr 2021 20:09:28 +0300 Subject: [PATCH 1/3] adding toFormData test --- test/specs/helpers/toFormData.spec.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 test/specs/helpers/toFormData.spec.js diff --git a/test/specs/helpers/toFormData.spec.js b/test/specs/helpers/toFormData.spec.js new file mode 100644 index 0000000000..f28471ece3 --- /dev/null +++ b/test/specs/helpers/toFormData.spec.js @@ -0,0 +1,18 @@ +var toFormData = require("../../../lib/helpers/toFormData"); + +describe("toFormData", function () { + it("Convert nested data object to FormDAta", function () { + var o = { + val: 123, + nested: { + arr: ["hello", "world"], + }, + }; + + convertedVal = toFormData(o); + expect(convertedVal instanceof FormData).toEqual(true); + expect(Array.from(convertedVal.keys()).length).toEqual(3); + expect(convertedVal.get("val")).toEqual("123") + expect(convertedVal.get("nested.arr.0")).toEqual("hello") + }); +}); From 2d139965ae108f634c36fe5af3310128d81799c1 Mon Sep 17 00:00:00 2001 From: Ben Carp Date: Sat, 17 Apr 2021 20:12:14 +0300 Subject: [PATCH 2/3] adding toFormData --- lib/helpers/toFormData.js | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 lib/helpers/toFormData.js diff --git a/lib/helpers/toFormData.js b/lib/helpers/toFormData.js new file mode 100644 index 0000000000..e21d0a7fa6 --- /dev/null +++ b/lib/helpers/toFormData.js @@ -0,0 +1,55 @@ +'use strict'; + +function combinedKey(parentKey, elKey) { + return parentKey + '.' + elKey; +} + +function buildFormData(formData, data, parentKey) { + if (Array.isArray(data)) { + data.forEach(function buildArray(el, i) { + buildFormData(formData, el, combinedKey(parentKey, i)); + }); + } else if ( + typeof data === 'object' && + !(data instanceof File || data === null) + ) { + Object.keys(data).forEach(function buildObject(key) { + buildFormData( + formData, + data[key], + parentKey ? combinedKey(parentKey, key) : key + ); + }); + } else { + if (data === undefined) { + return; + } + + var value = + typeof data === 'boolean' || typeof data === 'number' + ? data.toString() + : data; + formData.append(parentKey, value); + } +} + +/** + * convert a data object to FormData + * + * type FormDataPrimitive = string | Blob | number | boolean + * interface FormDataNest { + * [x: string]: FormVal + * } + * + * type FormVal = FormDataNest | FormDataPrimitive + * + * @param {FormVal} data + */ + +module.exports = function getFormData(data) { + var formData = new FormData(); + + buildFormData(formData, data); + + return formData; +}; From e3002e1fdab050ef5cf2adbf95f2674e8010f644 Mon Sep 17 00:00:00 2001 From: carpben Date: Sun, 13 Feb 2022 09:02:22 +0200 Subject: [PATCH 3/3] Separate responsibility between transformRequest and toFormData --- lib/defaults.js | 2 +- lib/helpers/toFormData.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/defaults.js b/lib/defaults.js index cb061af4c0..b62f1e962a 100644 --- a/lib/defaults.js +++ b/lib/defaults.js @@ -77,7 +77,7 @@ var defaults = { var contentType = headers && headers['Content-Type']; if ( isObjectPayload && contentType === 'multipart/form-data' ) { - return toFormData(data, new (this.env && this.env.FormData || FormData)); + return toFormData(data, this.env && this.env.FormData); } else if ( isObjectPayload || contentType === 'application/json' ) { setContentTypeIfUnset(headers, 'application/json'); return stringifySafely(data); diff --git a/lib/helpers/toFormData.js b/lib/helpers/toFormData.js index 0f03b79861..3a683f8a6e 100644 --- a/lib/helpers/toFormData.js +++ b/lib/helpers/toFormData.js @@ -46,12 +46,11 @@ function buildFormData(formData, data, parentKey) { * type FormVal = FormDataNest | FormDataPrimitive * * @param {FormVal} data - * @param {?Object} formData + * @param {?Class} EnvFormData */ -module.exports = function getFormData(data, formData) { - // eslint-disable-next-line no-param-reassign - formData = formData || new FormData(); +module.exports = function getFormData(data, EnvFormData) { + var formData = new (EnvFormData || FormData)(); buildFormData(formData, data);