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 )
|

|

|

|

|
| [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 )
|

|

|

|

|
---
### 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
([#​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 ) |

|

|

|

| pnpm.catalog.default | patch |
| [napi](https://crates.io/crates/napi ) | `3.9.1` → `3.9.2` |

|

|

|

| workspace.dependencies | patch |
---
### Release Notes
<details>
<summary>napi-rs/napi-rs (@​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