Spaces:
Running
Running
| import express, { type Express } from "express"; | |
| import fs from "fs"; | |
| import path from "path"; | |
| import { createServer as createViteServer, createLogger } from "vite"; | |
| import { type Server } from "http"; | |
| import viteConfig from "../vite.config"; | |
| import { nanoid } from "nanoid"; | |
| 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 serverOptions = { | |
| middlewareMode: true, | |
| hmr: { server }, | |
| allowedHosts: true, | |
| }; | |
| const vite = await createViteServer({ | |
| ...viteConfig, | |
| configFile: false, | |
| customLogger: { | |
| ...viteLogger, | |
| error: (msg, options) => { | |
| viteLogger.error(msg, options); | |
| process.exit(1); | |
| }, | |
| }, | |
| server: serverOptions, | |
| appType: "custom", | |
| }); | |
| app.use(vite.middlewares); | |
| app.use("*", async (req, res, next) => { | |
| const url = req.originalUrl; | |
| try { | |
| const clientTemplate = path.resolve( | |
| import.meta.dirname, | |
| "..", | |
| "client", | |
| "index.html", | |
| ); | |
| // always reload the index.html file from disk incase it changes | |
| let template = await fs.promises.readFile(clientTemplate, "utf-8"); | |
| template = template.replace( | |
| `src="/src/main.tsx"`, | |
| `src="/src/main.tsx?v=${nanoid()}"`, | |
| ); | |
| 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(import.meta.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)); | |
| // fall through to index.html if the file doesn't exist | |
| app.use("*", (_req, res) => { | |
| res.sendFile(path.resolve(distPath, "index.html")); | |
| }); | |
| } | |