Files
site/apps/web/vite.main-static.ts
T
vlad 86cc3fa541 Update admin theme/layout and refresh README details.
Align the project baseline with the latest admin interface styling and layout structure while documenting setup and usage updates in README.
2026-07-14 17:12:28 +03:00

87 lines
2.3 KiB
TypeScript

import type { Connect, Plugin } from "vite";
import { cpSync, createReadStream, existsSync, statSync } from "node:fs";
import { extname, resolve } from "node:path";
const MIME_TYPES: Record<string, string> = {
".css": "text/css",
".js": "application/javascript",
".png": "image/png",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".gif": "image/gif",
".mp4": "video/mp4",
".ttf": "font/ttf",
".woff": "font/woff",
".woff2": "font/woff2",
".html": "text/html"
};
const APP_ROUTE_PREFIXES = [
"/login",
"/register",
"/profile",
"/admin",
"/verify",
"/reset-password",
"/forgot-password",
"/pages"
];
function isAppRoute(url: string): boolean {
const path = url.split("?")[0];
return APP_ROUTE_PREFIXES.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));
}
function createMainStaticMiddleware(mainDir: string): Connect.NextHandleFunction {
const root = resolve(mainDir);
return (req, res, next) => {
const urlPath = decodeURIComponent((req.url ?? "").split("?")[0]);
if (!urlPath || urlPath === "/") {
next();
return;
}
const relativePath = urlPath.replace(/^\/+/, "");
const filePath = resolve(root, relativePath);
if (!filePath.startsWith(root) || !existsSync(filePath) || !statSync(filePath).isFile()) {
next();
return;
}
const ext = extname(filePath).toLowerCase();
res.setHeader("Content-Type", MIME_TYPES[ext] ?? "application/octet-stream");
createReadStream(filePath).pipe(res);
};
}
function createAppFallbackMiddleware(): Connect.NextHandleFunction {
return (req, _res, next) => {
const url = req.url ?? "";
if (isAppRoute(url)) {
req.url = "/app.html";
}
next();
};
}
export function mainStaticPlugin(mainDir: string): Plugin {
const resolvedMainDir = resolve(mainDir);
return {
name: "kompton-main-static",
configureServer(server) {
server.middlewares.use("/main", createMainStaticMiddleware(resolvedMainDir));
server.middlewares.use(createAppFallbackMiddleware());
},
configurePreviewServer(server) {
server.middlewares.use("/main", createMainStaticMiddleware(resolvedMainDir));
server.middlewares.use(createAppFallbackMiddleware());
},
closeBundle() {
cpSync(resolvedMainDir, resolve(__dirname, "dist/main"), { recursive: true });
}
};
}