Zod Transform and Coerce Pipeline
Coerce and transform incoming strings inside a Zod schema so trimming, defaults, and type conversion happen in one validated step.
Code
import { z } from "zod";
export const QuerySchema = z.object({
page: z.coerce.number().int().min(1).catch(1),
pageSize: z.coerce.number().int().min(1).max(100).default(20),
tags: z
.string()
.transform((raw) => raw.split(",").map((s) => s.trim()).filter(Boolean))
.pipe(z.array(z.string().min(1)).max(10)),
sort: z.enum(["asc", "desc"]).default("asc"),
});
export type Query = z.infer<typeof QuerySchema>;
export function parseQuery(params: Record<string, string | undefined>) {
return QuerySchema.parse({
page: params.page,
pageSize: params.pageSize,
tags: params.tags ?? "",
sort: params.sort,
});
}Report a problem with this exampleOpens a pre-filled issue on GitHub.