src/content/config.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import { defineCollection, z } from 'astro:content' const blog = defineCollection({ type: 'content', schema: ({ image }) => z.object({ title: z .string() .max( 60, 'Title should be 60 characters or less for optimal Open Graph display.', ), description: z .string() .max( 155, 'Description should be 155 characters or less for optimal Open Graph display.', ), date: z.coerce.date(), image: image() .refine((img) => img.width === 1200 && img.height === 630, { message: 'The image must be exactly 1200px × 630px for Open Graph requirements.', }) .optional(), tags: z.array(z.string()).optional(), authors: z.array(z.string()).optional(), draft: z.boolean().optional(), }), }) const authors = defineCollection({ type: 'content', schema: z.object({ name: z.string(), pronouns: z.string().optional(), avatar: z.string().url(), bio: z.string().optional(), mail: z.string().email().optional(), website: z.string().url().optional(), twitter: z.string().url().optional(), github: z.string().url().optional(), linkedin: z.string().url().optional(), discord: z.string().url().optional(), }), }) const projects = defineCollection({ type: 'content', schema: ({ image }) => z.object({ name: z.string(), description: z.string(), tags: z.array(z.string()), image: image().refine((img) => img.width === 1200 && img.height === 630, { message: 'The image must be exactly 1200px × 630px for Open Graph requirements.', }), link: z.string().url(), }), }) export const collections = { blog, authors, projects } |