From 0912bde937c9505ce5464d5b9c56b81d1edeab63 Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 9 Apr 2026 17:31:39 +0200 Subject: [PATCH] fix: support multiselect in form data (#10676) --- lib/helpers/formDataToJSON.js | 4 +++- tests/unit/helpers/formDataToJSON.test.js | 26 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/helpers/formDataToJSON.js b/lib/helpers/formDataToJSON.js index e8db891f..bc36d65b 100644 --- a/lib/helpers/formDataToJSON.js +++ b/lib/helpers/formDataToJSON.js @@ -58,7 +58,9 @@ function formDataToJSON(formData) { if (isLast) { if (utils.hasOwnProp(target, name)) { - target[name] = [target[name], value]; + target[name] = utils.isArray(target[name]) + ? target[name].concat(value) + : [target[name], value]; } else { target[name] = value; } diff --git a/tests/unit/helpers/formDataToJSON.test.js b/tests/unit/helpers/formDataToJSON.test.js index cffb6383..68ab0ab3 100644 --- a/tests/unit/helpers/formDataToJSON.test.js +++ b/tests/unit/helpers/formDataToJSON.test.js @@ -27,6 +27,32 @@ describe('formDataToJSON', () => { }); }); + it('should keep repeatable values flat for 3+ entries', () => { + const formData = new FormData(); + + formData.append('select3', '301'); + formData.append('select3', '302'); + formData.append('select3', '303'); + + expect(formDataToJSON(formData)).toEqual({ + select3: ['301', '302', '303'], + }); + }); + + it('should keep nested repeatable values flat for 3+ entries', () => { + const formData = new FormData(); + + formData.append('foo[bar]', '1'); + formData.append('foo[bar]', '2'); + formData.append('foo[bar]', '3'); + + expect(formDataToJSON(formData)).toEqual({ + foo: { + bar: ['1', '2', '3'], + }, + }); + }); + it('should convert props with empty brackets to arrays', () => { const formData = new FormData();