/* M02 「선택 입력」 카드 셈(`M02_MasterTemplete_Inputs_Model.ts`) 단위검증 헬퍼 — * 그 자리에서 트랜스파일해 Node 로 돌리고 값을 JSON 으로 낸다. */ const fs = require("fs"); const path = require("path"); const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); const file = path.join(__dirname, "..", "..", "M02_MasterTemplete", "M02_MasterTemplete_Inputs_Model.ts"); const js = ts.transpileModule(fs.readFileSync(file, "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; new Function("exports", "module", "require", js)(box.exports, box, require); const m = box.exports; // 같은 이름(높이)의 입력이 두 로직에 있음 const list = { 일위대가: "UA000001", 로직: [ { 로직: "GC1", 이름: "돌쌓기", 입력: [ { 이름: "높이", 단위: "m", 범위: [0.5, 5], 자동값: 1.2 }, { 이름: "종류", 고르기: ["막돌", "견치돌"] }, ], }, { 로직: "GC2", 이름: "타설", 입력: [{ 이름: "높이", 범위: { 최소: 0, 최대: 3 } }, { 이름: "배합" }] }, ], 빠진로직: [], }; const seats = m.seatsOf({ 판: "v1", 줄: [ { 로직: "GC1", 입력: "높이", 자리: "면적", 알약: "입력|GC1|높이" }, { 로직: "GC2", 입력: "높이", 자리: "면적" }, { 로직: "GC2", 입력: "배합", 자리: "재료" }, { 로직: "GC1", 입력: "종류", 자리: null }, { 로직: "GC9", 입력: "없는것", 자리: "선택" }, ], }); const links = { 판: "v1", 줄: [...[...seats].map(([k, 자리]) => ({ 로직: k.split("|")[0], 입력: k.split("|")[1], 자리 }))] }; const pick = new Map(seats); pick.set(m.inputKey("GC1", "종류"), "선택"); process.stdout.write( JSON.stringify({ keys: [m.inputKey("GC1", "높이"), m.pillKey("GC2", "높이")], seatKeys: [...seats.keys()], count: m.countOf(list), area: m.pillsOf(list, links, "면적").map((p) => [p.키, p.이름, p.단위 ?? null, p.고정]), material: m.pillsOf(list, links, "재료").map((p) => [p.키, p.이름]), lines: m.linesOf(list, pick), none: m.linesOf(list, new Map()), hints: list.로직.flatMap((l) => l.입력).map((i) => [m.valueHint(i), m.autoText(i)]), seatOptions: m.SEAT_OPTIONS.map((o) => o.label), }), );