import { z } from "astro/zod"; import type { FieldDefinition, FieldUIHints } from "./types.js"; export interface TextOptions { required?: boolean; minLength?: number; maxLength?: number; pattern?: RegExp; placeholder?: string; helpText?: string; } /** * Text field - single line text input */ export function text(options: TextOptions = {}): FieldDefinition { let stringSchema = z.string(); // Apply constraints if (options.minLength !== undefined) { stringSchema = stringSchema.min( options.minLength, `Must be at least ${options.minLength} characters`, ); } if (options.maxLength !== undefined) { stringSchema = stringSchema.max( options.maxLength, `Must be at most ${options.maxLength} characters`, ); } if (options.pattern) { stringSchema = stringSchema.regex(options.pattern, "Invalid format"); } // Optional vs required const schema: z.ZodTypeAny = options.required ? stringSchema : stringSchema.optional(); const ui: FieldUIHints = { widget: "text", placeholder: options.placeholder, helpText: options.helpText, }; return { type: "text", columnType: "TEXT", schema, options, ui, }; }