From b3b0ecfcb8d2314cf3e6cbd78056c5410650c348 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Mon, 12 Dec 2022 14:14:35 -0500 Subject: [PATCH] Only call .catch() method when parsing fails (#1674) * Only call .catch() method when parsing fails * Fix deno test Co-authored-by: Colin McDonnell --- deno/lib/__tests__/catch.test.ts | 10 ++++++++++ deno/lib/types.ts | 8 ++++---- src/__tests__/catch.test.ts | 10 ++++++++++ src/types.ts | 8 ++++---- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/deno/lib/__tests__/catch.test.ts b/deno/lib/__tests__/catch.test.ts index b2910a0dc..892ca12f0 100644 --- a/deno/lib/__tests__/catch.test.ts +++ b/deno/lib/__tests__/catch.test.ts @@ -9,6 +9,16 @@ test("basic catch", () => { expect(z.string().catch("default").parse(undefined)).toBe("default"); }); +test("catch fn does not run when parsing succeeds", () => { + let isCalled = false; + const cb = () => { + isCalled = true; + return "asdf"; + }; + expect(z.string().catch(cb).parse("test")).toBe("test"); + expect(isCalled).toEqual(false); +}); + test("basic catch async", async () => { const result = await z.string().catch("default").parseAsync(1243); expect(result).toBe("default"); diff --git a/deno/lib/types.ts b/deno/lib/types.ts index ee260df65..4602fe1aa 100644 --- a/deno/lib/types.ts +++ b/deno/lib/types.ts @@ -4076,17 +4076,17 @@ export class ZodCatch extends ZodType< if (isAsync(result)) { return result.then((result) => { - const defaultValue = this._def.defaultValue(); return { status: "valid", - value: result.status === "valid" ? result.value : defaultValue, + value: + result.status === "valid" ? result.value : this._def.defaultValue(), }; }); } else { - const defaultValue = this._def.defaultValue(); return { status: "valid", - value: result.status === "valid" ? result.value : defaultValue, + value: + result.status === "valid" ? result.value : this._def.defaultValue(), }; } } diff --git a/src/__tests__/catch.test.ts b/src/__tests__/catch.test.ts index 22c2e348d..99615f2f1 100644 --- a/src/__tests__/catch.test.ts +++ b/src/__tests__/catch.test.ts @@ -8,6 +8,16 @@ test("basic catch", () => { expect(z.string().catch("default").parse(undefined)).toBe("default"); }); +test("catch fn does not run when parsing succeeds", () => { + let isCalled = false; + const cb = () => { + isCalled = true; + return "asdf"; + }; + expect(z.string().catch(cb).parse("test")).toBe("test"); + expect(isCalled).toEqual(false); +}); + test("basic catch async", async () => { const result = await z.string().catch("default").parseAsync(1243); expect(result).toBe("default"); diff --git a/src/types.ts b/src/types.ts index 15c0b7d72..9e53b76dc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -4076,17 +4076,17 @@ export class ZodCatch extends ZodType< if (isAsync(result)) { return result.then((result) => { - const defaultValue = this._def.defaultValue(); return { status: "valid", - value: result.status === "valid" ? result.value : defaultValue, + value: + result.status === "valid" ? result.value : this._def.defaultValue(), }; }); } else { - const defaultValue = this._def.defaultValue(); return { status: "valid", - value: result.status === "valid" ? result.value : defaultValue, + value: + result.status === "valid" ? result.value : this._def.defaultValue(), }; } }