# @suaveplan/testing-dom - DOM/React testing — vitest+bun-test conditional re-exports, createTestConfig, polyfills, render helpers, accessibility-first queries, jest-dom matchers, user-event v14 ## Summary DOM and React component testing utilities for Suaveplan. Provides a single install that covers vitest config generation with WSL2-safe defaults, `@testing-library/react` render helpers, accessibility-first query aliases, `@testing-library/jest-dom` matchers, user-event v14 setup, and a dual-runner shim that routes between vitest and `bun:test` via package.json conditional exports. ## Documentation tree - [config](./src/config/config.md) — _(no submodules)_ - detect-environment — `detectEnvironment` probes the… - [bun-test-config](./src/config/bun-test-config.md) — `createBunTestConfig` produces a minimal `bun test` configuration object with the same polyfill preload and environment… - [config](./src/config/config.md) — _(no submodules)_ - detect-environment — `detectEnvironment` probes the… - [detect-environment](./src/config/detect-environment.md) — `detectEnvironment` probes the current runtime and returns the most-specific test environment available: `"happy-dom"`… - [detect-runner](./src/config/detect-runner.md) — `detectRunner` tells the caller whether the currently-executing process is vitest or bun-test. It's used by the runner-… - [vitest-config](./src/config/vitest-config.md) — `createVitestConfig` builds a ready-to-use vitest test block with WSL2-safe defaults and the package's polyfills preloa… - [codes](./src/errors/codes.md) — `TESTING_DOM_CODES` is the package-local error code registry for `@suaveplan/testing-dom`. All codes share the `TESTING… - [testing-dom-error](./src/errors/testing-dom-error.md) — `TestingDomError` is the single concrete error class thrown by `@suaveplan/testing-dom`. It intentionally does NOT exte… - [matchers](./src/matchers/matchers.md) — _(no submodules)_ - [matchers](./src/matchers/matchers.md) — _(no submodules)_ - [observability](./src/observability/instrumented.md) — _(no submodules)_ - [instrumented](./src/observability/instrumented.md) — _(no submodules)_ - [queries](./src/queries/queries.md) — _(no submodules)_ - [queries](./src/queries/queries.md) — _(no submodules)_ - [render](./src/render/render-component.md) — _(no submodules)_ - [render-component](./src/render/render-component.md) — _(no submodules)_ - [runner](./src/runner/runner.md) — _(no submodules)_ - vitest — The `runner/vitest` module re-exports vite… - [bun-test](./src/runner/bun-test.md) — The `runner/bun-test` module re-exports bun-test's primitives (`describe`, `it`, `test`, `expect`, `beforeAll`, `before… - [mocks](./src/runner/mocks.md) — The `runner/mocks` module offers a small set of dependency-injection friendly mock helpers that work identically under… - [runner](./src/runner/runner.md) — _(no submodules)_ - vitest — The `runner/vitest` module re-exports vite… - [vitest](./src/runner/vitest.md) — The `runner/vitest` module re-exports vitest's `describe`, `it`, `test`, `expect`, `beforeAll`, `beforeEach`, `afterAll… - [setup](./src/setup/polyfills.md) — _(no submodules)_ - [polyfills](./src/setup/polyfills.md) — _(no submodules)_ - [user](./src/user/setup-user.md) — _(no submodules)_ - [setup-user](./src/user/setup-user.md) — _(no submodules)_ - detect-environment — `detectEnvironment` probes the… - [bun-test-config](./src/config/bun-test-config.md) — `createBunTestConfig` produces a minimal `bun test` configuration object with the same polyfill preload and environment… - [config](./src/config/config.md) — _(no submodules)_- detect-environment — `detectEnvironment` probes the… - [detect-environment](./src/config/detect-environment.md) — `detectEnvironment` probes the current runtime and returns the most-specific test environment available: `"happy-dom"`… - [detect-runner](./src/config/detect-runner.md) — `detectRunner` tells the caller whether the currently-executing process is vitest or bun-test. It's used by the runner-… - [vitest-config](./src/config/vitest-config.md) — `createVitestConfig` builds a ready-to-use vitest test block with WSL2-safe defaults and the package's polyfills preloa… - [codes](./src/errors/codes.md) — `TESTING_DOM_CODES` is the package-local error code registry for `@suaveplan/testing-dom`. All codes share the `TESTING… - [testing-dom-error](./src/errors/testing-dom-error.md) — `TestingDomError` is the single concrete error class thrown by `@suaveplan/testing-dom`. It intentionally does NOT exte… - [matchers](./src/matchers/matchers.md) — _(no submodules)_- [matchers](./src/matchers/matchers.md) — _(no submodules)_- [observability](./src/observability/instrumented.md) — _(no submodules)_- [instrumented](./src/observability/instrumented.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_- [render](./src/render/render-component.md) — _(no submodules)_- [render-component](./src/render/render-component.md) — _(no submodules)_- [runner](./src/runner/runner.md) — _(no submodules)_- vitest — The `runner/vitest` module re-exports vite… - [bun-test](./src/runner/bun-test.md) — The `runner/bun-test` module re-exports bun-test's primitives (`describe`, `it`, `test`, `expect`, `beforeAll`, `before… - [mocks](./src/runner/mocks.md) — The `runner/mocks` module offers a small set of dependency-injection friendly mock helpers that work identically under… - [runner](./src/runner/runner.md) — _(no submodules)_- vitest — The `runner/vitest` module re-exports vite… - [vitest](./src/runner/vitest.md) — The `runner/vitest` module re-exports vitest's `describe`, `it`, `test`, `expect`, `beforeAll`, `beforeEach`, `afterAll… - [setup](./src/setup/polyfills.md) — _(no submodules)_- [polyfills](./src/setup/polyfills.md) — _(no submodules)_- [user](./src/user/setup-user.md) — _(no submodules)_- [setup-user](./src/user/setup-user.md) — _(no submodules)_- detect-environment — `detectEnvironment` probes the… - [bun-test-config](./src/config/bun-test-config.md) — `createBunTestConfig` produces a minimal `bun test` configuration object with the same polyfill preload and environment… - [config](./src/config/config.md) — _(no submodules)_- detect-environment — `detectEnvironment` probes the… - [detect-environment](./src/config/detect-environment.md) — `detectEnvironment` probes the current runtime and returns the most-specific test environment available: `"happy-dom"`… - [detect-runner](./src/config/detect-runner.md) — `detectRunner` tells the caller whether the currently-executing process is vitest or bun-test. It's used by the runner-… - [vitest-config](./src/config/vitest-config.md) — `createVitestConfig` builds a ready-to-use vitest test block with WSL2-safe defaults and the package's polyfills preloa… - [codes](./src/errors/codes.md) — `TESTING_DOM_CODES` is the package-local error code registry for `@suaveplan/testing-dom`. All codes share the `TESTING… - [testing-dom-error](./src/errors/testing-dom-error.md) — `TestingDomError` is the single concrete error class thrown by `@suaveplan/testing-dom`. It intentionally does NOT exte… - [matchers](./src/matchers/matchers.md) — _(no submodules)_- [matchers](./src/matchers/matchers.md) — _(no submodules)_- [observability](./src/observability/instrumented.md) — _(no submodules)_- [instrumented](./src/observability/instrumented.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_- [render](./src/render/render-component.md) — _(no submodules)_- [render-component](./src/render/render-component.md) — _(no submodules)_- [runner](./src/runner/runner.md) — _(no submodules)_- vitest — The `runner/vitest` module re-exports vite… - [bun-test](./src/runner/bun-test.md) — The `runner/bun-test` module re-exports bun-test's primitives (`describe`, `it`, `test`, `expect`, `beforeAll`, `before… - [mocks](./src/runner/mocks.md) — The `runner/mocks` module offers a small set of dependency-injection friendly mock helpers that work identically under… - [runner](./src/runner/runner.md) — _(no submodules)_- vitest — The `runner/vitest` module re-exports vite… - [vitest](./src/runner/vitest.md) — The `runner/vitest` module re-exports vitest's `describe`, `it`, `test`, `expect`, `beforeAll`, `beforeEach`, `afterAll… - [setup](./src/setup/polyfills.md) — _(no submodules)_- [polyfills](./src/setup/polyfills.md) — _(no submodules)_- [user](./src/user/setup-user.md) — _(no submodules)_- [setup-user](./src/user/setup-user.md) — _(no submodules)_- detect-environment — `detectEnvironment` probes the… - [bun-test-config](./src/config/bun-test-config.md) — `createBunTestConfig` produces a minimal `bun test` configuration object with the same polyfill preload and environment… - [config](./src/config/config.md) — _(no submodules)_- detect-environment — `detectEnvironment` probes the… - [detect-environment](./src/config/detect-environment.md) — `detectEnvironment` probes the current runtime and returns the most-specific test environment available: `"happy-dom"`… - [detect-runner](./src/config/detect-runner.md) — `detectRunner` tells the caller whether the currently-executing process is vitest or bun-test. It's used by the runner-… - [vitest-config](./src/config/vitest-config.md) — `createVitestConfig` builds a ready-to-use vitest test block with WSL2-safe defaults and the package's polyfills preloa… - [codes](./src/errors/codes.md) — `TESTING_DOM_CODES` is the package-local error code registry for `@suaveplan/testing-dom`. All codes share the `TESTING… - [testing-dom-error](./src/errors/testing-dom-error.md) — `TestingDomError` is the single concrete error class thrown by `@suaveplan/testing-dom`. It intentionally does NOT exte… - [matchers](./src/matchers/matchers.md) — _(no submodules)_- [matchers](./src/matchers/matchers.md) — _(no submodules)_- [observability](./src/observability/instrumented.md) — _(no submodules)_- [instrumented](./src/observability/instrumented.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_- [render](./src/render/render-component.md) — _(no submodules)_- [render-component](./src/render/render-component.md) — _(no submodules)_- [runner](./src/runner/runner.md) — _(no submodules)_- vitest — The `runner/vitest` module re-exports vite… - [bun-test](./src/runner/bun-test.md) — The `runner/bun-test` module re-exports bun-test's primitives (`describe`, `it`, `test`, `expect`, `beforeAll`, `before… - [mocks](./src/runner/mocks.md) — The `runner/mocks` module offers a small set of dependency-injection friendly mock helpers that work identically under… - [runner](./src/runner/runner.md) — _(no submodules)_- vitest — The `runner/vitest` module re-exports vite… - [vitest](./src/runner/vitest.md) — The `runner/vitest` module re-exports vitest's `describe`, `it`, `test`, `expect`, `beforeAll`, `beforeEach`, `afterAll… - [setup](./src/setup/polyfills.md) — _(no submodules)_- [polyfills](./src/setup/polyfills.md) — _(no submodules)_- [user](./src/user/setup-user.md) — _(no submodules)_- [setup-user](./src/user/setup-user.md) — _(no submodules)_- [bun-test-config](./src/config/bun-test-config.md) — `createBunTestConfig` produces a minimal `bun test` configuration object with the same polyfill preload and environment… - [config](./src/config/config.md) — _(no submodules)_- [detect-environment](./src/config/detect-environment.md) — `detectEnvironment` probes the current runtime and returns the most-specific test environment available: `"happy-dom"`… - [detect-runner](./src/config/detect-runner.md) — `detectRunner` tells the caller whether the currently-executing process is vitest or bun-test. It's used by the runner-… - [vitest-config](./src/config/vitest-config.md) — `createVitestConfig` builds a ready-to-use vitest test block with WSL2-safe defaults and the package's polyfills preloa… - [codes](./src/errors/codes.md) — `TESTING_DOM_CODES` is the package-local error code registry for `@suaveplan/testing-dom`. All codes share the `TESTING… - [testing-dom-error](./src/errors/testing-dom-error.md) — `TestingDomError` is the single concrete error class thrown by `@suaveplan/testing-dom`. It intentionally does NOT exte… - [matchers](./src/matchers/matchers.md) — _(no submodules)_ - [matchers](./src/matchers/matchers.md) — _(no submodules)_- [observability](./src/observability/instrumented.md) — _(no submodules)_ - [instrumented](./src/observability/instrumented.md) — _(no submodules)_- [queries](./src/queries/queries.md) — _(no submodules)_ - [queries](./src/queries/queries.md) — _(no submodules)_- [render](./src/render/render-component.md) — _(no submodules)_ - [render-component](./src/render/render-component.md) — _(no submodules)_- [runner](./src/runner/runner.md) — _(no submodules)_ - [bun-test](./src/runner/bun-test.md) — The `runner/bun-test` module re-exports bun-test's primitives (`describe`, `it`, `test`, `expect`, `beforeAll`, `before… - [mocks](./src/runner/mocks.md) — The `runner/mocks` module offers a small set of dependency-injection friendly mock helpers that work identically under… - [runner](./src/runner/runner.md) — _(no submodules)_ - [vitest](./src/runner/vitest.md) — The `runner/vitest` module re-exports vitest's `describe`, `it`, `test`, `expect`, `beforeAll`, `beforeEach`, `afterAll… - [setup](./src/setup/polyfills.md) — _(no submodules)_ - [polyfills](./src/setup/polyfills.md) — _(no submodules)_- [user](./src/user/setup-user.md) — _(no submodules)_ - [setup-user](./src/user/setup-user.md) — _(no submodules)_ ## Install ```bash bun add @suaveplan/testing-dom ``` Peer dependencies (install separately if using React rendering): ```bash bun add react react-dom @vitejs/plugin-react ``` ## Quick Start ### Vitest config ```ts // vitest.config.ts import { defineConfig } from "vitest/config"; import { createVitestConfig } from "@suaveplan/testing-dom/config"; import { fileURLToPath } from "node:url"; export default defineConfig( createVitestConfig(fileURLToPath(new URL(".", import.meta.url)), { environment: "happy-dom", coverage: true, }) ); ``` ### Rendering a React component ```tsx import { renderComponent } from "@suaveplan/testing-dom/render"; import { byRole, findRole } from "@suaveplan/testing-dom/queries"; import "@suaveplan/testing-dom/matchers"; // extends expect with jest-dom matchers it("submits the form", async () => { const { user } = renderComponent(); await user.click(byRole("button", { name: /submit/i })); const status = await findRole("status"); expect(status).toHaveTextContent("Saved"); }); ``` ## Modules | Subpath | Module | Description | |---|---|---| | `@suaveplan/testing-dom/config` | [src/config/vitest-config.md](src/config/vitest-config.md) | `createVitestConfig` — builds the vitest `test` block with WSL2-safe `pool: "forks"`, polyfill setup files, and Istanbul coverage defaults | | | [src/config/bun-test-config.md](src/config/bun-test-config.md) | `createBunTestConfig` — equivalent config builder for `bun test` | | | [src/config/detect-runner.md](src/config/detect-runner.md) | `detectRunner` — infers the active test runner from `package.json` and environment variables | | | [src/config/detect-environment.md](src/config/detect-environment.md) | `detectEnvironment` — resolves the vitest test environment (`node`, `happy-dom`, `jsdom`) | | | [src/config/config.md](src/config/config.md) | `createTestConfig` — unified entry point that delegates to the correct runner-specific builder | | `@suaveplan/testing-dom/render` | [src/render/render-component.md](src/render/render-component.md) | `renderComponent` — thin wrapper over `@testing-library/react` render that auto-cleans between calls and returns an attached `user` event instance | | `@suaveplan/testing-dom/queries` | [src/queries/queries.md](src/queries/queries.md) | Accessibility-first query aliases (`byRole`, `findRole`, `queryRole`, `byLabelText`, `byText`, `byPlaceholderText`) plus full re-export of `screen` and `within` | | `@suaveplan/testing-dom/user` | [src/user/setup-user.md](src/user/setup-user.md) | `setupUser` — produces a `@testing-library/user-event` v14 instance with happy-dom-safe defaults and automatic fake-timer integration | | `@suaveplan/testing-dom/matchers` | [src/matchers/matchers.md](src/matchers/matchers.md) | Side-effect import that extends vitest's `expect` with the full `@testing-library/jest-dom` matcher set | | `@suaveplan/testing-dom/polyfills` | [src/setup/polyfills.md](src/setup/polyfills.md) | Setup file that installs web-platform polyfills (`TextEncoder`, `ResizeObserver`, etc.) required by happy-dom in Node/Bun | | `@suaveplan/testing-dom/errors` | [src/errors/testing-dom-error.md](src/errors/testing-dom-error.md) | Typed error classes (`RenderError`) and error codes for failures surfaced by this package | | | [src/errors/codes.md](src/errors/codes.md) | `TESTING_DOM_ERROR_CODES` registry | | _(runner shim)_ | [src/runner/vitest.md](src/runner/vitest.md) | Vitest runner re-exports (`describe`, `it`, `test`, `expect`, `vi`, `beforeEach`, …) | | | [src/runner/bun-test.md](src/runner/bun-test.md) | `bun:test` runner shim with the same surface — activated by the `"bun"` conditional export | | | [src/runner/mocks.md](src/runner/mocks.md) | `fn`, `spy`, `stub`, `mock`, `fakeClock`, `restoreMocks`, `restoreTimers` — runner-agnostic mock helpers | | | [src/runner/runner.md](src/runner/runner.md) | Runner abstraction types | | _(observability)_ | [src/observability/instrumented.md](src/observability/instrumented.md) | `instrumented` — optional OTel wrapper (gated by `TESTING_DOM_OTEL_ENABLED=1`) that records call counts and duration histograms for package entrypoints |