/* 290-1 다른 프로젝트 열면 그 밖 프로젝트 캐시 지움 — 진짜 TS(b_page_state · b_project_switch)를 * 가짜 저장소 위에서 돌려 JSON 으로 냄(공용 storage · 브라우저 안 씀). */ const fs = require("fs"); const path = require("path"); const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); const ROOT = path.join(__dirname, "..", ".."); const load = (rel, requireStub) => { const js = ts.transpileModule(fs.readFileSync(path.join(ROOT, rel), "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const exports = {}; new Function("exports", "require", "window", js)(exports, requireStub, global.window); return exports; }; function fakeStorage() { const map = new Map(); return { get length() { return map.size; }, key: (i) => [...map.keys()][i] ?? null, getItem: (k) => (map.has(k) ? map.get(k) : null), setItem: (k, v) => map.set(k, String(v)), removeItem: (k) => map.delete(k), dump: () => Object.fromEntries(map), }; } global.window = { sessionStorage: fakeStorage(), localStorage: fakeStorage() }; const pageState = load("A00_Common/b_page_state.ts", () => ({})); const asked = []; const purged = []; let answer = true; const sw = load("A00_Common/b_project_switch.ts", (id) => { if (id.includes("b_page_state")) return pageState; if (id.includes("b_asset_cache")) return { purgeOtherProjects: async (p) => purged.push(p) }; return { showConfirmDialog: async (msg, ok, cancel) => (asked.push([msg, ok, cancel]), answer), }; }); const A = "aaaa1111"; const B = "bbbb2222"; const C = "cccc3333"; const SEED = { [`aislo:draft:structures:${A}`]: '[{"id":1}]', [`aislo:draft:crossw:${A}:12`]: '{"10":1}', [`b06:culvertopt:${A}:12`]: '{"x":1}', // 옛 키(초안) [`aislo:result:latest:${A}`]: '{"r":1}', [`aislo:draft:structures:${B}`]: '[{"id":2}]', [`aislo:result:section-detail:${B}:7`]: '{"d":1}', [`aislo:result:latest:${C}`]: '{"r":3}', [`aislo:draft:pipes:${C}`]: "{}", // 빈 초안 = 고침 없음 [`b09:page-cache:${C}`]: "1", // 등록표 밖 페이지 칸 "aislo.otp-pending": "x", // 프로젝트와 무관 }; const seed = (extra = {}) => { global.window.sessionStorage = fakeStorage(); Object.entries({ ...SEED, ...extra }).forEach(([k, v]) => global.window.sessionStorage.setItem(k, v), ); asked.length = 0; purged.length = 0; }; const keys = () => Object.keys(global.window.sessionStorage.dump()).sort(); const nameOf = async (id) => `이름-${id}`; global.window.localStorage.setItem(`aislo:pref:routeedit-view:${A}`, "{}"); (async () => { const out = {}; seed(); answer = true; await sw.enterProject(B, nameOf); out.drop = { keys: keys(), asked: [...asked], purged: [...purged] }; seed(); answer = false; await sw.enterProject(B, nameOf); out.keep = { keys: keys(), asked: asked.length }; seed({ "aislo:entered-project": B }); await sw.enterProject(B, nameOf); out.same = { keys: keys(), asked: asked.length, purged: purged.length }; out.pref = global.window.localStorage.getItem(`aislo:pref:routeedit-view:${A}`); out.plan = sw.planProjectPurge(SEED, B).draftProjects; process.stdout.write(JSON.stringify(out)); })();