import { renderToString } from 'preact-render-to-string'; import denoConfig from '/deno.json' with { type: 'json' }; import { RequestHandlerParams } from '/lib/page.ts'; import { AppConfig } from '/lib/config.ts'; import { escapeHtml, html } from '/public/ts/utils/misc.ts'; import Header from '/components/Header.tsx'; interface BasicLayoutOptions extends Pick { currentPath: string; titlePrefix: string; description?: string; } async function basicLayout( htmlContent: string, { currentPath, titlePrefix, description, user }: BasicLayoutOptions, ) { const config = await AppConfig.getConfig(); const defaultTitle = config.visuals.title || 'bewCloud is a modern and simpler alternative to Nextcloud and ownCloud'; const defaultDescription = config.visuals.description || `Have your files under your own control.`; const enabledApps = config.core.enabledApps; let title = defaultTitle; if (titlePrefix) { title = `${titlePrefix} - bewCloud`; } const headerReactNode =
; const headerHtml = renderToString(headerReactNode); return html` ${escapeHtml(title)} ${headerHtml} ${htmlContent} `; } const importMap = denoConfig.frontendImports.reduce( (importsObject: { imports: Record }, importName: string) => { const url = new URL(denoConfig.imports[importName as keyof typeof denoConfig.imports]).toString(); let fileName = url.replace('https://esm.sh/', '').split('?')[0].trim(); if (!fileName.endsWith('.mjs')) { fileName = `${fileName}.mjs`; } importsObject.imports[importName] = `/public/js/${fileName}`; return importsObject; }, { imports: {} }, ); export async function basicLayoutResponse(htmlContent: string, options: BasicLayoutOptions) { const headers: HeadersInit = { 'content-type': 'text/html; charset=utf-8', 'content-security-policy': `default-src 'self'; child-src 'none'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'`, 'x-frame-options': 'DENY', 'x-content-type-options': 'nosniff', 'strict-transport-security': 'max-age=31536000; includeSubDomains; preload', }; return new Response(await basicLayout(htmlContent, options), { headers, }); }