feat(map): add operational Cesium workspace

This commit is contained in:
DCCONSTRUCTIONS
2026-07-29 16:45:21 +03:00
parent 66f8d7a1fa
commit 8e3710b493
11 changed files with 1719 additions and 13 deletions
+64 -2
View File
@@ -1,15 +1,77 @@
import { createReadStream, cpSync, existsSync, statSync } from "node:fs";
import { createRequire } from "node:module";
import { dirname, resolve, sep } from "node:path";
import { fileURLToPath } from "node:url";
import { defineConfig, loadEnv } from "vite";
import { defineConfig, loadEnv, type Plugin } from "vite";
import react from "@vitejs/plugin-react";
import wasm from "vite-plugin-wasm";
const mapAdapterEntry = fileURLToPath(import.meta.resolve("@nodedc/map-cesium-react"));
const cesiumPackageJson = createRequire(mapAdapterEntry).resolve("cesium/package.json");
const cesiumBuildRoot = resolve(
dirname(cesiumPackageJson),
"Build",
"Cesium",
);
const cesiumRuntimeDirectories = ["Assets", "ThirdParty", "Widgets", "Workers"] as const;
function cesiumRuntimeAssets(): Plugin {
return {
name: "mission-core-cesium-runtime-assets",
config: () => ({
define: {
CESIUM_BASE_URL: JSON.stringify("/cesium"),
},
}),
configureServer(server) {
server.middlewares.use("/cesium", (request, response, next) => {
const pathname = new URL(request.url ?? "/", "http://localhost").pathname;
const target = resolve(cesiumBuildRoot, `.${decodeURIComponent(pathname)}`);
if (!target.startsWith(`${cesiumBuildRoot}${sep}`) || !existsSync(target)) {
next();
return;
}
const stats = statSync(target);
if (!stats.isFile()) {
next();
return;
}
if (target.endsWith(".js")) response.setHeader("Content-Type", "text/javascript");
else if (target.endsWith(".json")) response.setHeader("Content-Type", "application/json");
else if (target.endsWith(".css")) response.setHeader("Content-Type", "text/css");
else if (target.endsWith(".wasm")) response.setHeader("Content-Type", "application/wasm");
else if (target.endsWith(".png")) response.setHeader("Content-Type", "image/png");
else if (target.endsWith(".svg")) response.setHeader("Content-Type", "image/svg+xml");
else if (target.endsWith(".jpg") || target.endsWith(".jpeg")) {
response.setHeader("Content-Type", "image/jpeg");
}
createReadStream(target).pipe(response);
});
},
writeBundle(options) {
const outputDirectory = resolve(
process.cwd(),
typeof options.dir === "string" ? options.dir : "dist",
"cesium",
);
cesiumRuntimeDirectories.forEach((directory) => {
cpSync(
resolve(cesiumBuildRoot, directory),
resolve(outputDirectory, directory),
{ recursive: true },
);
});
},
};
}
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), "");
const apiTarget = env.VITE_API_TARGET || "http://127.0.0.1:8000";
return {
plugins: [react(), wasm()],
plugins: [react(), wasm(), cesiumRuntimeAssets()],
resolve: {
alias: {
"@mission-core/plugin-sdk": fileURLToPath(