commit 365ad2fddf40c8d7be197fa6abb02656b2219db4
parent dec29a24645c98de6c2132234172f36129997f81
Author: Damian Myrda <damian@prime8.dev>
Date: Sat, 31 Jan 2026 18:35:06 -0600
feat(blog): derive dates from file system metadata instead of frontmatter
Diffstat:
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/website/src/blogs/index.ts b/website/src/blogs/index.ts
@@ -1,6 +1,11 @@
+import { statSync } from "node:fs";
+import { resolve, dirname } from "node:path";
+import { fileURLToPath } from "node:url";
import matter from "gray-matter";
import { parseMarkdown, removeFirstH1 } from "../utils/markdown";
+const __dirname = dirname(fileURLToPath(import.meta.url));
+
export interface Blog {
id: string;
title: string;
@@ -13,32 +18,33 @@ export interface Blog {
tags?: string[];
}
-const blogModules = import.meta.glob<string>("./*.md", {
+const blogModules = import.meta.glob("./*.md", {
eager: true,
query: "?raw",
import: "default",
});
-export const blogs = Object.values(blogModules)
- .map(parseBlog)
+export const blogs = Object.entries(blogModules)
+ .map(([path, content]) =>
+ parseBlog(resolve(__dirname, path), content as string),
+ )
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
-function parseBlog(markdown: string): Blog {
+function formatDate(date: Date): string {
+ return date.toISOString().split("T")[0];
+}
+
+function parseBlog(path: string, markdown: string): Blog {
+ const stats = statSync(path);
+
const { data, content } = matter(markdown);
const blog: Partial<Blog> = {
id: data.id as string | undefined,
title: data.title as string | undefined,
description: data.description as string | undefined,
- date:
- data.date instanceof Date
- ? data.date.toISOString().split("T")[0]
- : (data.date as string | undefined),
- modifiedDate: data.modifiedDate
- ? data.modifiedDate instanceof Date
- ? data.modifiedDate.toISOString().split("T")[0]
- : (data.modifiedDate as string)
- : undefined,
+ date: formatDate(stats.birthtime),
+ modifiedDate: formatDate(stats.mtime),
url: data.url as string | undefined,
content: parseMarkdown(removeFirstH1(content)),
image: data.image as string | undefined,