import { afterEach } from 'vitest'; import { cleanup } from '@testing-library/react'; afterEach(() => cleanup()); function createStorage(): Storage { const values = new Map(); return { get length() { return values.size; }, clear: () => values.clear(), getItem: (key) => values.get(key) ?? null, key: (index) => Array.from(values.keys())[index] ?? null, removeItem: (key) => values.delete(key), setItem: (key, value) => values.set(key, String(value)) }; } Object.defineProperty(window, 'localStorage', { configurable: true, value: createStorage() }); Object.defineProperty(window, 'sessionStorage', { configurable: true, value: createStorage() }); Object.defineProperty(window, 'matchMedia', { writable: true, value: (query: string) => ({ matches: false, media: query, onchange: null, addListener: () => undefined, removeListener: () => undefined, addEventListener: () => undefined, removeEventListener: () => undefined, dispatchEvent: () => false }) }); class ResizeObserverStub { observe() {} unobserve() {} disconnect() {} } Object.defineProperty(window, 'ResizeObserver', { writable: true, value: ResizeObserverStub }); Object.defineProperty(globalThis, 'ResizeObserver', { writable: true, value: ResizeObserverStub }); const getComputedStyle = window.getComputedStyle.bind(window); window.getComputedStyle = (element: Element) => getComputedStyle(element); if (!window.requestAnimationFrame) { window.requestAnimationFrame = (callback) => window.setTimeout(callback, 0); window.cancelAnimationFrame = (id) => window.clearTimeout(id); }