import path from "path" import tailwindcss from "@tailwindcss/vite" import react from "@vitejs/plugin-react" import {defineConfig, type Plugin} from "vite" function tailwindEscapeFix(): Plugin { return { name: "tailwind-escape-fix", enforce: "pre", async transform(code, id) { if (id.endsWith(".css")) { return code.replace(/(\d)::(\d)(px|rem|em|%|vh|vw|ms|s)/g, "$1.$2$3") } }, } } export default defineConfig({ plugins: [tailwindcss(), tailwindEscapeFix(), react()], optimizeDeps: { entries: ["src/**/*.{ts,tsx}"], }, build: { rollupOptions: { output: { manualChunks(id: string) { if (id.includes("node_modules")) { // React + deps that import React — keep together to avoid circular deps if (id.includes("react-dom") || id.includes("react-router-dom") || id.includes("scheduler") || id.includes("@tanstack/react-query")) { return "vendor-react"; } if (id.includes("react-markdown") || id.includes("remark-gfm") || id.includes("rehype-raw") || id.includes("rehype-sanitize")) { return "vendor-markdown"; } if (id.includes("lucide-react")) { return "vendor-lucide"; } if (id.includes("motion")) { return "vendor-motion"; } if (id.includes("recharts")) { return "vendor-recharts"; } // Streamdown + diagram deps — keep together to avoid circular deps if (id.includes("streamdown") || id.includes("@streamdown") || id.includes("cytoscape") || id.includes("d3-") || id.includes("dagre")) { return "vendor-streamdown"; } if (id.includes("@tanstack/react-table")) { return "vendor-table"; } if (id.includes("radix-ui")) { return "vendor-radix"; } } }, }, }, chunkSizeWarningLimit: 400, }, resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, dedupe: ["react", "react-dom"], }, server: { host: true, port: 5080, fs: { deny: ["**/target/**"], }, watch: { ignored: ["**/libs/**", "**/target/**"], }, hmr: { host: "localhost", port: 5080, protocol: "ws", }, proxy: { "/api": { target: "http://localhost:8080", changeOrigin: true, }, "/ws": { target: "ws://localhost:8080", changeOrigin: true, ws: true, }, }, }, })