Files
Aislo/resources/tester/helper_b05_structures_define.cjs
T
eomsangdonandClaude Opus 5.5 281c71b55b refactor(logic): 348-1 순수 계산 TS 49 파일 <페이지>/logic/ 로 옮김 — 이름 앞머리 그대로 · 동작 고침 없음
- 옮김: B04 2 · B05 23 · B06 11 · A00_Common/design 13 (9,299 줄) · 이미 logic/ 에 있던 16 파일 그대로
- 안 옮김: 묶음 입구(package.json build:*) · 파이썬 · 순수지만 계산 아닌 8 (보기 결선 · 콜백 · API 타입 · 갈아끼움 알림판)
- import 266 줄(142 파일) · 시험 · 주석 · 짝 표시 문자열 경로 고침 · B05 · B06 CLAUDE.md 짝 줄 logic/
- 시험 도우미 새 경로: 가짜 require 열쇠 · B05()/B06() 부름 · 형제 import 자리 · tsc 묶어 돌리는 시험 · 정규식 · rglob
- design_view_cross 줄 한도 시험 685 → 688 (긴 import 경로 줄바꿈 3줄)
- 확인: typecheck 0 · 서버 묶음 넷(corridor · server-calc · b07-extent · b07-note) 다시 지어 코드 같음(//#region 경로 주석만 다름) · 관련 시험 270 파일 — 남은 실패 19 는 옮기기 전과 같음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL
2026-10-16 13:44:50 +09:00

100 lines
3.6 KiB
JavaScript

/* 구조물 정의 → 칸 모양 단위검증 헬퍼(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", "logic", "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));