import { z } from 'zod'; const targetPlatformEnum = z.enum(['default', 'intl', 'private']); // type 真实取值(含空串),忠实保留原始数据形态 const blockTypeEnum = z.enum(['', 'tab', 'codeTab', 'sideTab', 'list']); // 模型未声明但真实数据存在的 sideTabs 字段(tab 导航元信息) const sideTabItemSchema = z .object({ id: z.string(), title: z.string(), }) .strict(); // 递归嵌套的块结构,可任意深度 export interface GuideBlock { title: string; index?: number; markdown?: string; type?: '' | 'tab' | 'codeTab' | 'sideTab' | 'list'; id?: string; docsUrl?: string; sideTabs?: { id: string; title: string }[]; content?: GuideBlock[]; } const blockSchema: z.ZodType = z.lazy(() => z .object({ title: z.string(), index: z.number().optional(), markdown: z.string().optional(), type: blockTypeEnum.optional(), // 模型未声明但真实存在,按 AGENTS.md 补字段不丢数据 id: z.string().optional(), docsUrl: z.string().optional(), sideTabs: z.array(sideTabItemSchema).optional(), content: z.array(blockSchema).optional(), }) .strict(), ); const row = z .object({ category: z.string(), // 同 category+lang 在各站可能各一行,不合并 targetPlatform: z.array(targetPlatformEnum).min(1), lang: z.enum(['zh', 'en']), // 负值 -1 表示未设置排序;构建期不排序,顺序取源数据 index: z.number().int(), hasTemplate: z.boolean(), docsUrl: z.string().optional(), content: z.array(blockSchema), // —— 旧 cms 平台系统字段,保留以保证使用处兼容性 —— _id: z.string(), _openid: z.string().optional(), _mainDep: z.string().optional(), createdAt: z.number(), updatedAt: z.number(), owner: z.string().optional(), createBy: z.string().optional(), updateBy: z.string().optional(), }) .strict(); export default z.array(row);