import express, { type Express } from "express"; import cors from "cors"; import pinoHttp from "pino-http"; import path from "path"; import fs from "fs"; import router from "./routes"; import { logger } from "./lib/logger"; const app: Express = express(); app.use( pinoHttp({ logger, serializers: { req(req) { return { id: req.id, method: req.method, url: req.url?.split("?")[0], }; }, res(res) { return { statusCode: res.statusCode, }; }, }, }), ); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use("/api", router); const possiblePaths = [ path.resolve(process.cwd(), "artifacts/io-ui/dist"), path.resolve(process.cwd(), "artifacts/io-ui/dist/public"), path.resolve(__dirname, "../../io-ui/dist"), path.resolve(__dirname, "../../io-ui/dist/public"), path.resolve(__dirname, "../artifacts/io-ui/dist"), path.resolve(__dirname, "../artifacts/io-ui/dist/public"), ]; const publicPath = possiblePaths.find(p => fs.existsSync(p)) || possiblePaths[0]; if (fs.existsSync(publicPath)) { logger.info({ publicPath }, "Serving static frontend assets"); app.use(express.static(publicPath)); app.get("/{*path}", (_req, res) => { res.sendFile(path.join(publicPath, "index.html")); }); } else { logger.warn({ publicPath, attempted: possiblePaths }, "Frontend build folder not found. API-only mode active."); } export default app;