From c5d2bac26f2f1f4a04147da9f93fc35ed7b56aa7 Mon Sep 17 00:00:00 2001 From: zomars Date: Tue, 14 Jun 2022 14:07:39 -0600 Subject: [PATCH] Better ZodError handling --- .../lib/server/getServerErrorFromUnkown.ts | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/lib/server/getServerErrorFromUnkown.ts b/packages/lib/server/getServerErrorFromUnkown.ts index 45c3018d38..604b242f05 100644 --- a/packages/lib/server/getServerErrorFromUnkown.ts +++ b/packages/lib/server/getServerErrorFromUnkown.ts @@ -1,24 +1,47 @@ import { PrismaClientKnownRequestError } from "@prisma/client/runtime"; import Stripe from "stripe"; -import { ZodError } from "zod"; +import { ZodError, ZodIssue } from "zod"; import { HttpError } from "../http-error"; +function hasName(cause: unknown): cause is { name: string } { + return !!cause && typeof cause === "object" && "name" in cause; +} + +function isZodError(cause: unknown): cause is ZodError { + return cause instanceof ZodError || (hasName(cause) && cause.name === "ZodError"); +} + +function parseZodErrorIssues(issues: ZodIssue[]): string { + return issues + .map((i) => + i.code === "invalid_union" + ? i.unionErrors.map((ue) => parseZodErrorIssues(ue.issues)).join(" ") + : `'${i.code}' in '${i.path}': ${i.message};` + ) + .join(" "); +} + export function getServerErrorFromUnkown(cause: unknown): HttpError { + if (isZodError(cause)) { + console.log("cause", cause); + return new HttpError({ + statusCode: 400, + message: parseZodErrorIssues(cause.issues), + cause, + }); + } if (cause instanceof PrismaClientKnownRequestError) { return new HttpError({ statusCode: 400, message: cause.message, cause }); } - if (cause instanceof Error) { - return new HttpError({ statusCode: 500, message: cause.message, cause }); - } - if (cause instanceof HttpError) { - return cause; - } if (cause instanceof Stripe.errors.StripeInvalidRequestError) { return new HttpError({ statusCode: 400, message: cause.message, cause }); } - if (cause instanceof ZodError) { - return new HttpError({ statusCode: 400, message: cause.message, cause }); + if (cause instanceof HttpError) { + return cause; + } + if (cause instanceof Error) { + return new HttpError({ statusCode: 500, message: cause.message, cause }); } if (typeof cause === "string") { // @ts-expect-error https://github.com/tc39/proposal-error-cause