import { defineCollection } from "astro:content" import { glob } from "astro/loaders" import { z } from "astro/zod" const posts = defineCollection({ loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/posts" }), schema: z.object({ title: z.string(), published: z.date(), updated: z.date().optional(), draft: z.boolean().optional().default(false), description: z.string().optional().default(""), image: z.string().optional().default(""), tags: z.array(z.string()).optional().default([]), category: z.string().optional().nullable().default(""), lang: z.string().optional().default(""), pinned: z.boolean().optional().default(false), encrypted: z.boolean().optional().default(false), password: z.string().optional().default(""), disclaimer: z.union([z.string(), z.array(z.string())]).optional(), prevTitle: z.string().default(""), prevSlug: z.string().default(""), nextTitle: z.string().default(""), nextSlug: z.string().default(""), }), }) const thoughts = defineCollection({ loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/thoughts" }), schema: z.object({ title: z.string().optional(), published: z.date(), tags: z.array(z.string()).optional().default([]), /** 地点,显示在日期旁 */ location: z.string().optional(), /** 天气,与地点一起显示 */ weather: z.string().optional(), /** 配图,public 下的绝对路径 */ images: z.array(z.string()).optional().default([]), /** 置顶 */ pinned: z.boolean().optional().default(false), }), }) const studies = defineCollection({ loader: glob({ pattern: "**/*.{md,mdx}", base: "./src/content/studies" }), // 注意:`id` 由 glob loader 从文件路径生成(Content Layer API), // 所以这里不声明 slug,直接读 entry.id。 schema: z.object({ title: z.string(), status: z.enum(["在读", "沉淀中", "暂搁", "已结"]), started: z.string(), // "YYYY-MM" 或 "YYYY-MM-DD" subtitle: z.string().optional(), epigraph: z.string().optional(), field: z.string().optional(), }), }) export const collections = { posts, thoughts, studies }