import { ArkErrors } from "arktype"; import { configure } from "arktype/config"; import type { H3Event } from "h3"; export const throwingArktype = configure({ onFail: (errors) => errors.throw(), actual: () => "", }); // be sure to specify both the runtime and static configs declare global { interface ArkEnv { onFail: typeof throwingArktype.onFail; } } export async function readDropValidatedBody( event: H3Event, validate: (data: object) => T, ): Promise { const body = await readBody(event); try { // Delete all values that are 'null' if (typeof body === "object" && !Array.isArray(body) && body !== null) { for (const [key, value] of Object.entries(body) as Array< [string, unknown] >) { if (value === null) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete body[key]; } } } return validate(body); } catch (e) { const t = await useTranslation(event); if (e instanceof ArkErrors) { throw createError({ statusCode: 400, statusMessage: t("errors.invalidBody", [e.summary]), }); } throw createError({ statusCode: 400, statusMessage: t("errors.invalidBody", [ e instanceof Error ? e.message : `${e}`, ]), }); } }