From 40e3304e9e3ecf31df16dd67a24e85d049593240 Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Wed, 10 Sep 2025 21:26:21 -0700 Subject: [PATCH 1/3] Fix error message on invalid shape. Fixes #5218 --- packages/zod/src/v4/core/schemas.ts | 2 +- play.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/zod/src/v4/core/schemas.ts b/packages/zod/src/v4/core/schemas.ts index b410d79ddf..8a9bfa6cf1 100644 --- a/packages/zod/src/v4/core/schemas.ts +++ b/packages/zod/src/v4/core/schemas.ts @@ -1763,7 +1763,7 @@ export interface $ZodObject< function normalizeDef(def: $ZodObjectDef) { const keys = Object.keys(def.shape); for (const k of keys) { - if (!def.shape[k]._zod.traits.has("$ZodType")) { + if (!def.shape?.[k]?._zod?.traits?.has("$ZodType")) { throw new Error(`Invalid element at key "${k}": expected a Zod schema`); } } diff --git a/play.ts b/play.ts index 4564a8e840..6aabb3481f 100644 --- a/play.ts +++ b/play.ts @@ -1,3 +1,7 @@ -import * as z from "zod"; +import z from "zod"; -z; +z.object({ + inner: { + a: z.number(), + }, +}).parse({ inner: { a: 1 } }); From eeb66095cda39f70badb7657fa47e145a0b8aeb7 Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Wed, 10 Sep 2025 21:39:48 -0700 Subject: [PATCH 2/3] Ignore package.jsons --- packages/zod/.gitignore | 1 + play.ts | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/zod/.gitignore b/packages/zod/.gitignore index 2250745510..86d865467d 100644 --- a/packages/zod/.gitignore +++ b/packages/zod/.gitignore @@ -4,3 +4,4 @@ **/*.d.ts **/*.d.mts **/*.d.cts +**/package.json diff --git a/play.ts b/play.ts index 6aabb3481f..4564a8e840 100644 --- a/play.ts +++ b/play.ts @@ -1,7 +1,3 @@ -import z from "zod"; +import * as z from "zod"; -z.object({ - inner: { - a: z.number(), - }, -}).parse({ inner: { a: 1 } }); +z; From 9915c393a0c6cd880059ea2f0b65835f16cc809a Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Wed, 10 Sep 2025 21:43:31 -0700 Subject: [PATCH 3/3] Fix CIDRv6 validation false positive. Fixes #5184 --- packages/zod/src/v4/classic/tests/string.test.ts | 2 ++ packages/zod/src/v4/core/schemas.ts | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/zod/src/v4/classic/tests/string.test.ts b/packages/zod/src/v4/classic/tests/string.test.ts index 5e32b92560..a223b878c1 100644 --- a/packages/zod/src/v4/classic/tests/string.test.ts +++ b/packages/zod/src/v4/classic/tests/string.test.ts @@ -920,6 +920,8 @@ test("CIDR v6 validation", () => { expect(cidrV6.safeParse("not a cidr").success).toBe(false); // Invalid format expect(cidrV6.safeParse("192.168.0.0/24").success).toBe(false); // IPv4 CIDR in v6 validation expect(cidrV6.safeParse("2001:0db8:85a3::/64/whatever-after").success).toBe(false); + expect(cidrV6.safeParse("22d9:f4a8:6a90:f3bf:dcaa:2beb:5fba:0000/112").success).toBe(true); + expect(cidrV6.safeParse("22d9:f4a8:6a90:f3bf:dcaa:2beb:5fba:0000/112/268").success).toBe(false); }); test("E.164 validation", () => { diff --git a/packages/zod/src/v4/core/schemas.ts b/packages/zod/src/v4/core/schemas.ts index 8a9bfa6cf1..98aa588b1a 100644 --- a/packages/zod/src/v4/core/schemas.ts +++ b/packages/zod/src/v4/core/schemas.ts @@ -830,10 +830,11 @@ export const $ZodCIDRv6: core.$constructor<$ZodCIDRv6> = /*@__PURE__*/ core.$con $ZodStringFormat.init(inst, def); inst._zod.check = (payload) => { - const segments = payload.value.split("/"); - const [address, prefix] = segments; + const parts = payload.value.split("/"); try { - if (segments.length !== 2) throw new Error(); + if (parts.length !== 2) throw new Error(); + const [address, prefix] = parts; + if (!prefix) throw new Error(); const prefixNum = Number(prefix); if (`${prefixNum}` !== prefix) throw new Error(); if (prefixNum < 0 || prefixNum > 128) throw new Error();