feat(map): add operational Cesium workspace
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user