From 95d6cd136db54f99f3b3e6147fcde2b023992ed2 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Mon, 12 Dec 2022 11:09:27 -0500 Subject: [PATCH] Only call .catch() method when parsing fails --- deno/lib/__tests__/catch.test.ts | 6 ++++++ deno/lib/types.ts | 8 ++++---- src/__tests__/catch.test.ts | 8 +++++++- src/types.ts | 8 ++++---- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/deno/lib/__tests__/catch.test.ts b/deno/lib/__tests__/catch.test.ts index b2910a0dc..2e9a6c6fd 100644 --- a/deno/lib/__tests__/catch.test.ts +++ b/deno/lib/__tests__/catch.test.ts @@ -9,6 +9,12 @@ test("basic catch", () => { expect(z.string().catch("default").parse(undefined)).toBe("default"); }); +test("catch fn does not run when parsing succeeds", () => { + const cb = jest.fn().mockReturnValue("x") as () => string; + expect(z.string().catch(cb).parse("test")).toBe("test"); + expect(cb).not.toBeCalled(); +}); + 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..04d408a45 100644 --- a/src/__tests__/catch.test.ts +++ b/src/__tests__/catch.test.ts @@ -1,5 +1,5 @@ // @ts-ignore TS6133 -import { expect, test } from "@jest/globals"; +import { expect, jest, test } from "@jest/globals"; import { z } from ".."; import { util } from "../helpers/util"; @@ -8,6 +8,12 @@ test("basic catch", () => { expect(z.string().catch("default").parse(undefined)).toBe("default"); }); +test("catch fn does not run when parsing succeeds", () => { + const cb = jest.fn().mockReturnValue("x") as () => string; + expect(z.string().catch(cb).parse("test")).toBe("test"); + expect(cb).not.toBeCalled(); +}); + 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(), }; } }