Files
gerbeur/api/lib/static.ts
khannurien ed7695663e
All checks were successful
Build and Publish Docker Image / build-and-push (push) Successful in 44s
v3: correctly using SITE_NAME across the app, added notifications on comments
2026-04-08 20:12:30 +00:00

39 lines
1.1 KiB
TypeScript

import { Context, Next, send } from "@oak/oak";
import { OG_SITE_NAME } from "../config.ts";
async function serveIndexHtml(
context: Context<Record<string, object>>,
root: string,
) {
const filePath = `${root}/index.html`;
const raw = await Deno.readTextFile(filePath);
const html = raw.replaceAll("__SITE_NAME__", OG_SITE_NAME);
context.response.type = "text/html";
context.response.body = html;
}
export function routeStaticFilesFrom(staticPaths: string[]) {
return async (context: Context<Record<string, object>>, next: Next) => {
const pathname = context.request.url.pathname;
// Serve index.html with runtime placeholder replacement
if (pathname === "/" || pathname === "/index.html") {
await serveIndexHtml(context, staticPaths[0]);
return;
}
for (const path of staticPaths) {
try {
await send(context, pathname, { root: path });
return;
} catch {
continue;
}
}
// SPA fallback: serve index.html so client-side routes work on direct navigation
await serveIndexHtml(context, staticPaths[0]);
await next();
};
}