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 };