// SPDX-License-Identifier: AGPL-3.0-only import { Application, Router, Response, Request } from "https://deno.land/x/oak@v10.1.0/mod.ts"; import { compile, compileTemplate } from "https://deno.land/x/pug@v0.1.3/mod.ts"; const app = new Application() const router = new Router() const renderEnv = { commit: Deno.readTextFileSync("./.git/refs/heads/main").toString().substr(0, 8) } const templates: Map = new Map() async function render(response: Response, _request: Request, name: string) { const template = templates.get(name) ?? compile(await Deno.readTextFile(`./views/${name}.pug`), { filename: `./views/${name}.pug`, name: name }) templates.set(name, template) response.body = template({ ...renderEnv }) } router.get("/", ({ response }) => response.redirect("/about")) router.get("/about", c => render(c.response, c.request, "about")) router.get("/projects", c => render(c.response, c.request, "projects")) router.get("/contact", c => render(c.response, c.request, "contact")) router.get("/links", c => render(c.response, c.request, "links")) router.get("/services", c => render(c.response, c.request, "services")) router.get("/licence", async ({ response }) => { const content = await Deno.readTextFile("LICENCE") response.headers.set("content-type", "text/plain") response.body = content }) router.get("/favicon.ico", ({ response }) => response.status = 204) // no content router.get("/robots.txt", ({ response }) => { response.body = "User-Agent: *\nDisallow: /\n" }) const port = parseInt(Deno.env.get("PORT") ?? "8080") const hostname = Deno.env.get("HOST") || "127.0.0.1" app.use(router.routes()) app.listen({ port, hostname }) console.log(`listening on http://${hostname}:${port}`);