Files
Aislo/resources/tester/helper_506_3_b07_save.cjs
T
eomsangdonandClaude Opus 5.5 17e6500cf6 fix(506-3 B07 · CAD 작은 흠): 저장 길 · 죽은 길 걷음 · CAD 되돌리기 · B09 인쇄 미리보기 · M02 도움말
- 1-A 도면 GET · 저장 PUT 한도 60 s · 저장 중 미리받기 쉼 · 끊긴 저장 = 목록 confirmed 로 판정
- 2 CAD 자동백업 열쇠 = b07:{프로젝트}:{도면} · 도각 편집 = b07-frame:{프로젝트} · [초기화] 같은 열쇠
- 3-1 [초기화] 물음 글 = 프로젝트 도각 그대로 · [도각 편집] → [기본 도각 복원] 안내
- 3-2 풀린 장 저장본 json · 수량표 찌꺼기 걷음(_write_manifest 한 곳)
- 5-1 확정 풀기 · 배치 · 축척 = mark_stage(save)
- 7-3 start_stage 가 DEV_UNLOCK 표식 남김
- 6-a navigateDrawing · onNavigate · hasPrev · hasNext 걷음 · 6-b cad-host-save 토글 걷음 · 4-2 B08 안 쓰는 글 11 걷음
- 6-f 특성 판 색 끌기 = 되돌리기 한 칸(paintNowCommitLater 한 벌) · 6-g LAYMRG 사본 길
- 4-1 B09 [인쇄 미리보기] = 저장 뒤 이동 · 단계 그대로 · 6-e M02 카드 도움말 DWG 한 줄
- 시험 test_506_3_* 둘 · cad/undo-506-3 · test_298_2_b07_buttons 열쇠 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:48:36 +09:00

107 lines
3.8 KiB
JavaScript

/* 506-3 B07 저장 길 헬퍼 — `_UI_Save` 를 Node 로 돌려 끊긴(abort) 저장 판정 · 저장 중 표 · 자동백업 열쇠 ·
* [초기화] 물음 글을 표준출력 JSON 한 벌로. 서버 길 · 알림 · 물음은 기록용 가짜.
*/
const fs = require("fs");
const path = require("path");
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
const B07 = path.join(__dirname, "..", "..", "B07_DesignDetail");
const calls = [];
let confirmError = null;
let listConfirmed = false;
let savingSeen = null;
let asked = "";
let Save;
const STUBS = {
"@ui/ui_template_elements": {
showToast: (message, kind) => calls.push(["toast", kind]),
showLoadingOverlay: () => calls.push(["overlay+"]),
hideLoadingOverlay: () => calls.push(["overlay-"]),
showConfirmDialog: async (message) => ((asked = message), calls.push(["ask"]), true),
},
"./B07_DesignDetail_Api_Fetch": {
confirmDesignDrawing: async (projectId, id) => {
calls.push(["confirm", id]);
savingSeen = Save.isSaving();
if (confirmError) throw confirmError;
},
fetchDesignDrawingList: async () => {
calls.push(["list"]);
return { drawings: [{ id: "cross_s1", confirmed: listConfirmed }] };
},
invalidateDesignDrawing: async () => undefined,
resetDesignDrawings: async () => ({ status: "success" }),
},
};
global.localStorage = { removeItem: (key) => calls.push(["drop", key]) };
global.location = { reload: () => calls.push(["reload"]) };
global.document = { querySelectorAll: () => [] };
function loadTs(file) {
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, (r) => STUBS[r] ?? {});
return box.exports;
}
Save = loadTs(path.join(B07, "B07_DesignDetail_UI_Save.ts"));
const storeOf = () => {
let dirty = true;
const tab = { id: "cross_s1", dirty };
return {
projectId: "p1",
drawings: [{ id: "cross_s1", kind: "cross", label: "횡단 1", confirmed: false }],
tabs: {
tabs: () => [tab],
active: () => tab,
markClean: (t) => ((t ?? tab).dirty = false),
anyDirty: () => tab.dirty,
},
current: () => ({ id: "cross_s1", kind: "cross", label: "횡단 1", confirmed: false }),
cadDirty: () => dirty,
setCadClean: () => (dirty = false),
requestCad: async () => ({ drawing: {}, quantityTable: null }),
isFrameEditing: () => false,
forget: () => undefined,
reload: async () => undefined,
};
};
const take = () => calls.splice(0).map((c) => c.join(":"));
const abort = () => new DOMException("The operation was aborted.", "AbortError");
(async () => {
const out = {};
out.scope = Save.recoveryScopeOf("p1", "cross_s1");
await Save.saveDrawingsNow(storeOf(), () => calls.push(["saved"]));
out.normal = { calls: take(), savingSeen, savingAfter: Save.isSaving() };
confirmError = abort();
listConfirmed = true;
await Save.saveDrawingsNow(storeOf(), () => calls.push(["saved"]));
out.abortSaved = { calls: take(), savingAfter: Save.isSaving() };
listConfirmed = false;
await Save.saveDrawingsNow(storeOf(), () => calls.push(["saved"]));
out.abortUnsaved = { calls: take(), savingAfter: Save.isSaving() };
confirmError = new Error("서버 오류");
listConfirmed = true;
await Save.saveDrawingsNow(storeOf(), () => calls.push(["saved"]));
out.otherError = take();
confirmError = null;
await Save.resetDrawings(storeOf());
out.reset = { calls: take(), asked };
process.stdout.write(JSON.stringify(out));
})().catch((error) => {
process.stderr.write(String(error && error.stack ? error.stack : error));
process.exit(1);
});