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.

TypescriptData Integrity

Code

snippet
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,
  });
}