From 868eed2e5fca667594e50bead6ba8527cbc040e3 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Sun, 27 Sep 2026 14:26:08 +0200 Subject: [PATCH] chore: migrate to oxc --- .claude/agents/vitest-test-writer.md | 12 + .claude/skills/typo-checker/SKILL.md | 11 +- .github/PULL_REQUEST_TEMPLATE.md | 4 + .github/renovate.json5 | 54 +- .gitignore | 1 - .oxfmtrc.json | 47 + .oxlintrc.json | 332 ++ .tazerc.json | 5 +- .vscode/extensions.json | 5 +- .vscode/settings.json | 34 +- AGENTS.md | 43 +- CONTRIBUTING.md | 3 +- _typos.toml | 6 +- docs/.vitepress/blog.data.ts | 3 +- docs/.vitepress/components/Advanced.vue | 6 +- docs/.vitepress/components/BlogIndex.vue | 4 +- docs/.vitepress/components/CRoot.vue | 6 +- docs/.vitepress/components/CopyPrompt.vue | 13 +- docs/.vitepress/components/Deprecated.vue | 4 +- docs/.vitepress/components/Experimental.vue | 6 +- docs/.vitepress/components/FeaturesList.vue | 65 +- docs/.vitepress/components/HomePage.vue | 8 +- docs/.vitepress/components/ListItem.vue | 44 +- docs/.vitepress/components/MoonPhase.vue | 4 +- docs/.vitepress/components/Version.vue | 6 +- docs/.vitepress/config.ts | 2437 +++++------ docs/.vitepress/contributors.ts | 8 +- docs/.vitepress/meta.ts | 7 +- docs/.vitepress/scripts/cli-generator.ts | 39 +- docs/.vitepress/scripts/fetch-avatars.ts | 11 +- docs/.vitepress/scripts/pwa.ts | 14 +- docs/.vitepress/scripts/transformHead.ts | 1 - docs/.vitepress/theme/FeatureGrid.vue | 45 +- docs/.vitepress/theme/Hero.vue | 27 +- docs/.vitepress/theme/Home.vue | 6 +- docs/.vitepress/theme/Intro.vue | 38 +- docs/.vitepress/theme/SupportedVersions.vue | 48 +- docs/.vitepress/theme/index.ts | 22 +- docs/.vitepress/theme/styles.css | 13 +- docs/api/advanced/plugin.md | 4 + docs/api/advanced/reporters.md | 6 + docs/api/advanced/runner.md | 1 + docs/api/advanced/test-case.md | 1 + docs/api/advanced/test-collection.md | 1 + docs/api/advanced/test-module.md | 2 + docs/api/advanced/test-project.md | 10 + docs/api/advanced/test-specification.md | 3 + docs/api/advanced/test-suite.md | 2 + docs/api/advanced/vitest.md | 9 +- docs/api/assert.md | 5 +- docs/api/browser/assertions.md | 4 + docs/api/browser/context.md | 4 + docs/api/browser/interactivity.md | 2 + docs/api/browser/locators.md | 7 +- docs/api/browser/react.md | 2 + docs/api/browser/svelte.md | 7 + docs/api/describe.md | 4 +- docs/api/expect.md | 16 +- docs/api/hooks.md | 8 + docs/api/mock.md | 6 + docs/api/test.md | 33 +- docs/api/vi.md | 28 +- docs/blog/vitest-3-2.md | 5 +- docs/blog/vitest-4-1.md | 7 +- docs/blog/vitest-4.md | 4 + docs/blog/vitest-5.md | 29 +- docs/config/alias.md | 1 + docs/config/allowonly.md | 3 + docs/config/browser/enabled.md | 1 + docs/config/browser/expect.md | 1 + docs/config/browser/playwright.md | 2 + docs/config/browser/traceview.md | 8 +- docs/config/coverage.md | 15 +- docs/config/deps.md | 2 +- docs/config/diff.md | 2 + docs/config/environment.md | 1 + docs/config/exclude.md | 1 + docs/config/experimental.md | 4 + docs/config/globalsetup.md | 5 + docs/config/include-source.md | 7 + docs/config/include.md | 1 + docs/config/includetasklocation.md | 1 + docs/config/maxworkers.md | 6 + docs/config/name.md | 4 + docs/config/provide.md | 4 + docs/config/reporters.md | 3 + docs/config/sequence.md | 1 + docs/config/setupfiles.md | 1 + docs/config/sharedviteserver.md | 1 + docs/config/stricttags.md | 3 + docs/config/tags.md | 1 + docs/config/vmmemorylimit.md | 3 +- docs/guide/advanced/tests.md | 1 + docs/guide/benchmarking.md | 2 +- docs/guide/browser/aria-snapshots.md | 10 +- docs/guide/browser/component-testing.md | 11 + docs/guide/browser/index.md | 40 + docs/guide/browser/multiple-setups.md | 6 + docs/guide/browser/playwright-traces.md | 3 + docs/guide/browser/trace-view.md | 21 +- .../browser/visual-regression-testing.md | 14 +- docs/guide/cli.md | 5 +- docs/guide/common-errors.md | 8 + docs/guide/comparisons.md | 2 +- docs/guide/coverage.md | 16 + docs/guide/debugging.md | 11 +- docs/guide/extending-matchers.md | 1 + docs/guide/features.md | 6 + docs/guide/filtering.md | 5 +- docs/guide/improving-performance.md | 19 +- docs/guide/in-source.md | 4 + docs/guide/index.md | 44 +- docs/guide/learn/matchers.md | 8 +- docs/guide/learn/mock-functions.md | 2 +- docs/guide/learn/setup-teardown.md | 2 +- docs/guide/learn/snapshots.md | 2 +- docs/guide/learn/testing-in-practice.md | 8 +- docs/guide/learn/writing-tests-with-ai.md | 2 +- docs/guide/lifecycle.md | 32 +- docs/guide/migration/index.md | 26 +- docs/guide/migration/mocha.md | 19 +- docs/guide/mocking.md | 6 + docs/guide/mocking/classes.md | 2 + docs/guide/mocking/file-system.md | 2 + docs/guide/mocking/modules.md | 8 + docs/guide/mocking/requests.md | 2 + docs/guide/open-telemetry.md | 6 + docs/guide/parallelism.md | 7 +- docs/guide/profiling-test-performance.md | 5 +- docs/guide/projects.md | 15 + docs/guide/recipes/conditional-mocking.md | 11 +- docs/guide/recipes/parallel-sequential.md | 10 +- docs/guide/recipes/wait-for.md | 10 +- docs/guide/reporters.md | 51 +- docs/guide/snapshot.md | 3 + docs/guide/test-annotations.md | 1 + docs/guide/test-context.md | 16 +- docs/guide/test-tags.md | 17 +- docs/guide/testing-types.md | 10 +- docs/guide/ui.md | 1 + docs/pwa-assets.config.ts | 5 +- docs/tsconfig.json | 12 +- eslint.config.js | 187 - examples/fastify/mockData.ts | 39 +- examples/fastify/src/index.ts | 3 +- examples/fastify/test/app.test.ts | 7 +- examples/in-source-test/tsconfig.json | 4 +- examples/lit/index.html | 2 +- examples/lit/src/my-button.ts | 4 +- examples/lit/test/basic.test.ts | 1 - examples/lit/vite.config.ts | 4 +- examples/opentelemetry/src/basic.ts | 2 +- examples/opentelemetry/src/other.test.ts | 4 +- examples/profiling/src/prime-number.ts | 4 +- .../packages/client/test/basic.test.tsx | 4 +- .../projects/packages/client/tsconfig.json | 6 +- examples/projects/packages/server/mockData.ts | 39 +- .../projects/packages/server/src/index.ts | 3 +- .../projects/packages/server/test/app.test.ts | 7 +- knip.jsonc | 65 +- package.json | 8 +- packages/browser-playwright/rollup.config.js | 5 +- .../browser-playwright/src/commands/clear.ts | 5 +- .../src/commands/dragAndDrop.ts | 6 +- .../src/commands/keyboard.ts | 230 +- .../src/commands/screenshot.ts | 47 +- .../browser-playwright/src/commands/select.ts | 22 +- .../browser-playwright/src/commands/tab.ts | 5 +- .../browser-playwright/src/commands/trace.ts | 114 +- .../browser-playwright/src/commands/type.ts | 2 +- .../browser-playwright/src/commands/upload.ts | 24 +- .../browser-playwright/src/commands/utils.ts | 2 +- .../src/commands/viewport.ts | 7 +- .../browser-playwright/src/commands/wheel.ts | 11 +- packages/browser-playwright/src/locators.ts | 25 +- packages/browser-playwright/src/playwright.ts | 146 +- packages/browser-playwright/tsconfig.json | 7 +- packages/browser-preview/rollup.config.js | 5 +- packages/browser-preview/src/index.ts | 5 +- packages/browser-preview/src/locators.ts | 28 +- packages/browser-preview/src/preview.ts | 4 +- packages/browser-preview/tsconfig.json | 7 +- packages/browser/aria-role.d.ts | 168 +- packages/browser/context.d.ts | 38 +- packages/browser/context.js | 10 +- packages/browser/jest-dom.d.ts | 54 +- packages/browser/matchers.d.ts | 10 +- packages/browser/rollup.config.js | 11 +- packages/browser/src/client/channel.ts | 20 +- packages/browser/src/client/client.ts | 25 +- packages/browser/src/client/orchestrator.html | 8 +- packages/browser/src/client/orchestrator.ts | 198 +- .../src/client/public/error-catcher.js | 32 +- packages/browser/src/client/tester/action.ts | 62 +- packages/browser/src/client/tester/aria.ts | 30 +- packages/browser/src/client/tester/context.ts | 115 +- packages/browser/src/client/tester/dialog.ts | 6 +- .../src/client/tester/expect-element.ts | 78 +- .../src/client/tester/expect/toBeChecked.ts | 22 +- .../tester/expect/toBeEmptyDOMElement.ts | 10 +- .../src/client/tester/expect/toBeEnabled.ts | 22 +- .../client/tester/expect/toBeInTheDocument.ts | 10 +- .../client/tester/expect/toBeInViewport.ts | 16 +- .../src/client/tester/expect/toBeInvalid.ts | 24 +- .../tester/expect/toBePartiallyChecked.ts | 14 +- .../src/client/tester/expect/toBeRequired.ts | 43 +- .../src/client/tester/expect/toBeVisible.ts | 18 +- .../client/tester/expect/toContainElement.ts | 11 +- .../src/client/tester/expect/toContainHTML.ts | 6 +- .../expect/toHaveAccessibleDescription.ts | 7 +- .../expect/toHaveAccessibleErrorMessage.ts | 11 +- .../tester/expect/toHaveAccessibleName.ts | 7 +- .../client/tester/expect/toHaveAttribute.ts | 6 +- .../src/client/tester/expect/toHaveClass.ts | 15 +- .../tester/expect/toHaveDisplayValue.ts | 21 +- .../src/client/tester/expect/toHaveFocus.ts | 20 +- .../client/tester/expect/toHaveFormValues.ts | 30 +- .../src/client/tester/expect/toHaveRole.ts | 6 +- .../client/tester/expect/toHaveSelection.ts | 38 +- .../src/client/tester/expect/toHaveStyle.ts | 77 +- .../client/tester/expect/toHaveTextContent.ts | 6 +- .../src/client/tester/expect/toHaveValue.ts | 15 +- .../client/tester/expect/toMatchScreenshot.ts | 46 +- .../tester/expect/toMatchTextContent.ts | 6 +- .../browser/src/client/tester/expect/utils.ts | 61 +- .../browser/src/client/tester/locators.ts | 100 +- packages/browser/src/client/tester/logger.ts | 19 +- packages/browser/src/client/tester/rpc.ts | 10 +- packages/browser/src/client/tester/runner.ts | 150 +- packages/browser/src/client/tester/state.ts | 7 +- .../browser/src/client/tester/tester-utils.ts | 121 +- .../browser/src/client/tester/tester.html | 4 +- packages/browser/src/client/tester/tester.ts | 92 +- packages/browser/src/client/tester/trace.ts | 11 +- packages/browser/src/client/tsconfig.json | 16 +- packages/browser/src/client/utils.ts | 4 +- packages/browser/src/client/vite.config.ts | 19 +- packages/browser/src/node/cdp.ts | 7 +- packages/browser/src/node/commands/fs.ts | 30 +- packages/browser/src/node/commands/index.ts | 7 +- .../browser/src/node/commands/screenshot.ts | 11 +- .../commands/screenshotMatcher/codecs/png.ts | 17 +- .../screenshotMatcher/comparators/index.ts | 12 +- .../comparators/pixelmatch.ts | 27 +- .../node/commands/screenshotMatcher/index.ts | 218 +- .../node/commands/screenshotMatcher/types.ts | 30 +- .../node/commands/screenshotMatcher/utils.ts | 106 +- packages/browser/src/node/commands/trace.ts | 21 +- packages/browser/src/node/index.ts | 174 +- .../middlewares/orchestratorMiddleware.ts | 4 +- .../src/node/middlewares/testerMiddleware.ts | 4 +- .../browser/src/node/middlewares/utils.ts | 5 +- .../browser/src/node/plugins/pluginContext.ts | 17 +- packages/browser/src/node/project.ts | 20 +- packages/browser/src/node/projectParent.ts | 92 +- packages/browser/src/node/rpc.ts | 181 +- .../browser/src/node/serverOrchestrator.ts | 49 +- packages/browser/src/node/serverTester.ts | 20 +- packages/browser/src/node/utils.ts | 16 +- .../src/shared/screenshotMatcher/types.ts | 53 +- packages/browser/src/types.ts | 38 +- packages/browser/tsconfig.json | 7 +- packages/browser/utils.d.ts | 2 +- packages/coverage-istanbul/src/base.ts | 2 +- packages/coverage-istanbul/src/commands.ts | 13 +- packages/coverage-istanbul/src/provider.ts | 46 +- packages/coverage-v8/src/commands.ts | 13 +- packages/coverage-v8/src/index.ts | 5 +- packages/coverage-v8/src/load-provider.ts | 4 +- packages/coverage-v8/src/provider.ts | 249 +- packages/expect/src/chai-style-assertions.ts | 16 +- packages/expect/src/constants.ts | 4 +- packages/expect/src/custom-matchers.ts | 16 +- .../expect/src/jest-asymmetric-matchers.ts | 108 +- packages/expect/src/jest-expect.ts | 744 ++-- packages/expect/src/jest-extend.ts | 226 +- packages/expect/src/jest-matcher-utils.ts | 23 +- packages/expect/src/jest-utils.ts | 342 +- packages/expect/src/state.ts | 9 +- packages/expect/src/types.ts | 70 +- packages/expect/src/utils.ts | 11 +- packages/mocker/rollup.config.js | 14 +- packages/mocker/src/automocker.ts | 82 +- packages/mocker/src/browser/auto-register.ts | 4 +- packages/mocker/src/browser/hints.ts | 82 +- packages/mocker/src/browser/index.ts | 5 +- .../mocker/src/browser/interceptor-msw.ts | 67 +- packages/mocker/src/browser/mocker.ts | 97 +- packages/mocker/src/browser/utils.ts | 2 +- packages/mocker/src/node/automock.ts | 58 +- .../mocker/src/node/dynamicImportPlugin.ts | 5 +- packages/mocker/src/node/esmWalker.ts | 128 +- packages/mocker/src/node/hoistMocks.ts | 200 +- packages/mocker/src/node/hoistMocksPlugin.ts | 2 +- packages/mocker/src/node/interceptorPlugin.ts | 20 +- packages/mocker/src/node/mockerPlugin.ts | 28 +- packages/mocker/src/node/parsers.ts | 61 +- packages/mocker/src/node/redirect.ts | 14 +- packages/mocker/src/node/resolver.ts | 38 +- packages/mocker/src/registry.ts | 91 +- packages/mocker/src/types.ts | 8 +- packages/mocker/src/utils.ts | 14 +- packages/pretty-format/src/collections.ts | 38 +- packages/pretty-format/src/index.ts | 190 +- .../src/plugins/AsymmetricMatcher.ts | 41 +- .../src/plugins/DOMCollection.ts | 41 +- .../pretty-format/src/plugins/DOMElement.ts | 70 +- .../pretty-format/src/plugins/Immutable.ts | 119 +- .../pretty-format/src/plugins/ReactElement.ts | 20 +- .../src/plugins/ReactTestComponent.ts | 18 +- .../pretty-format/src/plugins/lib/markup.ts | 77 +- packages/pretty-format/src/types.ts | 3 +- packages/snapshot/src/client.ts | 107 +- packages/snapshot/src/index.ts | 5 +- packages/snapshot/src/manager.ts | 23 +- packages/snapshot/src/port/inlineSnapshot.ts | 41 +- packages/snapshot/src/port/mockSerializer.ts | 6 +- packages/snapshot/src/port/plugins.ts | 1 - packages/snapshot/src/port/state.ts | 161 +- packages/snapshot/src/port/utils.ts | 39 +- packages/snapshot/src/types/index.ts | 5 +- packages/spy/optional-types.d.ts | 2 +- packages/spy/src/index.ts | 224 +- packages/spy/src/types.ts | 155 +- .../components/AnnotationAttachmentImage.vue | 12 +- .../ui/client/components/BrowserIframe.vue | 10 +- .../client/components/ClosedDetailsHeader.vue | 4 +- .../client/components/ConnectionOverlay.vue | 17 +- packages/ui/client/components/Coverage.vue | 4 +- packages/ui/client/components/Dashboard.vue | 4 +- .../components/DetailsHeaderButtons.vue | 4 +- .../client/components/FailureScreenshot.vue | 11 +- packages/ui/client/components/FileDetails.vue | 53 +- .../components/FileDetailsModuleGraph.vue | 11 +- .../ui/client/components/FilterStatus.vue | 11 +- packages/ui/client/components/IconAction.vue | 5 +- packages/ui/client/components/IconButton.vue | 4 +- packages/ui/client/components/Modal.vue | 5 +- .../components/ModuleGraphImportBreakdown.vue | 16 +- .../components/ModuleTransformResultView.vue | 95 +- packages/ui/client/components/Navigation.vue | 27 +- packages/ui/client/components/ProgressBar.vue | 13 +- .../client/components/artifacts/Artifacts.vue | 18 +- .../visual-regression/SmallTabs.spec.ts | 60 +- .../artifacts/visual-regression/SmallTabs.vue | 10 +- .../VisualRegression.spec.ts | 24 +- .../visual-regression/VisualRegression.vue | 32 +- .../VisualRegressionImage.vue | 4 +- .../VisualRegressionImageContainer.vue | 6 +- .../VisualRegressionSlider.spec.ts | 35 +- .../VisualRegressionSlider.vue | 18 +- .../components/dashboard/ErrorEntry.vue | 28 +- .../components/dashboard/TestFilesEntry.vue | 32 +- .../components/dashboard/TestsEntry.vue | 39 +- .../dashboard/TestsFilesContainer.vue | 4 +- .../client/components/explorer/Explorer.vue | 84 +- .../components/explorer/ExplorerItem.vue | 57 +- .../ui/client/components/trace/TraceView.vue | 162 +- .../client/components/trace/TraceViewPane.vue | 51 +- .../components/views/ScreenshotError.vue | 6 +- .../components/views/ViewConsoleOutput.vue | 10 +- .../views/ViewConsoleOutputEntry.spec.ts | 5 +- .../ui/client/components/views/ViewEditor.vue | 125 +- .../components/views/ViewModuleGraph.vue | 100 +- .../components/views/ViewReport.spec.ts | 59 +- .../ui/client/components/views/ViewReport.vue | 10 +- .../components/views/ViewReportError.vue | 11 +- .../components/views/ViewTestReport.vue | 29 +- packages/ui/client/composables/api.ts | 2 +- packages/ui/client/composables/attachments.ts | 37 +- packages/ui/client/composables/browser.ts | 17 +- .../ui/client/composables/client/index.ts | 31 +- .../ui/client/composables/client/state.ts | 42 +- .../ui/client/composables/client/static.ts | 14 +- packages/ui/client/composables/client/ws.ts | 11 +- packages/ui/client/composables/codemirror.ts | 8 +- packages/ui/client/composables/error.ts | 4 +- .../client/composables/explorer/collapse.ts | 2 +- .../client/composables/explorer/collector.ts | 140 +- .../ui/client/composables/explorer/expand.ts | 54 +- .../ui/client/composables/explorer/filter.ts | 117 +- .../ui/client/composables/explorer/search.ts | 69 +- .../ui/client/composables/explorer/state.ts | 65 +- .../ui/client/composables/explorer/tree.ts | 63 +- .../ui/client/composables/explorer/utils.ts | 62 +- .../ui/client/composables/module-graph.ts | 39 +- packages/ui/client/composables/navigation.ts | 31 +- packages/ui/client/composables/trace-view.ts | 67 +- packages/ui/client/constants.ts | 2 +- packages/ui/client/global-setup.ts | 5 +- packages/ui/client/pages/index.vue | 40 +- packages/ui/client/styles/main.css | 12 +- packages/ui/client/test.ts | 31 +- packages/ui/client/utils/task.ts | 17 +- packages/ui/explorer.md | 8 + packages/ui/index.html | 19 +- packages/ui/node/index.ts | 29 +- packages/ui/node/reporter.ts | 82 +- packages/ui/vite.config.ts | 9 +- packages/ui/vitest.config.ts | 12 +- packages/utils/rollup.config.js | 22 +- packages/utils/src/constants.ts | 7 +- packages/utils/src/diff/cleanupSemantic.ts | 196 +- packages/utils/src/diff/constants.ts | 6 +- packages/utils/src/diff/diffLines.ts | 47 +- packages/utils/src/diff/diffStrings.ts | 17 +- packages/utils/src/diff/getAlignedDiffs.ts | 37 +- packages/utils/src/diff/getType.ts | 66 +- packages/utils/src/diff/index.ts | 118 +- packages/utils/src/diff/joinAlignedDiffs.ts | 43 +- .../utils/src/diff/normalizeDiffOptions.ts | 12 +- packages/utils/src/diff/printDiffs.ts | 12 +- packages/utils/src/display.ts | 62 +- packages/utils/src/error.ts | 21 +- packages/utils/src/helpers.ts | 80 +- packages/utils/src/nanoid.ts | 3 +- packages/utils/src/offset.ts | 6 +- packages/utils/src/resolver.ts | 17 +- packages/utils/src/serialize.ts | 44 +- packages/utils/src/source-map.ts | 145 +- packages/utils/src/source-map/node.ts | 10 +- packages/utils/src/timers.ts | 15 +- packages/utils/src/types.ts | 6 +- packages/vitest/browser/context.d.ts | 8 +- packages/vitest/browser/context.js | 10 +- packages/vitest/globals.d.ts | 38 +- packages/vitest/index.cjs | 6 +- packages/vitest/optional-runtime-types.d.ts | 2 +- packages/vitest/optional-types.d.ts | 2 +- packages/vitest/rollup.config.js | 169 +- packages/vitest/src/api/check.ts | 5 +- packages/vitest/src/api/setup.ts | 58 +- packages/vitest/src/api/types.ts | 27 +- packages/vitest/src/constants.ts | 4 +- packages/vitest/src/create/browser/creator.ts | 44 +- .../vitest/src/create/browser/examples.ts | 3 +- packages/vitest/src/defaults.ts | 23 +- .../vitest/src/integrations/chai/bench.ts | 42 +- .../vitest/src/integrations/chai/index.ts | 18 +- packages/vitest/src/integrations/chai/poll.ts | 37 +- .../src/integrations/env/edge-runtime.ts | 2 +- .../vitest/src/integrations/env/happy-dom.ts | 5 +- packages/vitest/src/integrations/env/index.ts | 4 +- packages/vitest/src/integrations/env/jsdom.ts | 37 +- .../vitest/src/integrations/env/loader.ts | 96 +- packages/vitest/src/integrations/env/node.ts | 28 +- packages/vitest/src/integrations/env/utils.ts | 25 +- packages/vitest/src/integrations/inject.ts | 4 +- packages/vitest/src/integrations/mock/chai.ts | 4 +- .../vitest/src/integrations/mock/timers.ts | 41 +- packages/vitest/src/integrations/mock/when.ts | 125 +- .../vitest/src/integrations/snapshot/chai.ts | 142 +- packages/vitest/src/integrations/vi.ts | 153 +- packages/vitest/src/integrations/wait.ts | 51 +- packages/vitest/src/node/ast-collect.ts | 121 +- packages/vitest/src/node/benchmark.ts | 8 +- packages/vitest/src/node/browser/sessions.ts | 6 +- packages/vitest/src/node/cache/files.ts | 3 +- .../vitest/src/node/cache/fsModuleCache.ts | 141 +- packages/vitest/src/node/cache/index.ts | 15 +- packages/vitest/src/node/cli/cac.ts | 110 +- packages/vitest/src/node/cli/cli-api.ts | 74 +- packages/vitest/src/node/cli/cli-config.ts | 220 +- packages/vitest/src/node/cli/doctor.ts | 161 +- packages/vitest/src/node/cli/filter.ts | 19 +- packages/vitest/src/node/config/apiToken.ts | 20 +- .../vitest/src/node/config/resolveConfig.ts | 470 ++- .../vitest/src/node/config/serializeConfig.ts | 50 +- packages/vitest/src/node/core.ts | 670 +-- packages/vitest/src/node/coverage.ts | 255 +- packages/vitest/src/node/create.ts | 18 +- .../src/node/environments/fetchModule.ts | 137 +- .../src/node/environments/normalizeUrl.ts | 19 +- .../src/node/environments/serverRunner.ts | 8 +- packages/vitest/src/node/errors.ts | 12 +- packages/vitest/src/node/globalSetup.ts | 19 +- packages/vitest/src/node/hash.ts | 9 +- packages/vitest/src/node/logger.ts | 72 +- packages/vitest/src/node/module-diagnostic.ts | 91 +- packages/vitest/src/node/packageInstaller.ts | 15 +- .../vitest/src/node/plugins/browserLoader.ts | 51 +- packages/vitest/src/node/plugins/config.ts | 31 +- .../src/node/plugins/coverageTransform.ts | 6 +- .../vitest/src/node/plugins/cssEnabler.ts | 17 +- packages/vitest/src/node/plugins/index.ts | 9 +- packages/vitest/src/node/plugins/mocks.ts | 6 +- .../vitest/src/node/plugins/normalizeURL.ts | 24 +- .../src/node/plugins/runnerTransform.ts | 10 +- .../vitest/src/node/plugins/testConfig.ts | 104 +- packages/vitest/src/node/plugins/utils.ts | 36 +- packages/vitest/src/node/pool.ts | 116 +- packages/vitest/src/node/pools/browser.ts | 277 +- packages/vitest/src/node/pools/pool.ts | 63 +- packages/vitest/src/node/pools/poolRunner.ts | 67 +- packages/vitest/src/node/pools/rpc.ts | 162 +- packages/vitest/src/node/pools/types.ts | 28 +- .../src/node/pools/workers/forksWorker.ts | 26 +- .../src/node/pools/workers/threadsWorker.ts | 9 +- .../src/node/pools/workers/typecheckWorker.ts | 51 +- packages/vitest/src/node/printError.ts | 145 +- packages/vitest/src/node/project.ts | 161 +- .../src/node/projects/globProjectFiles.ts | 5 +- .../src/node/projects/resolveProjects.ts | 510 ++- packages/vitest/src/node/reporters/base.ts | 449 +- packages/vitest/src/node/reporters/blob.ts | 42 +- .../vitest/src/node/reporters/diagnostics.ts | 57 +- packages/vitest/src/node/reporters/dot.ts | 12 +- .../src/node/reporters/durationBreakdown.ts | 10 +- .../src/node/reporters/github-actions.ts | 59 +- .../src/node/reporters/hanging-process.ts | 2 +- packages/vitest/src/node/reporters/index.ts | 48 +- packages/vitest/src/node/reporters/json.ts | 62 +- packages/vitest/src/node/reporters/junit.ts | 143 +- .../reporters/renderers/benchmark-table.ts | 8 +- .../reporters/renderers/indented-logger.ts | 5 +- .../src/node/reporters/renderers/utils.ts | 59 +- .../reporters/renderers/windowedRenderer.ts | 10 +- packages/vitest/src/node/reporters/report.ts | 6 +- .../src/node/reporters/reported-tasks.ts | 96 +- packages/vitest/src/node/reporters/summary.ts | 71 +- .../vitest/src/node/reporters/tap-flat.ts | 9 +- packages/vitest/src/node/reporters/tap.ts | 41 +- packages/vitest/src/node/reporters/utils.ts | 80 +- packages/vitest/src/node/reporters/verbose.ts | 10 +- packages/vitest/src/node/resolver.ts | 34 +- .../src/node/sequencers/BaseSequencer.ts | 7 +- packages/vitest/src/node/specifications.ts | 127 +- packages/vitest/src/node/state.ts | 108 +- packages/vitest/src/node/stdin.ts | 61 +- packages/vitest/src/node/tags.ts | 2 +- packages/vitest/src/node/test-run.ts | 98 +- .../vitest/src/node/test-specification.ts | 14 +- packages/vitest/src/node/types/browser.ts | 135 +- packages/vitest/src/node/types/config.ts | 304 +- packages/vitest/src/node/types/coverage.ts | 88 +- packages/vitest/src/node/types/plugin.ts | 4 +- packages/vitest/src/node/types/reporter.ts | 16 +- packages/vitest/src/node/types/vite.ts | 2 - packages/vitest/src/node/vcs/git.ts | 23 +- packages/vitest/src/node/vcs/vcs.ts | 21 +- packages/vitest/src/node/vite.ts | 27 +- packages/vitest/src/node/viteLogger.ts | 23 +- packages/vitest/src/node/watch-filter.ts | 90 +- packages/vitest/src/node/watcher.ts | 31 +- packages/vitest/src/paths.ts | 5 +- packages/vitest/src/public/browser.ts | 16 +- packages/vitest/src/public/config.ts | 21 +- packages/vitest/src/public/index.ts | 15 +- packages/vitest/src/public/node.ts | 12 +- packages/vitest/src/public/runtime.ts | 6 +- packages/vitest/src/runtime/benchmark.ts | 151 +- .../src/runtime/benchmark/default-provider.ts | 4 +- packages/vitest/src/runtime/config.ts | 31 +- packages/vitest/src/runtime/console.ts | 57 +- .../vitest/src/runtime/detect-async-leaks.ts | 18 +- .../vitest/src/runtime/external-executor.ts | 70 +- packages/vitest/src/runtime/inspector.ts | 11 +- packages/vitest/src/runtime/listeners.ts | 4 +- .../runtime/moduleRunner/bareModuleMocker.ts | 62 +- .../runtime/moduleRunner/cachedResolver.ts | 8 +- .../src/runtime/moduleRunner/errorCatcher.ts | 5 +- .../runtime/moduleRunner/evaluatedModules.ts | 5 +- .../src/runtime/moduleRunner/moduleDebug.ts | 5 +- .../runtime/moduleRunner/moduleEvaluator.ts | 147 +- .../src/runtime/moduleRunner/moduleMocker.ts | 51 +- .../src/runtime/moduleRunner/moduleRunner.ts | 59 +- .../runtime/moduleRunner/moduleTransport.ts | 17 +- .../moduleRunner/nativeModuleMocker.ts | 52 +- .../moduleRunner/startVitestModuleRunner.ts | 79 +- packages/vitest/src/runtime/rpc.ts | 20 +- packages/vitest/src/runtime/runBaseTests.ts | 88 +- packages/vitest/src/runtime/runVmTests.ts | 93 +- .../vitest/src/runtime/runner/artifact.ts | 50 +- packages/vitest/src/runtime/runner/collect.ts | 246 +- packages/vitest/src/runtime/runner/context.ts | 76 +- .../vitest/src/runtime/runner/deadline.ts | 21 +- packages/vitest/src/runtime/runner/errors.ts | 6 +- packages/vitest/src/runtime/runner/fixture.ts | 235 +- packages/vitest/src/runtime/runner/hooks.ts | 41 +- packages/vitest/src/runtime/runner/map.ts | 5 +- packages/vitest/src/runtime/runner/run.ts | 268 +- packages/vitest/src/runtime/runner/setup.ts | 3 +- packages/vitest/src/runtime/runner/suite.ts | 219 +- packages/vitest/src/runtime/runner/types.ts | 348 +- .../vitest/src/runtime/runner/utils/chain.ts | 18 +- .../src/runtime/runner/utils/collect.ts | 13 +- .../vitest/src/runtime/runner/utils/suite.ts | 3 +- .../vitest/src/runtime/runner/utils/tags.ts | 119 +- packages/vitest/src/runtime/runners/index.ts | 18 +- packages/vitest/src/runtime/runners/test.ts | 33 +- packages/vitest/src/runtime/setup-common.ts | 24 +- packages/vitest/src/runtime/setup-node.ts | 3 +- packages/vitest/src/runtime/utils.ts | 16 +- packages/vitest/src/runtime/vm/code-cache.ts | 15 +- .../src/runtime/vm/commonjs-executor.ts | 90 +- .../vitest/src/runtime/vm/esm-executor.ts | 114 +- packages/vitest/src/runtime/vm/types.ts | 18 +- packages/vitest/src/runtime/vm/utils.ts | 39 +- .../vitest/src/runtime/vm/vite-executor.ts | 24 +- packages/vitest/src/runtime/worker.ts | 31 +- packages/vitest/src/runtime/workers/base.ts | 36 +- .../vitest/src/runtime/workers/init-forks.ts | 16 +- .../src/runtime/workers/init-threads.ts | 6 +- packages/vitest/src/runtime/workers/init.ts | 69 +- packages/vitest/src/runtime/workers/native.ts | 70 +- packages/vitest/src/runtime/workers/vm.ts | 71 +- packages/vitest/src/typecheck/parse.ts | 21 +- packages/vitest/src/typecheck/typechecker.ts | 151 +- packages/vitest/src/typecheck/types.ts | 2 +- packages/vitest/src/types/environment.ts | 5 +- packages/vitest/src/types/general.ts | 10 +- packages/vitest/src/types/global.ts | 26 +- packages/vitest/src/types/jsdom-options.ts | 3 +- packages/vitest/src/types/rpc.ts | 34 +- packages/vitest/src/utils/base.ts | 23 +- packages/vitest/src/utils/colors.ts | 15 +- packages/vitest/src/utils/config-helpers.ts | 4 +- packages/vitest/src/utils/coverage.ts | 14 +- packages/vitest/src/utils/env.ts | 18 +- packages/vitest/src/utils/environments.ts | 9 +- packages/vitest/src/utils/graph.ts | 20 +- .../vitest/src/utils/limit-concurrency.ts | 11 +- packages/vitest/src/utils/memory-limit.ts | 28 +- packages/vitest/src/utils/modules.ts | 8 +- .../vitest/src/utils/nativeModuleRunner.ts | 8 +- packages/vitest/src/utils/serialization.ts | 14 +- packages/vitest/src/utils/source-map.ts | 5 +- packages/vitest/src/utils/tasks.ts | 87 +- packages/vitest/src/utils/test-helpers.ts | 12 +- packages/vitest/src/utils/traces.ts | 111 +- packages/vitest/suppress-warnings.cjs | 2 +- packages/web-worker/rollup.config.js | 41 +- packages/web-worker/src/pure.ts | 9 +- packages/web-worker/src/runner.ts | 12 +- packages/web-worker/src/shared-worker.ts | 56 +- packages/web-worker/src/utils.ts | 11 +- packages/web-worker/src/worker.ts | 118 +- pnpm-lock.yaml | 2381 +++-------- pnpm-workspace.yaml | 2 + scripts/build-utils.js | 10 +- scripts/explain-types.ts | 16 +- scripts/publish-ci.ts | 4 +- scripts/update-contributors.ts | 26 +- test/README.md | 2 +- test/browser/custom-tester.html | 54 +- test/browser/settings.ts | 36 +- test/browser/setup.unit.ts | 24 +- test/browser/specs/aria-snapshot.test.ts | 19 +- test/browser/specs/assertion-helper.test.ts | 8 +- test/browser/specs/bail-out.test.ts | 15 +- test/browser/specs/browser-multiple.test.ts | 3 +- test/browser/specs/concurrency-id.test.ts | 79 +- test/browser/specs/config-watching.test.ts | 37 +- test/browser/specs/duplicate-tester.test.ts | 40 +- test/browser/specs/error-watch.test.ts | 10 +- test/browser/specs/errors.test.ts | 76 +- test/browser/specs/expect-dom.test.ts | 8 +- .../specs/expect-element-no-awaited.test.ts | 35 +- test/browser/specs/failure-screenshot.test.ts | 42 +- test/browser/specs/filter.test.ts | 11 +- test/browser/specs/heartbeat.test.ts | 99 +- test/browser/specs/insecure-context.test.ts | 17 +- test/browser/specs/inspect.test.ts | 80 +- test/browser/specs/locators.test.ts | 4 +- test/browser/specs/mocking.test.ts | 13 +- .../specs/multiple-different-configs.test.ts | 21 +- test/browser/specs/playwright-connect.test.ts | 99 +- .../specs/playwright-trace-mark.test.ts | 61 +- test/browser/specs/playwright-trace.test.ts | 5 +- test/browser/specs/prewarm.test.ts | 123 +- test/browser/specs/projects-ui.test.ts | 53 +- test/browser/specs/readiness.test.ts | 114 +- test/browser/specs/runner.test.ts | 174 +- test/browser/specs/setup-file.test.ts | 8 +- test/browser/specs/timeout-actions.test.ts | 4 +- .../browser/specs/to-match-screenshot.test.ts | 403 +- test/browser/specs/trace.test.ts | 9 +- test/browser/specs/update-snapshot.test.ts | 28 +- test/browser/specs/utils.ts | 23 +- test/browser/specs/viewport.test.ts | 7 +- test/browser/specs/worker.test.ts | 3 +- test/browser/src/blog-app/blog.tsx | 2 +- test/browser/src/button.css | 4 +- test/browser/test/browser.bench.ts | 12 +- test/browser/test/cdp.test-d.ts | 40 +- test/browser/test/cdp.test.ts | 111 +- test/browser/test/commands.test.ts | 17 +- test/browser/test/dom.test.ts | 4 +- test/browser/test/expect.test-d.ts | 16 +- test/browser/test/findElement.test.ts | 22 +- test/browser/test/iframe.test.ts | 4 +- test/browser/test/injected.test.ts | 5 +- test/browser/test/mocking.test.ts | 7 +- test/browser/test/polyfill-lib.test.ts | 4 +- test/browser/test/snapshot.test.ts | 3 +- test/browser/test/userEvent.test.ts | 235 +- test/browser/test/utils.test.ts | 21 +- test/browser/test/viewport.test.ts | 12 +- test/browser/tsconfig.json | 14 +- test/browser/vitest.config.mts | 12 +- test/coverage-test/setup.native.ts | 7 +- test/coverage-test/setup.ts | 18 +- .../coverage-test/test/allow-external.test.ts | 12 +- .../browser-api-permissions.browser.test.ts | 2 +- .../test/bundled-sources.test.ts | 9 +- test/coverage-test/test/changed.test.ts | 27 +- .../coverage-test/test/cjs-dependency.test.ts | 20 +- .../coverage-test/test/clean-on-rerun.test.ts | 18 +- .../test/configuration-options.test-d.ts | 45 +- .../test/custom-instrumenter.istanbul.test.ts | 17 +- .../test/empty-coverage-directory.test.ts | 13 +- .../test/extended-run-context.v8.test.ts | 24 +- .../test/file-outside-vite.test.ts | 18 +- test/coverage-test/test/ignore-hints.test.ts | 5 +- .../test/import-meta-env.test.ts | 12 +- test/coverage-test/test/in-source.test.ts | 2 +- .../test/include-exclude.test.ts | 74 +- .../test/include-exclude.unit.test.ts | 23 +- test/coverage-test/test/mock-autospy.test.ts | 2 +- .../test/mock-importActual.test.ts | 5 +- .../test/module-import-pending.v8.test.ts | 4 +- .../test/multi-environment.test.ts | 4 +- test/coverage-test/test/on-failure.test.ts | 32 +- .../test/pre-transpiled-source.test.ts | 4 +- .../test/query-param-transforms.test.ts | 43 +- test/coverage-test/test/reporters.test.ts | 6 +- .../test/results-snapshot.test.ts | 58 +- .../test/run-dynamic-coverage.test.ts | 12 +- test/coverage-test/test/setup-files.test.ts | 2 +- test/coverage-test/test/shard.test.ts | 6 +- test/coverage-test/test/source-maps.test.ts | 17 +- .../test/temporary-files.unit.test.ts | 15 +- .../test/test-reporter-conflicts.test.ts | 2 +- test/coverage-test/test/threshold-100.test.ts | 31 +- .../test/threshold-auto-update.test.ts | 11 +- .../test/threshold-auto-update.unit.test.ts | 150 +- .../test/threshold-failure.test.ts | 74 +- .../coverage-test/test/threshold-glob.test.ts | 115 +- .../test/threshold-per-file.test.ts | 197 +- .../transform-plugin-order.istanbul.test.ts | 12 +- .../test/workspace.multi-transform.test.ts | 2 +- .../test/workspace.project-filter.test.ts | 8 +- test/coverage-test/utils.ts | 175 +- test/coverage-test/vitest.config.ts | 26 +- .../packages/project-b/tsconfig.json | 4 +- test/e2e/project-references/tsconfig.json | 5 +- test/e2e/project-references/vitest.config.ts | 18 +- test/e2e/snapshots/ci.test.ts | 16 +- test/e2e/snapshots/compare-keys.test.ts | 6 +- test/e2e/snapshots/custom-environment.test.ts | 10 +- test/e2e/snapshots/custom-matcher.test.ts | 66 +- test/e2e/snapshots/custom-serializers.test.ts | 6 +- test/e2e/snapshots/domain-aria-inline.test.ts | 113 +- test/e2e/snapshots/domain-aria.test.ts | 11 +- test/e2e/snapshots/domain-inline.test.ts | 18 +- test/e2e/snapshots/domain-poll-inline.test.ts | 50 +- test/e2e/snapshots/domain-poll.test.ts | 64 +- test/e2e/snapshots/domain.test.ts | 20 +- test/e2e/snapshots/file.test.ts | 13 +- test/e2e/snapshots/indent.test.ts | 2 +- .../snapshots/inline-multiple-calls.test.ts | 111 +- .../e2e/snapshots/jest-image-snapshot.test.ts | 12 +- test/e2e/snapshots/options.test.ts | 4 +- test/e2e/snapshots/properties.test.ts | 14 +- test/e2e/snapshots/skip-test.test.ts | 26 +- test/e2e/snapshots/snapshots.test.ts | 8 +- test/e2e/snapshots/soft-inline.test.ts | 23 +- test/e2e/snapshots/soft.test.ts | 16 +- test/e2e/snapshots/summary.test.ts | 22 +- test/e2e/snapshots/test-update.test.ts | 2 +- test/e2e/snapshots/utils.ts | 4 +- test/e2e/test/annotations.test.ts | 50 +- test/e2e/test/around-each.test.ts | 38 +- test/e2e/test/artifacts.test.ts | 59 +- test/e2e/test/bail-race.test.ts | 14 +- test/e2e/test/benchmarking.test-d.ts | 38 +- test/e2e/test/benchmarking.test.ts | 395 +- test/e2e/test/cache.test.ts | 94 +- test/e2e/test/caching.test.ts | 20 +- test/e2e/test/cancel-run.test.ts | 40 +- test/e2e/test/compile-cache.test.ts | 41 +- test/e2e/test/concurrent.test.ts | 428 +- test/e2e/test/config-loader.test.ts | 4 +- test/e2e/test/config-types.test-d.ts | 33 +- test/e2e/test/config/bail.test.ts | 76 +- test/e2e/test/config/browser-configs.test.ts | 652 ++- test/e2e/test/config/injectCjsGlobals.test.ts | 129 +- test/e2e/test/config/passWithNoTests.test.ts | 5 +- test/e2e/test/config/root.test.ts | 15 +- test/e2e/test/config/sequence-shuffle.test.ts | 132 +- .../test/config/watchTriggerPattern.test.ts | 5 +- test/e2e/test/configureVitest.test.ts | 384 +- test/e2e/test/console-color.test.ts | 129 +- test/e2e/test/console-config.test.ts | 2 +- test/e2e/test/console.test.ts | 14 +- test/e2e/test/css-configs.test.ts | 27 +- test/e2e/test/detect-async-leaks.test.ts | 43 +- test/e2e/test/diff.test.ts | 28 +- test/e2e/test/dotted-files.test.ts | 9 +- .../test/each-non-ascii-placeholders.test.ts | 10 +- test/e2e/test/exclude.test.ts | 1 - test/e2e/test/exec-args.test.ts | 64 +- test/e2e/test/expect-extend.test.ts | 13 +- test/e2e/test/expect-soft.test.ts | 20 +- test/e2e/test/expect-task.test.ts | 14 +- test/e2e/test/fails.test.ts | 151 +- test/e2e/test/failures.test.ts | 206 +- test/e2e/test/fixture-no-async.test.ts | 2 +- test/e2e/test/frozen-object-prototype.test.ts | 2 +- .../test/fs-module-cache-resiliency.test.ts | 80 +- test/e2e/test/get-state.test.ts | 2 +- test/e2e/test/git-changed.test.ts | 49 +- test/e2e/test/global-setup.test.ts | 3 +- test/e2e/test/group-order.test.ts | 73 +- test/e2e/test/hook-timeout.test.ts | 10 +- test/e2e/test/in-source-collect.test.ts | 44 +- test/e2e/test/init.test.ts | 4 +- test/e2e/test/inspect.test.ts | 8 +- test/e2e/test/list-changed.test.ts | 32 +- test/e2e/test/list.test.ts | 108 +- test/e2e/test/location-filters.test.ts | 12 +- test/e2e/test/malformed-source-map.test.ts | 10 +- test/e2e/test/mixed-environments.test.ts | 1 - .../test/mocker-redirect-traversal.test.ts | 19 +- test/e2e/test/mocking.test.ts | 178 +- test/e2e/test/network-imports.test.ts | 36 +- test/e2e/test/no-module-runner.test.ts | 201 +- test/e2e/test/no-unexpected-logging.test.ts | 27 +- test/e2e/test/node-builtins.test.ts | 2 +- test/e2e/test/open-telemetry.test.ts | 15 +- test/e2e/test/override.test.ts | 34 +- test/e2e/test/plugin.test.ts | 16 +- test/e2e/test/pool-worker-exit.test.ts | 39 +- test/e2e/test/pool.test.ts | 89 +- test/e2e/test/pre-parse.test.ts | 173 +- test/e2e/test/print-error.test.ts | 30 +- test/e2e/test/projects.test.ts | 455 +- test/e2e/test/public-api.test.ts | 136 +- test/e2e/test/public.test.ts | 18 +- test/e2e/test/repeats.test.ts | 4 +- test/e2e/test/reporters/agent.test.ts | 20 +- .../reporters/configuration-options.test-d.ts | 8 +- test/e2e/test/reporters/console.test.ts | 58 +- .../test/reporters/custom-diff-config.test.ts | 23 +- .../test/reporters/custom-reporter.test.ts | 8 +- test/e2e/test/reporters/default.test.ts | 12 +- .../test/reporters/function-as-name.test.ts | 30 +- .../e2e/test/reporters/github-actions.test.ts | 141 +- test/e2e/test/reporters/html.test.ts | 125 +- .../test/reporters/import-durations.test.ts | 24 +- test/e2e/test/reporters/json.test.ts | 68 +- test/e2e/test/reporters/junit.test.ts | 51 +- test/e2e/test/reporters/logger.test.ts | 32 +- test/e2e/test/reporters/merge-reports.test.ts | 81 +- test/e2e/test/reporters/report.test.ts | 16 +- test/e2e/test/reporters/reporters.test.ts | 10 +- test/e2e/test/reporters/silent.test.ts | 9 +- test/e2e/test/reporters/summary.test.ts | 34 +- test/e2e/test/reporters/tap.test.ts | 10 +- test/e2e/test/reporters/test-run.test.ts | 242 +- test/e2e/test/reporters/utils.ts | 29 +- test/e2e/test/reporters/verbose.test.ts | 12 +- test/e2e/test/restricted-fs.test.ts | 1 - test/e2e/test/retry-clear-mocks.test.ts | 6 +- test/e2e/test/retry-condition.test.ts | 22 +- test/e2e/test/rollup-error.test.ts | 10 +- test/e2e/test/run-custom-env.test.ts | 1 - test/e2e/test/scoped-fixtures.test.ts | 3718 +++++++++-------- test/e2e/test/sequence-concurrent.test.ts | 1 - test/e2e/test/server-url.test.ts | 1 - test/e2e/test/setup-files.test.ts | 36 +- test/e2e/test/shard.test.ts | 15 +- test/e2e/test/shared-env.test.ts | 47 +- test/e2e/test/signal.test.ts | 38 +- test/e2e/test/skip-note.test.ts | 4 +- test/e2e/test/snapshot.test.ts | 2 +- test/e2e/test/stacktraces.test.ts | 53 +- test/e2e/test/standalone.test.ts | 17 +- test/e2e/test/static-collect.test.ts | 54 +- test/e2e/test/test-meta.test.ts | 6 +- test/e2e/test/test-name-pattern.test.ts | 4 +- test/e2e/test/test-specifications.test.ts | 81 +- test/e2e/test/test-tags.test.ts | 731 ++-- test/e2e/test/testname-pattern.test.ts | 15 +- test/e2e/test/unhandled-rejections.test.ts | 30 +- test/e2e/test/vcs-provider.test.ts | 63 +- test/e2e/test/vite-ssr-resolve.test.ts | 762 ++-- test/e2e/test/vm-threads.test.ts | 422 +- test/e2e/test/watch/change-project.test.ts | 17 +- test/e2e/test/watch/file-watching.test.ts | 108 +- .../e2e/test/watch/global-setup-rerun.test.ts | 2 +- test/e2e/test/watch/related.test.ts | 10 +- test/e2e/test/watch/reporter-failed.test.ts | 30 +- .../e2e/test/watch/restart-coalescing.test.ts | 9 +- test/e2e/test/watch/stdin.test.ts | 3 +- test/e2e/test/watch/stdout.test.ts | 13 +- test/e2e/test/watch/workspaces.test.ts | 210 +- test/e2e/test/windows-drive-case.test.ts | 28 +- test/e2e/test/workers-option.test.ts | 2 +- test/e2e/vitest.config.ts | 18 +- test/node-runner/test/cli.test.js | 4 +- test/test-utils/cli.ts | 32 +- test/test-utils/index.ts | 272 +- test/tsconfig.json | 9 +- .../typescript/test-d/expect-extend.test-d.ts | 8 +- .../typescript/test-d/nested-suite1.test-d.ts | 6 +- .../typescript/test-d/nested-suite2.test-d.ts | 9 +- test/typescript/test-d/test.test-d.ts | 8 +- test/typescript/test/runner.test.ts | 37 +- test/typescript/test/typecheck-error.test.ts | 12 +- test/typescript/tsconfig.custom.json | 8 +- test/typescript/tsconfig.empty.json | 8 +- test/typescript/tsconfig.fails.json | 8 +- test/typescript/tsconfig.json | 10 +- test/ui/test/browser-preview.spec.ts | 4 +- test/ui/test/editor.spec.ts | 6 +- test/ui/test/helper.ts | 15 +- test/ui/test/single-file.spec.ts | 9 +- test/ui/test/trace-stream.spec.ts | 95 +- test/ui/test/trace.spec.ts | 146 +- test/ui/test/ui.spec.ts | 95 +- test/ui/test/watch-updates.spec.ts | 5 +- test/ui/tsconfig.json | 5 +- test/unit/deps/dep-fn/index.d.ts | 2 +- test/unit/index.html | 20 +- test/unit/src/exec.ts | 2 +- test/unit/src/external/package.json | 4 +- test/unit/src/file-less.less | 2 +- test/unit/src/mockedC.ts | 2 +- test/unit/src/mocks/retry-dynamic-import.ts | 3 +- test/unit/src/mocks/set-foo.ts | 2 +- test/unit/src/mocks/squared.js | 4 +- test/unit/test/basic.test.ts | 2 +- test/unit/test/browserAutomocker.test.ts | 84 +- .../test/chai-style-assertions-sinon.test.ts | 2 +- test/unit/test/chai-style-assertions.test.ts | 26 +- test/unit/test/chainable.test.ts | 2 +- .../test/child-specific.child_process.test.ts | 2 +- test/unit/test/circular.test.ts | 2 +- test/unit/test/cli-test.test.ts | 183 +- test/unit/test/concurrent-suite.test.ts | 21 +- test/unit/test/concurrent.spec.ts | 2 +- test/unit/test/deadline.test.ts | 8 +- test/unit/test/diff.test.ts | 67 +- test/unit/test/do-mock-reset-modules.test.ts | 9 +- test/unit/test/doctor-candidates.test.ts | 113 +- .../unit/test/dom-single-line-options.test.ts | 3 +- test/unit/test/dom.test.ts | 7 +- test/unit/test/dual-package-hazard.test.ts | 12 +- test/unit/test/duration-breakdown.test.ts | 14 +- test/unit/test/dynamic-import.test.ts | 3 +- test/unit/test/each.test.ts | 71 +- .../unit/test/environment-diagnostics.test.ts | 75 +- test/unit/test/environments/happy-dom.spec.ts | 20 +- .../test/environments/jsdom-options.test.ts | 6 +- test/unit/test/environments/jsdom.spec.ts | 115 +- test/unit/test/error.test.ts | 2 +- test/unit/test/esnext.test.ts | 2 +- test/unit/test/expect-poll.test.ts | 52 +- test/unit/test/expect.test-d.ts | 80 +- test/unit/test/expect.test.ts | 234 +- .../test/external-module-directory.test.ts | 2 +- ...xture-comments-between-destructure.test.ts | 1 - .../fixture-concurrent-beforeEach.test.ts | 2 +- test/unit/test/fixture-concurrent.test.ts | 2 +- test/unit/test/fixture-initialization.test.ts | 30 +- test/unit/test/fixture-options.test.ts | 22 +- test/unit/test/fn.test.ts | 12 +- test/unit/test/fs.test.ts | 2 +- test/unit/test/handled-unhandled.test.ts | 2 +- test/unit/test/happy-dom-custom.test.ts | 3 - test/unit/test/happy-dom.test.ts | 5 +- test/unit/test/hoist-import.test.ts | 1 - test/unit/test/hooks.test.js | 8 +- test/unit/test/hooks.test.ts | 23 +- test/unit/test/immutable.test.ts | 2 +- test/unit/test/import-client.test.ts | 2 +- test/unit/test/import-diagnostics.test.ts | 106 +- test/unit/test/import-meta-resolve.test.ts | 8 +- test/unit/test/imports.test.ts | 72 +- test/unit/test/injector-esm.test.ts | 12 +- test/unit/test/injector-mock.test.ts | 309 +- test/unit/test/inline-snap.test.ts | 32 +- test/unit/test/interop.test.ts | 3 +- test/unit/test/jest-expect-no-url.test.ts | 2 +- test/unit/test/jest-expect.test.ts | 769 ++-- test/unit/test/jest-matcher-utils.test.ts | 3 +- test/unit/test/jest-mock.test.ts | 43 +- test/unit/test/local-context.test.ts | 10 +- test/unit/test/lot-of-tests.test.ts | 3 +- test/unit/test/memory-limit.test.ts | 4 +- test/unit/test/mocked-circular.test.ts | 1 - .../test/mocked-class-restore-all.test.ts | 1 - .../mocked-class-restore-explicit.test.ts | 1 - test/unit/test/mocked-class.test.ts | 1 - test/unit/test/mocked-import-circular.test.ts | 1 - test/unit/test/mocked-no-mocks-same.test.ts | 2 +- test/unit/test/mocked-node-module.test.ts | 2 +- test/unit/test/mocked.test.js | 10 +- test/unit/test/mocked.test.ts | 77 +- .../automocking-class-inheritance.test.ts | 8 +- .../test/mocking/cyclic-import-actual.spec.ts | 1 - .../mocking/cyclic-import-original.spec.ts | 1 - test/unit/test/mocking/error-mock.spec.ts | 6 +- test/unit/test/mocking/external.test.ts | 2 +- test/unit/test/mocking/factory.test.ts | 39 +- test/unit/test/mocking/hoisted.test.ts | 5 +- test/unit/test/mocking/self-importing.test.ts | 2 +- test/unit/test/mocking/vi-fn.test-d.ts | 59 +- test/unit/test/mocking/vi-fn.test.ts | 69 +- test/unit/test/mocking/vi-mockObject.test.ts | 25 +- test/unit/test/mocking/vi-spyOn.test.ts | 51 +- test/unit/test/mocking/vi-when.test.ts | 102 +- test/unit/test/mocking/virtual.test.ts | 2 - test/unit/test/modes.test.ts | 4 +- test/unit/test/module-diagnostic.test.ts | 178 +- test/unit/test/module.test.ts | 39 +- test/unit/test/nested-suite.test.ts | 4 +- test/unit/test/nested-test.test.ts | 20 +- test/unit/test/node-protocol-jsdom.spec.ts | 3 +- test/unit/test/node-protocol-node.spec.ts | 2 +- test/unit/test/on-finished.test.ts | 2 +- test/unit/test/parse-cjs-conditions.test.ts | 11 +- test/unit/test/pattern.test.ts | 9 +- test/unit/test/pretty-format.test.ts | 219 +- test/unit/test/repeats.test.ts | 2 +- test/unit/test/replace-matcher.test.ts | 51 +- test/unit/test/require.test.ts | 2 +- test/unit/test/retry-condition.test.ts | 88 +- test/unit/test/retry-delay.test.ts | 72 +- test/unit/test/sequencers.test.ts | 7 +- test/unit/test/sequential.test.ts | 2 +- test/unit/test/serialize.test.ts | 42 +- test/unit/test/skip.test.ts | 2 +- test/unit/test/snapshot-concurrent.test.ts | 9 +- .../test/snapshot-custom-serializer.test.ts | 16 +- test/unit/test/snapshot-file.test.ts | 7 +- .../snapshot-inline-(parentheses).test.ts | 3 +- test/unit/test/snapshot-inline.test.ts | 24 +- test/unit/test/snapshot.test.ts | 6 +- test/unit/test/sourcemap.test.ts | 13 +- test/unit/test/spy.test.ts | 2 +- test/unit/test/strict.test.js | 8 +- test/unit/test/stubs.test.ts | 20 +- test/unit/test/suite.test.tsx | 2 +- test/unit/test/tab-effect.spec.mjs | 1 - test/unit/test/task-collector.test.ts | 42 +- test/unit/test/task-names.test.ts | 170 +- .../test-extend-with-top-level-hooks.test.ts | 4 +- test/unit/test/test-extend.test.ts | 115 +- test/unit/test/test-for-suite.test.ts | 30 +- test/unit/test/test-for.test.ts | 93 +- test/unit/test/test-tags-filter.test.ts | 68 +- .../test/threads-specific.threads.test.ts | 2 +- test/unit/test/timers-queueMicrotask.test.ts | 2 +- test/unit/test/unhandled-skip.test.ts | 2 +- test/unit/test/url-ssr.test.ts | 10 +- test/unit/test/utils-display.spec.ts | 54 +- test/unit/test/utils.spec.ts | 85 +- test/unit/test/vi.spec.ts | 25 +- test/unit/test/vm-code-cache.test.ts | 5 +- test/unit/test/wait.test.ts | 52 +- test/unit/test/wasm.test.ts | 16 +- test/unit/test/web-worker-jsdom.test.ts | 4 +- test/unit/test/web-worker-node.test.ts | 95 +- test/unit/vite.config.ts | 82 +- test/workspaces-browser/globalTest.ts | 5 +- .../space_browser/vitest.config.ts | 2 +- .../space_browser_inline/test/basic.test.ts | 2 - test/workspaces-browser/src/math.ts | 2 +- test/workspaces-browser/vitest.config.ts | 12 +- .../check-coverage.test.ts | 10 +- test/workspaces/globalTest.ts | 12 +- .../src/multi-transform.ts | 6 +- .../test/project-1.test.ts | 1 - .../test/project-2.test.ts | 1 - test/workspaces/space-pools/isolate.test.ts | 3 +- .../workspaces/space-pools/no-isolate.test.ts | 3 +- test/workspaces/space_shared/test.spec.ts | 4 +- test/workspaces/src/math.ts | 2 +- test/workspaces/vitest.config.ts | 30 +- test/workspaces/vitest.config.watch.ts | 19 +- tsconfig.check.json | 5 +- 1083 files changed, 27575 insertions(+), 27197 deletions(-) create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json delete mode 100644 eslint.config.js diff --git a/.claude/agents/vitest-test-writer.md b/.claude/agents/vitest-test-writer.md index 3a5abd6bd..7889de5ed 100644 --- a/.claude/agents/vitest-test-writer.md +++ b/.claude/agents/vitest-test-writer.md @@ -20,22 +20,29 @@ You write comprehensive, high-quality tests that follow the established patterns ## Testing Patterns You Must Follow ### Use runInlineTests Utility + For integration tests, always use the `runInlineTests` utility to create and run test scenarios. This utility allows you to define inline test files and validate their output. ### Snapshot Validation with toMatchInlineSnapshot + Always validate output using `toMatchInlineSnapshot()`. The snapshot is automatically generated on the first run. This is the preferred method because it: + - Captures the exact expected output - Makes changes visible in code review - Catches regressions precisely ### Avoid toContain + Do NOT use `toContain()` for output validation. This method fails to catch: + - Extra unexpected output - Repeated output that shouldn't occur - Subtle formatting differences ### Handle Dynamic Content + When output contains dynamic content (timestamps, absolute paths, durations, etc.): + 1. First check `test-utils` for existing utilities that normalize this content 2. If no utility exists, manually process with `stdout.replace(regexp, 'normalized-value')` 3. Common patterns to normalize: @@ -44,7 +51,9 @@ When output contains dynamic content (timestamps, absolute paths, durations, etc - Process IDs or temporary file paths ### Validate Test Results with testTree or errorTree + To ensure all tests actually passed (not just that they ran), use `testTree` or `errorTree` helpers. Pass the result to `toMatchInlineSnapshot()` to verify: + - The correct number of tests ran - Tests are organized in the expected suites - No unexpected failures or skipped tests @@ -52,6 +61,7 @@ To ensure all tests actually passed (not just that they ran), use `testTree` or ## Writing Unit Tests For unit tests in `test/unit/`: + 1. Import the function directly from its source package 2. Test pure functionality without process spawning 3. Cover edge cases, error conditions, and typical usage @@ -60,6 +70,7 @@ For unit tests in `test/unit/`: ## Writing Integration Tests For integration tests in `test/e2e/`: + 1. Use `runInlineTests` to define test scenarios 2. Create realistic test file content 3. Validate both stderr and the test results structure @@ -86,6 +97,7 @@ For integration tests in `test/e2e/`: ## Output Format When writing tests, provide: + 1. The complete test file with all imports 2. Explanations of what each test verifies 3. Notes on any dynamic content normalization applied diff --git a/.claude/skills/typo-checker/SKILL.md b/.claude/skills/typo-checker/SKILL.md index 026939e46..88ef1f89d 100644 --- a/.claude/skills/typo-checker/SKILL.md +++ b/.claude/skills/typo-checker/SKILL.md @@ -16,11 +16,11 @@ Scan the codebase with `typos-cli`, classify findings, fix real typos, and maint `typos-cli` must be installed. If not available, install via one of: -| Method | Command | -|---|---| -| cargo | `cargo install typos-cli` | -| brew | `brew install typos-cli` | -| pipx | `pipx install typos` | +| Method | Command | +| ------ | -------------------------------------------------------- | +| cargo | `cargo install typos-cli` | +| brew | `brew install typos-cli` | +| pipx | `pipx install typos` | | Binary | Download from https://github.com/crate-ci/typos/releases | ## Workflow @@ -52,6 +52,7 @@ For every finding, decide: - **False positive** — add to `_typos.toml` Common false positive patterns: + - Short variable names that happen to be words (`ba`, `fo`, `nd`) - Domain abbreviations (`als` for AsyncLocalStorage, `PnP` for Plug'n'Play) - File extensions in regexes (`.styl`, `.pcss`) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index aa069c529..cca20b499 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,16 +9,20 @@ Resolves #issue-number ### Please don't delete this checklist! Before submitting the PR, please make sure you do the following: + - [ ] It's really useful if your PR references an issue where it is discussed ahead of time. If the feature is substantial or introduces breaking changes without a discussion, PR might be closed. - [ ] Ideally, include a test that fails without this PR but passes with it. - [ ] Please, don't make changes to `pnpm-lock.yaml` unless you introduce a new test example. - [ ] Please check [Allow edits by maintainers](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) to make review process faster. Note that this option is not available for repositories that are owned by Github organizations. ### Tests + - [ ] Run the tests with `pnpm test:ci`. ### Documentation + - [ ] If you introduce new functionality, document it. You can run documentation with `pnpm run docs` command. ### Changesets + - [ ] Changes in changelog are generated from PR name. Please, make sure that it explains your changes in an understandable manner. Please, prefix changeset messages with `feat:`, `fix:`, `perf:`, `docs:`, or `chore:`. diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 0fed23671..87294e000 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,44 +1,42 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended", "schedule:weekly", "group:allNonMajor"], - "labels": ["dependencies"], - "rangeStrategy": "bump", + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + extends: ['config:recommended', 'schedule:weekly', 'group:allNonMajor'], + labels: ['dependencies'], + rangeStrategy: 'bump', // Align with pnpm's `minimumReleaseAge` default (1440 minutes) so Renovate does // not propose versions that pnpm's supply-chain check would reject as too new. - "minimumReleaseAge": "1 day", - "packageRules": [ + minimumReleaseAge: '1 day', + packageRules: [ { - "groupName": "Eslint packages", - "matchPackageNames": ["/eslint/"] + groupName: 'Oxc packages', + matchPackageNames: ['oxlint', 'oxfmt'], }, { - "matchDepTypes": ["peerDependencies"], - "enabled": false + matchDepTypes: ['peerDependencies'], + enabled: false, }, { - "matchDepTypes": ["action"], - "matchPackageNames": ["!actions/{/,}**", "!github/{/,}**"], - "pinDigests": true - } + matchDepTypes: ['action'], + matchPackageNames: ['!actions/{/,}**', '!github/{/,}**'], + pinDigests: true, + }, ], - "ignoreDeps": [ + ignoreDeps: [ // manually bumping - "node", - "vite", + 'node', + 'vite', // we patch these packages - "@types/chai", - "@sinonjs/fake-timers", - "cac", + '@types/chai', + '@sinonjs/fake-timers', + 'cac', // Transitive dependency that we patch - "acorn", + 'acorn', // Keep using codemirror 5 - "codemirror", - "react-18", - "react-is-18", + 'codemirror', + 'react-18', + 'react-is-18', // webdriverio removed provenance: https://github.com/webdriverio/webdriverio/issues/14887 - "webdriverio" + 'webdriverio', ], - "ignorePaths": [ - "**/node_modules/**" - ] + ignorePaths: ['**/node_modules/**'], } diff --git a/.gitignore b/.gitignore index 19d26869a..4b87bf4ea 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,6 @@ bench/test/*/*/ **/bench.json **/browser/browser.json docs/public/user-avatars -.eslintcache docs/.vitepress/cache/ !test/e2e/fixtures/dotted-files/**/.cache test/**/__screenshots__/**/* diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 000000000..51706d150 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,47 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "semi": false, + "singleQuote": true, + "trailingComma": "all", + "sortPackageJson": false, + "sortImports": { + "groups": [ + "type-import", + ["type-parent", "type-sibling", "type-index", "type-internal"], + "value-builtin", + "value-external", + "value-internal", + ["value-parent", "value-sibling", "value-index"], + "side_effect", + "unknown" + ], + "newlinesBetween": false + }, + "overrides": [ + { + // code blocks in the docs are written by hand to look good + "files": ["**/*.md"], + "options": { "embeddedLanguageFormatting": "off" } + } + ], + "ignorePatterns": [ + "**/fixtures", + "**/*.timestamp-*", + "pnpm-lock.yaml", + // generated by the build + "packages/*/LICENSE.md", + "docs/guide/cli-generated.md", + "docs/.vitepress/contributor-names.json", + "packages/browser/src/client/public/esm-client-injector.js", + "test/unit/src/wasm/wasm-bindgen*", + // test inputs that depend on the exact source text + "test/unit/src/self", + "test/unit/test/mocking/already-hoisted.test.ts", + "test/unit/test/tab-effect.spec.mjs", + "test/unit/test/mocking/external.test.ts", + "test/workspaces/results.json", + "test/workspaces-browser/results.json", + "test/e2e/deps/error", + "test/e2e/deps/malformed-source-map" + ] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 000000000..0d654a689 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,332 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "unicorn", "oxc", "import", "node", "vue", "jsdoc"], + "env": { + "browser": true, + "node": true + }, + "options": { + "reportUnusedDisableDirectives": "error" + }, + "ignorePatterns": [ + "**/fixtures", + "**/*.d.ts", + "**/*.timestamp-*", + "packages/browser/src/client/public/esm-client-injector.js", + "test/unit/src/wasm/wasm-bindgen*", + "test/unit/src/self", + "test/unit/test/mocking/already-hoisted.test.ts", + "test/*/deps" + ], + "categories": { + "correctness": "error" + }, + "rules": { + "accessor-pairs": "error", + "array-callback-return": "error", + "block-scoped-var": "error", + "curly": ["error", "all"], + "default-case-last": "error", + "dot-notation": "error", + "eqeqeq": ["error", "smart"], + "new-cap": ["error", { "capIsNew": false }], + "no-alert": "error", + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": ["error", "always"], + "no-console": ["error", { "allow": ["warn", "error"] }], + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-class-members": "error", + "no-duplicate-case": "error", + "no-empty": ["error", { "allowEmptyCatch": true }], + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-boolean-cast": "error", + "no-fallthrough": "error", + "no-global-assign": "error", + "no-implied-eval": "error", + "no-irregular-whitespace": "error", + "no-iterator": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-loss-of-precision": "error", + "no-misleading-character-class": "error", + "no-multi-str": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-wrappers": "error", + "no-proto": "error", + "no-prototype-builtins": "error", + "no-redeclare": "error", + "no-regex-spaces": "error", + "no-restricted-globals": [ + "error", + { "name": "global", "message": "Use `globalThis` instead." }, + { "name": "self", "message": "Use `globalThis` instead." } + ], + "no-restricted-imports": ["error", { "paths": ["path"] }], + "no-restricted-properties": [ + "error", + { + "property": "__proto__", + "message": "Use `Object.getPrototypeOf` or `Object.setPrototypeOf` instead." + }, + { "property": "__defineGetter__", "message": "Use `Object.defineProperty` instead." }, + { "property": "__defineSetter__", "message": "Use `Object.defineProperty` instead." }, + { + "property": "__lookupGetter__", + "message": "Use `Object.getOwnPropertyDescriptor` instead." + }, + { + "property": "__lookupSetter__", + "message": "Use `Object.getOwnPropertyDescriptor` instead." + } + ], + "no-self-assign": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-unexpected-multiline": "error", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": ["error", { "defaultAssignment": false }], + "no-unreachable-loop": "error", + "no-unsafe-finally": "error", + "no-unused-expressions": [ + "error", + { "allowShortCircuit": true, "allowTaggedTemplates": true, "allowTernary": true } + ], + "no-unused-vars": [ + "error", + { + "args": "after-used", + "argsIgnorePattern": "^_", + "ignoreRestSiblings": true, + "vars": "all", + "varsIgnorePattern": "^_" + } + ], + "no-use-before-define": ["error", { "classes": false, "functions": false, "variables": true }], + "no-useless-call": "error", + "no-useless-catch": "error", + "no-useless-computed-key": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "error", + "object-shorthand": ["error", "always", { "avoidQuotes": true }], + "one-var": ["error", { "initialized": "never" }], + "prefer-arrow-callback": ["error", { "allowUnboundThis": true }], + "prefer-const": ["error", { "destructuring": "all", "ignoreReadBeforeAssign": true }], + "prefer-exponentiation-operator": "error", + "prefer-object-has-own": "error", + "prefer-promise-reject-errors": "error", + "prefer-regex-literals": ["error", { "disallowRedundantWrapping": true }], + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "error", + "symbol-description": "error", + "unicode-bom": "error", + "use-isnan": ["error", { "enforceForIndexOf": true, "enforceForSwitchCase": true }], + "valid-typeof": ["error", { "requireStringLiterals": true }], + "vars-on-top": "error", + "yoda": "error", + + "typescript/ban-ts-comment": ["error", { "ts-expect-error": "allow-with-description" }], + "typescript/consistent-type-definitions": ["error", "interface"], + "typescript/consistent-type-imports": [ + "error", + { + "prefer": "type-imports", + "fixStyle": "separate-type-imports", + "disallowTypeAnnotations": false + } + ], + "typescript/method-signature-style": ["error", "property"], + "typescript/no-duplicate-enum-values": "error", + "typescript/no-empty-object-type": ["error", { "allowInterfaces": "always" }], + "typescript/no-extra-non-null-assertion": "error", + "typescript/no-import-type-side-effects": "error", + "typescript/no-misused-new": "error", + "typescript/no-namespace": "error", + "typescript/no-non-null-asserted-nullish-coalescing": "error", + "typescript/no-non-null-asserted-optional-chain": "error", + "typescript/no-require-imports": "error", + "typescript/no-this-alias": "error", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unsafe-declaration-merging": "error", + "typescript/no-wrapper-object-types": "error", + "typescript/prefer-as-const": "error", + "typescript/prefer-literal-enum-member": "error", + "typescript/prefer-namespace-keyword": "error", + + "unicorn/consistent-empty-array-spread": "error", + "unicorn/error-message": "error", + "unicorn/escape-case": "error", + "unicorn/new-for-builtins": "error", + "unicorn/no-instanceof-builtins": ["error", { "strategy": "loose" }], + "unicorn/no-new-array": "error", + "unicorn/no-new-buffer": "error", + "unicorn/prefer-array-some": "error", + "unicorn/prefer-date-now": "error", + "unicorn/prefer-dom-node-text-content": "error", + "unicorn/prefer-includes": "error", + "unicorn/prefer-node-protocol": "error", + "unicorn/prefer-number-properties": ["error", { "checkInfinity": false, "checkNaN": false }], + "unicorn/prefer-regexp-test": "error", + "unicorn/prefer-string-starts-ends-with": "error", + "unicorn/prefer-type-error": "error", + "unicorn/throw-new-error": "error", + + "import/consistent-type-specifier-style": ["error", "prefer-top-level"], + "import/first": "error", + "import/no-duplicates": "error", + "import/no-mutable-exports": "error", + "import/no-named-default": "error", + + "node/handle-callback-err": ["error", "^(err|error)$"], + "node/no-exports-assign": "error", + "node/no-new-require": "error", + "node/no-path-concat": "error", + "node/no-top-level-await": "error", + + "vue/component-definition-name-casing": "warn", + "vue/no-arrow-functions-in-watch": "error", + "vue/no-async-in-computed-properties": "error", + "vue/no-computed-properties-in-data": "error", + "vue/no-deprecated-data-object-declaration": "error", + "vue/no-deprecated-delete-set": "error", + "vue/no-deprecated-destroyed-lifecycle": "error", + "vue/no-deprecated-events-api": "error", + "vue/no-deprecated-model-definition": "error", + "vue/no-deprecated-props-default-this": "error", + "vue/no-deprecated-vue-config-keycodes": "error", + "vue/no-dupe-keys": "error", + "vue/no-export-in-script-setup": "error", + "vue/no-expose-after-await": "error", + "vue/no-lifecycle-after-await": "error", + "vue/no-multiple-slot-args": "warn", + "vue/no-required-prop-with-default": "warn", + "vue/no-reserved-component-names": "error", + "vue/no-reserved-keys": "error", + "vue/no-reserved-props": "error", + "vue/no-shared-component-data": "error", + "vue/no-side-effects-in-computed-properties": "error", + "vue/no-watch-after-await": "error", + "vue/prefer-import-from-vue": "error", + "vue/prop-name-casing": ["error", "camelCase"], + "vue/require-prop-type-constructor": "error", + "vue/require-render-return": "error", + "vue/require-slots-as-functions": "error", + "vue/return-in-computed-property": "error", + "vue/return-in-emits-validator": "error", + "vue/valid-define-emits": "error", + "vue/valid-define-options": "error", + "vue/valid-define-props": "error", + "vue/valid-next-tick": "error", + + "jsdoc/check-access": "warn", + "jsdoc/check-property-names": "warn", + "jsdoc/empty-tags": "warn", + "jsdoc/implements-on-classes": "warn", + "jsdoc/no-defaults": "warn", + "jsdoc/require-param-name": "warn", + "jsdoc/require-property": "warn", + "jsdoc/require-property-description": "warn", + "jsdoc/require-property-name": "warn", + "jsdoc/require-returns-description": "warn", + + // part of the correctness category, but not wanted here + "no-constant-condition": "off", + "no-empty-pattern": "off", + "import/default": "off", + "import/namespace": "off", + "jsdoc/check-tag-names": "off", + "jsdoc/require-yields": "off", + "typescript/no-useless-empty-export": "off", + "unicorn/no-empty-file": "off", + "unicorn/no-thenable": "off", + "unicorn/no-useless-spread": "off", + // the formatter lowercases hex digits + "unicorn/number-literal-case": "off" + }, + "overrides": [ + { + "files": ["packages/**"], + "rules": { + "no-restricted-imports": ["error", { "paths": ["vitest", "path", "vitest/node"] }] + } + }, + { + // these packages declare vitest as a peer dependency + "files": ["packages/{coverage-*,ui,browser,web-worker,browser-*}/**"], + "rules": { + "no-restricted-imports": ["error", { "paths": ["path"] }] + } + }, + { + "files": ["packages/browser/src/client/orchestrator.ts"], + "rules": { + "no-restricted-imports": ["error", { "paths": ["vitest/internal/browser", "vitest/node"] }] + } + }, + { + // ivya must stay in a single rollup chunk, see the browser rollup config + "files": ["packages/browser/**"], + "excludeFiles": [ + "packages/browser/src/vendor-types.ts", + "packages/browser/src/client/tester/aria.ts", + "packages/browser/src/client/tester/locators.ts", + "packages/browser/src/client/tester/expect/**", + "packages/browser/src/client/utils.ts" + ], + "rules": { + "no-restricted-imports": ["error", { "paths": ["ivya", "ivya/utils", "ivya/aria"] }] + } + }, + { + "files": ["docs/**", "packages/web-worker/**", "test/unit/**"], + "rules": { + "no-restricted-globals": "off" + } + }, + { + "files": ["docs/**"], + "rules": { + "prefer-arrow-callback": "off", + "typescript/method-signature-style": "off", + "no-self-compare": "off", + "no-throw-literal": "off", + "no-unused-vars": "off", + "import/no-duplicates": "off", + "import/no-mutable-exports": "off" + } + }, + { + "files": ["test/**", "scripts/**", "docs/**", "examples/**", "**/*.config.*"], + "rules": { + "node/no-top-level-await": "off" + } + }, + { + "files": ["**/scripts/**", "**/cli.*", "**/cli/**"], + "rules": { + "no-console": "off" + } + }, + { + "files": ["**/*.cjs"], + "rules": { + "typescript/no-require-imports": "off" + } + } + ] +} diff --git a/.tazerc.json b/.tazerc.json index fd46acea9..cfff77b6c 100644 --- a/.tazerc.json +++ b/.tazerc.json @@ -1,8 +1,5 @@ { - "exclude": [ - "vue", - "pretty-format" - ], + "exclude": ["vue", "pretty-format"], "packageMode": { "vue": "minor", "codemirror": "minor", diff --git a/.vscode/extensions.json b/.vscode/extensions.json index f63d683be..a3311b458 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,3 @@ { - "recommendations": [ - "vitest.explorer", - "dbaeumer.vscode-eslint" - ] + "recommendations": ["vitest.explorer", "oxc.oxc-vscode"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 2ec80fa65..5f15fd816 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,44 +1,16 @@ { - // Disable the default formatter, use eslint instead - "prettier.enable": false, - "editor.formatOnSave": false, + "editor.defaultFormatter": "oxc.oxc-vscode", + "editor.formatOnSave": true, - // Auto fix "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", + "source.fixAll.oxc": "explicit", "source.organizeImports": "never" }, - // Silent the stylistic rules in you IDE, but still auto fix them - // "eslint.rules.customizations": [ - // { "rule": "style/*", "severity": "off" }, - // { "rule": "*-indent", "severity": "off" }, - // { "rule": "*-spacing", "severity": "off" }, - // { "rule": "*-spaces", "severity": "off" }, - // { "rule": "*-order", "severity": "off" }, - // { "rule": "*-dangle", "severity": "off" }, - // { "rule": "*-newline", "severity": "off" }, - // { "rule": "*quotes", "severity": "off" }, - // { "rule": "*semi", "severity": "off" } - // ], - "vitest.ignoreWorkspace": true, "vitest.configSearchPatternInclude": "test/{unit,e2e,config,browser,reporters}/{vitest,vite}.{config.ts,config.unit.mts}", "testing.automaticallyOpenTestResults": "neverOpen", - // Enable eslint for all supported languages - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "typescriptreact", - "vue", - "html", - "markdown", - "json", - "jsonc", - "yaml" - ], // Use the project's typescript version "js/ts.tsdk.path": "node_modules/typescript/lib" } diff --git a/AGENTS.md b/AGENTS.md index 10e0aa404..b750330a9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,20 +24,23 @@ Vitest is a next-generation testing framework powered by Vite. This is a monorep ## Setup and Development ### Initial Setup + 1. Run `pnpm install` to install dependencies 2. Run `pnpm build` to build all packages 3. Install Playwright browsers when working with browser features: `npx playwright install --with-deps` ### Key Scripts + - `pnpm build` - Build all packages - `pnpm dev` - Watch mode for development -- `pnpm lint` - Run ESLint -- `pnpm lint:fix` - Fix linting issues automatically +- `pnpm lint` - Run oxlint and check formatting with oxfmt +- `pnpm lint:fix` - Fix lint issues and format with oxfmt - `pnpm typecheck` - Run TypeScript type checking ## Testing ### Running Tests + - **All tests**: `CI=true pnpm test:ci` - **Examples**: `CI=true pnpm test:examples` - **Specific test suite**: `CI=true cd test/ && pnpm test ` @@ -70,6 +73,7 @@ Tests execute built output: test suites resolve `vitest` through workspace symli - `pnpm dev` (watch mode) rebuilds JS only; the `.d.ts` bundling configs are skipped in watch mode. After changing public types, run a full build before checking anything against `dist/*.d.ts`. ### Testing Utilities + - **`runInlineTests`** from `test/test-utils/index.ts` - You must use this for complex file system setups (>1 file) - **`runVitest`** from `test/test-utils/index.ts` - You can use this to run Vitest programmatically - **No mocking policy** - You must never mock anything in tests @@ -85,12 +89,13 @@ Behavior you must know: - Never mutate committed fixture files from a test; e2e tests run in parallel. Tests that only need an editable directory must use `runInlineTests`. Tests that genuinely need git-tracked files (for example `--changed`) must be added to the `serialTests` list in `test/e2e/vitest.config.ts`. - In watch-mode tests, mutate files only with `createFile`/`editFile` from `test/test-utils`: they restore content and mtime after the test, so the next test's watcher sees no phantom change. Call them inside a test, not in hooks (cleanup registers via `onTestFinished`). Always pass a small explicit `root`; `runVitest({ watch: true, root })` waits for the watcher to be ready before resolving. -- ESLint's test rules are disabled in this repo, so a stray `.only` passes lint. Check for and remove it yourself. +- The vitest lint plugin is not enabled in this repo, so a stray `.only` passes lint. Check for and remove it yourself. - CI runs the unit, e2e, coverage, and browser suites on Windows, plus an e2e leg on macOS. Vitest reports paths with forward slashes, so normalize `\` to `/` before comparing against `import.meta.filename`, `process.execArgv`, or other raw OS paths. Never use unix-only commands like `rm -rf` or `cp -r` in package.json scripts; use a node script or rimraf. ## Project Structure ### Core Packages (`packages/`) + - `vitest` - Main testing framework, including the test runner core (all imported packages, except `@vitest/mocker`, from this repository are inlined into its bundle, they are not imported at runtime) - `browser` - Browser testing support - `browser-playwright` / `browser-preview` - Browser mode providers @@ -105,6 +110,7 @@ Behavior you must know: - `web-worker` - Web Worker simulation for Node.js ### Test Organization (`test/`) + - `test/unit` - Core functionality tests - `test/e2e` - End-to-end tests run through `runVitest`/`runInlineTests` - `test/browser` - Browser-specific tests @@ -112,6 +118,7 @@ Behavior you must know: - Various test suites organized by feature ### Important Directories + - `docs/` - Documentation (Vite-powered) - `examples/` - Example projects and integrations - `scripts/` - Build and development scripts @@ -121,20 +128,25 @@ Behavior you must know: ## Code Style and Conventions ### Formatting and Linting -- **Always run** `pnpm lint:fix` after making changes + +- Linting is done by [oxlint](https://oxc.rs/docs/guide/usage/linter) (`.oxlintrc.json`). Formatting, including import order, is done only by [oxfmt](https://oxc.rs/docs/guide/usage/formatter) (`.oxfmtrc.json`); there are no stylistic lint rules +- **Always run** `pnpm lint:fix` after making changes; it runs `oxlint --fix` and then `oxfmt` +- `pnpm lint` runs `oxlint` and `oxfmt --check`; both must pass in CI - Fix non-auto-fixable errors manually -- Run lint as `CI=true pnpm lint` from a terminal inside an editor or agent harness: the config disables some rules when it detects an editor environment, and those rules still fail in CI +- Suppress a rule with `// oxlint-disable-next-line `, never with `eslint-disable`; an unused directive is a lint error +- Test fixtures (`**/fixtures`) are neither linted nor formatted; `*.d.ts` files and markdown code blocks are formatted but not linted Rules that `lint:fix` cannot fix: -- Never `import ... from 'path'`; it is an ESLint error everywhere. Prefer `pathe` (the dominant convention; it normalizes paths to posix), though `node:path` is allowed in Node-only code. +- Never `import ... from 'path'`; it is a lint error everywhere. Prefer `pathe` (the dominant convention; it normalizes paths to posix), though `node:path` is allowed in Node-only code. - Source in `packages/*/src` must not import from `vitest` or `vitest/node`, even type-only. Exception: packages that declare vitest as a peer dependency (`coverage-*`, `ui`, `browser`, `browser-*`, `web-worker`). -- `console.log` in package source is an ESLint error; only `console.warn` and `console.error` are allowed. Remove debug logging, and give intentional console output an explicit eslint-disable comment. +- `console.log` in package source is a lint error; only `console.warn` and `console.error` are allowed. Remove debug logging, and give intentional console output an explicit `oxlint-disable-next-line no-console` comment. - Use `globalThis`, never `global` or `self` (allowed only in `docs/`, `packages/web-worker/`, and `test/unit/`). -- No top-level `await` in `packages/*/src` (allowed in `test/`, `scripts/`, and config files); no `const enum`; no `export =`. -- In `packages/browser`, do not import from `ivya` outside the files that already do; ESLint enforces this so ivya stays in a single rollup chunk. Reuse the existing entry points. +- No top-level `await` in `packages/*/src` (allowed in `test/`, `scripts/`, `docs/`, `examples/`, and config files). `const enum` and `export =` are also banned, but the linter does not check them. +- In `packages/browser`, do not import from `ivya` outside the files that already do; oxlint enforces this so ivya stays in a single rollup chunk. Reuse the existing entry points. ### TypeScript + - Strict TypeScript configuration - Use `pnpm typecheck` to verify types - Configuration files: `tsconfig.base.json`, `tsconfig.build.json`, `tsconfig.check.json` @@ -142,6 +154,7 @@ Rules that `lint:fix` cannot fix: - Root typecheck does not cover the UI client Vue code; when changing `packages/ui/client`, also run `pnpm -C packages/ui typecheck:client` ### Code Quality + - ESM-first approach - Follow existing patterns in the codebase - Use utilities from `@vitest/utils/*` when available. Never import from `@vitest/utils` main entry point directly. @@ -160,6 +173,7 @@ Rules that `lint:fix` cannot fix: ## Common Workflows ### Adding New Features + 1. Identify the appropriate package in `packages/` 2. Follow existing code patterns 3. Add tests using testing utilities @@ -167,10 +181,12 @@ Rules that `lint:fix` cannot fix: 5. Add tests with relevant test suites ### Debugging + - Use VS Code: `⇧⌘B` (Shift+Cmd+B) or `Ctrl+Shift+B` for dev tasks - Check `scripts/` directory for specialized development tools ### Documentation + - Docs live in `docs/` (VitePress); read `docs/AGENTS.md` before working on them - After ANY change to CLI options or their descriptions in `packages/vitest/src/node/cli/cli-config.ts`, run `pnpm -C docs run cli-table` and commit the regenerated `docs/guide/cli-generated.md`; never edit that file by hand @@ -191,15 +207,18 @@ Other blocking CI jobs: ## Dependencies and Tools ### Key Dependencies + - **Vite** - Build tool and dev server - **Rollup** - Bundler -- **ESLint** - Linting +- **oxlint** - Linting +- **oxfmt** - Formatting - **TypeScript** - Type checking - **Playwright** - Browser testing - **Chai/Expect** - Assertions - **Tinybench** - Benchmarking ### Adding and Updating Dependencies + - New runtime deps for `packages/*` usually go into `devDependencies`: Rollup marks only `dependencies` as external and bundles everything else. Use `dependencies` only for `@types/*` packages, deps that cannot be bundled (binaries), or deps whose own types appear in Vitest's public types (see "Notes on Dependencies" in CONTRIBUTING.md). - Add deps with `pnpm add ` inside the target package: `catalogMode: prefer` writes `catalog:` into package.json and adds the version to the default catalog in `pnpm-workspace.yaml` automatically. To bump a shared dep, edit its catalog entry, never per-package ranges. - The `overrides` in `pnpm-workspace.yaml` force one version of `vite`, `rollup`, `@types/node`, `acorn`, and `mlly` across the workspace; editing a range in an individual package.json changes what gets published, not what installs locally. @@ -209,10 +228,12 @@ Other blocking CI jobs: - pnpm enforces a 24h `minimumReleaseAge`: installing a version published less than a day ago either resolves to an older version or appends the pick to `minimumReleaseAgeExclude` in `pnpm-workspace.yaml`. Both outcomes are expected; commit the yaml change instead of reverting it. ## Browser Testing + - Providers: Playwright (`@vitest/browser-playwright`) and preview (`@vitest/browser-preview`); the WebDriverIO provider is maintained outside this monorepo - Component testing supported (Vue, React, Svelte via official `vitest-browser-*` packages, other frameworks via Testing Library) ## Performance Considerations + - This is a performance-critical testing framework - Pay attention to import costs and bundle size - Use lazy loading where appropriate @@ -221,12 +242,14 @@ Other blocking CI jobs: ## Troubleshooting ### Common Issues + - Ensure pnpm is used (not npm/yarn) - Build before running tests - Check Node.js version compatibility - Playwright browsers must be installed for browser tests ### Getting Help + - Check existing issues and documentation - Review CONTRIBUTING.md for detailed guidelines - Follow patterns in existing code diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8bcd08965..0144acf0e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,8 @@ To develop and test `vitest` package: 1. Run `pnpm install` in `vitest`'s root folder 2. Run `pnpm run build` to build all monorepo packages - - after this, you can use `pnpm run dev` to rebuild packages as you modify code + +- after this, you can use `pnpm run dev` to rebuild packages as you modify code 3. Run - `pnpm run test` to run core tests diff --git a/_typos.toml b/_typos.toml index c386660c6..ea0661edc 100644 --- a/_typos.toml +++ b/_typos.toml @@ -1,9 +1,5 @@ [files] -extend-exclude = [ - "*.js.map", - "*.svg", - "test/e2e/test/fixtures/reporters/html/**", -] +extend-exclude = ["*.js.map", "*.svg", "test/e2e/test/fixtures/reporters/html/**"] [default.extend-words] # AsyncLocalStorage abbreviation diff --git a/docs/.vitepress/blog.data.ts b/docs/.vitepress/blog.data.ts index 8aa4dc4a7..d9799a454 100644 --- a/docs/.vitepress/blog.data.ts +++ b/docs/.vitepress/blog.data.ts @@ -17,8 +17,7 @@ export default createContentLoader('blog/*.md', { transform(raw): Post[] { return raw .map(({ url, frontmatter }) => ({ - title: frontmatter.head.find((e: any) => e[1].property === 'og:title')[1] - .content, + title: frontmatter.head.find((e: any) => e[1].property === 'og:title')[1].content, url, date: formatDate(frontmatter.date), })) diff --git a/docs/.vitepress/components/Advanced.vue b/docs/.vitepress/components/Advanced.vue index de842162c..8bd33cc5c 100644 --- a/docs/.vitepress/components/Advanced.vue +++ b/docs/.vitepress/components/Advanced.vue @@ -1,5 +1,9 @@ diff --git a/docs/.vitepress/components/BlogIndex.vue b/docs/.vitepress/components/BlogIndex.vue index b702f1617..95244ffb6 100644 --- a/docs/.vitepress/components/BlogIndex.vue +++ b/docs/.vitepress/components/BlogIndex.vue @@ -10,9 +10,7 @@ function getDateTime(time: number) {
  • - +

    {{ post.title }}

    diff --git a/docs/.vitepress/components/CRoot.vue b/docs/.vitepress/components/CRoot.vue index b01d65081..464f4c5f6 100644 --- a/docs/.vitepress/components/CRoot.vue +++ b/docs/.vitepress/components/CRoot.vue @@ -3,7 +3,11 @@ import { Icon } from '@iconify/vue' diff --git a/docs/.vitepress/components/CopyPrompt.vue b/docs/.vitepress/components/CopyPrompt.vue index bf253ab5e..7cc1b2091 100644 --- a/docs/.vitepress/components/CopyPrompt.vue +++ b/docs/.vitepress/components/CopyPrompt.vue @@ -7,14 +7,13 @@ const props = defineProps<{ }>() const state = ref<'idle' | 'copied' | 'error'>('idle') -const label = computed(() => state.value === 'copied' ? 'Copied' : 'Copy prompt') +const label = computed(() => (state.value === 'copied' ? 'Copied' : 'Copy prompt')) async function copyPrompt() { try { await navigator.clipboard.writeText(props.prompt) state.value = 'copied' - } - catch { + } catch { state.value = 'error' } } @@ -26,6 +25,12 @@ async function copyPrompt() { {{ label }} - {{ state === 'copied' ? 'Prompt copied to clipboard.' : state === 'error' ? 'Could not copy prompt.' : '' }} + {{ + state === 'copied' + ? 'Prompt copied to clipboard.' + : state === 'error' + ? 'Could not copy prompt.' + : '' + }} diff --git a/docs/.vitepress/components/Deprecated.vue b/docs/.vitepress/components/Deprecated.vue index 9ae996276..b5d12e2e4 100644 --- a/docs/.vitepress/components/Deprecated.vue +++ b/docs/.vitepress/components/Deprecated.vue @@ -1,5 +1,3 @@ diff --git a/docs/.vitepress/components/Experimental.vue b/docs/.vitepress/components/Experimental.vue index b35721c98..40292f00f 100644 --- a/docs/.vitepress/components/Experimental.vue +++ b/docs/.vitepress/components/Experimental.vue @@ -1,5 +1,9 @@ diff --git a/docs/.vitepress/components/FeaturesList.vue b/docs/.vitepress/components/FeaturesList.vue index 9ab874de8..a16b98da7 100644 --- a/docs/.vitepress/components/FeaturesList.vue +++ b/docs/.vitepress/components/FeaturesList.vue @@ -3,31 +3,68 @@ import ListItem from './ListItem.vue'