import formidable from 'formidable'; import type { IncomingMessage } from 'http'; const normalizeFormData = (values: Record) => { for (const key in values) { const value = values[key]; if (Array.isArray(value) && value.length === 1) { values[key] = value[0]; } } }; /** * Creates a function that parses the multipart form data into the request's `body` property */ export const createMultiFormDataParser = (maxFormDataSizeInMb: number) => { return async function parseMultipartFormData(req: IncomingMessage): Promise<{ data: formidable.Fields; files: formidable.Files; }> { const { encoding } = req; const form = formidable({ multiples: true, encoding: encoding as formidable.BufferEncoding, maxFileSize: maxFormDataSizeInMb * 1024 * 1024, // TODO: pass a custom `fileWriteStreamHandler` to create binary data files directly }); return await new Promise((resolve) => { form.parse(req, async (_err, data, files) => { normalizeFormData(data); normalizeFormData(files); resolve({ data, files }); }); }); }; };