55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import type { MultiPartData } from 'h3'
|
|
|
|
function parseFieldValues(rawValues: string[]): string[] {
|
|
const values = rawValues.map(value => value.trim()).filter(Boolean)
|
|
if (values.length !== 1) return values
|
|
|
|
const raw = values[0]!
|
|
try {
|
|
const parsed = JSON.parse(raw) as unknown
|
|
if (Array.isArray(parsed)) {
|
|
return parsed.map(item => String(item).trim()).filter(Boolean)
|
|
}
|
|
} catch {
|
|
// fall through to comma-separated parsing
|
|
}
|
|
return raw.split(',').map(item => item.trim()).filter(Boolean)
|
|
}
|
|
|
|
export function readMultipartFormFieldValues(
|
|
formData: MultiPartData[],
|
|
fieldName: string
|
|
): string[] {
|
|
const field = formData.find(part => part.name === fieldName)
|
|
if (field?.data?.length) {
|
|
return parseFieldValues([new TextDecoder().decode(field.data)])
|
|
}
|
|
|
|
const repeatFields = formData.filter(
|
|
part => part.name === fieldName && part.data?.length
|
|
)
|
|
if (!repeatFields.length) return []
|
|
|
|
return parseFieldValues(
|
|
repeatFields.map(part => new TextDecoder().decode(part.data!))
|
|
)
|
|
}
|
|
|
|
export function readFormDataFieldValues(
|
|
formData: FormData,
|
|
fieldName: string
|
|
): string[] {
|
|
return parseFieldValues(
|
|
formData.getAll(fieldName).filter((value): value is string => typeof value === 'string')
|
|
)
|
|
}
|
|
|
|
export function readFormDataFiles(
|
|
formData: FormData,
|
|
fieldNames: string[]
|
|
): File[] {
|
|
return fieldNames
|
|
.flatMap(name => formData.getAll(name))
|
|
.filter((value): value is File => value instanceof File && value.size > 0)
|
|
}
|