Share Zod Types with Frontend
Reuse backend validators safely in frontend apps.
Share Zod Types with Frontend
Problem: frontend and backend validations drift and you debug the same bug twice.
Solution: create a shared contracts module from KadakORM validators.
1. Create a contracts file
// packages/contracts/user.ts
import { z } from 'zod'
import { users } from '@api/schema'
export const createUserSchema = users
.insertValidator()
.omit({ id: true, createdAt: true, updatedAt: true, deletedAt: true })
export type CreateUserInput = z.infer<typeof createUserSchema>2. Use in frontend
import { createUserSchema, type CreateUserInput } from '@contracts/user'
const parsed = createUserSchema.safeParse(formValues)
if (!parsed.success) console.log(parsed.error.flatten())3. Use same contract in backend
const parsed = createUserSchema.safeParse(req.body)
if (!parsed.success) return res.status(400).json(parsed.error.flatten())
await db.users.insert(parsed.data)Important: keep server-managed fields (
id, timestamps, soft-delete columns) out of frontend input contracts.