28 lines
1.8 KiB
JavaScript
28 lines
1.8 KiB
JavaScript
"use strict";
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
function checkOutput({ areaId, outDir }) {
|
|
if (typeof areaId !== "string" || !areaId) throw new Error("RoadCompilerCheckInput.areaId must be a non-empty string");
|
|
if (typeof outDir !== "string" || !outDir) throw new Error("RoadCompilerCheckInput.outDir must be a non-empty string");
|
|
const compiledPath = path.join(outDir, "compiled.json");
|
|
if (!fs.existsSync(compiledPath)) throw new Error(`Native road output is missing: ${compiledPath}`);
|
|
const compiled = readJson(compiledPath);
|
|
const connectors = readJson(path.join(outDir, "layers", "connectors.geojson"));
|
|
const published = new Set(connectors.features.map((feature) => feature.properties.movement_id));
|
|
const failures = [];
|
|
for (const movement of compiled.movements || []) {
|
|
if (movement.geometryPublished && !published.has(movement.id)) failures.push(`Published movement has no connector: ${movement.id}`);
|
|
if (!movement.geometryPublished && published.has(movement.id)) failures.push(`Non-published movement has a connector: ${movement.id}`);
|
|
if (!movement.geometryStatus) failures.push(`Movement has no geometry status: ${movement.id}`);
|
|
}
|
|
const errors = (compiled.diagnostics || []).filter((item) => item.severity === "error");
|
|
const warnings = (compiled.diagnostics || []).filter((item) => item.severity === "warning");
|
|
return { schema: "native-road-check/v1", areaId, ok: failures.length === 0 && errors.length === 0, movementCount: (compiled.movements || []).length, connectorCount: connectors.features.length, errors: errors.map((item) => ({ id: item.id, rule: item.rule, message: item.message })), warningCount: warnings.length, failures };
|
|
}
|
|
|
|
function readJson(file) { return JSON.parse(fs.readFileSync(file, "utf8")); }
|
|
|
|
module.exports = { checkOutput };
|