Jonas.dev
jonas-devblog.jsx
1// lib/blog.js — the whole content layer, no database involved
2import fs from "node:fs";
3import matter from "gray-matter";
4
5export const BLOG_DIR = join(process.cwd(), "content/blog")
6
7// Drafts preview in `next dev`, never in a production build.
8const SHOW_DRAFTS = process.env.NODE_ENV !== "production"
9
10export function getPostSlugs() {
11 return fs.readdirSync(BLOG_DIR)
12 .filter((file) => file.endsWith(".mdx"))
13 .map((file) => file.replace(/\.mdx$/, ""))
14 .sort();
15}
16
17export function getPostBySlug(slug) {
18 const source = fs.readFileSync(join(BLOG_DIR, `${slug}.mdx`), "utf8");
19 const { data, content } = matter(source);
20
21 // `published: false` keeps a post out of the public blog
22 if (data.published === false && !SHOW_DRAFTS) return null;
23
24 return {
25 slug, title: data.title, date: toIsoDate(data.date),
26 readingTime: readingTimeFor(content), tags: data.tags ?? [],
27 // Newest first, featured posts flagged by frontmatter
28 featured: data.featured === true,
29 };
30}