95 lines
2.2 KiB
JavaScript
95 lines
2.2 KiB
JavaScript
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",
|
|
"styles.css",
|
|
"console-v2.css",
|
|
"self-extension.css",
|
|
"speech-input.css",
|
|
"assistant-chat.css",
|
|
"energy-monitor.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
|
|
}
|
|
});
|