- 카드 = 로직 이름 · 결과단위 묶음 아래 입력 줄(이름 · 설명 · 단위 · 고르기/범위 · 자동값 흐리게) + 자리 상자 · 처음은 모두 안 씀 - 저장 = 집계표 [저장]에 이어 PUT input-links(자동저장 없음) · 읽기만 층은 상자 잠금 - 면적 · 재료로 고른 입력은 그 시트 알약 줄에 「로직 이름 · 입력 이름」 · 자재 모드에서도 [목록에서 빼기] 막음(고정) - 알약 줄 시험을 합계 줄 아래 자리에 맞춤(25-0 뒤 어긋난 것) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D2nUMUMTsqm93PbQtipo6c
57 lines
2.4 KiB
JavaScript
57 lines
2.4 KiB
JavaScript
/* 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),
|
|
}),
|
|
);
|