/* 344-2 노선 짝 거울 — 진짜 TS(`logic/B05_Profile_Grade_Ground` · `logic/B05_Profile_Grade_Carry` · * `common_util_route_follow`)를 Node 로 돌림. 입력 argv[2] JSON(파이썬과 같은 값) · 표준출력 JSON 한 벌. */ const fs = require("fs"); const path = require("path"); const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const ROOT = path.join(__dirname, "..", ".."); function loadTs(file, stubs = {}) { return makeLoader({ root: ROOT, cache: false, requireFor: (full) => (request) => { if (stubs[request]) return stubs[request]; throw new Error(`stub 없음: ${request} (${file})`); }, }).loadTs(path.join(ROOT, file)); } const straightJudge = loadTs("B05_Profile/logic/B05_Profile_Profile_Straight.ts"); const curveLaw = loadTs("B05_Profile/logic/B05_Profile_Profile_CurveLaw.ts"); const pivot = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Pivot.ts", { "./B05_Profile_Profile_Straight": straightJudge, }); const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts", { "./B05_Profile_UI_Profile_Pivot": pivot, "./B05_Profile_Profile_Straight": straightJudge, "./B05_Profile_Profile_CurveLaw": curveLaw, }); const ground = loadTs("B05_Profile/logic/B05_Profile_Grade_Ground.ts", { "./B05_Profile_Profile_CurveLaw": curveLaw, "./B05_Profile_UI_Profile_Alignment": alignment, }); const carry = loadTs("B05_Profile/logic/B05_Profile_Grade_Carry.ts", { "./B05_Profile_UI_Profile_Alignment": alignment, }); const catalog = require("./helper_322_catalog_module.cjs"); const station = loadTs("common_util/common_util_structure_station.ts", { "./common_util_structure_catalog": catalog, }); const follow = loadTs("common_util/common_util_route_follow.ts", { "./common_util_structure_station": station, }); const input = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); const out = { ground: input.ground.map((item) => ground.groundFollowingBasePvi(item)), carry: input.carry.map((item) => { const span = carry.changedSpan(item.old_xy, item.new_xy); return { span, result: span ? { basePvi: carry.carryBase(item.old_xy, item.new_xy, item.base_pvi, item.ground_pvi), edits: carry.carryEdits( item.old_xy, item.new_xy, item.base_pvi, item.edits, item.stations, 10, ), } : null, }; }), pipes: input.pipes.map((item) => follow.projectPipePoints(item.points, item.line)), structures: input.structures.map((item) => follow.followStructures(item.items, item.line)), driftMax: follow.STRUCTURE_ROUTE_DRIFT_MAX_M, }; process.stdout.write(JSON.stringify(out));