import "dotenv/config"; import express from "express"; import path from "node:path"; import { createServer as createViteServer } from "vite"; import { contentRouter } from "./src/backend/http/contentRouter"; import { controlRouter } from "./src/backend/http/controlRouter"; import { gitSourceRouter } from "./src/backend/http/gitSourceRouter"; import { previewRouter } from "./src/backend/http/previewRouter"; const parsePort = (value: string): number => { const port = Number.parseInt(value, 10); if (!Number.isInteger(port) || port < 1 || port > 65_535) { throw new Error(`Invalid PORT value: ${value}`); } return port; }; async function startServer(): Promise { const app = express(); const port = parsePort(process.env.PORT ?? "3000"); const host = process.env.HOST ?? "127.0.0.1"; app.disable("x-powered-by"); app.set("trust proxy", process.env.TRUST_PROXY ?? "loopback"); app.use(express.json({ limit: "1mb" })); app.use("/api", controlRouter); app.use("/api", gitSourceRouter); app.use("/api", contentRouter); app.use("/api", previewRouter); if (process.env.NODE_ENV !== "production") { const vite = await createViteServer({ server: { middlewareMode: true }, appType: "spa", }); app.use(vite.middlewares); } else { const distPath = path.join(process.cwd(), "dist"); app.use(express.static(distPath)); app.get("*", (_req, res) => { res.sendFile(path.join(distPath, "index.html")); }); } app.listen(port, host, () => { console.log(`Labyricorn Control Plane running on http://${host}:${port}`); }); } startServer().catch((error) => { console.error(error); process.exitCode = 1; });