Ctrl K
ComunidadGuías…

skyvern-frontend/vitest.setup.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { cleanup } from "@testing-library/react";
import { afterEach } from "vitest";

type StorageRecord = Record<string, string>;

const createMemoryStorage = (): Storage => {
  let values: StorageRecord = {};

  return {
    get length() {
      return Object.keys(values).length;
    },
    clear() {
      values = {};
    },
    getItem(key: string) {
      return Object.prototype.hasOwnProperty.call(values, key)
        ? (values[key] ?? null)
        : null;
    },
    key(index: number) {
      return Object.keys(values)[index] ?? null;
    },
    removeItem(key: string) {
      delete values[key];
    },
    setItem(key: string, value: string) {
      values[key] = String(value);
    },
  };
};

const localStorageNeedsShim =
  typeof globalThis.localStorage?.clear !== "function" ||
  typeof window.localStorage?.clear !== "function" ||
  typeof globalThis.localStorage?.setItem !== "function" ||
  typeof window.localStorage?.setItem !== "function";

if (localStorageNeedsShim) {
  const storage = createMemoryStorage();

  Object.defineProperty(globalThis, "localStorage", {
    configurable: true,
    value: storage,
  });
  Object.defineProperty(window, "localStorage", {
    configurable: true,
    value: storage,
  });
}

// Radix focus primitives create CustomEvent via the global constructor, then
// dispatch on jsdom elements. Keep those constructors from the same realm.
if (typeof window !== "undefined") {
  Object.defineProperty(globalThis, "Event", {
    configurable: true,
    value: window.Event,
  });
  Object.defineProperty(globalThis, "CustomEvent", {
    configurable: true,
    value: window.CustomEvent,
  });
}

// Radix FocusScope schedules a setTimeout(..., 0) on unmount that dispatches a
// CustomEvent. Flush it within the test's realm (cleanup then one macrotask) so
// it can't fire during teardown against a swapped realm and red the run.
afterEach(async () => {
  cleanup();
  await new Promise((resolve) => setTimeout(resolve, 0));
});