import { serveFile } from "jsr:@std/http/file-server"; import { createSSRApp } from "vue"; import { renderToString } from "vue/server-renderer"; import App from "@/App.tsx"; import transpileResponse from './transpile.ts'; const utf8Decoder = new TextDecoder("utf-8"); Deno.serve({ port: 8080, hostname: "0.0.0.0", onListen({ port, hostname }) { console.log(`Listening on port http://${hostname}:${port}/`); }, }, async (req, _conn) => { if (req.method === "GET") { const pathname = URL.parse(req.url)?.pathname ?? "/"; if (pathname === "/") { const rendered = await renderToString(createSSRApp(App)); const content = utf8Decoder.decode(await Deno.readFile("./public/index.html")) .replace(``, rendered) .replace(``, ''); return new Response(content, { headers: { "Content-Type": "text/html" } }); } else if (pathname === "/health") { return new Response("OK"); } else if (pathname.startsWith('/app') && (pathname.endsWith('.ts') || pathname.endsWith('.tsx'))) { const response = await serveFile(req, './' + pathname); return await transpileResponse(response, req.url, pathname); } else if (pathname.startsWith('/deps')) { return serveFile(req, `node_modules/${pathname.split('/deps')[1]}`); } else { return serveFile(req, `public${ pathname }`); } } else { return new Response("Only GET allowed.", { status: 500 }); } }); Deno.addSignalListener("SIGINT", () => { console.info("Shutting down (received SIGINT)"); Deno.exit(); });