import { defineCollection, defineConfig } from '@content-collections/core'; import { compileMDX } from '@content-collections/mdx'; import { type RehypeCodeOptions, rehypeCode, remarkGfm, remarkHeading, } from 'fumadocs-core/mdx-plugins'; import readingTime from 'reading-time'; import { sqip } from 'sqip'; const rehypeCodeOptions: RehypeCodeOptions = { themes: { light: 'catppuccin-mocha', dark: 'catppuccin-mocha', }, }; const posts = defineCollection({ name: 'posts', directory: 'content/blog', include: '**/*.mdx', schema: (z) => ({ title: z.string(), description: z.string(), date: z.string(), image: z.string(), authors: z.array(z.string()), tags: z.array(z.string()), }), transform: async ({ title, ...page }, context) => { const body = await context.cache(page.content, async () => compileMDX(context, page, { remarkPlugins: [remarkGfm, remarkHeading], rehypePlugins: [[rehypeCode, rehypeCodeOptions]], }) ); const blur = await context.cache(page._meta.path, async () => sqip({ input: `./public/${page.image}`, plugins: [ 'sqip-plugin-primitive', 'sqip-plugin-svgo', 'sqip-plugin-data-uri', ], }) ); const blurResult = Array.isArray(blur) ? blur[0] : blur; return { ...page, _title: title, _slug: page._meta.path, body, image: page.image, imageBlur: blurResult.metadata.dataURIBase64 as string, readingTime: readingTime(page.content).text, }; }, }); const legals = defineCollection({ name: 'legal', directory: 'content/legal', include: '**/*.mdx', schema: (z) => ({ title: z.string(), description: z.string(), date: z.string(), }), transform: async ({ title, ...page }, context) => { const body = await context.cache(page.content, async () => compileMDX(context, page) ); return { ...page, _title: title, _slug: page._meta.path, body, }; }, }); export default defineConfig({ collections: [posts, legals], });