62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
import tailwindcss from "@tailwindcss/vite";
|
|
import react from "@vitejs/plugin-react-swc";
|
|
import { defineConfig, loadEnv, type Plugin, type PreviewServer, type ViteDevServer } from "vite";
|
|
import { fileURLToPath, URL } from "node:url";
|
|
import { createEdgeTtsMiddleware } from "./server/edge-tts-service";
|
|
|
|
const RUNTIME_CONFIG_PATH = "/runtime-config.js";
|
|
|
|
function renderRuntimeConfig(values: Record<string, string>) {
|
|
const config = {
|
|
DRAINAGE_MAPBOX_ACCESS_TOKEN: values.DRAINAGE_MAPBOX_ACCESS_TOKEN || "",
|
|
DRAINAGE_MAP_URL: values.DRAINAGE_MAP_URL || "https://geoserver.waternetwork.cn/geoserver",
|
|
DRAINAGE_GEOSERVER_WORKSPACE: values.DRAINAGE_GEOSERVER_WORKSPACE || "wenzhou",
|
|
DRAINAGE_AGENT_API_BASE_URL: values.DRAINAGE_AGENT_API_BASE_URL || "http://127.0.0.1:8787",
|
|
DRAINAGE_ENABLE_DEV_PANEL: values.DRAINAGE_ENABLE_DEV_PANEL || "false",
|
|
DRAINAGE_ENABLE_MSW: values.DRAINAGE_ENABLE_MSW || "false"
|
|
};
|
|
|
|
return `globalThis.__DRAINAGE_CONFIG__ = ${JSON.stringify(config)};\n`;
|
|
}
|
|
|
|
function runtimeConfigPlugin(values: Record<string, string>): Plugin {
|
|
const installMiddleware = (server: ViteDevServer | PreviewServer) => {
|
|
server.middlewares.use(createEdgeTtsMiddleware());
|
|
server.middlewares.use((request, response, next) => {
|
|
if (request.url?.split("?", 1)[0] !== RUNTIME_CONFIG_PATH) {
|
|
next();
|
|
return;
|
|
}
|
|
|
|
response.statusCode = 200;
|
|
response.setHeader("Content-Type", "application/javascript; charset=utf-8");
|
|
response.setHeader("Cache-Control", "no-store");
|
|
response.end(renderRuntimeConfig(values));
|
|
});
|
|
};
|
|
|
|
return {
|
|
name: "drainage-runtime-config",
|
|
configureServer: installMiddleware,
|
|
configurePreviewServer: installMiddleware
|
|
};
|
|
}
|
|
|
|
export default defineConfig(({ mode }) => {
|
|
const env = loadEnv(mode, process.cwd(), "");
|
|
|
|
return {
|
|
plugins: [runtimeConfigPlugin(env), react(), tailwindcss()],
|
|
resolve: {
|
|
alias: {
|
|
"@": fileURLToPath(new URL("./src", import.meta.url))
|
|
}
|
|
},
|
|
test: {
|
|
environment: "jsdom",
|
|
globals: true,
|
|
setupFiles: ["./src/test/setup.ts"]
|
|
}
|
|
};
|
|
});
|