/**
 * Test bootstrap for tracker-web.
 *
 * Node 25 ships a global `localStorage` (Web Storage) that is a non-functional
 * stub unless started with `--localstorage-file=<path>` — 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<string, string> = {};
  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<string, unknown>)[name] as Storage | undefined;
  if (!current || typeof current.clear !== 'function') {
    Object.defineProperty(globalThis, name, {
      value: createMemoryStorage(),
      configurable: true,
      writable: true,
    });
  }
}
