import { existsSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import fastifyStatic from "@fastify/static"; import type { FastifyInstance } from "fastify"; export async function registerStatic(app: FastifyInstance) { // Resolve relative to this file's location const __dirname = dirname(fileURLToPath(import.meta.url)); const webDistPath = resolve(__dirname, "../../../web/dist"); if (!existsSync(webDistPath)) { app.log.warn(`SPA dist not found at ${webDistPath} — skipping static file serving`); return; } await app.register(fastifyStatic, { root: webDistPath, prefix: "/", wildcard: false, decorateReply: !app.hasReplyDecorator("sendFile"), }); // SPA fallback — serve index.html for all non-API routes app.setNotFoundHandler((request, reply) => { if (request.url.startsWith("/api/")) { reply.code(404).send({ error: "Not found", code: "NOT_FOUND" }); } else { reply.sendFile("index.html"); } }); }