/** * Test bootstrap for tracker-web. * * Node 25 ships a global `localStorage` (Web Storage) that is a non-functional * stub unless started with `--localstorage-file=` — accessing it yields an * object with no `getItem`/`setItem`/`clear`. That global shadows the DOM test * environment's storage, so tests (and the code under test) that use * `localStorage` break with "localStorage.clear is not a function". * * Install a real in-memory Web Storage over it when the active one is missing the * Storage API. Tests that stub localStorage themselves (vi.stubGlobal) still work * — this only provides the baseline the rest of the suite assumes. */ function createMemoryStorage(): Storage { let store: Record = {}; return { get length() { return Object.keys(store).length; }, clear() { store = {}; }, getItem(key: string) { return Object.prototype.hasOwnProperty.call(store, key) ? store[key] : null; }, setItem(key: string, value: string) { store[String(key)] = String(value); }, removeItem(key: string) { delete store[key]; }, key(index: number) { return Object.keys(store)[index] ?? null; }, } as Storage; } for (const name of ['localStorage', 'sessionStorage'] as const) { const current = (globalThis as Record)[name] as Storage | undefined; if (!current || typeof current.clear !== 'function') { Object.defineProperty(globalThis, name, { value: createMemoryStorage(), configurable: true, writable: true, }); } }