import { z } from 'zod'; export const documentSchema = z.object({ "document": z.object({ "type": z.enum(["pdf","docx","odt"]).describe("Output document format"), "filename": z.string().regex(new RegExp("^[a-zA-Z0-9_-]+$")).min(1).max(100).describe("Output filename without extension").default("document"), "title": z.string().max(200).describe("Document title").optional(), "author": z.string().max(100).describe("Document author").optional(), "subject": z.string().max(200).describe("Document subject").optional(), "keywords": z.array(z.string().min(1).max(50)).max(10).describe("Document keywords").optional(), "size": z.enum(["A4","A3","A5","Letter","Legal"]).describe("Page size").default("A4"), "orientation": z.enum(["portrait","landscape"]).describe("Page orientation").default("portrait"), "marginTop": z.number().gte(0).lte(10).describe("Top margin in cm").default(2.54), "marginRight": z.number().gte(0).lte(10).describe("Right margin in cm").default(2.54), "marginBottom": z.number().gte(0).lte(10).describe("Bottom margin in cm").default(2.54), "marginLeft": z.number().gte(0).lte(10).describe("Left margin in cm").default(2.54) }).strict(), "variables": z.record(z.string().min(1).max(1000)).describe("Variables for text replacement. Use {{varName}} in text. Built-in: {{pageNumber}}, {{totalPages}}").optional(), "defaults": z.object({ "fontFamily": z.string().min(1).max(100).describe("Default font family").default("Arial"), "fontSize": z.number().gte(6).lte(72).describe("Default font size in pt").default(11), "color": z.string().regex(new RegExp("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")).describe("Default text color in hex format").default("#000000"), "lineHeight": z.number().gte(0.5).lte(3).describe("Default line height multiplier").default(1.5), "spacing": z.object({ "before": z.object({ "h1": z.number().gte(0).lte(100).default(20), "h2": z.number().gte(0).lte(100).default(18), "h3": z.number().gte(0).lte(100).default(16), "h4": z.number().gte(0).lte(100).default(14), "h5": z.number().gte(0).lte(100).default(12), "h6": z.number().gte(0).lte(100).default(10), "text": z.number().gte(0).lte(100).default(0), "text2": z.number().gte(0).lte(100).default(0), "table": z.number().gte(0).lte(100).default(10), "list": z.number().gte(0).lte(100).default(10), "image": z.number().gte(0).lte(100).default(10), "qrcode": z.number().gte(0).lte(100).default(10), "chart": z.number().gte(0).lte(100).default(10), "code": z.number().gte(0).lte(100).default(10), "math": z.number().gte(0).lte(100).default(10) }).strict().optional(), "after": z.object({ "h1": z.number().gte(0).lte(100).default(15), "h2": z.number().gte(0).lte(100).default(12), "h3": z.number().gte(0).lte(100).default(10), "h4": z.number().gte(0).lte(100).default(8), "h5": z.number().gte(0).lte(100).default(6), "h6": z.number().gte(0).lte(100).default(5), "text": z.number().gte(0).lte(100).default(10), "text2": z.number().gte(0).lte(100).default(10), "table": z.number().gte(0).lte(100).default(15), "list": z.number().gte(0).lte(100).default(10), "image": z.number().gte(0).lte(100).default(15), "qrcode": z.number().gte(0).lte(100).default(15), "chart": z.number().gte(0).lte(100).default(15), "code": z.number().gte(0).lte(100).default(15), "math": z.number().gte(0).lte(100).default(15) }).strict().optional() }).strict().describe("Global spacing defaults in pt").optional(), "chart": z.object({ "colors": z.array(z.string().regex(new RegExp("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"))).describe("Default fill colors for chart datasets (hex colors, used in order and cycled).").optional(), "borderColors": z.array(z.string().regex(new RegExp("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"))).describe("Default border colors for chart datasets (hex colors, used in order and cycled).").optional() }).strict().optional(), "styles": z.object({ "h1": z.any().optional(), "h2": z.any().optional(), "h3": z.any().optional(), "h4": z.any().optional(), "h5": z.any().optional(), "h6": z.any().optional(), "text2": z.any().optional(), "table": z.any().optional(), "math": z.any().optional() }).optional(), "header": z.object({ "left": z.any().describe("Left column content").optional(), "center": z.any().describe("Center column content").optional(), "right": z.any().describe("Right column content").optional(), "align": z.enum(["left","center","right"]).describe("Override alignment for all header content (overrides default left/center/right positioning)").optional(), "excludeFirstPage": z.boolean().describe("Exclude header from first page").default(false) }).optional(), "footer": z.object({ "left": z.any().describe("Left column content").optional(), "center": z.any().describe("Center column content").optional(), "right": z.any().describe("Right column content").optional(), "align": z.enum(["left","center","right"]).describe("Override alignment for all footer content (overrides default left/center/right positioning)").optional(), "excludeFirstPage": z.boolean().describe("Exclude footer from first page").default(false) }).optional() }).strict().optional(), "sections": z.array(z.any().superRefine((x, ctx) => { const schemas = [z.object({ "type": z.literal("page"), "align": z.enum(["top","center","bottom"]).describe("Vertical alignment of page content").default("top"), "startY": z.number().gte(0).lte(50).describe("Y position in cm (overrides align)").optional(), "content": z.array(z.any()).min(1).max(100).describe("Page content elements") }).strict().describe("Styled single page with custom positioning"), z.object({ "type": z.literal("flow"), "newPage": z.boolean().describe("Start this section on a new page (default: true)").default(true), "content": z.array(z.any()).min(1).max(200).describe("Flow content elements") }).strict().describe("Flowing content across multiple pages")]; const errors = schemas.reduce( (errors, schema) => ((result) => result.error ? [...errors, result.error] : errors)( schema.safeParse(x), ), [], ); if (schemas.length - errors.length !== 1) { ctx.addIssue({ path: ctx.path, code: "invalid_union", unionErrors: errors, message: "Invalid input: Should pass single schema", }); } })).min(0).max(100) }).strict().describe("JSON schema for document generation (PDF, DOCX)")