← ClaudeAtlas

zod-4listed

Zod 4 schema validation patterns. Trigger: When using Zod for validation - breaking changes from v3.
JoseCortezz25/template-starter-nextjs · ★ 0 · Web & Frontend · score 65
Install: claude install-skill JoseCortezz25/template-starter-nextjs
## Breaking Changes from Zod 3 ```typescript // ❌ Zod 3 (OLD) z.string().email(); z.string().uuid(); z.string().url(); z.string().nonempty(); z.object({ name: z.string() }).required_error('Required'); // ✅ Zod 4 (NEW) z.email(); z.uuid(); z.url(); z.string().min(1); z.object({ name: z.string() }, { error: 'Required' }); ``` ## Basic Schemas ```typescript import { z } from 'zod'; // Primitives const stringSchema = z.string(); const numberSchema = z.number(); const booleanSchema = z.boolean(); const dateSchema = z.date(); // Top-level validators (Zod 4) const emailSchema = z.email(); const uuidSchema = z.uuid(); const urlSchema = z.url(); // With constraints const nameSchema = z.string().min(1).max(100); const ageSchema = z.number().int().positive().max(150); const priceSchema = z.number().min(0).multipleOf(0.01); ``` ## Object Schemas ```typescript const userSchema = z.object({ id: z.uuid(), email: z.email({ error: 'Invalid email address' }), name: z.string().min(1, { error: 'Name is required' }), age: z.number().int().positive().optional(), role: z.enum(['admin', 'user', 'guest']), metadata: z.record(z.string(), z.unknown()).optional() }); type User = z.infer<typeof userSchema>; // Parsing const user = userSchema.parse(data); // Throws on error const result = userSchema.safeParse(data); // Returns { success, data/error } if (result.success) { console.log(result.data); } else { console.log(result.error.issues); } ``` ## Arrays and Records ```types