import { cpSync, copyFileSync, existsSync, mkdirSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import vue from "@vitejs/plugin-vue"; import { defineConfig } from "vite"; const webRoot = dirname(fileURLToPath(import.meta.url)); const outputRoot = resolve(webRoot, "dist"); const backendOrigin = "http://127.0.0.1:8000"; const runtimeDirectories = ["assets", "icons", "vendor"]; const runtimeFiles = [ "manifest.webmanifest", "service-worker.js", "speech-audio-worklet.js", "login.html", "login.css", "login.js", "hardware-control.html", "hardware-control.css", "hardware-control.js", "network.js", "app.js", "gesture-control.js", "pwa.js", "console-v2.js", "self-extension.js", "speech-input.js", "assistant-chat.js", "energy-monitor.js", "firmware-workbench-entry.js", "firmware-workbench-theme.js", "firmware-workbench.js", "firmware-workbench.html", "styles.css", "console-v2.css", "self-extension.css", "speech-input.css", "assistant-chat.css", "energy-monitor.css", "firmware-workbench-entry.css", "firmware-workbench.css", "ui-consistency.css", "codepen-glass-theme.css", "vue-ui.js" ]; function copyRuntimeAssets() { return { name: "copy-n7-runtime-assets", apply: "build", closeBundle() { for (const directory of runtimeDirectories) { const source = resolve(webRoot, directory); if (existsSync(source)) { cpSync(source, resolve(outputRoot, directory), { recursive: true }); } } for (const file of runtimeFiles) { const source = resolve(webRoot, file); if (!existsSync(source)) continue; const target = resolve(outputRoot, file); mkdirSync(dirname(target), { recursive: true }); copyFileSync(source, target); } } }; } function backendProxy() { return { target: backendOrigin, changeOrigin: true, configure(proxy) { proxy.on("proxyReq", (request) => request.setHeader("origin", backendOrigin)); } }; } export default defineConfig({ root: webRoot, publicDir: false, plugins: [vue(), copyRuntimeAssets()], server: { strictPort: true, fs: { allow: [webRoot] }, proxy: { "/api": backendProxy(), "/artifacts": backendProxy() } }, build: { outDir: outputRoot, emptyOutDir: true, assetsDir: "vite-assets", target: "es2022", sourcemap: true } });