1 import { getStaticDir } from "@utils/env";
2 import { Helmet } from "inferno-helmet";
3 import { renderToString } from "inferno-server";
4 import serialize from "serialize-javascript";
5 import sharp from "sharp";
6 import { favIconPngUrl, favIconUrl } from "../../shared/config";
7 import { ILemmyConfig, IsoDataOptionalSite } from "../../shared/interfaces";
8 import { buildThemeList } from "./build-themes-list";
9 import { fetchIconPng } from "./fetch-icon-png";
11 const customHtmlHeader = process.env["LEMMY_UI_CUSTOM_HTML_HEADER"] || "";
13 let appleTouchIcon: string | undefined = undefined;
15 export async function createSsrHtml(
17 isoData: IsoDataOptionalSite
19 const site = isoData.site_res;
21 const fallbackTheme = `<link rel="stylesheet" type="text/css" href="/css/themes/${
22 (await buildThemeList())[0]
25 if (!appleTouchIcon) {
26 appleTouchIcon = site?.site_view.site.icon
27 ? `data:image/png;base64,${await sharp(
28 await fetchIconPng(site.site_view.site.icon)
36 background: "#222222",
40 .then(buf => buf.toString("base64"))}`
45 process.env["LEMMY_UI_DEBUG"] === "true"
48 <script src="//cdn.jsdelivr.net/npm/eruda"></script>
49 <script>eruda.init();</script>
54 const helmet = Helmet.renderStatic();
56 const config: ILemmyConfig = { wsHost: process.env.LEMMY_UI_LEMMY_WS_HOST };
60 <html ${helmet.htmlAttributes.toString()}>
62 <script>window.isoData = ${serialize(isoData)}</script>
63 <script>window.lemmyConfig = ${serialize(config)}</script>
65 <!-- A remote debugging utility for mobile -->
68 <!-- Custom injected script -->
71 ${helmet.title.toString()}
72 ${helmet.meta.toString()}
74 <!-- Required meta tags -->
75 <meta name="Description" content="Lemmy">
76 <meta charset="utf-8">
77 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
82 href=${site?.site_view.site.icon ?? favIconUrl}
85 <!-- Web app manifest -->
86 <link rel="manifest" href="/manifest.webmanifest" />
87 <link rel="apple-touch-icon" href=${appleTouchIcon} />
88 <link rel="apple-touch-startup-image" href=${appleTouchIcon} />
91 <link rel="stylesheet" type="text/css" href="${getStaticDir()}/styles/styles.css" />
93 <!-- Current theme and more -->
94 ${helmet.link.toString() || fallbackTheme}
98 <body ${helmet.bodyAttributes.toString()}>
100 <div class="alert alert-danger rounded-0" role="alert">
101 <b>Javascript is disabled. Actions will not work.</b>
105 <div id='root'>${root}</div>
106 <script defer src='${getStaticDir()}/js/client.js'></script>