Standalone Schemas
Overview
Sometimes you need the validation logic without the full route handler — for a custom endpoint, middleware, or server action. @relayerjs/next exports standalone schema generators.
createWhereSchema
import { createWhereSchema } from '@relayerjs/next';
const taskWhereSchema = createWhereSchema(r.tasks, { status: { operators: ['eq', 'in'] }, priority: true, password: false,});
// Use in a custom route handlerexport async function GET(req: Request) { const url = new URL(req.url); const whereStr = url.searchParams.get('where'); const where = taskWhereSchema.parse(whereStr ? JSON.parse(whereStr) : undefined);
const results = await r.tasks.findMany({ where }); return Response.json({ data: results });}createSelectSchema
import { createSelectSchema } from '@relayerjs/next';
const userSelectSchema = createSelectSchema(r.users, { password: false, posts: { title: true },});createOrderBySchema
import { createOrderBySchema } from '@relayerjs/next';
const userOrderBySchema = createOrderBySchema(r.users, ['name', 'createdAt', 'author.firstName']);Combining schemas
import { z } from 'zod';
const listQuerySchema = z.object({ where: taskWhereSchema, orderBy: createOrderBySchema(r.tasks, ['title', 'createdAt']), limit: z.coerce.number().min(1).max(100).optional().default(20), offset: z.coerce.number().min(0).optional().default(0),});
export async function GET(req: Request) { const url = new URL(req.url); const params = listQuerySchema.parse({ where: url.searchParams.get('where') ? JSON.parse(url.searchParams.get('where')!) : undefined, orderBy: url.searchParams.get('orderBy') ? JSON.parse(url.searchParams.get('orderBy')!) : undefined, limit: url.searchParams.get('limit'), offset: url.searchParams.get('offset'), });
const results = await r.tasks.findMany(params); return Response.json({ data: results });}