/* 구조물 정의 → 칸 모양 단위검증 헬퍼(PLAN 48-3 · 48-4) — `B05_Profile_UI_Structures_Define.ts` 를 * 그 자리에서 트랜스파일해 Node 로 돌림(import 없는 파일). 결과는 표준출력에 JSON 한 벌. * 판 1 정의(`resources/master_template/구조물정의.json`)도 읽어 지금 화면과 같은지(차례 · 2열) 봄. */ const fs = require("fs"); const path = require("path"); const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); const ROOT = path.join(__dirname, "..", ".."); const src = fs.readFileSync( path.join(ROOT, "B05_Profile", "B05_Profile_UI_Structures_Define.ts"), "utf8", ); const js = ts.transpileModule(src, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; new Function("exports", "module", "require", js)(box.exports, box, require); const d = box.exports; const opt = (key, extra = {}) => ({ key, label: key, input: "select", choices: ["a", "b", "c"], default: null, ...extra, }); const type = { options: [ opt("p"), opt("q"), opt("r", { enabled: false }), opt("s", { visible: false }), opt("t"), ], spots: { t: { 줄: 1, 칸: 1, 너비: 2 }, p: { 줄: 2, 칸: 2 } }, rules: [ { 종류: "x", 만약: { 옵션: "p", 값들: ["a"] }, 그러면: { 옵션: "q", 선택지: ["b", "c"], 기본값: "c" }, }, { 종류: "x", 만약: { 옵션: "p", 값들: ["b"] }, 그러면: { 옵션: "q", 보이기: false } }, { 종류: "x", 만약: { 옵션: "q", 값들: ["c"] }, 그러면: { 옵션: "t", 보이기: false } }, ], }; const plain = (states) => Object.fromEntries([...states].map(([k, v]) => [k, v])); const def = JSON.parse( fs.readFileSync(path.join(ROOT, "resources", "master_template", "구조물정의.json"), "utf8"), ); const merged = d.withDefinition( def.types.map((t) => ({ ...t, groups: (def.그룹[t.type_id] ?? []).map((g) => ({ id: g.id })) })), def, ); const v1 = merged.map((t) => ({ id: t.type_id, same: JSON.stringify(d.orderedOptions(t).map((o) => o.key)) === JSON.stringify(t.options.filter((o) => o.enabled !== false).map((o) => o.key)), columns: d.columnsOf(t), anchor: d.showsAnchor(t), })); const out = { order: d.orderedOptions(type).map((o) => o.key), columns: d.columnsOf(type), columnsNone: d.columnsOf({}), placeT: d.gridPlace(type.spots.t, 2), placeNone: d.gridPlace(undefined, 2), stateA: plain(d.ruleStates(type, { p: "a", q: "c" })), stateB: plain(d.ruleStates(type, { p: "b", q: "c" })), defaultsA: d.ruleDefaults(type, "p", { p: "a" }), defaultsB: d.ruleDefaults(type, "p", { p: "b" }), stale: d.staleValues({ p: "a", old_key: 3, g1__length_m: 2 }, ["p", "g1__length_m"]), shapes: d.shapeFields({ 길이: { 받기: true, 뜻: "연장" }, 높이: { 받기: false }, 후: { 받기: true }, }), shapeKey: d.shapeKey("g1", "length_m"), withNull: d.withDefinition([{ type_id: "a", group: "A" }], null), withDef: d.withDefinition([{ type_id: "a", group: "A", groups: [{ id: "g1" }] }], { 구조물군: { A: "가 군" }, 종류: { a: { 기준측점: false, 동작: ["계곡통과시설"] } }, 그룹: { a: [{ id: "g1", 형상: { 길이: { 받기: true } } }] }, 배치: { a: { k: { 줄: 1, 칸: 1 } } }, 규칙: [ { ...type.rules[0], 종류: "a" }, { ...type.rules[1], 종류: "b" }, ], }), v1Types: v1.length, v1Same: v1.every((t) => t.same), v1Columns: [...new Set(v1.map((t) => t.columns))], v1Anchor: v1.every((t) => t.anchor), }; process.stdout.write(JSON.stringify(out));