38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import { defineCollection, z } from 'astro:content';
|
|
import { glob } from 'astro/loaders';
|
|
|
|
const baseSchema = z.object({
|
|
title: z.string(),
|
|
description: z.string().optional(),
|
|
pubDate: z.coerce.date(),
|
|
updatedDate: z.coerce.date().optional(),
|
|
draft: z.boolean().default(false),
|
|
categories: z.array(z.string()).nullable().transform((value) => value ?? []).default([]),
|
|
tags: z.array(z.string()).nullable().transform((value) => value ?? []).default([]),
|
|
slug: z.string().optional(),
|
|
originalSlug: z.string().optional(),
|
|
cover: z.string().optional(),
|
|
originalCover: z.string().url().optional(),
|
|
hero: z.string().optional(),
|
|
textTone: z.enum(['light', 'dark', 'auto']).optional(),
|
|
toc: z.union([
|
|
z.boolean(),
|
|
z.object({ enabled: z.boolean().default(true), position: z.enum(['left', 'right']).default('right') })
|
|
]).default(true),
|
|
comments: z.boolean().default(false),
|
|
math: z.boolean().default(false),
|
|
mermaid: z.boolean().default(false)
|
|
});
|
|
|
|
const posts = defineCollection({
|
|
loader: glob({ base: './src/content/posts', pattern: '**/*.{md,mdx}' }),
|
|
schema: baseSchema
|
|
});
|
|
|
|
const pages = defineCollection({
|
|
loader: glob({ base: './src/content/pages', pattern: '**/*.{md,mdx}' }),
|
|
schema: baseSchema
|
|
});
|
|
|
|
export const collections = { posts, pages };
|