// setup.js —— B1 归属,vitest 全局 setup(vitest.config.js setupFiles)。 // 环境适配(jsdom 25 + Node ≥22 组合下 window.localStorage 为 undefined): // - Node ≥22 自带实验性 globalThis.localStorage(未配 --localstorage-file 时为 undefined),会遮蔽 jsdom 实现 // - jsdom 25 在较新 Node 上 window.localStorage 亦可能缺失 // 统一策略:window.localStorage 缺失时注入内存实现,并将其同时暴露到 globalThis。 class MemoryStorage { constructor() { this._m = new Map(); } get length() { return this._m.size; } key(i) { return [...this._m.keys()][i] ?? null; } getItem(k) { const key = String(k); return this._m.has(key) ? this._m.get(key) : null; } setItem(k, v) { this._m.set(String(k), String(v)); } removeItem(k) { this._m.delete(String(k)); } clear() { this._m.clear(); } } if (typeof window !== 'undefined') { let storage = window.localStorage; if (!storage) { storage = new MemoryStorage(); try { Object.defineProperty(window, 'localStorage', { value: storage, configurable: true }); } catch { window.localStorage = storage; } } try { Object.defineProperty(globalThis, 'localStorage', { value: storage, configurable: true }); } catch { globalThis.localStorage = storage; } }