Skip to content

Commit f29f2a6

Browse files
authored
fix(v4): cidrv6 JSON schema pattern matches runtime (#5945)
1 parent ee7376a commit f29f2a6

2 files changed

Lines changed: 9 additions & 1 deletion

File tree

packages/zod/src/v4/classic/tests/string.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,14 @@ test("CIDR v6 validation", () => {
10541054
expect(cidrV6.safeParse("fe80::/10").success).toBe(true);
10551055
expect(cidrV6.safeParse("::1/128").success).toBe(true);
10561056
expect(cidrV6.safeParse("2001:0db8:85a3::/64").success).toBe(true);
1057+
expect(cidrV6.safeParse("2001:db8:1::/48").success).toBe(true);
1058+
expect(cidrV6.safeParse("2001:db8:85a3::8a2e:370:7334/64").success).toBe(true);
1059+
expect(cidrV6.safeParse("2001:db8:85a3:0:0:8a2e:370:7334/64").success).toBe(true);
1060+
1061+
const pattern = new RegExp(z.toJSONSchema(cidrV6).pattern as string);
1062+
for (const input of ["2001:db8::/32", "2001:db8:1::/48", "2001:0db8:85a3::/64", "fe80::/10", "::/0"]) {
1063+
expect(pattern.test(input)).toBe(true);
1064+
}
10571065

10581066
// Invalid CIDR v6 addresses
10591067
expect(cidrV6.safeParse("2001:db8::").success).toBe(false); // Missing prefix

packages/zod/src/v4/core/regexes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export const mac = (delimiter?: string): RegExp => {
7373
export const cidrv4: RegExp =
7474
/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;
7575
export const cidrv6: RegExp =
76-
/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;
76+
/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;
7777

7878
// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript
7979
export const base64: RegExp = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;

0 commit comments

Comments
 (0)