| import express, { type Express } from "express"; |
| import fs from "fs"; |
| import path, { dirname } from "path"; |
| import { fileURLToPath } from "url"; |
| import { createServer as createViteServer, createLogger } from "vite"; |
| const __filename = fileURLToPath(import.meta.url); |
| const __dirname = dirname(__filename); |
| import { type Server } from "http"; |
| import viteConfig from "../vite.config"; |
|
|
| const viteLogger = createLogger(); |
|
|
| export function log(message: string, source = "express") { |
| const formattedTime = new Date().toLocaleTimeString("en-US", { |
| hour: "numeric", |
| minute: "2-digit", |
| second: "2-digit", |
| hour12: true, |
| }); |
|
|
| console.log(`${formattedTime} [${source}] ${message}`); |
| } |
|
|
| export async function setupVite(app: Express, server: Server) { |
| const vite = await createViteServer({ |
| ...viteConfig, |
| configFile: false, |
| customLogger: { |
| ...viteLogger, |
| error: (msg, options) => { |
| if ( |
| msg.includes("[TypeScript] Found 0 errors. Watching for file changes") |
| ) { |
| log("no errors found", "tsc"); |
| return; |
| } |
|
|
| if (msg.includes("[TypeScript] ")) { |
| const [errors, summary] = msg.split("[TypeScript] ", 2); |
| log(`${summary} ${errors}\u001b[0m`, "tsc"); |
| return; |
| } else { |
| viteLogger.error(msg, options); |
| process.exit(1); |
| } |
| }, |
| }, |
| server: { |
| middlewareMode: true, |
| hmr: { server }, |
| }, |
| appType: "custom", |
| }); |
|
|
| app.use(vite.middlewares); |
| app.use("*", async (req, res, next) => { |
| const url = req.originalUrl; |
|
|
| try { |
| const clientTemplate = path.resolve( |
| __dirname, |
| "..", |
| "client", |
| "index.html", |
| ); |
|
|
| |
| const template = await fs.promises.readFile(clientTemplate, "utf-8"); |
| const page = await vite.transformIndexHtml(url, template); |
| res.status(200).set({ "Content-Type": "text/html" }).end(page); |
| } catch (e) { |
| vite.ssrFixStacktrace(e as Error); |
| next(e); |
| } |
| }); |
| } |
|
|
| export function serveStatic(app: Express) { |
| const distPath = path.resolve(__dirname, "public"); |
|
|
| if (!fs.existsSync(distPath)) { |
| throw new Error( |
| `Could not find the build directory: ${distPath}, make sure to build the client first`, |
| ); |
| } |
|
|
| app.use(express.static(distPath)); |
|
|
| |
| app.use("*", (_req, res) => { |
| res.sendFile(path.resolve(distPath, "index.html")); |
| }); |
| } |
|
|