Commit Graph

2615 Commits

Author SHA1 Message Date
Mikhail Baev b50bf4df69 docs(linter): remove manually written options doc for eslint/arrow-body-style (#23490)
this PR removes manually written options doc for
`eslint/arrow-body-style` to avoid duplication

---------

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-16 11:37:40 +01:00
WaterWhisperer b02444e2a8 feat(linter): add schema for react/jsx-no-script-url (#23475)
Adds verified config schema generation for `react/jsx-no-script-url`.

Refs #22955.

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-16 08:52:00 +01:00
Dunqing 53509a85df feat(minifier): treeshake pure typed arrays and Set/Map array literals (#23469)
## Summary

Mark side-effect-free `new` constructions pure so they are dropped when unused (and annotated for downstream tree-shaking):

- **TypedArrays** with a non-negative numeric-literal length (`new Int8Array(8)`, `new Uint8Array(1024)`). The buffer allocation runs no user code; a valid length is pure and a too-large length only throws a maximum-length `RangeError`, which the minifier is allowed to drop (see `docs/ASSUMPTIONS.md`). `new Int8Array(-1)` (negative-length `RangeError`), `new Int8Array(0n)` (BigInt `TypeError`), object, and non-literal arguments are kept.
- **`new Set([...])` / `new Map([[..], ..])`** with array-literal arguments; element side effects are preserved when the construction is dropped. `WeakSet`/`WeakMap` are excluded (their keys must be objects, so `new WeakSet([1])` throws), and `Map` entries must be array literals (`new Map([1])` throws).

This matches esbuild's per-constructor handling — the only other minifier that keeps every throwing form; Rollup, Terser (`unsafe`), and SWC drop some of these incorrectly. Cross-verified against the ES spec, esbuild, Terser, Rollup, and SWC.

Minified-size impact: react.development.js −0.04 kB; size-neutral elsewhere (real code uses dynamic buffer lengths, not numeric literals).
2026-06-16 07:46:28 +00:00
Sysix 37a34a128f fix(oxfmt/lsp): avoid newlines line ending changes (#23463)
close https://github.com/oxc-project/oxc/issues/23462
Manually tested in VS Code.
A snapshot test will not work, because it does not reflect how editors work, it just replaces position→bytes offset, not interpreting what an editor/ LSP client does.
_https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocuments_

> So you can not specify a position that denotes \r|\n or \n| where | represents the character offset.
2026-06-15 23:55:24 +00:00
Sysix fef29bdbce refactor(linter): add MixedTupleRuleConfig (#23396)
Added a new struct for 3 rules:
- `eslint/func-name-matching`
- `import/extension`
- `react/jsx-no-script-url`

These rules accept an enum configuration like:
```rust
enum ConfigOptions {
 First(Option1),
 Second(Option2),
 Both(Option1, Option2)
}
```

Added the new struct for `eslint/func-name-matching` to test if the expected result matches the upstream configuration.
Changed the rule schema generation code, so enums (`subschema with any_of`), will be folded, Allowing us to support the 3 rules.
2026-06-15 16:53:26 +00:00
arieleli01212 a8dce46fcd feat(linter/unicorn): implement max-nested-calls rule (#23461)
Implements the `unicorn/max-nested-calls` rule. Part of #684.

Limits the depth of nested calls, following the [eslint-plugin-unicorn
rule](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/max-nested-calls.md).

## What it does

Counts calls and constructor calls passed as arguments into other
calls/constructors. Reports when the depth exceeds `max` (default `3`).
Fluent receiver chains and JSX wrappers are ignored, and a new scope
(function, class, static block, JSX element/fragment) resets the count.

```js
// ❌
foo(bar(baz(qux())));

// ✅
const value = baz(qux());
foo(bar(value));

// ✅ fluent chains are ignored
query().filter().map().toArray();
```

## Options

`max` (integer, default `3`) — the maximum allowed nested call depth.

## Notes

- All 16 pass / 10 fail fixtures from the upstream rule are ported,
including `new`, `await`, optional calls (`?.`), spread arguments,
ternaries, and the JSX/class/static-block boundary cases.
- The depth walk tracks the child node through each ancestor and only
counts an ancestor call/`new` when the child is one of its arguments
(not its callee), which is what makes fluent chains and JSX wrappers
transparent.

---------

Co-authored-by: Ariel Eli <arieleli@MacBook-Air-sl-Ariel.local>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-06-15 17:45:24 +01:00
renovate[bot] bcefc00974 chore(deps): update oxc to ^0.136.0 (#23448)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [@oxc-project/types](https://oxc.rs)
([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/npm/oxc-types))
| [`^0.135.0` →
`^0.136.0`](https://renovatebot.com/diffs/npm/@oxc-project%2ftypes/0.135.0/0.136.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@oxc-project%2ftypes/0.136.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@oxc-project%2ftypes/0.136.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@oxc-project%2ftypes/0.135.0/0.136.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@oxc-project%2ftypes/0.135.0/0.136.0?slim=true)
|
| [oxc-parser](https://oxc.rs/docs/guide/usage/parser)
([source](https://redirect.github.com/oxc-project/oxc/tree/HEAD/napi/parser))
| [`^0.135.0` →
`^0.136.0`](https://renovatebot.com/diffs/npm/oxc-parser/0.135.0/0.136.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/oxc-parser/0.136.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/oxc-parser/0.136.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/oxc-parser/0.135.0/0.136.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/oxc-parser/0.135.0/0.136.0?slim=true)
|

---

### Release Notes

<details>
<summary>oxc-project/oxc (oxc-parser)</summary>

###
[`v0.136.0`](https://redirect.github.com/oxc-project/oxc/blob/HEAD/napi/parser/CHANGELOG.md#01360---2026-06-15)

##### ⚡ Performance

-
[`da1a6c6`](https://redirect.github.com/oxc-project/oxc/commit/da1a6c6)
diagnostics: Migrate to allocation-optimized oxc-miette
([#&#8203;23094](https://redirect.github.com/oxc-project/oxc/issues/23094))
(Boshen)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-06-15 14:31:57 +01:00
camc314 9f1a985dcd perf(oxlint): start Tokio only for LSP (#23447)
- Start the Tokio runtime only when oxlint runs in LSP mode.
- Keep normal oxlint CLI runs on the synchronous path.
- Split from #23409.
2026-06-15 13:10:16 +00:00
camc314 a303c2348e fix(linter/jsx-a11y): align anchor-is-valid config with upstream (#23446)
## Summary
- Align `jsx_a11y/anchor-is-valid` rule options with upstream `eslint-plugin-jsx-a11y`: `components`, `specialLink`, and `aspects`.
- Re-port the upstream rule test matrix and expose the generated schema/config types for the supported options.

Fixes #23358
2026-06-15 13:05:18 +00:00
oxc-guard[bot] aa79b5be99 release(apps): oxlint v1.70.0 && oxfmt v0.55.0 (#23442)
# Oxlint
### 🚀 Features

- 5e1627d linter/unicorn: Flag all Error() calls without new in
`throw-new-error` (#23363) (Cason Kervis)
- 2e8bda4 linter/vue: Implement no-dupe-keys rule (#23350) (bab)
- 1490a0a linter/react: Implement react-compiler rule (#23202) (Boshen)
- dd560ae linter/unicorn: Implement `no-array-fill-with-reference-type`
rule (#23397) (Mikhail Baev)
- af36c2f linter: Add schema for `react/jsx-curly-brace-presence`
(#23400) (WaterWhisperer)
- 47d34a3 linter: Add schema for `react/jsx-handler-names` (#23393)
(WaterWhisperer)
- f4250d0 linter: Add schema for `unicorn/import-style` (#23386)
(WaterWhisperer)
- 30c74ce linter: Add schema for
`jsx_a11y/no-noninteractive-element-to-interactive-role` (#23384)
(Sysix)
- cfbe8dc linter: Add schema for
`jsx_a11y/no-interactive-element-to-noninteractive-role` (#23382)
(WaterWhisperer)
- d15b7ff linter: Add schema for `typescript/no-restricted-types`
(#23381) (WaterWhisperer)
- 028a811 linter: Add schema for `jsx-a11y/media-has-caption` (#23377)
(Sysix)
- b3b1038 linter: Add schema for `jsx-a11y/label-has-associated-control`
(#23376) (Sysix)
- 7ada6b2 linter: Add schema for `jsx_a11y/no-distracting-elements`
(#23379) (WaterWhisperer)
- ee3dd49 linter: Add schema for `jsx-a11y/img-redundant-alt` (#23374)
(Sysix)
- df5f8dd linter: Add short descriptions to most lint rules. (#23365)
(Connor Shea)
- e3fd735 linter: Add schema for `jsx_a11y/alt-text` (#23369) (Sysix)
- 0f2fff4 linter: Add schema for `react/exhaustive-deps` (#23372)
(Mikhail Baev)
- e3e4e10 linter: Add schema for `react_perf/jsx-no-new-object-as-prop`
(#23368) (Mikhail Baev)
- 9366d44 linter: Add schema for `unicorn/prefer-at` (#23366)
(WaterWhisperer)
- f57b55d linter: Add schema for `typescript/array-type` (#23355)
(Sysix)
- 0dcf912 linter: Add schema for `typescript/ban-ts-comment` (#23354)
(Sysix)
- 51fa83e linter: Add schema for `react/no-did-update-set-state`
(#23357) (Mikhail Baev)
- 59db0bd linter: Add schema for `consistent-generic-constructors`
(#23353) (Sysix)
- c4775c0 linter: Add schema for `typescript/consistent-type-assertions`
(#23349) (Sysix)
- 6e516f7 linter: Add schema for `typescript/consistent-type-imports`
(#23348) (Sysix)
- 012134d linter: Add schema for `react/jsx-no-target-blank` (#23345)
(WaterWhisperer)
- 0806aae linter: Add schema for `jsx_a11y/no-noninteractive-tabindex`
(#23337) (Mikhail Baev)
- 0708b5a linter: Add schema for `react/jsx-filename-extension` (#23315)
(Mikhail Baev)
- 150bce1 linter: Add schema for `typescript/no-empty-object-type`
(#23309) (Sysix)
- f9e36f1 linter: Add schema for
`typescript/no-duplicate-type-constituents` (#23308) (Sysix)
- 937accf linter: Add schema for `typescript/no-invalid-void-type`
(#23307) (Sysix)
- 3e042b9 linter: Add schema for `typescript/no-misused-promises`
(#23306) (Sysix)
- da212d1 linter: Add schema for `typescript/no-unnecessary-condition`
(#23305) (Sysix)
- f8f0d38 linter: Add schema for `typescript/parameter-properties`
(#23304) (Sysix)
- 2275fc7 linter: Add schema for `typescript/prefer-nullish-coalescing`
(#23302) (Sysix)
- d353858 linter: Add schema for
`typescript/prefer-string-starts-ends-with` (#23301) (Sysix)
- 03060f5 linter: Add schema for `typescript/triple-slash-reference`
(#23300) (Sysix)
- 6619cee linter: Add schema for `promise/param-names` (#23298) (Sysix)
- 8bf108e linter: Add schema for `promise/catch-or-return` (#23297)
(Sysix)
- 48158d0 linter: Add schema for `vitest/consistent-each-for` (#23294)
(Sysix)
- 7e74c98 linter: Add schema for `vitest/consistent-test-filename`
(#23293) (Sysix)
- ff94d4a linter: Add schema for `vitest/consistent-vitest-vi` (#23292)
(Sysix)
- 2409a10 linter: Add schema for `vitest/prefer-import-in-mock` (#23291)
(Sysix)
- 3d782b7 linter: Add schema for `react/no-unstable-nested-components`
(#23287) (Mikhail Baev)
- 0a0bc2f linter/jsx-a11y: Add `allowedRedundantRoles` option to
`no-redundant-roles` (#22820) (bab)
- 80758a5 linter/vue: Implement no-side-effects-in-computed-properties
rule (#23282) (bab)
- e3869ac linter: Add schema for `react/no-object-type-as-default-prop`
(#23279) (Mikhail Baev)
- 4480609 linter: Add schema for `react/jsx-props-no-spreading` (#23276)
(Mikhail Baev)
- 08d68a5 linter/react: Implement `jsx-no-literals` rule (#23145)
(kapobajza)
- 9a2788b linter/unicorn: Implement `prefer-export-from` rule (#22935)
(AliceLanniste)
- bdb723c linter/unicorn: Implement prefer-single-call rule (#23235)
(Yuzhe Shi)
- 31543ed linter: Add schema for `vue/define-props-destructuring`
(#23252) (Sysix)
- 21b6c3d linter: Add schema for `oxc/no-async-endpoint-handlers`
(#23251) (Sysix)
- e77ff81 linter: Add schema for `unicorn/prefer-object-from-entries`
(#23249) (Mikhail Baev)
- bcac2d6 linter: Add schema for `jest/vitest/no-restricted-matchers`
(#23247) (Sysix)
- 539f036 linter: Add schema for `jest/vitest/no-restricted-*-methods`
(#23246) (Sysix)
- dd1b927 linter/vue: Implement require-default-prop rule (#22951) (bab)
- 3f018e7 linter: Add schema for `unicorn/no-instanceof-builtins`
(#23225) (Mikhail Baev)
- 5b9a793 linter/react-perf: Support `nativeAllowList` config (#22996)
(Cole Ellison)
- b4e19d4 linter: Improve promise/catch-or-return termination
diagnostics (#23218) (camc314)
- 9b72a41 linter/promise/catch-or-return: Add support for
`allowThenStrict` option (#23206) (camc314)
- e0d0f78 linter: Verify promise/no-callback-in-promise schema (#23141)
(beanscg)
- 123d4f4 linter: Add schema for `jest/vitest/valid-expect` (#23185)
(Sysix)
- 46c8a21 linter: Add schema for
`jest/vitest/require-top-level-describe` (#23184) (Sysix)
- 41465cf linter: Add schema for `jest/vitest/prefer-snapshot-hint`
(#23183) (Sysix)
- d068b9b linter: Add schema for `jest/vitest/prefer-expect-assertions`
(#23181) (Sysix)
- 064a1ee linter: Add schema for `jest/prefer-ending-with-an-expect`
(#23180) (Sysix)
- d046797 linter: Add schema for `jest/vitest/no-standalone-expect`
(#23179) (Sysix)
- 137b9a6 linter: Add schema for `jest/vitest/no-large-snapshots`
(#23178) (Sysix)
- 0f3e4a5 linter: Add schema for `jest/vitest/no-hooks` (#23177) (Sysix)
- 00244d8 parser: Report definite property initializer errors (#23160)
(camc314)
- cd0b384 linter: Add schema for `unicorn/explicit-length-check`
(#23155) (Mikhail Baev)
- 01b74c4 linter: Add schema for `jest/no-deprecated-functions` (#23136)
(Sysix)
- 9d6a387 linter: Add schema for `unicorn/catch-error-name` (#23137)
(Mikhail Baev)
- 0da8efa linter: Add schema for `jest/vitest/max-nested-describe`
(#23131) (Sysix)
- d71c9fd linter: Add schema for `eslint/no-use-before-define` (#23129)
(Sysix)

### 🐛 Bug Fixes

- 019be2e linter/unicorn: Align throw-new-error parity (#23437)
(camc314)
- b9e5e51 linter/jest: Validate no-restricted-jest-methods config
(#23436) (camc314)
- f302f41 linter: Normalize oxlint jsPlugin prefixes (#23335) (konh)
- 2bdf8ce linter/jest: Validate no-restricted-matchers config (#23434)
(camc314)
- 5c2fb45 linter/eslint: Validate max-depth config (#23430) (camc314)
- eafc280 linter/eslint: Validate no-unused-vars config (#23433)
(camc314)
- 25aebb0 linter/typescript: Validate no-empty-object-type config
(#23432) (camc314)
- 7cafe3b linter/unicorn: Validate catch-error-name config (#23431)
(camc314)
- af1b897 linter/unicorn: Validate prefer-object-from-entries config
(#23429) (camc314)
- 68d48fe linter/eslint: Validate max-classes-per-file config (#23428)
(camc314)
- 02932b6 linter/eslint: Validate `complexity` config (#23427) (camc314)
- 375e574 linter/eslint: Use shared id-length regex config (#23426)
(camc314)
- ba3e2e0 linter/eslint: Preserve used imports in no-unused-vars fixer
(#23425) (camc314)
- 26ddac6 linter: Avoid config schema generation for
`jsx_a11y/no-noninteractive-element-interactions` (#23385) (Sysix)
- 40556ad linter: Parse `jsx-a11y/control-has-associated-label` config
with `DefaultRuleConfig` (#23373) (Sysix)
- dacbda8 linter/unicorn/prefer-string-starts-ends-with: Mark rule as
deprecated (#23342) (camc314)
- 956309a lsp: Use protocol line breaks for positions (#23329) (konh)
- 71e9648 linter: Expose no-noninteractive-element-interactions schema
(#23283) (camc314)
- 4c4c19c linter: `no-noninteractive-element-interactions` fix default
values (#23288) (Sysix)
- e63a139 linter/jsx-a11y: Restore control label defaults (#22737)
(konh)
- 0e4e59f linter/jsx-a11y: No-redundant-roles attribute-aware implicit
roles for `<input>`, skip ancestor-conditional elements (#23015) (Gaurav
Dubey)
- 06e215e linter/vitest: Validate `consistent-each-for` config (#23278)
(camc314)
- cd278e1 linter/promise: Validate param-names config (#23277) (camc314)
- 7f46013 linter/react/display-name: Handle default export function
correctly (#23271) (camc314)
- 22ff6a6 linter/unicorn: Deserialize filename-case config with serde
(#23266) (camc314)
- b644da0 linter/eslint: Add fixer for `sort_vars` (#23262) (Cason
Kervis)
- 778af4d linter/unicorn: Support array of patterns for
`unicorn/filename-case` `ignore` option (#23260) (kapobajza)
- 127fb2c linter: Deserialize rule config with serde for
`unicorn/prefer-object-from-entries` (#23253) (Sysix)
- f89b909 linter/react/jsx-no-target-blank: Handle compound conditions
(#23245) (camc314)
- c30419a linter/typescript: Deserialize rule config with serde for
`consistent-generic-constructors` (#23238) (camc314)
- 7d17d37 linter/react: Report invalid exhaustive-deps config (#23239)
(camc314)
- 1060186 linter/eslint: Add `deny_unknown_fields` to
`prefer-destructuring` (#23237) (camc314)
- fd2e4eb linter/react: Add `deny_unknown_fields` to `exhaustive-deps`
(#23236) (camc314)
- 6c3c904 linter/react/jsx-curly-brace-presence: Avoid false positive
with comment within braces (#23234) (camc314)
- 6c86d1c linter/react-perf: Correct nativeAllowList all schema (#23229)
(camc314)
- c393760 linter/react/rules-of-hooks: Align try/catch semantics
(#23221) (camc314)
- 4dd52de linter/react-perf: Re-generate stale snapshots (#23228)
(camc314)
- de2d23b linter/unicorn/prefer-dom-node-dataset: Preserve optional
chaining in fixer (#23148) (Bruno Carvalho)
- d7038de linter/react/exhaustive-deps: Ignore non `React` namespace
hooks (#23175) (camc314)
- 7111903 linter/react/exhaustive-deps: FP with wrapped literal
expressions (#23172) (camc314)
- 93326e7 linter/react: Align hook errors with anonomous async callbacks
(#23158) (camc314)
- 8f3db61 linter: Allow options for `eslint/capitalized-comments`
(#23139) (Sysix)
- f533565 linter: Support nofunc string option in no-use-before-define
(#23115) (bab)

### ⚡ Performance

- f09707e linter: `jest/no-deprecated-functions` store config version as
`usize` (#23138) (Sysix)
- da1a6c6 diagnostics: Migrate to allocation-optimized oxc-miette
(#23094) (Boshen)

### 📚 Documentation

- f682e25 linter: Remove manually written options doc for
`eslint/prefer-arrow-callback` (#23438) (Mikhail Baev)
- 64c942c linter: Remove manually written options doc for
`eslint/no-sequences` (#23420) (Mikhail Baev)
- d6d1189 linter: Add `short_descriptions` to more rules (#23417)
(Connor Shea)
- b979722 linter: Clarify valid-define-emits description (#23408)
(camc314)
- ccd0a69 linter: Clarify only-used-in-recursion description (#23407)
(camc314)
- b0fd30b linter: Clarify no-sync-scripts description (#23406) (camc314)
- c23290d linter: Clarify no-cycle description (#23405) (camc314)
- 3612e0b linter: Clarify no-nodejs-modules description (#23403)
(camc314)
- c67c5b1 linter: Clarify no-misused-new description (#23402) (camc314)
- 88bf0bc linter: Clarify require-render-return description (#23401)
(camc314)
- 9fff263 linter: Add short descriptions to more rules that lacked them
(#23389) (Connor Shea)
- ac69042 linter: Add short_description fields to more lint rules
(#23391) (Connor Shea)
- 99a3c78 linter: Add info for more skipped rule schemas (#23380)
(Sysix)
- c966384 linter: Fix the example of `unicorn/prefer-string-replace-all`
(#23367) (Liang)
- 2120ecf linter: Describe problems on not verified rules schema
(#23351) (Sysix)
- 14abf32 linter/react-perf: Use autogenerated docs (#23227) (camc314)
# Oxfmt
### 🚀 Features

- 9a2788b linter/unicorn: Implement `prefer-export-from` rule (#22935)
(AliceLanniste)
- 0c6fb23 oxfmt: Format `parser:json-stringify` files by
`oxc_formatter_json` (#23194) (leaysgur)
- 8cc82c4 formatter_json: Implement json-stringify variant (#23192)
(leaysgur)

### 🐛 Bug Fixes

- 956309a lsp: Use protocol line breaks for positions (#23329) (konh)
- 769de65 oxfmt: Handle compound json extensions (#23198) (leaysgur)
- b0b5d39 formatter_json: Support JSON5/JSON6 value in json/jsonc/json5
(#23193) (leaysgur)

### 📚 Documentation

- 4986613 formatter_json: Update AGENTS.md (#23199) (leaysgur)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
2026-06-15 13:58:15 +01:00
Mikhail Baev f682e25389 docs(linter): remove manually written options doc for eslint/prefer-arrow-callback (#23438)
this PR removes manually written options doc for
`eslint/prefer-arrow-callback` to avoid duplication

before:

<img width="1116" height="1218" alt="Снимок экрана 2026-06-15 в 14 42
27"
src="https://github.com/user-attachments/assets/3e485bdd-ca0e-4c5a-b9e2-38601df45852"
/>

after:

<img width="928" height="1037" alt="Снимок экрана 2026-06-15 в 14 47 48"
src="https://github.com/user-attachments/assets/8abb72cb-162e-4dd9-aa98-9409fff6ccd4"
/>

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-15 10:59:17 +01:00
konh f302f4131e fix(linter): normalize oxlint jsPlugin prefixes (#23335)
Closes #22131

## Summary

- normalize `oxlint-plugin-*` names the same way as existing
`eslint-plugin-*` names
- keep Rust `normalize_plugin_name` and JS `normalizePluginName`
behavior in sync
- reject `oxlint-plugin-*` aliases as non-normalized plugin names
- add JS plugin fixtures for package-name, `meta.name`, and scoped
package normalization

## AI Assistance

This PR was prepared with AI assistance. I reviewed the generated
changes and test results, and I am responsible for the contribution.

Co-authored-by: xiaokhkh <10765730+xiaokhkh@users.noreply.github.com>
Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-15 10:46:58 +01:00
bab 2e8bda4999 feat(linter/vue): implement no-dupe-keys rule (#23350)
Implements `vue/no-dupe-keys`. Part of #11440.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-06-15 09:32:04 +01:00
Mikhail Baev 64c942cffe docs(linter): remove manually written options doc for eslint/no-sequences (#23420)
this PR removes manually written options doc for `eslint/no-sequences`
to avoid duplication

before:

<img width="2658" height="2524" alt="image"
src="https://github.com/user-attachments/assets/0c47043b-c05a-430b-968d-d0297f9a1bf8"
/>

after: 

<img width="2604" height="2366" alt="image"
src="https://github.com/user-attachments/assets/93b3dcfa-5d56-4814-b531-27aa547f913e"
/>

---------

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-15 08:56:25 +01:00
Boshen 1490a0a069 feat(linter/react): implement react-compiler rule (#23202)
Adds a nursery `react/react-compiler` rule that runs the React Compiler
(`oxc_react_compiler`) in lint-only mode and reports Rules of React
violations: conditional hook calls, setState during render, ref access
during render, mutation errors, etc.

### Rule

- `run_once` rule calling `oxc_react_compiler::lint()` on the program;
the compiler's own prefilter skips files with no React-like functions.
- Lints with the same compiler options as `eslint-plugin-react-compiler`
(`COMPILER_OPTIONS` in its `RunReactCompiler.ts`): `lint` output mode
plus the validations the plugin force-enables (impure functions,
capitalized calls, JSX in try, static components, setState in effects,
etc.).
- Reports only error-severity violations by default. Compiler bail-outs
(skipped optimizations, e.g. unsupported syntax) are opt-in via
`reportAllBailouts`.
- Flow suppressions are handled like the eslint plugin: diagnostics
whose primary location sits directly below a
`$FlowFixMe[react-rule-hook]` / `$FlowFixMe[react-rule-unsafe-ref]`
comment are dropped, while other diagnostics in the same function still
surface.

### Tests

All test cases from
[`eslint-plugin-react-compiler/__tests__`](https://github.com/facebook/react/tree/main/compiler/packages/eslint-plugin-react-compiler/__tests__)
(MIT) are ported, covering hooks order, capitalized calls, impure calls
in render, JSX in try/catch, ref access in render, useMemo diagnostics,
useState mutation (TS), `'use memo'`/`'use no forget'` directives, and
Flow suppressions. The only case not ported is "Basic example with
component syntax", which uses Flow's experimental `component`
declaration syntax that oxc does not parse.
`RustBackendComparison-test.ts` replicates the same cases for backend
comparison, so it adds no new ones. Every diagnostic message and
location in the snapshot matches the upstream assertions.

### Diagnostics

`oxc_react_compiler` diagnostics previously had no spans. They now carry
labeled spans built from the compiler's source locations (byte offsets
flow through from oxc spans): `detail.loc` → sub-detail locations with
their messages (e.g. "Found setState() in render") → enclosing function
as fallback. Long descriptions moved from the message into `help`. This
makes code frames and `oxlint-disable` directives work.

Example output:

```
⚠ react(react-compiler): RenderSetState: Cannot call setState during render
   ╭─[App.tsx:3:17]
 2 │                 const [state, setState] = useState(0);
 3 │                 setState(1);
   ·                 ────┬───
   ·                     ╰── Found setState() in render
 4 │                 return <div>{state}</div>;
   ╰────
  help: Calling setState during render may trigger an infinite loop.
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-06-15 08:53:18 +01:00
Sysix 965358e613 refactor(linter): reuse RuleNoConfig reference for rule schema (#23390)
Because `RuleNoConfig` is already `AllowWarnDeny | [AllowWarnDeny]` we can reuse the reference for all other rules config and saving us some bytes on the TS config types generation.
2026-06-14 13:47:07 +00:00
renovate[bot] e745892d4c chore(deps): update napi (#23394)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) | Type |
Update |
|---|---|---|---|---|---|---|---|
| [@napi-rs/cli](https://napi.rs/)
([source](https://redirect.github.com/napi-rs/napi-rs)) | [`3.7.1` →
`3.7.2`](https://renovatebot.com/diffs/npm/@napi-rs%2fcli/3.7.1/3.7.2) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@napi-rs%2fcli/3.7.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@napi-rs%2fcli/3.7.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@napi-rs%2fcli/3.7.1/3.7.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@napi-rs%2fcli/3.7.1/3.7.2?slim=true)
| pnpm.catalog.default | patch |
| [napi](https://crates.io/crates/napi) | `3.9.1` → `3.9.2` |
![age](https://developer.mend.io/api/mc/badges/age/crate/napi/3.9.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/napi/3.9.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/napi/3.9.1/3.9.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/napi/3.9.1/3.9.2?slim=true)
| workspace.dependencies | patch |

---

### Release Notes

<details>
<summary>napi-rs/napi-rs (@&#8203;napi-rs/cli)</summary>

###
[`v3.7.2`](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.7.1...@napi-rs/cli@3.7.2)

[Compare
Source](https://redirect.github.com/napi-rs/napi-rs/compare/@napi-rs/cli@3.7.1...@napi-rs/cli@3.7.2)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Cameron Clark <cameron.clark@hey.com>
2026-06-14 14:10:12 +01:00
Mikhail Baev dd560ae213 feat(linter/unicorn): implement no-array-fill-with-reference-type rule (#23397)
this PR implements `unicorn/no-array-fill-with-reference-type` rule

issue #684

---------

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-14 14:08:06 +01:00
WaterWhisperer af36c2f9cd feat(linter): add schema for react/jsx-curly-brace-presence (#23400)
Adds verified config schema generation for
`react/jsx-curly-brace-presence`.

Refs #22955.

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-14 14:00:14 +01:00
WaterWhisperer 47d34a304c feat(linter): add schema for react/jsx-handler-names (#23393)
Adds verified config schema generation for `react/jsx-handler-names`.

Refs #22955.
2026-06-14 13:25:23 +02:00
WaterWhisperer f4250d0d08 feat(linter): add schema for unicorn/import-style (#23386)
Adds verified config schema generation for `unicorn/import-style`.

Refs #22955.

Signed-off-by: Alexander S. <sysix@sysix-coding.de>
Co-authored-by: Alexander S. <sysix@sysix-coding.de>
2026-06-13 20:15:53 +02:00
Sysix 26ddac621e fix(linter): avoid config schema generation for jsx_a11y/no-noninteractive-element-interactions (#23385)
Fixes #23299 for now.
We can look later how and where we need to make changes.
2026-06-13 17:57:00 +00:00
Sysix 30c74ce6bf feat(linter): add schema for jsx_a11y/no-noninteractive-element-to-interactive-role (#23384)
+ little refactoring on the other rule, we want to know the defaults from the `Config` and not from the `Rule`.
2026-06-13 17:31:56 +00:00
WaterWhisperer cfbe8dc639 feat(linter): add schema for jsx_a11y/no-interactive-element-to-noninteractive-role (#23382)
Adds verified config schema generation for
`jsx_a11y/no-interactive-element-to-noninteractive-role`.

Refs #22955.
2026-06-13 19:21:13 +02:00
WaterWhisperer d15b7ff197 feat(linter): add schema for typescript/no-restricted-types (#23381)
Adds verified config schema generation for
`typescript/no-restricted-types`.

Refs #22955.

Signed-off-by: Alexander S. <sysix@sysix-coding.de>
Co-authored-by: Alexander S. <sysix@sysix-coding.de>
2026-06-13 18:59:08 +02:00
Sysix 028a8117d3 feat(linter): add schema for jsx-a11y/media-has-caption (#23377) 2026-06-13 16:22:32 +00:00
Sysix b3b1038f38 feat(linter): add schema for jsx-a11y/label-has-associated-control (#23376) 2026-06-13 16:22:32 +00:00
WaterWhisperer 7ada6b2446 feat(linter): add schema for jsx_a11y/no-distracting-elements (#23379)
Adds verified config schema generation for
`jsx_a11y/no-distracting-elements`.

Refs #22955.
2026-06-13 18:15:21 +02:00
Sysix ee3dd49e8b feat(linter): add schema for jsx-a11y/img-redundant-alt (#23374) 2026-06-13 15:54:30 +00:00
Sysix 40556ad8b5 fix(linter): parse jsx-a11y/control-has-associated-label config with DefaultRuleConfig (#23373)
- Used `DefaultRuleConfig` to parse the `serde_json` value
- Moved the 25 cap, to the `Deserializer`
- added schema validation + deny unknown fields
- removed test cases where the upstream rule auto-generated options for every rule
2026-06-13 15:30:37 +00:00
Sysix e3fd735e59 feat(linter): add schema for jsx_a11y/alt-text (#23369)
upstream docs: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/alt-text.md
2026-06-13 15:08:23 +00:00
Mikhail Baev 0f2fff48d2 feat(linter): add schema for react/exhaustive-deps (#23372)
part of #22955
2026-06-13 15:51:43 +01:00
Mikhail Baev e3e4e105bc feat(linter): add schema for react_perf/jsx-no-new-object-as-prop (#23368)
issue #22955

---------

Signed-off-by: Alexander S. <sysix@sysix-coding.de>
Co-authored-by: Alexander S. <sysix@sysix-coding.de>
2026-06-13 15:38:33 +02:00
WaterWhisperer 9366d44cc2 feat(linter): add schema for unicorn/prefer-at (#23366)
Adds verified config schema generation for `unicorn/prefer-at`.

Refs #22955.
2026-06-13 15:29:35 +02:00
Sysix f57b55db11 feat(linter): add schema for typescript/array-type (#23355) 2026-06-12 17:37:36 +00:00
Sysix 0dcf912b16 feat(linter): add schema for typescript/ban-ts-comment (#23354)
Requesting a little review, because the types are little bit complex.
Should be aligned with our tests and the upstream TS type:
https://typescript-eslint.io/rules/ban-ts-comment/#options
2026-06-12 17:26:26 +00:00
Mikhail Baev 51fa83ef5f feat(linter): add schema for react/no-did-update-set-state (#23357)
issue #22955

There are three rules that use the same config and default value:
- `react/no-did-mount-set-state`
- `react/no-did-update-set-state`
- `react/no-will-update-set-state`

this PR also moves that config into a shared `SetStateInFunctionConfig`
type to avoid duplication, similar to the `AlwaysNever` enum
2026-06-12 19:20:41 +02:00
Sysix 59db0bd215 feat(linter): add schema for consistent-generic-constructors (#23353) 2026-06-12 15:07:59 +00:00
Sysix c4775c01b5 feat(linter): add schema for typescript/consistent-type-assertions (#23349)
`assertionStyle` can only be `never` without any other options. This is currently not reflected within the schema.
Upstream docs:
https://typescript-eslint.io/rules/consistent-type-assertions/
2026-06-12 14:05:40 +00:00
Sysix 6e516f75b6 feat(linter): add schema for typescript/consistent-type-imports (#23348) 2026-06-12 14:05:40 +00:00
WaterWhisperer 012134d6cb feat(linter): add schema for react/jsx-no-target-blank (#23345)
Adds verified config schema generation for `react/jsx-no-target-blank`.

Refs #22955.

---------

Signed-off-by: Cameron <cameron.clark@hey.com>
Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-12 14:44:22 +01:00
Sysix 44dbcc2f18 refactor(oxlint/lsp): remove unused Rope references (#23341)
With the changes from https://github.com/oxc-project/oxc/pull/23329, `Rope` does not need to be created and passed into the functions.
This PR removes all references to `Rope`, because we never access it.
2026-06-12 12:52:56 +00:00
konh 956309aa26 fix(lsp): use protocol line breaks for positions (#23329)
Fixes #23314

## Summary

- add an LSP-specific UTF-8 byte offset to `Position` converter
- use it for oxfmt formatter `TextEdit` ranges
- route oxlint LSP positions through the same converter

## Details

The existing conversion used the shared rope helper, which treats
Unicode line
and paragraph separators as line breaks. That is correct for some
JavaScript
source-location semantics, but LSP only treats CR, LF, and CRLF as line
breaks.

This keeps the shared rope helper unchanged and isolates the
protocol-specific
behavior in `oxc_language_server`.

## Tests

- `cargo fmt --all`
- `cargo test -p oxc_language_server position --lib`
- `cargo test -p oxfmt --lib lsp::server_formatter`
- `cargo test -p oxlint --lib lsp::error_with_position`
- `cargo clippy -p oxc_language_server -p oxfmt -p oxlint --lib --tests
--no-deps -- -D warnings`
- `git diff --check`

---------

Co-authored-by: xiaokhkh <10765730+xiaokhkh@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Sysix <sysix@sysix-coding.de>
2026-06-12 14:33:53 +02:00
Mikhail Baev 0806aae474 feat(linter): add schema for jsx_a11y/no-noninteractive-tabindex (#23337)
issue #22955

also replaced manual config parsing with `DefaultRuleConfig`
2026-06-12 13:39:39 +02:00
Mikhail Baev 0708b5a233 feat(linter): add schema for react/jsx-filename-extension (#23315)
issue #22955

---------

Co-authored-by: Cameron <cameron.clark@hey.com>
2026-06-12 10:05:03 +01:00
leaysgur 4503faa630 chore(oxfmt): update prettier@3.8.4 (#23312)
> https://github.com/prettier/prettier/releases/tag/3.8.4

Only fixes bug in markdown.
2026-06-12 02:30:03 +00:00
Sysix 150bce13e4 feat(linter): add schema for typescript/no-empty-object-type (#23309) 2026-06-12 00:45:31 +00:00
Sysix f9e36f1738 feat(linter): add schema for typescript/no-duplicate-type-constituents (#23308) 2026-06-12 00:45:30 +00:00
Sysix 937accf58f feat(linter): add schema for typescript/no-invalid-void-type (#23307) 2026-06-11 23:58:30 +00:00
Sysix 3e042b9dbd feat(linter): add schema for typescript/no-misused-promises (#23306) 2026-06-11 23:58:30 +00:00