import { z } from "zod/mini" /** * SideConstraint accepts multiple input formats and normalizes to number | null: * - Integer values * - String integers (e.g., "100") * - Pixel strings (e.g., "100px") * - "auto" or "" → null * - null */ export const SideConstraintSchema: z.ZodMiniType = z.union([ z.pipe( z.literal("auto"), z.transform(() => null), ), z.pipe( z.literal(""), z.transform(() => null), ), z.null(), z.number().check(z.int()), z.pipe( z.string(), z.transform((s: string) => parseInt(s.replace("px", ""), 10)), ), ]) export const ImageConstraintSchema = z.object({ width: z.optional(SideConstraintSchema), height: z.optional(SideConstraintSchema), }) export type ImageConstraint = z.infer const ThumbnailSchema = z.object({ name: z.string(), width: z.optional(SideConstraintSchema), height: z.optional(SideConstraintSchema), }) const ImageConfigSchema = z.object({ label: z.nullish(z.string()), placeholder: z.optional(z.string()), constraint: z.optional(ImageConstraintSchema), thumbnails: z.optional(z.array(ThumbnailSchema)), }) export const ImageModelSchema = z.object({ type: z.literal("Image"), fieldset: z.nullish(z.string()), config: z.optional(ImageConfigSchema), }) export type ImageModel = z.infer