Skip to content

feat(linter): Split jest/prefer-to-contain into a jest and a vitest rule.#21821

Merged
graphite-app[bot] merged 1 commit intomainfrom
vitest-split-prefer-to-contain
Apr 27, 2026
Merged

feat(linter): Split jest/prefer-to-contain into a jest and a vitest rule.#21821
graphite-app[bot] merged 1 commit intomainfrom
vitest-split-prefer-to-contain

Conversation

@connorshea
Copy link
Copy Markdown
Member

@connorshea connorshea commented Apr 27, 2026

Part of #21664.

Generated with Claude Code, Opus 4.7. Reviewed by me.

I had Claude double-check itself after simplifying the vitest tests down, and manually spot-checked 8 different tests in the vitest snapshot to make sure the deleted tests were indeed duplicates. All were identical dupes of other tests in the same file.

Copilot AI review requested due to automatic review settings April 27, 2026 04:39
@connorshea connorshea requested a review from camc314 as a code owner April 27, 2026 04:39
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR continues the ongoing Jest→Vitest rule split by extracting prefer-to-contain into shared logic and introducing a dedicated vitest/prefer-to-contain rule, removing it from the “vitest compatible jest rules” compatibility list.

Changes:

  • Remove prefer-to-contain from VITEST_COMPATIBLE_JEST_RULES and the synced JSON list.
  • Factor the rule implementation into a shared rules::shared::prefer_to_contain module and wire both jest/ and vitest/ wrappers to it.
  • Add Vitest-specific snapshots and register the new Vitest rule in generated rule registries.

Reviewed changes

Copilot reviewed 9 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
crates/oxc_linter/src/utils/mod.rs Updates the compatibility allowlist size and removes prefer-to-contain.
crates/oxc_linter/data/vitest_compatible_jest_rules.json Keeps external sync list aligned with the compatibility change.
crates/oxc_linter/src/rules/shared/jest_vitest/mod.rs Exposes the new shared prefer_to_contain module.
crates/oxc_linter/src/rules/shared/jest_vitest/prefer_to_contain.rs Introduces the shared implementation and docs for Jest/Vitest wrappers.
crates/oxc_linter/src/rules/jest/prefer_to_contain.rs Switches Jest rule to delegate to shared implementation; trims Vitest test coverage from this file.
crates/oxc_linter/src/rules/vitest/prefer_to_contain.rs Adds a dedicated Vitest rule wrapper and associated tests.
crates/oxc_linter/src/rules.rs Registers the new Vitest rule module.
crates/oxc_linter/src/generated/rules_enum.rs Adds the new Vitest rule to the generated enum, IDs, schema wiring, and dispatch.
crates/oxc_linter/src/generated/rule_runner_impls.rs Registers runner metadata for the new Vitest rule.
crates/oxc_linter/src/snapshots/jest_prefer_to_contain.snap Removes Vitest-plugin output from the Jest snapshot.
crates/oxc_linter/src/snapshots/vitest_prefer_to_contain.snap Adds snapshot coverage for the new Vitest rule.

Comment thread crates/oxc_linter/src/rules/vitest/prefer_to_contain.rs
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 27, 2026

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 47 skipped benchmarks1


Comparing vitest-split-prefer-to-contain (ed31e8d) with main (ea4b358)

Open in CodSpeed

Footnotes

  1. 47 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 11 changed files in this pull request and generated no new comments.

@connorshea connorshea changed the title feat(linter): Split jest/prefer-to-contain into a shared and a vitest rule. feat(linter): Split jest/prefer-to-contain into a jest and a vitest rule. Apr 27, 2026
@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Apr 27, 2026
@camc314 camc314 self-assigned this Apr 27, 2026
Copy link
Copy Markdown
Contributor

camc314 commented Apr 27, 2026

Merge activity

  • Apr 27, 7:42 AM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Apr 27, 7:42 AM UTC: camc314 added this pull request to the Graphite merge queue.
  • Apr 27, 7:56 AM UTC: The Graphite merge queue couldn't merge this PR because it was not satisfying all requirements (Failed CI: 'Test Linux').
  • Apr 27, 8:25 AM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Apr 27, 8:25 AM UTC: camc314 added this pull request to the Graphite merge queue.
  • Apr 27, 8:30 AM UTC: Merged by the Graphite merge queue.

graphite-app Bot pushed a commit that referenced this pull request Apr 27, 2026
…ule. (#21821)

Part of #21664.

Generated with Claude Code, Opus 4.7. Reviewed by me.

I had Claude double-check itself after simplifying the vitest tests down, and manually spot-checked 8 different tests in the vitest snapshot to make sure the deleted tests were indeed duplicates. All were identical dupes of other tests in the same file.
@graphite-app graphite-app Bot force-pushed the vitest-split-prefer-to-contain branch from ed31e8d to bcf246f Compare April 27, 2026 07:54
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Apr 27, 2026
@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Apr 27, 2026
…ule. (#21821)

Part of #21664.

Generated with Claude Code, Opus 4.7. Reviewed by me.

I had Claude double-check itself after simplifying the vitest tests down, and manually spot-checked 8 different tests in the vitest snapshot to make sure the deleted tests were indeed duplicates. All were identical dupes of other tests in the same file.
@graphite-app graphite-app Bot force-pushed the vitest-split-prefer-to-contain branch from dd702cf to 613bfef Compare April 27, 2026 08:26
@graphite-app graphite-app Bot merged commit 613bfef into main Apr 27, 2026
27 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Apr 27, 2026
@graphite-app graphite-app Bot deleted the vitest-split-prefer-to-contain branch April 27, 2026 08:30
camc314 added a commit that referenced this pull request Apr 27, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName`
(#21711) (overlookmotel)
- 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710)
(overlookmotel)
- c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement`
(#21709) (overlookmotel)

### 🚀 Features

- b4acdbd linter/vue: Implement no-deprecated-delete-set rule (#21766)
(bab)
- 613bfef linter: Split jest/prefer-to-contain into a jest and a vitest
rule. (#21821) (connorshea)
- c629719 linter/vue: Implement no-deprecated-events-api rule (#21793)
(Alex Peshkov)
- f2a8528 linter: Split jest/require-top-level-describe rule into a Jest
and a Vitest rule. (#21822) (connorshea)
- ea4b358 linter: Split jest/prefer-todo into a shared rule and a
vitest-specific rule. (#21820) (connorshea)
- 3a66819 linter: Split jest/no-mocks-import into vitest/no-mocks-import
(#21818) (camchenry)
- 0b3ffce linter: Split jest/no-large-snapshots into
vitest/no-large-snapshots (#21814) (camchenry)
- d1cf22e linter: Split jest/no-interpolation-in-snapshots into
vitest/no-interpolation-in-snapshots (#21812) (camchenry)
- bb0c359 linter: Split jest/no-identical-title into
vitest/no-identical-title (#21810) (camchenry)
- c26ea41 linter: Split jest/no-hooks into vitest/no-hooks (#21809)
(camchenry)
- 46b32f2 linter: Split jest/no-focused-tests into
vitest/no-focused-tests (#21804) (camchenry)
- acf41a8 linter: Split jest/no-duplicate-hooks into
vitest/no-duplicate-hooks (#21803) (camchenry)
- 54d787f linter: Split jest/no-disabled-tests into
vitest/no-disabled-tests (#21802) (camchenry)
- 9c9a676 linter/vue: Implement no-deprecated-data-object-declaration
rule (#21764) (bab)
- 4445855 linter: Split `jest/no-conditional-in-test` into
`vitest/no-conditional-in-test` (#21763) (camchenry)
- b8604de linter: Split `jest/no-conditional-expect` into
`vitest/no-conditional-expect` (#21762) (camchenry)
- 0dbd650 linter: Split `jest/no-commented-out-tests` into
`vitest/no-commented-out-tests` (#21761) (camchenry)
- 7f1a97c linter: Split `jest/no-alias-methods` into
`vitest/no-alias-methods` (#21760) (camchenry)
- eb97c49 linter: Split `jest/max-nested-describe` into
`vitest/max-nested-describe` (#21759) (camchenry)
- d870cad linter: Split `jest/max-expects` into `vitest/max-expects`
(#21758) (camchenry)
- 1b97124 linter/vue: Implement no-deprecated-vue-config-keycodes rule
(#21699) (bab)
- 5f81883 linter/eslint: Implement `func-name-matching` rule (#21708)
(Mikhail Baev)
- 348f46c linter: Add `respectEslintDisableDirectives` option (#21384)
(Christian Vuerings)
- 63ec351 linter: Support nested vite+ config discovery (#21638)
(camc314)
- 560feb4 linter: Introduce `Vite` variant to `DiscoveredConfigFile`
(#21637) (camc314)
- 07dc41e linter/eslint: Implement `no-underscore-dangle` rule (#21630)
(Paul-Arthur THIERY)
- e270d54 linter/react: Impl react/no-did-update-set-state (#17322)
(Kenzo Wada)
- ca81199 linter/react: Implement `forbid-component-props` rule (#20005)
(Mikhail Baev)
- 6776403 linter/branches-sharing-code: Move rule from nursery to
pedantic (#21621) (camc314)
- ce7a4dc linter/no-unreachable: Move rule from nursery to correctness
(#21618) (camc314)
- e3b5e78 linter/getter-return: Move rule from nursery to correctness
(#21617) (camc314)
- d3a7e9a linter/unicorn: Implement suggestion for
`no-useless-iterator-to-array` rule (#21610) (Mikhail Baev)
- a0c883c oxlint/lsp: Add vite plus version to server info (#21587)
(Sysix)
- 67ff860 linter/no-unknown-property: Support React 19 `precedence` prop
(#21590) (João Pedro Schmitz)

### 🐛 Bug Fixes

- aace797 linter: Detect Svelte TS and module scripts correctly (#20819)
(mustafa0x)
- 3612db1 linter/prefer-default-parameters: Skip reporting on
object/class setters (#21836) (camc314)
- 28c3521 oxlint/lsp: Remove overlapping edits for
`source.fixAllDangerous.oxc` code action (#21785) (Sysix)
- 705a82c linter/no-non-null-asserted-nullish-coalescing: Add fixer
(#21827) (yyh)
- 33f5535 linter: Add checks that `Program` is in current allocator
chunk before JS plugins linting (#21774) (overlookmotel)
- d122877 linter/no-extra-non-null-assertions: Add fixer (#21744) (yyh)
- 37f0731 linter: `with_plugin_vitest(true)` working realiable in test
mode (#21769) (Said Atrahouch)
- e42e6a6 linter/role-supports-aria-props: False positive with
`combobox` and `haspopup` (#21725) (Leonabcd123)
- e24324f linter: Iframe-has-title false positive for template literals
(#21714) (Leonabcd123)
- 41a6510 linter/vitest/hoisted-apis-on-top: Only check first member
(#20068) (Sidharth Vinod)
- 98ed888 linter: Check initializer for allowConstantExport in
only-export-components (#20608) (Eyüp Can Akman)
- 1946e8b linter: Avoid applying override plugin categories to eslint
rules (#21521) (bab)
- 3d1e83a linter: Parse `<script>` tag attributes with curly braces in
Svelte files (#21089) (bab)
- bc6ade5 linter: Report actual disable directive prefix (#21682)
(camc314)
- bf84466 linter: Respect category settings in overrides (#19411)
(Connor Shea)
- 52ecb45 linter/vitest: Don't treat `test.extend` or `it.extend` as
test functions (#21668) (Said Atrahouch)
- aa1a00c linter: Support jsx-a11y attributes setting in anchor-is-valid
rule (#21665) (camchenry)
- 30e0ad3 linter/prefer-default-parameters: Preserve TS annotations in
fixer (#21655) (camc314)
- 8c425db linter: Allow string for jest version in config schema
(#21649) (camc314)
- 3617864 linter/react/display-name: Fix false positive for named
default class (#21643) (Mikhail Baev)
- f3a02cc linter/no-non-null-assertion: Improve diagnostic message
(#21616) (Cameron)
- c2ada2c linter: Make `--fix-dangerously` fix dangerous fixes and
suggestions as documented (#13366) (Ulrich Stark)
- 8265ed9 linter/sort-keys: Handle CRLF separated groups (#21608)
(camc314)
- 96c559e linter/no-shadow: Add note explaining enum member shadowing
(#21607) (camc314)
- 3b49389 linter: No-irregular-whitespace: add config options (#21559)
(camchenry)

### ⚡ Performance

- cdc9eae oxlint/lsp: Avoid clones on lsp options deserializion (#21748)
(Sysix)
- be2db80 linter/sort-keys: Reduce allocations (#21560) (camchenry)

### 📚 Documentation

- 453d647 linter: Remove now-unnecessary compatibility notes from shared
Jest/Vitest rules. (#21826) (connorshea)
- b1574a2 linter: Fix the configuration docs for no-underscore-dangle
rule. (#21801) (connorshea)
- 6946aee linter: Remove no-longer-relevant documentation about vitest
compatibility from shared Jest/Vitest rules. (#21799) (connorshea)
- 0652ea2 linter: Misc grammar cleanup for Vitest rules. (#21755)
(connorshea)
- 99f0b68 linter: Improve docs for `vitest/require-mock-type-parameters`
rule. (#21754) (connorshea)
- 9e2796b linter: Improve the docs for the `vitest/hoisted-apis-on-top`
rule. (#21753) (connorshea)
- 2ccede2 linter: Improve function usage examples in doc comments
(#21718) (overlookmotel)
- 43adae9 linter: Add version section to rules page (#21601) (camchenry)
- d15dad2 linter: Export rule version metadata (#21588) (Old Autumn)
# Oxfmt
### 💥 BREAKING CHANGES

- 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName`
(#21711) (overlookmotel)
- 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710)
(overlookmotel)
- c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement`
(#21709) (overlookmotel)

### 🚀 Features

- 3bc54a9 oxfmt: Respect nested config for `--stdin-filepath` (#21627)
(leaysgur)
- 144f27a oxfmt: Respect ignore settings for `--stdin-filepath` (#21625)
(leaysgur)
- 81c7ae4 oxfmt/lsp: Add vite plus version to server info (#21586)
(Sysix)

### 🐛 Bug Fixes

- 477435b formatter/sort_imports: Keep leading blank line when
decreasing group transitions (#21835) (leaysgur)
- 38d1e82 oxfmt/lsp: Format non `file://` URIs without a authority
(#21647) (Sysix)
- 5eb8e2b formatter/sort_imports: Preserve blank lines around ignored
side-effect imports (#21692) (leaysgur)
- 0dce3c6 oxfmt: Handle invalid `overrides` config without panic
(#21661) (Yuji Sugiura)
- 9f82ed4 formatter: Escape backticks in JSDoc inline code spans
(#21577) (bab)

### ⚡ Performance

- db6c603 oxfmt/lsp: Avoid clones on lsp options deserializion (#21749)
(Sysix)
- 6a96c76 formatter: Avoid heap alloc for jsdoc delimiter (#21597)
(leaysgur)

---------

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants