import { ComputedFields, defineDocumentType, makeSource, } from 'contentlayer/source-files'; import readingTime from 'reading-time'; import remarkGfm from 'remark-gfm'; import rehypeSlug from 'rehype-slug'; import rehypeCodeTitles from 'rehype-code-titles'; import rehypeAutolinkHeadings from 'rehype-autolink-headings'; import rehypePrism from 'rehype-prism-plus'; const computedFields: ComputedFields = { readingTime: { type: 'json', resolve: (doc) => readingTime(doc.body.raw) }, wordCount: { type: 'number', resolve: (doc) => doc.body.raw.split(/\s+/gu).length, }, }; const Blog = defineDocumentType(() => ({ name: 'Blog', filePathPattern: 'blog/*.mdx', bodyType: 'mdx', fields: { title: { type: 'string', required: true }, publishedAt: { type: 'string', required: true }, summary: { type: 'string', required: true }, }, computedFields, })); const contentLayerConfig = makeSource({ contentDirPath: 'data', documentTypes: [Blog], mdx: { remarkPlugins: [remarkGfm], rehypePlugins: [ rehypeSlug, rehypeCodeTitles, rehypePrism, [ rehypeAutolinkHeadings, { properties: { className: ['anchor'], }, }, ], ], }, }); export default contentLayerConfig;