blog.z0x.ca/src/content.config.ts
enscribe 71d1df3bd7
chore: miscellaneous cleanup
- Update README documentation
- Update favicon configuration
- Enhance site metadata in Head.astro and consts.ts
- Refactor RSS feed generation logic in rss.xml.ts
- Adjust avatar schema to accept both URL and local paths in content.config.ts
2025-03-22 16:25:52 -07:00

56 lines
1.6 KiB
TypeScript

import { glob } from 'astro/loaders'
import { defineCollection, z } from 'astro:content'
const blog = defineCollection({
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
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().optional(),
tags: z.array(z.string()).optional(),
authors: z.array(z.string()).optional(),
draft: z.boolean().optional(),
}),
})
const authors = defineCollection({
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/authors' }),
schema: z.object({
name: z.string(),
pronouns: z.string().optional(),
avatar: z.string().url().or(z.string().startsWith('/')),
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({
loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/projects' }),
schema: ({ image }) =>
z.object({
name: z.string(),
description: z.string(),
tags: z.array(z.string()),
image: image(),
link: z.string().url(),
}),
})
export const collections = { blog, authors, projects }