feat(workbench): integrate runtime data and map tooling

This commit is contained in:
2026-09-22 10:45:46 +08:00
parent bf44cc0f25
commit bebcf2a06c
163 changed files with 15642 additions and 1312 deletions
+40 -1
View File
@@ -14,6 +14,12 @@ describe("runtime frontend configuration", () => {
TJWATER_GEOSERVER_WORKSPACE: "project-a",
TJWATER_SERVER_API_BASE_URL: "https://server.example.test",
TJWATER_AGENT_API_BASE_URL: "https://agent.example.test",
TJWATER_WORKBENCH_RUNTIME_MODE: "backend",
TJWATER_PERIPHERAL_SAMPLE_API_BASE_URL: "https://peripheral.example.test/",
TJWATER_PERIPHERAL_SAMPLE_TIME_MODE: "recent",
TJWATER_PERIPHERAL_SAMPLE_DEMO_START: "2026-04-30T08:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_DEMO_END: "2026-04-30T16:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_RECENT_HOURS: "6",
TJWATER_ENABLE_DEV_PANEL: "true",
TJWATER_ENABLE_MSW: "false"
})
@@ -26,6 +32,12 @@ describe("runtime frontend configuration", () => {
TJWATER_GEOSERVER_WORKSPACE: "project-a",
TJWATER_SERVER_API_BASE_URL: "https://server.example.test",
TJWATER_AGENT_API_BASE_URL: "https://agent.example.test",
TJWATER_WORKBENCH_RUNTIME_MODE: "backend",
TJWATER_PERIPHERAL_SAMPLE_API_BASE_URL: "https://peripheral.example.test",
TJWATER_PERIPHERAL_SAMPLE_TIME_MODE: "recent",
TJWATER_PERIPHERAL_SAMPLE_DEMO_START: "2026-04-30T08:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_DEMO_END: "2026-04-30T16:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_RECENT_HOURS: 6,
TJWATER_ENABLE_DEV_PANEL: true,
TJWATER_ENABLE_MSW: false
});
@@ -35,11 +47,24 @@ describe("runtime frontend configuration", () => {
expect(parseRuntimeConfig({ TJWATER_AUTH_MODE: "disabled" })).toMatchObject({
TJWATER_AUTH_MODE: "disabled",
TJWATER_KEYCLOAK_CLIENT_ID: "next-tjwater",
TJWATER_WORKBENCH_RUNTIME_MODE: "auto",
TJWATER_PERIPHERAL_SAMPLE_API_BASE_URL: "",
TJWATER_PERIPHERAL_SAMPLE_TIME_MODE: "demo",
TJWATER_PERIPHERAL_SAMPLE_DEMO_START: "2026-09-17T00:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_DEMO_END: "2026-09-17T12:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_RECENT_HOURS: 8,
TJWATER_ENABLE_DEV_PANEL: false,
TJWATER_ENABLE_MSW: false
});
});
it("accepts the explicit backend history mode", () => {
expect(parseRuntimeConfig({
TJWATER_AUTH_MODE: "disabled",
TJWATER_WORKBENCH_RUNTIME_MODE: "history"
}).TJWATER_WORKBENCH_RUNTIME_MODE).toBe("history");
});
it("requires a Realm issuer when authentication is enabled", () => {
expect(() => parseRuntimeConfig({ TJWATER_AUTH_MODE: "required" })).toThrow();
});
@@ -51,7 +76,8 @@ describe("runtime frontend configuration", () => {
it.each([
["TJWATER_MAP_URL", "file:///etc/passwd"],
["TJWATER_AGENT_API_BASE_URL", "https://user:secret@agent.example.test"],
["TJWATER_AGENT_API_BASE_URL", "https://agent.example.test/#secret"]
["TJWATER_AGENT_API_BASE_URL", "https://agent.example.test/#secret"],
["TJWATER_PERIPHERAL_SAMPLE_API_BASE_URL", "https://user:secret@peripheral.example.test"]
])("rejects unsafe browser runtime address %s", (key, value) => {
expect(() => parseRuntimeConfig({ TJWATER_AUTH_MODE: "disabled", [key]: value })).toThrow();
});
@@ -65,4 +91,17 @@ describe("runtime frontend configuration", () => {
})
).toThrow();
});
it("rejects an invalid or oversized peripheral demo window", () => {
expect(() => parseRuntimeConfig({
TJWATER_AUTH_MODE: "disabled",
TJWATER_PERIPHERAL_SAMPLE_DEMO_START: "2026-04-30T16:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_DEMO_END: "2026-04-30T08:00:00Z"
})).toThrow(/演示窗口/);
expect(() => parseRuntimeConfig({
TJWATER_AUTH_MODE: "disabled",
TJWATER_PERIPHERAL_SAMPLE_DEMO_START: "2026-04-01T00:00:00Z",
TJWATER_PERIPHERAL_SAMPLE_DEMO_END: "2026-04-30T00:00:00Z"
})).toThrow(/演示窗口/);
});
});