36 lines
1 KiB
JavaScript
36 lines
1 KiB
JavaScript
|
|
import { defineCollection } from "astro:content";
|
||
|
|
import { glob } from "astro/loaders";
|
||
|
|
import { z } from "astro/zod";
|
||
|
|
|
||
|
|
const blog = defineCollection({
|
||
|
|
loader: glob({
|
||
|
|
pattern: "**/index.mdx",
|
||
|
|
base: "./src/content/blog",
|
||
|
|
generateId: ({ entry }) => entry.replace(/[\\/]index\.mdx$/, "").replace(/\\/g, "/"),
|
||
|
|
}),
|
||
|
|
schema: ({ image }) =>
|
||
|
|
z.object({
|
||
|
|
title: z.string(),
|
||
|
|
excerpt: z.string(),
|
||
|
|
date: z.coerce.date(),
|
||
|
|
updated: z.coerce.date().optional(),
|
||
|
|
readingTime: z.number().int().positive(),
|
||
|
|
category: z.string(),
|
||
|
|
tags: z.array(z.string()).default([]),
|
||
|
|
author: z.string(),
|
||
|
|
thumbnail: image(),
|
||
|
|
imageCredit: z
|
||
|
|
.object({
|
||
|
|
caption: z.string().optional(),
|
||
|
|
author: z.string(),
|
||
|
|
authorUrl: z.string().url(),
|
||
|
|
source: z.string().optional(),
|
||
|
|
sourceUrl: z.string().url().optional(),
|
||
|
|
})
|
||
|
|
.optional(),
|
||
|
|
featured: z.boolean().default(false),
|
||
|
|
}),
|
||
|
|
});
|
||
|
|
|
||
|
|
export const collections = { blog };
|