feat: Use nunjucks for rendering

This commit is contained in:
Myzel394 2024-11-20 16:49:02 +01:00
parent 82774d656d
commit 2a55890764
No known key found for this signature in database
GPG Key ID: ED20A1D1D423AF3F
8 changed files with 22 additions and 37 deletions

View File

@ -4,9 +4,6 @@ WORKDIR /app
COPY . /app COPY . /app
# Absolutely no idea why, but piping the output directly to the file makes it empty.
RUN mkdir -p /tmp/templates && mv /app/templates/*.html /tmp/templates/
RUN bunx html-minifier --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true /tmp/templates/index.html > /app/templates/index.html
RUN bun install --production RUN bun install --production
EXPOSE 3000 EXPOSE 3000

BIN
bun.lockb

Binary file not shown.

View File

@ -8,11 +8,13 @@
"dependencies": { "dependencies": {
"hono": "^4.6.9", "hono": "^4.6.9",
"ip": "^2.0.1", "ip": "^2.0.1",
"nunjucks": "^3.2.4",
"zod": "^3.23.8" "zod": "^3.23.8"
}, },
"devDependencies": { "devDependencies": {
"@types/bun": "latest", "@types/bun": "latest",
"@types/ip": "^1.1.3", "@types/ip": "^1.1.3",
"@types/nunjucks": "^3.2.6",
"prettier": "^3.3.3" "prettier": "^3.3.3"
} }
} }

View File

@ -2,6 +2,11 @@ import { Hono } from "hono";
import { portRoute } from "./routes/port"; import { portRoute } from "./routes/port";
import { rootRoute } from "./routes/root"; import { rootRoute } from "./routes/root";
import { serveStatic } from "hono/bun"; import { serveStatic } from "hono/bun";
import * as nunjucks from "nunjucks";
nunjucks.configure("templates", {
dev: process.env.NODE_ENV === "development",
});
const app = new Hono() const app = new Hono()
.use("/static/*", serveStatic({ root: "./" })) .use("/static/*", serveStatic({ root: "./" }))

View File

@ -1,46 +1,27 @@
import { Context } from "hono"; import { Context } from "hono";
import { PresentationType } from "../middlewares/presentation"; import { PresentationType } from "../middlewares/presentation";
import * as nunjucks from "nunjucks";
export default async function render( export default async function render(
request: Context, context: Context,
templateName: "index", templateName: "index",
ctx: Record<string, any>, ctx: Record<string, any>,
) { ) {
const presentation = request.get("presentation"); const presentation = context.get("presentation") as PresentationType;
let content = await getTemplate(templateName, presentation);
for (const [key, value] of Object.entries(ctx)) {
content = content.replaceAll(`{{${key}}}`, value);
}
switch (presentation) {
case "browser": {
return request.html(content);
}
case "terminal": {
return request.text(content);
}
}
}
const _templateCache: Record<string, string> = {};
async function getTemplate(
templateName: "index",
presentation: PresentationType,
): Promise<string> {
const extension = { const extension = {
browser: ".html", browser: ".html",
terminal: ".txt", terminal: ".txt",
}[presentation]; }[presentation];
const key = templateName + extension; const key = templateName + extension + ".njk";
if (_templateCache[key]) { const content = nunjucks.render(key, ctx);
return _templateCache[key];
switch (presentation) {
case "browser":
return context.html(content);
break;
case "terminal":
return context.text(content);
break;
} }
const currentPath = await Bun.resolve(`./templates/${key}`, process.cwd());
_templateCache[key] = await Bun.file(currentPath).text();
return _templateCache[key];
} }

View File

@ -4,6 +4,7 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="darkreader-lock">
<title>amiopen.now</title> <title>amiopen.now</title>
<style type="text/css"> <style type="text/css">

View File

@ -1,8 +1,7 @@
ip=$1 ip=$1
user=$2 user=$2
cd server && docker buildx build --platform linux/amd64 . --tag amiopen:latest &&
docker buildx build --platform linux/amd64 . --tag amiopen:latest &&
docker save -o amiopen.tar amiopen:latest && docker save -o amiopen.tar amiopen:latest &&
scp amiopen.tar $user@$ip:~/amiopen/amiopen.tar && scp amiopen.tar $user@$ip:~/amiopen/amiopen.tar &&
ssh $user@$ip "cd ~/amiopen && docker container stop amiopen && docker container rm amiopen && docker load -i amiopen.tar && docker compose up -d" ssh $user@$ip "cd ~/amiopen && docker container stop amiopen && docker container rm amiopen && docker load -i amiopen.tar && docker compose up -d"