From 799a8d8ae5c7bdfef64ebef2f54cd070af8d42a5 Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Wed, 8 May 2024 14:22:17 +0900 Subject: [PATCH] fix(validator): `form` supports multiple values with `foo[]` (#2639) * fix(validator): `form` supports multiple values `foo[]` * denoify --- deno_dist/validator/validator.ts | 10 +++++++++- src/validator/validator.test.ts | 27 +++++++++++++++++++++++++++ src/validator/validator.ts | 10 +++++++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/deno_dist/validator/validator.ts b/deno_dist/validator/validator.ts index 9dfc2e764..b790e3e38 100644 --- a/deno_dist/validator/validator.ts +++ b/deno_dist/validator/validator.ts @@ -93,7 +93,15 @@ export const validator = < const formData = await bufferToFormData(arrayBuffer, contentType) const form: BodyData = {} formData.forEach((value, key) => { - form[key] = value + if (key.endsWith('[]')) { + if (form[key] === undefined) { + form[key] = [value] + } else if (Array.isArray(form[key])) { + ;(form[key] as unknown[]).push(value) + } + } else { + form[key] = value + } }) value = form c.req.bodyCache.formData = formData diff --git a/src/validator/validator.test.ts b/src/validator/validator.test.ts index 27a836be3..f28191b9e 100644 --- a/src/validator/validator.test.ts +++ b/src/validator/validator.test.ts @@ -257,6 +257,33 @@ describe('Cached contents', () => { }) }) +describe('Form with multiple values', () => { + const app = new Hono() + + app.post( + '/', + validator('form', (value) => value), + async (c) => { + const data = c.req.valid('form') + return c.json(data) + } + ) + + it('Should return `foo[]` as an array', async () => { + const form = new FormData() + form.append('foo[]', 'bar1') + form.append('foo[]', 'bar2') + const res = await app.request('/', { + method: 'POST', + body: form, + }) + expect(res.status).toBe(200) + expect(await res.json()).toEqual({ + 'foo[]': ['bar1', 'bar2'], + }) + }) +}) + describe('Validator middleware with a custom validation function', () => { const app = new Hono() diff --git a/src/validator/validator.ts b/src/validator/validator.ts index e83682f58..7f7e8b2e5 100644 --- a/src/validator/validator.ts +++ b/src/validator/validator.ts @@ -93,7 +93,15 @@ export const validator = < const formData = await bufferToFormData(arrayBuffer, contentType) const form: BodyData = {} formData.forEach((value, key) => { - form[key] = value + if (key.endsWith('[]')) { + if (form[key] === undefined) { + form[key] = [value] + } else if (Array.isArray(form[key])) { + ;(form[key] as unknown[]).push(value) + } + } else { + form[key] = value + } }) value = form c.req.bodyCache.formData = formData