diff --git a/src/lib/blog.test.ts b/src/lib/blog.test.ts new file mode 100644 index 0000000..a74f6b5 --- /dev/null +++ b/src/lib/blog.test.ts @@ -0,0 +1,26 @@ +import { expect, test } from "bun:test"; +import { readdir, readFile } from "node:fs/promises"; +import { createServer } from "vite"; + +test("the voice archive includes the complete source and URL of every blog post", async () => { + const vite = await createServer({ server: { middlewareMode: true }, appType: "custom" }); + try { + const { GET } = await vite.ssrLoadModule("/src/pages/blog.json.ts"); + const response: Response = GET(); + expect(response.headers.get("content-type")).toContain("application/json"); + const { posts } = await response.json(); + const directory = new URL("../pages/blog/", import.meta.url); + const files = (await readdir(directory)).filter((file) => file.endsWith(".mdx")).sort(); + expect(files.length).toBeGreaterThan(0); + expect(posts).toEqual( + await Promise.all( + files.map(async (file) => ({ + url: `https://moq.dev/blog/${file.slice(0, -4)}`, + content: await readFile(new URL(file, directory), "utf8"), + })), + ), + ); + } finally { + await vite.close(); + } +}); diff --git a/src/pages/blog.json.ts b/src/pages/blog.json.ts new file mode 100644 index 0000000..5cb5264 --- /dev/null +++ b/src/pages/blog.json.ts @@ -0,0 +1,17 @@ +// Built with the site so the voice agent gets every post from the same release. +const posts = import.meta.glob("./blog/*.mdx", { + eager: true, + query: "?raw", + import: "default", +}); + +export function GET() { + return Response.json({ + posts: Object.entries(posts) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([path, content]) => ({ + url: `https://moq.dev/blog/${path.slice("./blog/".length, -".mdx".length)}`, + content, + })), + }); +}