122 lines · 4.0 KB
import { z } from "zod";

const MAX_OPTIONS = 50;
const text = z.string().max(2000);

const options = z.array(z.union([z.string().max(200), z.object({ label: z.string().max(200) })])).max(MAX_OPTIONS);

const fieldSchema = z.discriminatedUnion("type", [
  z.object({ type: z.literal("markdown"), attributes: z.object({ value: z.string().max(10000) }) }),
  z.object({
    type: z.enum(["input", "textarea"]),
    id: z.string().max(100).optional(),
    attributes: z.object({
      label: text,
      description: text.optional(),
      placeholder: text.optional(),
      value: z.string().max(10000).optional(),
      render: z.string().max(50).optional(),
    }),
    validations: z.object({ required: z.boolean().optional() }).optional(),
  }),
  z.object({
    type: z.literal("dropdown"),
    id: z.string().max(100).optional(),
    attributes: z.object({
      label: text,
      description: text.optional(),
      multiple: z.boolean().optional(),
      options,
    }),
    validations: z.object({ required: z.boolean().optional() }).optional(),
  }),
  z.object({
    type: z.literal("checkboxes"),
    id: z.string().max(100).optional(),
    attributes: z.object({ label: text, description: text.optional(), options }),
  }),
]);

const labels = z