/* 298-2 B07 좌측 [저장] · [초기화] 헬퍼 — `_UI_Save` 의 saveDrawingsNow · resetDrawings 를 Node 로 돌려 * 부른 차례(물음 · 오버레이 · 창구 · 자동백업 지움 · 다시 읽음)를 표준출력 JSON 한 벌로. * TS 는 그 자리에서 트랜스파일 · 서버 길 · 알림 · 물음은 기록용 가짜. */ const fs = require("fs"); const path = require("path"); const { makeLoader } = require("./helper_ts_stub_loader.cjs"); const B07 = path.join(__dirname, "..", "..", "B07_DesignDetail"); const calls = []; let answer = true; let failReset = false; const STUBS = { "@ui/ui_template_elements": { showToast: (message, kind) => calls.push(["toast", kind]), showLoadingOverlay: () => calls.push(["overlay+"]), hideLoadingOverlay: () => calls.push(["overlay-"]), showConfirmDialog: async () => (calls.push(["ask"]), answer), }, "./B07_DesignDetail_Api_Fetch": { confirmDesignDrawing: async (projectId, id) => calls.push(["confirm", id]), invalidateDesignDrawing: async () => calls.push(["invalidate"]), resetDesignDrawings: async (projectId) => { calls.push(["reset", projectId]); if (failReset) throw new Error("서버 오류"); return { status: "success", released: 1, cleared: [], provisional: 0 }; }, }, }; const storage = new Map(); global.localStorage = { removeItem: (key) => (calls.push(["drop", key]), storage.delete(key)), }; global.location = { reload: () => calls.push(["reload"]) }; global.document = { querySelectorAll: () => [] }; const { loadTs } = makeLoader({ root: path.join(__dirname, "..", ".."), cache: false, requireFor: (full) => { return (r) => STUBS[r] ?? {}; }, }); const Save = loadTs(path.join(B07, "B07_DesignDetail_UI_Save.ts")); const storeOf = (over = {}) => { let dirty = !!over.cadDirty; const tab = { id: "cross_s1", dirty }; return { projectId: "p1", drawings: [ { id: "cover", kind: "cover", label: "표지", confirmed: false }, { 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: () => !!over.frame, forget: () => undefined, reload: async () => undefined, }; }; const take = () => calls.splice(0).map((c) => c.join(":")); (async () => { const out = {}; let saved = 0; const onSaved = () => saved++; await Save.saveDrawingsNow(storeOf(), onSaved); out.saveNone = { calls: take(), saved }; await Save.saveDrawingsNow(storeOf({ cadDirty: true }), onSaved); out.saveEdited = { calls: take(), saved }; await Save.resetDrawings(storeOf({ cadDirty: true })); out.reset = take(); answer = false; await Save.resetDrawings(storeOf()); answer = true; out.resetCancel = take(); failReset = true; await Save.resetDrawings(storeOf()); failReset = false; out.resetFail = take(); await Save.resetDrawings(storeOf({ frame: true })); out.resetFrame = take(); process.stdout.write(JSON.stringify(out)); })().catch((error) => { process.stderr.write(String(error && error.stack ? error.stack : error)); process.exit(1); });