c812a1a595
Integrate the remote firmware workbench, OTA delivery, and timed mode schedules while preserving the local N7 scene and runtime changes.
100 lines
2.4 KiB
JavaScript
100 lines
2.4 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",
|
|
"firmware-workbench-entry.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
|
|
}
|
|
});
|