- 헬퍼 동작 그대로(풀이 함수 본문은 옮겨 담음) · 제품 코드 안 고침 - 확인: 이 묶음 헬퍼를 쓰는 시험 236 개 전 230 통과 → 후 230 통과 (시험별 junit 대조 · 어긋남 0) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
60 lines
2.1 KiB
JavaScript
60 lines
2.1 KiB
JavaScript
/* 345-3 → 346-4 Ctrl+Z · Y 헬퍼 — 「마지막에 만진 판 하나」(`_RouteEdit_UndoOwner`)는 346-4 한 줄 되돌리기로
|
|
* 없어짐. 평면 이력 단추(`_RouteEdit_History.bindHistoryControls`)가 단축키를 안 듣는지 가짜 창에서 봄 —
|
|
* 단축키는 종단도(`_Profile_Panel_Tools`)가 페이지 사진첩 하나로 받음. 결과는 JSON 한 벌(표준출력).
|
|
*/
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const { makeLoader } = require("./helper_ts_stub_loader.cjs");
|
|
|
|
const ROOT = path.join(__dirname, "..", "..");
|
|
const listeners = {};
|
|
global.window = {
|
|
addEventListener: (type, fn) => (listeners[type] ??= new Set()).add(fn),
|
|
removeEventListener: (type, fn) => listeners[type]?.delete(fn),
|
|
};
|
|
const fire = (type, event) => [...(listeners[type] ?? [])].forEach((fn) => fn(event));
|
|
|
|
const { loadTs } = makeLoader({
|
|
root: ROOT,
|
|
requireFor: (full) => (request) =>
|
|
request.startsWith(".")
|
|
? loadTs(`${path.resolve(path.dirname(full), request)}.ts`)
|
|
: require(request),
|
|
});
|
|
|
|
const page = path.join(ROOT, "B05_Profile");
|
|
const { bindHistoryControls } = loadTs(path.join(page, "B05_Profile_UI_RouteEdit_History.ts"));
|
|
|
|
const button = () => ({ disabled: false, addEventListener: () => undefined });
|
|
const buttons = { '[data-act="undo"]': button(), '[data-act="redo"]': button() };
|
|
const overlay = { querySelector: (sel) => buttons[sel] };
|
|
const plan = [];
|
|
const history = {
|
|
undo: () => (plan.push("undo"), { tag: "u" }),
|
|
redo: () => (plan.push("redo"), { tag: "r" }),
|
|
canUndo: () => true,
|
|
canRedo: () => true,
|
|
};
|
|
const controls = bindHistoryControls({
|
|
overlay,
|
|
getHistory: () => history,
|
|
restore: () => undefined,
|
|
});
|
|
|
|
const key = (k, shift = false) =>
|
|
fire("keydown", { ctrlKey: true, key: k, code: "", shiftKey: shift, preventDefault() {} });
|
|
const press = (cls) =>
|
|
fire("pointerdown", { target: { closest: (sel) => (sel === `.${cls}` ? {} : null) } });
|
|
|
|
const out = {};
|
|
controls.listen(true);
|
|
press("b05-routeedit");
|
|
key("z");
|
|
key("y");
|
|
key("z", true);
|
|
out.plan = [...plan];
|
|
out.keydownListeners = listeners.keydown?.size ?? 0;
|
|
controls.listen(false);
|
|
controls.dispose();
|
|
console.log(JSON.stringify(out));
|