/* PLAN 349-0n 헬퍼 — 계산 묶음 cross 단계의 [확정] 보정(포장 구간 · 세월교 노면 하강 · 사토장). * 진짜 TS(`B06_Section_Cross_Stage` · `B06_Section_Cross_Enforce`)를 트랜스파일해 Node 로 돌림. * 입력 argv[2] JSON(측점 · 계획고 · 관 · 구조물 · 판정 누가거리) · 결과 = 표준출력 JSON. * 짝 = `test_349_0n_cross_enforce_mirror.py`. */ const fs = require("fs"); const path = require("path"); const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); const CATALOG = require("./helper_322_catalog_module.cjs"); const ROOT = path.join(__dirname, "..", ".."); const job = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); const cache = new Map(); function loadTs(full) { if (cache.has(full)) return cache.get(full); const js = ts.transpileModule(fs.readFileSync(full, "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; cache.set(full, box.exports); const localRequire = (request) => { if (CATALOG.isCatalogRequest(request)) return CATALOG; if (request.endsWith(".json")) return require(path.join(path.dirname(full), request)); const bare = request.replace(/\.js$/, ""); if (bare.startsWith("@util/")) return loadTs(path.join(ROOT, "common_util", `${bare.slice(6)}.ts`)); if (bare.startsWith(".")) return loadTs(path.join(path.dirname(full), `${bare}.ts`)); return require(request); }; new Function("exports", "module", "require", js)(box.exports, box, localRequire); return box.exports; } const load = (...parts) => loadTs(path.join(ROOT, ...parts)); const enforce = load("B06_Section", "logic", "B06_Section_Cross_Enforce.ts"); const crossMod = load("B06_Section", "logic", "B06_Section_Cross_Stage.ts"); const ranges = enforce.facilityRanges(job.pipes, job.structures); const at = job.probe.map((chainage) => ({ chainage, ...enforce.facilityAt(ranges, chainage) })); const profile = { stations: job.stations.map((s) => ({ chainage_m: s.chainageM, plan_elevation_m: s.elevation })), samples: job.stations.map((s) => ({ chainage_m: s.chainageM, elevation_m: s.elevation })), }; const ground = { stations: job.stations }; function runStage(facilities) { const cross = crossMod.createCrossStage(); const started = process.hrtime.bigint(); const out = cross.stage({ generation: 1, range: null, inputs: { cross: { standard: job.standard, byKey: job.byKey, rockBoundaryDefaultM: job.rockBoundaryDefaultM ?? null, }, pipes: facilities ? job.pipes : null, structures: facilities ? job.structures : null, }, out: { profile, ground }, prev: null, }); const ms = Number(process.hrtime.bigint() - started) / 1e6; return { ms, byKey: Object.fromEntries(Object.entries(out.byKey).map(([k, v]) => [k, v.detail])), }; } process.stdout.write(JSON.stringify({ at, stage: runStage(true), carried: runStage(false) }));