convex
Version:
Client for the Convex Cloud
41 lines (39 loc) • 1.4 kB
text/typescript
import { z } from "zod";
const baseConvexValidator = z.discriminatedUnion("type", [
z.object({ type: z.literal("null") }),
z.object({ type: z.literal("number") }),
z.object({ type: z.literal("bigint") }),
z.object({ type: z.literal("boolean") }),
z.object({ type: z.literal("string") }),
z.object({ type: z.literal("bytes") }),
z.object({ type: z.literal("any") }),
z.object({ type: z.literal("literal"), value: z.any() }),
z.object({ type: z.literal("id"), tableName: z.string() }),
]);
export type ConvexValidator =
| z.infer<typeof baseConvexValidator>
| { type: "array"; value: ConvexValidator }
| { type: "record"; keys: ConvexValidator; values: ConvexValidator }
| { type: "union"; value: ConvexValidator[] }
| {
type: "object";
value: Record<string, { fieldType: ConvexValidator; optional: boolean }>;
};
export const convexValidator: z.ZodType<ConvexValidator> = z.lazy(() =>
z.union([
baseConvexValidator,
z.object({ type: z.literal("array"), value: convexValidator }),
z.object({
type: z.literal("record"),
keys: convexValidator,
values: convexValidator,
}),
z.object({ type: z.literal("union"), value: z.array(convexValidator) }),
z.object({
type: z.literal("object"),
value: z.record(
z.object({ fieldType: convexValidator, optional: z.boolean() }),
),
}),
]),
);