41 lines
1.1 KiB
TypeScript
Executable File
41 lines
1.1 KiB
TypeScript
Executable File
import { withLeadingSlash } from "ufo";
|
|
import { stringify } from "minimark/stringify";
|
|
import { queryCollection } from "@nuxt/content/nitro";
|
|
import type { Collections } from "@nuxt/content";
|
|
|
|
export default eventHandler(async (event) => {
|
|
const slug = getRouterParams(event)["slug.md"];
|
|
if (!slug?.endsWith(".md")) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
statusMessage: "Page not found",
|
|
fatal: true,
|
|
});
|
|
}
|
|
|
|
const path = withLeadingSlash(slug.replace(".md", ""));
|
|
|
|
const page = await queryCollection(event, "docs" as keyof Collections)
|
|
.path(path)
|
|
.first();
|
|
if (!page) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
statusMessage: "Page not found",
|
|
fatal: true,
|
|
});
|
|
}
|
|
|
|
// Add title and description to the top of the page if missing
|
|
if (page.body.value[0]?.[0] !== "h1") {
|
|
page.body.value.unshift(["blockquote", {}, page.description]);
|
|
page.body.value.unshift(["h1", {}, page.title]);
|
|
}
|
|
|
|
setHeader(event, "Content-Type", "text/markdown; charset=utf-8");
|
|
return stringify(
|
|
{ ...page.body, type: "minimark" },
|
|
{ format: "markdown/html" },
|
|
);
|
|
});
|