typescript Utilities

Zod Validation Schema

Comprehensive Zod validation schemas for user registration, API request bodies, environment variables, and nested objects.

Apex Logic 0 copies
typescript
import { z } from 'zod';

// User registration schema with custom validators
const userRegistrationSchema = z.object({
    name: z.string().min(2, 'Name must be at least 2 characters').max(100),
    email: z.string().email('Invalid email format').toLowerCase(),
    password: z.string()
        .min(8, 'Password must be at least 8 characters')
        .regex(/[A-Z]/, 'Must contain an uppercase letter')
        .regex(/[0-9]/, 'Must contain a number')
        .regex(/[^A-Za-z0-9]/, 'Must contain a special character'),
    confirmPassword: z.string(),
    role: z.enum(['user', 'admin', 'moderator']).default('user'),
    profile: z.object({
        bio: z.string().max(500).optional(),
        website: z.string().url().optional().or(z.literal('')),
        avatar: z.string().url().optional(),
    }).optional(),
    tags: z.array(z.string()).max(10).default([]),
    acceptTerms: z.literal(true, {
        errorMap: () => ({ message: 'You must accept the terms' }),
    }),
}).refine(data => data.password === data.confirmPassword, {
    message: 'Passwords do not match',
    path: ['confirmPassword'],
});

// Environment variables validation
const envSchema = z.object({
    NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
    PORT: z.coerce.number().int().min(1).max(65535).default(3000),
    DATABASE_URL: z.string().url(),
    JWT_SECRET: z.string().min(32),
    REDIS_URL: z.string().url().optional(),
    SMTP_HOST: z.string().optional(),
    SMTP_PORT: z.coerce.number().optional(),
    LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
});

// API pagination query schema
const paginationSchema = z.object({
    page: z.coerce.number().int().min(1).default(1),
    limit: z.coerce.number().int().min(1).max(100).default(20),
    sort: z.string().optional(),
    order: z.enum(['asc', 'desc']).default('desc'),
    search: z.string().max(200).optional(),
});

// Helper: validate and extract typed data
function validate<T>(schema: z.ZodSchema<T>, data: unknown): T {
    const result = schema.safeParse(data);
    if (!result.success) {
        const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`);
        throw new Error(`Validation failed: ${errors.join(', ')}`);
    }
    return result.data;
}

type UserRegistration = z.infer<typeof userRegistrationSchema>;
type Env = z.infer<typeof envSchema>;
type Pagination = z.infer<typeof paginationSchema>;

export { userRegistrationSchema, envSchema, paginationSchema, validate };

Tags

zod validation typescript schema

Related Snippets

javascript

File Upload Handler with Validation

python

Web Scraper with BeautifulSoup

python

CSV Data Processor

python

Email Sender with Templates