UNPKG

@django-vite/vite-server

Version:

This provide cli to start Express Server with Chokidar to detect any file changes and send events.

79 lines (78 loc) 2.66 kB
#!/usr/bin/env node import { createServer as createHttpServer } from "http"; import { createServer as createViteServer } from "vite"; import Server, { WebSocketServer } from "ws"; import chokidar from "chokidar"; import express from "express"; import path from "path"; import fs from "fs"; const __dirname = resolveRoot(); // Reading UserConfig Files: Need default export const viteConfig = await getConfig("./vite.config"); const chokidarConfig = await getConfig("./chokidar.config"); const { paths, ...chokidarConf } = chokidarConfig; const watcher = chokidar.watch(paths ? paths : "./**/*.+(html)", { persistent: true, ...chokidarConf, }); async function createServer() { const app = express(); const server = createHttpServer(app); const vite = await createViteServer({ server: { middlewareMode: true, port: 5173 }, appType: "custom", ...viteConfig, }); app.use(vite.middlewares); // app.use("/static", express.static(path.resolve(__dirname, "static"))) app.get("", (_, res) => { res.sendFile(path.resolve(__dirname, "views", "index.html")); }); // Setting Up WebSocket const wss = new WebSocketServer({ server }); wss.on("connection", (ws) => { console.log(`[Connected] Client Connected`); ws.send("connected"); const notifyClients = () => { wss.clients.forEach((client) => { if (client.readyState === Server.OPEN) { client.send("reload"); } }); }; watcher.on("change", (path) => { console.log(`File Changed -> ${path}`); notifyClients(); }); }); server.listen(vite.config.server.port, () => { console.log(`Listening on http://localhost:${vite.config.server.port}/`); }); } function resolveRoot() { const dirname_current = import.meta.dirname; if (fs.existsSync(path.resolve(dirname_current, "..", "..", "package.json"))) { // After Building return path.resolve(dirname_current, "..", ".."); } else if ( // Before Building fs.existsSync(path.resolve(dirname_current, "..", "package.json"))) { return path.resolve(dirname_current, ".."); } else { // None Case applied return dirname_current; } } async function getConfig(config_path) { try { const { default: config } = await import(config_path); return config; } catch (error) { console.warn(`Configuration File is not found. Using default configuration.\n\t${path.resolve(config_path)}.{ts,js}`); return {}; } } createServer();