#!/usr/bin/env node "use strict"; const fs = require("fs"); const path = require("path"); const { readAreaConfig } = require("./lib/area-config"); const { compileArea, parseArgs } = require("./compile-native-roads"); const repoRoot = path.resolve(__dirname, ".."); function checkArea(configPath, options = {}) { if (options.compile) compileArea(configPath); const area = readAreaConfig(configPath, { repoRoot }); const root = area.outputs.nativeRoadDir; const compiledPath = path.join(root, "compiled.json"); if (!fs.existsSync(compiledPath)) throw new Error(`Native road output is missing: ${compiledPath}`); const compiled = readJson(compiledPath); const connectors = readJson(path.join(root, "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: area.id, 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")); } function main() { const args = parseArgs(process.argv.slice(2)); const configPath = path.resolve(args.config || path.join(repoRoot, "config", "areas", "nantaizi-lake-innovation-valley.json")); const result = checkArea(configPath, { compile: args.compile === "true" }); console.log(`NATIVE_ROAD_CHECK_DONE ${JSON.stringify(result)}`); if (!result.ok) process.exitCode = 1; } if (require.main === module) main(); module.exports = { checkArea };