fix(linter/plugins): error not panic if invalid fix range#19058
Conversation
CodSpeed Performance ReportMerging this PR will degrade performance by 25.98%Comparing Summary
Performance Changes
Footnotes
|
There was a problem hiding this comment.
Pull request overview
This PR hardens the external-linter fix merging path to avoid panics when JS plugins return a single fix with an invalid range, and extends fixture coverage to exercise invalid-range behaviors for both fixes and suggestions.
Changes:
- Add validation for single JS fix ranges in
convert_and_merge_js_fixes, returningMergeFixesErrorinstead of panicking. - Expand JS fixture plugins to emit invalid-range fixes/suggestions and add new fixture files to trigger those code paths.
- Update fixture snapshots/options to reflect the new error outputs and run deterministically single-threaded.
Reviewed changes
Copilot reviewed 22 out of 22 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| crates/oxc_linter/src/external_linter.rs | Adds early validation for single-fix ranges to prevent panics. |
| apps/oxlint/test/fixtures/suggestions/plugin.ts | Adds cases emitting invalid suggestion fix ranges for coverage. |
| apps/oxlint/test/fixtures/suggestions/output.snap.md | Updates expected output for new invalid-fix scenarios. |
| apps/oxlint/test/fixtures/suggestions/options.json | Runs fixture single-threaded for deterministic output. |
| apps/oxlint/test/fixtures/suggestions/fix.snap.md | Updates expected output under --fix for new scenarios. |
| apps/oxlint/test/fixtures/suggestions/fix-suggestions.snap.md | Updates expected output under --fix-suggestions for new scenarios. |
| apps/oxlint/test/fixtures/suggestions/files/range_start_too_large.js | New fixture input file for invalid start range value. |
| apps/oxlint/test/fixtures/suggestions/files/range_start_negative.js | New fixture input file for negative start range value. |
| apps/oxlint/test/fixtures/suggestions/files/range_start_after_end.js | New fixture input file for start-after-end range. |
| apps/oxlint/test/fixtures/suggestions/files/range_end_too_large.js | New fixture input file for invalid end range value. |
| apps/oxlint/test/fixtures/suggestions/files/range_end_out_of_bounds.js | New fixture input file for end out-of-bounds range. |
| apps/oxlint/test/fixtures/suggestions/files/range_end_negative.js | New fixture input file for negative end range value. |
| apps/oxlint/test/fixtures/fixes/plugin.ts | Adds cases emitting invalid fix ranges for coverage. |
| apps/oxlint/test/fixtures/fixes/output.snap.md | Updates expected output for new invalid-fix scenarios. |
| apps/oxlint/test/fixtures/fixes/options.json | Runs fixture single-threaded for deterministic output. |
| apps/oxlint/test/fixtures/fixes/fix.snap.md | Updates expected output under --fix for new scenarios. |
| apps/oxlint/test/fixtures/fixes/files/range_start_too_large.js | New fixture input file for invalid start range value. |
| apps/oxlint/test/fixtures/fixes/files/range_start_negative.js | New fixture input file for negative start range value. |
| apps/oxlint/test/fixtures/fixes/files/range_start_after_end.js | New fixture input file for start-after-end range. |
| apps/oxlint/test/fixtures/fixes/files/range_end_too_large.js | New fixture input file for invalid end range value. |
| apps/oxlint/test/fixtures/fixes/files/range_end_out_of_bounds.js | New fixture input file for end out-of-bounds range. |
| apps/oxlint/test/fixtures/fixes/files/range_end_negative.js | New fixture input file for negative end range value. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
a27744a to
bcbef71
Compare
Merge activity
|
e5778cb to
d44ed04
Compare
Previously when a rule provided a single fix or suggestion, the range of the fix was not checked to ensure it is valid. If the fix had an invalid range (`start <= end`, `end` not out of bounds of source text) this would cause a panic when attempting to slice the source text with the invalid range. Catch these cases earlier and produce a `MergeFixesError`, so the invalid fix is not applied, avoiding the panic. Notes: * The error messages for negative offsets or offsets > `u32::MAX` are not great, but I don't think it really matters. These shouldn't happen in practice, so IMO it'd be wasteful to introduce extra code paths to handle these cases. The important thing is that they don't cause panics. * No additional validation is required when rule produces multiple fixes, as these same checks are already performed in `CompositeFix::merge_fixes_fallible`, which handles combining multiple fixes.
bcbef71 to
c7b1756
Compare
Previously when a rule provided a single fix or suggestion, the range of the fix was not checked to ensure it is valid. If the fix had an invalid range (`start <= end`, `end` not out of bounds of source text) this would cause a panic when attempting to slice the source text with the invalid range. Catch these cases earlier and produce a `MergeFixesError`, so the invalid fix is not applied, avoiding the panic. Notes: * The error messages for negative offsets or offsets > `u32::MAX` are not great, but I don't think it really matters. These shouldn't happen in practice, so IMO it'd be wasteful to introduce extra code paths to handle these cases. The important thing is that they don't cause panics. * No additional validation is required when rule produces multiple fixes, as these same checks are already performed in `CompositeFix::merge_fixes_fallible`, which handles combining multiple fixes.
d44ed04 to
6e54567
Compare
c7b1756 to
34851a7
Compare
# Oxlint ### 🚀 Features - aef2af5 linter/unicorn: Add fixer for `unicorn/relative-url-style` rule (#19186) (Mikhail Baev) - 80eba6f linter/max-params: Support `countThis` option (#19175) (camc314) - e19bc45 linter/no-new-func: Improve rule diagnostic with note and actionable help message (#19132) (Sean Gallen) - e3dc5f6 linter/plugins: `RuleTester` test suggestions (#19104) (overlookmotel) - 6054249 linter/plugins: Add `recursive` option to `RuleTester` (#19093) (overlookmotel) - 27c241b linter/plugins: `RuleTester` test fixes (#19091) (overlookmotel) - 7318275 linter/new-cap: Tighten diagnostic spans and add help text (#19131) (camchenry) - ac2b16b linter: Improve `no-misleading-character-class` diagnostic spans (#19109) (Sysix) - 7be8613 linter: Move `no-misleading-chracter-class` to `correctness` (#19006) (Sysix) - 87a920d ci: Add riscv64 and s390x napi targets for oxlint and oxfmt (#19039) (Boshen) - ee2925b oxlint/lsp: Enable JS plugins (#18834) (overlookmotel) - 533013d linter/unicorn: Implement suggestion for `unicorn/prefer-dom-node-dataset` (#19051) (Mikhail Baev) - 384abae linter/oxc/no-async-endpoint-handlers: Improve diagnostic message (#19001) (camc314) - d35ece3 linter/array-callback-return: Improve diagnostic hints for some cases (#18993) (camc314) - dd0f754 linter/array-callback-return: Improve diagnostic message for `forEach` case (#18992) (camc314) - e2d28fe linter/plugins: Implement suggestions (#18963) (overlookmotel) - a398152 linter: Promote the `eslint/no-iterator` rule to correctness, which makes it a default rule (#18915) (connorshea) - bb1eb97 linter: Improve diagnostic message for circular configs (#18947) (camc314) - 3184f36 linter: Ban relative js plugin specifiers in js extends config (#18944) (camc314) - 749972f linter: Validate dynamic config extends shape (#18943) (camc314) - b270739 linter: Support extends in oxlint.config.ts (#18942) (camc314) - 6024ddf linter: Implement suggestion for `unicorn/prefer-reflect-apply` (#18932) (Mikhail Baev) - b06b3a9 linter: Implement `typescript/consistent-type-assertions` (#18869) (Bazyli Brzóska) - 9fd3bd6 linter/plugins: Add `@oxlint/plugins` NPM package (#18824) (overlookmotel) - 5ee7b2f linter/vitest: Implements `prefer-expect-type-of` rule (#17957) (Said Atrahouch) - a7b360a linter/unicorn: Implement `unicorn/relative-url-style` rule (#18857) (Mikhail Baev) - 9788a96 oxlint,oxfmt: Add more native builds (#18853) (Boshen) - b23395a linter: Enforce exporting an object with `defineConfig` (#18858) (camc314) ### 🐛 Bug Fixes - 7800fc5 linter/prefer-event-target: Ignore EventEmitter imported from packages (#19188) (camc314) - 03b2955 linter/typescript/ban-types: Mark rule as deprecated (#19179) (camc314) - a5b8766 oxlint/lsp: Disable rule for this line should not be preferred (#19083) (Sysix) - e08157e linter/jsx-filename-extension: Include filename in as-needed diagnostic (#19172) (camc314) - 1773acb oxlint: Re-generate envs (#19169) (camc314) - 51c3fc8 linter/no-array-for-each: Skip `Effect.forEach` calls (#19127) (camc314) - 825f148 linter/plugins: `RuleTester` consider adjacent fixes as overlapping in ESLint compat mode (#19094) (overlookmotel) - ecd2456 linter/plugins: Handle fix with -1 offsets in file with BOM (#19092) (overlookmotel) - 5969d26 linter/no-array-sort: Avoid false positives for effect Chunk.sort (#19125) (camc314) - de10f04 linter: `no-misleading-character-class`: do not skip reporting on first invalid sequence of the checking group (#19111) (Sysix) - 8c0ce78 linter: Scope no-misleading-character-class sequences to single character class (#19108) (copilot-swe-agent) - 879e3a0 linter: `no-misleading-character-class`: split sequences on all `CharacterSet` (#19107) (Sysix) - 2ad33cc oxlint/lsp: Search parent directories for root oxlint config (#19062) (copilot-swe-agent) - f969d5e linter/prefer-dom-node-dataset: Address some edge cases in the fixer (#19065) (camc314) - ed759d1 linter/plugins: Fix error messages for invalid suggestions (#19059) (overlookmotel) - 34851a7 linter/plugins: Error not panic if invalid fix range (#19058) (overlookmotel) - 4823b58 linter/plugins: Fix fixes in files with BOM (#19056) (overlookmotel) - 2ef405e linter/no-map-spread: Improve actionability of error message (#19007) (Artyom Alekseevich) - 56c086b parser: Add modifier ordering validation (TS1029) (#19024) (Boshen) - 6067a49 linter/jsdoc: False positive in `check-tag-names` for `@` in email addresses and npm scopes (#19021) (Boshen) - 6d46ed9 linter/capitalized-comments: Ignore prettier and oxfmt directives (#19008) (Artyom Alekseevich) - a46c878 linter/react/no-array-index-key: Look for keys in expressions (#18997) (camc314) - 7d61704 linter/prefer-at: Skip autofix for `arguments` (#18991) (camc314) - 3ebae53 linter/preserve-caught-error: Skip traversing into nested try/catch stmts (#18990) (camc314) - e94d37e linter/react/no-unknown-property: Add missing `popover` related props (#18953) (Christoph Nakazawa) - 04b0d99 linter: Normalize relative paths with `./` prefix in overrides. (#18954) (connorshea) - 57917ee parser: Parse decorators on rest parameters (#18938) (Boshen) - 07742ea linter/prefer-as-const: Implement fixer for type annotation (#18899) (camc314) - d64bfdd linter/plugins: Ensure `after` hook always runs last in rule converted for ESLint (#18904) (overlookmotel) - ec39944 linter/jsx-a11y/no-distracting-elements: Support elements option (#18892) (camc314) - f609cb6 linter/prefer-expect-type-of: Handle computed elements in fixer correctly (#18890) (camc314) - ecf11e5 linter/dynamic-config: Set `ExternalPlugin.config_dir` to fix js plugins loading (#18854) (camc314) - 01b7838 linter/plugins: Do not destroy workspaces (#18833) (overlookmotel) - dc51d6b linter: Normalize paths slashes for snapshots on windows (#18825) (camc314) - dbfdc40 linter/bad-replace-all-args: Skip extracting flags from conditional expressions (#18844) (camc314) ### ⚡ Performance - ed8c054 oxc_str: Add precomputed hash to Ident for fast HashMap lookups (#19143) (Boshen) - 18f58bd oxlint/lsp: Transform unused disable directive directly to DiagnosticReport (#19112) (Sysix) - 4ce3772 linter: Remove pointless string cloning when combining suggestions (#19075) (overlookmotel) - c417bf5 linter: Avoid allocating `Vec` when compiling `PossibleFixes` (#19074) (overlookmotel) - adb2baa linter/plugins: Avoid allocation when rule provides single suggestion (#19071) (overlookmotel) - 2537924 semantic: Optimize scope resolution with fast paths and inlining (#19029) (Boshen) ### 📚 Documentation - 6e8ef38 linter/plugins: Correct and expand JSDoc comment for `RuleTester` config (#19156) (overlookmotel) - e7ec06a linter: Improve docs for `import/max-dependencies` rule. (#19119) (connorshea) - 367f730 linter/consistent-test-filename: Escape file names fixes #19114 (#19123) (camc314) - 8753a54 linter: Rewrite the docs for the `jsx-a11y/no-redundant-roles` rule. (#19117) (connorshea) - dd44b1a linter: Fix invalid directive in example code for `import/no-nodejs-modules`. (#19115) (connorshea) - 726e273 linter/plugins: Improve JSDoc comment for `DiagnosticReport` (#19103) (overlookmotel) - 9561e7f linter/plugins: Alter JS plugins example (#18900) (overlookmotel) - 501e3b6 linter: Regenerate `config.generated.ts` (#18897) (overlookmotel) - b425a0c linter: Document jsPlugins examples (#18671) (Cameron) - df2b7fa linter: Expand settings example with reference to custom plugins (#18670) (camc314) # Oxfmt ### 💥 BREAKING CHANGES - 856a01f formatter/sort_imports: [**BREAKING**] Replace prefix match with glob pattern in `customGroups.elementNamePattern` (#19066) (leaysgur) ### 🚀 Features - 91e67f3 oxfmt/lsp: Do not refer `.gitignore` (#19206) (leaysgur) - 23c0753 oxfmt: Better Tailwind CSS intergration (#19000) (Dunqing) - 87a920d ci: Add riscv64 and s390x napi targets for oxlint and oxfmt (#19039) (Boshen) - 8536dce oxfmt: Support glob for CLI paths (#18976) (leaysgur) - 6ee2d59 oxfmt: Use `oxc_formatter` in js-in-xxx part (#18373) (leaysgur) - 9788a96 oxlint,oxfmt: Add more native builds (#18853) (Boshen) ### 🐛 Bug Fixes - 119348b oxfmt: Resolve relative -> absolute path for other usages (#19207) (leaysgur) - 5f4cf30 oxfmt: Fix relative -> absolute path resolution with refactoring (#19202) (leaysgur) - dc335d1 oxfmt: Temporarily disable the override for js-in-xxx (not ready yet) (#19043) (leaysgur) - 5ea5bda oxfmt: Handle `isSingleJsxExpressionStatementInMarkdown()` check for js-in-md (#19042) (leaysgur) - 5243307 formatter: Preserve numeric separators in number literals (#19015) (Dunqing) - 9b205b3 formatter: Fallback to formatting when package.json sorting fails (#19097) (Boshen) - b79c065 formatter: Preserve comment between callee and optional chaining operator (#19020) (Dunqing) - 01d1be1 formatter: Remove unnecessary parentheses for single-member union types (#19018) (Dunqing) - f5c7e75 formatter: Preserve parentheses around await with private field access (#19014) (Dunqing) - 5a75785 formatter: Preserve parentheses around nested sequence expressions (#19013) (Dunqing) - f39c96c oxfmt: Do not override `babel-ts` for now (#19030) (leaysgur) - 0ef11bb formatter: Add space before type annotation with leading comment (#19012) (Dunqing) - cc232e1 formatter: Keep spread with callback on same line (#18999) (Dunqing) - ef5bfab oxfmt: Workaround Node.js ThreadsafeFunction cleanup race condition (#18980) (Boshen) - d53f5c4 formatter: Require string first arg in test calls (#18935) (Dunqing) - 57917ee parser: Parse decorators on rest parameters (#18938) (Boshen) - 2db8c05 formatter: Avoid breaking generic call assignments (#18933) (Dunqing) - 1e023e1 formatter: Preserve trailing comma in mts/cts arrow generics (#18928) (Dunqing) - 7c4e558 formatter/detect_code_removal: Do not count `TemplateLiteral` content (#18848) (leaysgur) ### ⚡ Performance - 467724f oxfmt: Collect glob paths in parallel (#19209) (leaysgur) - 61e0efa oxfmt: Use RwLock instead of Mutex for TSFN handles (#18888) (Boshen) Co-authored-by: camc314 <[email protected]>
# Oxlint ### 🚀 Features - aef2af5 linter/unicorn: Add fixer for `unicorn/relative-url-style` rule (oxc-project#19186) (Mikhail Baev) - 80eba6f linter/max-params: Support `countThis` option (oxc-project#19175) (camc314) - e19bc45 linter/no-new-func: Improve rule diagnostic with note and actionable help message (oxc-project#19132) (Sean Gallen) - e3dc5f6 linter/plugins: `RuleTester` test suggestions (oxc-project#19104) (overlookmotel) - 6054249 linter/plugins: Add `recursive` option to `RuleTester` (oxc-project#19093) (overlookmotel) - 27c241b linter/plugins: `RuleTester` test fixes (oxc-project#19091) (overlookmotel) - 7318275 linter/new-cap: Tighten diagnostic spans and add help text (oxc-project#19131) (camchenry) - ac2b16b linter: Improve `no-misleading-character-class` diagnostic spans (oxc-project#19109) (Sysix) - 7be8613 linter: Move `no-misleading-chracter-class` to `correctness` (oxc-project#19006) (Sysix) - 87a920d ci: Add riscv64 and s390x napi targets for oxlint and oxfmt (oxc-project#19039) (Boshen) - ee2925b oxlint/lsp: Enable JS plugins (oxc-project#18834) (overlookmotel) - 533013d linter/unicorn: Implement suggestion for `unicorn/prefer-dom-node-dataset` (oxc-project#19051) (Mikhail Baev) - 384abae linter/oxc/no-async-endpoint-handlers: Improve diagnostic message (oxc-project#19001) (camc314) - d35ece3 linter/array-callback-return: Improve diagnostic hints for some cases (oxc-project#18993) (camc314) - dd0f754 linter/array-callback-return: Improve diagnostic message for `forEach` case (oxc-project#18992) (camc314) - e2d28fe linter/plugins: Implement suggestions (oxc-project#18963) (overlookmotel) - a398152 linter: Promote the `eslint/no-iterator` rule to correctness, which makes it a default rule (oxc-project#18915) (connorshea) - bb1eb97 linter: Improve diagnostic message for circular configs (oxc-project#18947) (camc314) - 3184f36 linter: Ban relative js plugin specifiers in js extends config (oxc-project#18944) (camc314) - 749972f linter: Validate dynamic config extends shape (oxc-project#18943) (camc314) - b270739 linter: Support extends in oxlint.config.ts (oxc-project#18942) (camc314) - 6024ddf linter: Implement suggestion for `unicorn/prefer-reflect-apply` (oxc-project#18932) (Mikhail Baev) - b06b3a9 linter: Implement `typescript/consistent-type-assertions` (oxc-project#18869) (Bazyli Brzóska) - 9fd3bd6 linter/plugins: Add `@oxlint/plugins` NPM package (oxc-project#18824) (overlookmotel) - 5ee7b2f linter/vitest: Implements `prefer-expect-type-of` rule (oxc-project#17957) (Said Atrahouch) - a7b360a linter/unicorn: Implement `unicorn/relative-url-style` rule (oxc-project#18857) (Mikhail Baev) - 9788a96 oxlint,oxfmt: Add more native builds (oxc-project#18853) (Boshen) - b23395a linter: Enforce exporting an object with `defineConfig` (oxc-project#18858) (camc314) ### 🐛 Bug Fixes - 7800fc5 linter/prefer-event-target: Ignore EventEmitter imported from packages (oxc-project#19188) (camc314) - 03b2955 linter/typescript/ban-types: Mark rule as deprecated (oxc-project#19179) (camc314) - a5b8766 oxlint/lsp: Disable rule for this line should not be preferred (oxc-project#19083) (Sysix) - e08157e linter/jsx-filename-extension: Include filename in as-needed diagnostic (oxc-project#19172) (camc314) - 1773acb oxlint: Re-generate envs (oxc-project#19169) (camc314) - 51c3fc8 linter/no-array-for-each: Skip `Effect.forEach` calls (oxc-project#19127) (camc314) - 825f148 linter/plugins: `RuleTester` consider adjacent fixes as overlapping in ESLint compat mode (oxc-project#19094) (overlookmotel) - ecd2456 linter/plugins: Handle fix with -1 offsets in file with BOM (oxc-project#19092) (overlookmotel) - 5969d26 linter/no-array-sort: Avoid false positives for effect Chunk.sort (oxc-project#19125) (camc314) - de10f04 linter: `no-misleading-character-class`: do not skip reporting on first invalid sequence of the checking group (oxc-project#19111) (Sysix) - 8c0ce78 linter: Scope no-misleading-character-class sequences to single character class (oxc-project#19108) (copilot-swe-agent) - 879e3a0 linter: `no-misleading-character-class`: split sequences on all `CharacterSet` (oxc-project#19107) (Sysix) - 2ad33cc oxlint/lsp: Search parent directories for root oxlint config (oxc-project#19062) (copilot-swe-agent) - f969d5e linter/prefer-dom-node-dataset: Address some edge cases in the fixer (oxc-project#19065) (camc314) - ed759d1 linter/plugins: Fix error messages for invalid suggestions (oxc-project#19059) (overlookmotel) - 34851a7 linter/plugins: Error not panic if invalid fix range (oxc-project#19058) (overlookmotel) - 4823b58 linter/plugins: Fix fixes in files with BOM (oxc-project#19056) (overlookmotel) - 2ef405e linter/no-map-spread: Improve actionability of error message (oxc-project#19007) (Artyom Alekseevich) - 56c086b parser: Add modifier ordering validation (TS1029) (oxc-project#19024) (Boshen) - 6067a49 linter/jsdoc: False positive in `check-tag-names` for `@` in email addresses and npm scopes (oxc-project#19021) (Boshen) - 6d46ed9 linter/capitalized-comments: Ignore prettier and oxfmt directives (oxc-project#19008) (Artyom Alekseevich) - a46c878 linter/react/no-array-index-key: Look for keys in expressions (oxc-project#18997) (camc314) - 7d61704 linter/prefer-at: Skip autofix for `arguments` (oxc-project#18991) (camc314) - 3ebae53 linter/preserve-caught-error: Skip traversing into nested try/catch stmts (oxc-project#18990) (camc314) - e94d37e linter/react/no-unknown-property: Add missing `popover` related props (oxc-project#18953) (Christoph Nakazawa) - 04b0d99 linter: Normalize relative paths with `./` prefix in overrides. (oxc-project#18954) (connorshea) - 57917ee parser: Parse decorators on rest parameters (oxc-project#18938) (Boshen) - 07742ea linter/prefer-as-const: Implement fixer for type annotation (oxc-project#18899) (camc314) - d64bfdd linter/plugins: Ensure `after` hook always runs last in rule converted for ESLint (oxc-project#18904) (overlookmotel) - ec39944 linter/jsx-a11y/no-distracting-elements: Support elements option (oxc-project#18892) (camc314) - f609cb6 linter/prefer-expect-type-of: Handle computed elements in fixer correctly (oxc-project#18890) (camc314) - ecf11e5 linter/dynamic-config: Set `ExternalPlugin.config_dir` to fix js plugins loading (oxc-project#18854) (camc314) - 01b7838 linter/plugins: Do not destroy workspaces (oxc-project#18833) (overlookmotel) - dc51d6b linter: Normalize paths slashes for snapshots on windows (oxc-project#18825) (camc314) - dbfdc40 linter/bad-replace-all-args: Skip extracting flags from conditional expressions (oxc-project#18844) (camc314) ### ⚡ Performance - ed8c054 oxc_str: Add precomputed hash to Ident for fast HashMap lookups (oxc-project#19143) (Boshen) - 18f58bd oxlint/lsp: Transform unused disable directive directly to DiagnosticReport (oxc-project#19112) (Sysix) - 4ce3772 linter: Remove pointless string cloning when combining suggestions (oxc-project#19075) (overlookmotel) - c417bf5 linter: Avoid allocating `Vec` when compiling `PossibleFixes` (oxc-project#19074) (overlookmotel) - adb2baa linter/plugins: Avoid allocation when rule provides single suggestion (oxc-project#19071) (overlookmotel) - 2537924 semantic: Optimize scope resolution with fast paths and inlining (oxc-project#19029) (Boshen) ### 📚 Documentation - 6e8ef38 linter/plugins: Correct and expand JSDoc comment for `RuleTester` config (oxc-project#19156) (overlookmotel) - e7ec06a linter: Improve docs for `import/max-dependencies` rule. (oxc-project#19119) (connorshea) - 367f730 linter/consistent-test-filename: Escape file names fixes oxc-project#19114 (oxc-project#19123) (camc314) - 8753a54 linter: Rewrite the docs for the `jsx-a11y/no-redundant-roles` rule. (oxc-project#19117) (connorshea) - dd44b1a linter: Fix invalid directive in example code for `import/no-nodejs-modules`. (oxc-project#19115) (connorshea) - 726e273 linter/plugins: Improve JSDoc comment for `DiagnosticReport` (oxc-project#19103) (overlookmotel) - 9561e7f linter/plugins: Alter JS plugins example (oxc-project#18900) (overlookmotel) - 501e3b6 linter: Regenerate `config.generated.ts` (oxc-project#18897) (overlookmotel) - b425a0c linter: Document jsPlugins examples (oxc-project#18671) (Cameron) - df2b7fa linter: Expand settings example with reference to custom plugins (oxc-project#18670) (camc314) # Oxfmt ### 💥 BREAKING CHANGES - 856a01f formatter/sort_imports: [**BREAKING**] Replace prefix match with glob pattern in `customGroups.elementNamePattern` (oxc-project#19066) (leaysgur) ### 🚀 Features - 91e67f3 oxfmt/lsp: Do not refer `.gitignore` (oxc-project#19206) (leaysgur) - 23c0753 oxfmt: Better Tailwind CSS intergration (oxc-project#19000) (Dunqing) - 87a920d ci: Add riscv64 and s390x napi targets for oxlint and oxfmt (oxc-project#19039) (Boshen) - 8536dce oxfmt: Support glob for CLI paths (oxc-project#18976) (leaysgur) - 6ee2d59 oxfmt: Use `oxc_formatter` in js-in-xxx part (oxc-project#18373) (leaysgur) - 9788a96 oxlint,oxfmt: Add more native builds (oxc-project#18853) (Boshen) ### 🐛 Bug Fixes - 119348b oxfmt: Resolve relative -> absolute path for other usages (oxc-project#19207) (leaysgur) - 5f4cf30 oxfmt: Fix relative -> absolute path resolution with refactoring (oxc-project#19202) (leaysgur) - dc335d1 oxfmt: Temporarily disable the override for js-in-xxx (not ready yet) (oxc-project#19043) (leaysgur) - 5ea5bda oxfmt: Handle `isSingleJsxExpressionStatementInMarkdown()` check for js-in-md (oxc-project#19042) (leaysgur) - 5243307 formatter: Preserve numeric separators in number literals (oxc-project#19015) (Dunqing) - 9b205b3 formatter: Fallback to formatting when package.json sorting fails (oxc-project#19097) (Boshen) - b79c065 formatter: Preserve comment between callee and optional chaining operator (oxc-project#19020) (Dunqing) - 01d1be1 formatter: Remove unnecessary parentheses for single-member union types (oxc-project#19018) (Dunqing) - f5c7e75 formatter: Preserve parentheses around await with private field access (oxc-project#19014) (Dunqing) - 5a75785 formatter: Preserve parentheses around nested sequence expressions (oxc-project#19013) (Dunqing) - f39c96c oxfmt: Do not override `babel-ts` for now (oxc-project#19030) (leaysgur) - 0ef11bb formatter: Add space before type annotation with leading comment (oxc-project#19012) (Dunqing) - cc232e1 formatter: Keep spread with callback on same line (oxc-project#18999) (Dunqing) - ef5bfab oxfmt: Workaround Node.js ThreadsafeFunction cleanup race condition (oxc-project#18980) (Boshen) - d53f5c4 formatter: Require string first arg in test calls (oxc-project#18935) (Dunqing) - 57917ee parser: Parse decorators on rest parameters (oxc-project#18938) (Boshen) - 2db8c05 formatter: Avoid breaking generic call assignments (oxc-project#18933) (Dunqing) - 1e023e1 formatter: Preserve trailing comma in mts/cts arrow generics (oxc-project#18928) (Dunqing) - 7c4e558 formatter/detect_code_removal: Do not count `TemplateLiteral` content (oxc-project#18848) (leaysgur) ### ⚡ Performance - 467724f oxfmt: Collect glob paths in parallel (oxc-project#19209) (leaysgur) - 61e0efa oxfmt: Use RwLock instead of Mutex for TSFN handles (oxc-project#18888) (Boshen) Co-authored-by: camc314 <[email protected]>
…t#19058) Previously when a rule provided a single fix or suggestion, the range of the fix was not checked to ensure it is valid. If the fix had an invalid range (`start <= end`, `end` not out of bounds of source text) this would cause a panic when attempting to slice the source text with the invalid range. Catch these cases earlier and produce a `MergeFixesError`, so the invalid fix is not applied, avoiding the panic. Notes: * The error messages for negative offsets or offsets > `u32::MAX` are not great, but I don't think it really matters. These shouldn't happen in practice, so IMO it'd be wasteful to introduce extra code paths to handle these cases. The important thing is that they don't cause panics. * No additional validation is required when rule produces multiple fixes, as these same checks are already performed in `CompositeFix::merge_fixes_fallible`, which handles combining multiple fixes.
# Oxlint ### 🚀 Features - aef2af5 linter/unicorn: Add fixer for `unicorn/relative-url-style` rule (oxc-project#19186) (Mikhail Baev) - 80eba6f linter/max-params: Support `countThis` option (oxc-project#19175) (camc314) - e19bc45 linter/no-new-func: Improve rule diagnostic with note and actionable help message (oxc-project#19132) (Sean Gallen) - e3dc5f6 linter/plugins: `RuleTester` test suggestions (oxc-project#19104) (overlookmotel) - 6054249 linter/plugins: Add `recursive` option to `RuleTester` (oxc-project#19093) (overlookmotel) - 27c241b linter/plugins: `RuleTester` test fixes (oxc-project#19091) (overlookmotel) - 7318275 linter/new-cap: Tighten diagnostic spans and add help text (oxc-project#19131) (camchenry) - ac2b16b linter: Improve `no-misleading-character-class` diagnostic spans (oxc-project#19109) (Sysix) - 7be8613 linter: Move `no-misleading-chracter-class` to `correctness` (oxc-project#19006) (Sysix) - 87a920d ci: Add riscv64 and s390x napi targets for oxlint and oxfmt (oxc-project#19039) (Boshen) - ee2925b oxlint/lsp: Enable JS plugins (oxc-project#18834) (overlookmotel) - 533013d linter/unicorn: Implement suggestion for `unicorn/prefer-dom-node-dataset` (oxc-project#19051) (Mikhail Baev) - 384abae linter/oxc/no-async-endpoint-handlers: Improve diagnostic message (oxc-project#19001) (camc314) - d35ece3 linter/array-callback-return: Improve diagnostic hints for some cases (oxc-project#18993) (camc314) - dd0f754 linter/array-callback-return: Improve diagnostic message for `forEach` case (oxc-project#18992) (camc314) - e2d28fe linter/plugins: Implement suggestions (oxc-project#18963) (overlookmotel) - a398152 linter: Promote the `eslint/no-iterator` rule to correctness, which makes it a default rule (oxc-project#18915) (connorshea) - bb1eb97 linter: Improve diagnostic message for circular configs (oxc-project#18947) (camc314) - 3184f36 linter: Ban relative js plugin specifiers in js extends config (oxc-project#18944) (camc314) - 749972f linter: Validate dynamic config extends shape (oxc-project#18943) (camc314) - b270739 linter: Support extends in oxlint.config.ts (oxc-project#18942) (camc314) - 6024ddf linter: Implement suggestion for `unicorn/prefer-reflect-apply` (oxc-project#18932) (Mikhail Baev) - b06b3a9 linter: Implement `typescript/consistent-type-assertions` (oxc-project#18869) (Bazyli Brzóska) - 9fd3bd6 linter/plugins: Add `@oxlint/plugins` NPM package (oxc-project#18824) (overlookmotel) - 5ee7b2f linter/vitest: Implements `prefer-expect-type-of` rule (oxc-project#17957) (Said Atrahouch) - a7b360a linter/unicorn: Implement `unicorn/relative-url-style` rule (oxc-project#18857) (Mikhail Baev) - 9788a96 oxlint,oxfmt: Add more native builds (oxc-project#18853) (Boshen) - b23395a linter: Enforce exporting an object with `defineConfig` (oxc-project#18858) (camc314) ### 🐛 Bug Fixes - 7800fc5 linter/prefer-event-target: Ignore EventEmitter imported from packages (oxc-project#19188) (camc314) - 03b2955 linter/typescript/ban-types: Mark rule as deprecated (oxc-project#19179) (camc314) - a5b8766 oxlint/lsp: Disable rule for this line should not be preferred (oxc-project#19083) (Sysix) - e08157e linter/jsx-filename-extension: Include filename in as-needed diagnostic (oxc-project#19172) (camc314) - 1773acb oxlint: Re-generate envs (oxc-project#19169) (camc314) - 51c3fc8 linter/no-array-for-each: Skip `Effect.forEach` calls (oxc-project#19127) (camc314) - 825f148 linter/plugins: `RuleTester` consider adjacent fixes as overlapping in ESLint compat mode (oxc-project#19094) (overlookmotel) - ecd2456 linter/plugins: Handle fix with -1 offsets in file with BOM (oxc-project#19092) (overlookmotel) - 5969d26 linter/no-array-sort: Avoid false positives for effect Chunk.sort (oxc-project#19125) (camc314) - de10f04 linter: `no-misleading-character-class`: do not skip reporting on first invalid sequence of the checking group (oxc-project#19111) (Sysix) - 8c0ce78 linter: Scope no-misleading-character-class sequences to single character class (oxc-project#19108) (copilot-swe-agent) - 879e3a0 linter: `no-misleading-character-class`: split sequences on all `CharacterSet` (oxc-project#19107) (Sysix) - 2ad33cc oxlint/lsp: Search parent directories for root oxlint config (oxc-project#19062) (copilot-swe-agent) - f969d5e linter/prefer-dom-node-dataset: Address some edge cases in the fixer (oxc-project#19065) (camc314) - ed759d1 linter/plugins: Fix error messages for invalid suggestions (oxc-project#19059) (overlookmotel) - 34851a7 linter/plugins: Error not panic if invalid fix range (oxc-project#19058) (overlookmotel) - 4823b58 linter/plugins: Fix fixes in files with BOM (oxc-project#19056) (overlookmotel) - 2ef405e linter/no-map-spread: Improve actionability of error message (oxc-project#19007) (Artyom Alekseevich) - 56c086b parser: Add modifier ordering validation (TS1029) (oxc-project#19024) (Boshen) - 6067a49 linter/jsdoc: False positive in `check-tag-names` for `@` in email addresses and npm scopes (oxc-project#19021) (Boshen) - 6d46ed9 linter/capitalized-comments: Ignore prettier and oxfmt directives (oxc-project#19008) (Artyom Alekseevich) - a46c878 linter/react/no-array-index-key: Look for keys in expressions (oxc-project#18997) (camc314) - 7d61704 linter/prefer-at: Skip autofix for `arguments` (oxc-project#18991) (camc314) - 3ebae53 linter/preserve-caught-error: Skip traversing into nested try/catch stmts (oxc-project#18990) (camc314) - e94d37e linter/react/no-unknown-property: Add missing `popover` related props (oxc-project#18953) (Christoph Nakazawa) - 04b0d99 linter: Normalize relative paths with `./` prefix in overrides. (oxc-project#18954) (connorshea) - 57917ee parser: Parse decorators on rest parameters (oxc-project#18938) (Boshen) - 07742ea linter/prefer-as-const: Implement fixer for type annotation (oxc-project#18899) (camc314) - d64bfdd linter/plugins: Ensure `after` hook always runs last in rule converted for ESLint (oxc-project#18904) (overlookmotel) - ec39944 linter/jsx-a11y/no-distracting-elements: Support elements option (oxc-project#18892) (camc314) - f609cb6 linter/prefer-expect-type-of: Handle computed elements in fixer correctly (oxc-project#18890) (camc314) - ecf11e5 linter/dynamic-config: Set `ExternalPlugin.config_dir` to fix js plugins loading (oxc-project#18854) (camc314) - 01b7838 linter/plugins: Do not destroy workspaces (oxc-project#18833) (overlookmotel) - dc51d6b linter: Normalize paths slashes for snapshots on windows (oxc-project#18825) (camc314) - dbfdc40 linter/bad-replace-all-args: Skip extracting flags from conditional expressions (oxc-project#18844) (camc314) ### ⚡ Performance - ed8c054 oxc_str: Add precomputed hash to Ident for fast HashMap lookups (oxc-project#19143) (Boshen) - 18f58bd oxlint/lsp: Transform unused disable directive directly to DiagnosticReport (oxc-project#19112) (Sysix) - 4ce3772 linter: Remove pointless string cloning when combining suggestions (oxc-project#19075) (overlookmotel) - c417bf5 linter: Avoid allocating `Vec` when compiling `PossibleFixes` (oxc-project#19074) (overlookmotel) - adb2baa linter/plugins: Avoid allocation when rule provides single suggestion (oxc-project#19071) (overlookmotel) - 2537924 semantic: Optimize scope resolution with fast paths and inlining (oxc-project#19029) (Boshen) ### 📚 Documentation - 6e8ef38 linter/plugins: Correct and expand JSDoc comment for `RuleTester` config (oxc-project#19156) (overlookmotel) - e7ec06a linter: Improve docs for `import/max-dependencies` rule. (oxc-project#19119) (connorshea) - 367f730 linter/consistent-test-filename: Escape file names fixes oxc-project#19114 (oxc-project#19123) (camc314) - 8753a54 linter: Rewrite the docs for the `jsx-a11y/no-redundant-roles` rule. (oxc-project#19117) (connorshea) - dd44b1a linter: Fix invalid directive in example code for `import/no-nodejs-modules`. (oxc-project#19115) (connorshea) - 726e273 linter/plugins: Improve JSDoc comment for `DiagnosticReport` (oxc-project#19103) (overlookmotel) - 9561e7f linter/plugins: Alter JS plugins example (oxc-project#18900) (overlookmotel) - 501e3b6 linter: Regenerate `config.generated.ts` (oxc-project#18897) (overlookmotel) - b425a0c linter: Document jsPlugins examples (oxc-project#18671) (Cameron) - df2b7fa linter: Expand settings example with reference to custom plugins (oxc-project#18670) (camc314) # Oxfmt ### 💥 BREAKING CHANGES - 856a01f formatter/sort_imports: [**BREAKING**] Replace prefix match with glob pattern in `customGroups.elementNamePattern` (oxc-project#19066) (leaysgur) ### 🚀 Features - 91e67f3 oxfmt/lsp: Do not refer `.gitignore` (oxc-project#19206) (leaysgur) - 23c0753 oxfmt: Better Tailwind CSS intergration (oxc-project#19000) (Dunqing) - 87a920d ci: Add riscv64 and s390x napi targets for oxlint and oxfmt (oxc-project#19039) (Boshen) - 8536dce oxfmt: Support glob for CLI paths (oxc-project#18976) (leaysgur) - 6ee2d59 oxfmt: Use `oxc_formatter` in js-in-xxx part (oxc-project#18373) (leaysgur) - 9788a96 oxlint,oxfmt: Add more native builds (oxc-project#18853) (Boshen) ### 🐛 Bug Fixes - 119348b oxfmt: Resolve relative -> absolute path for other usages (oxc-project#19207) (leaysgur) - 5f4cf30 oxfmt: Fix relative -> absolute path resolution with refactoring (oxc-project#19202) (leaysgur) - dc335d1 oxfmt: Temporarily disable the override for js-in-xxx (not ready yet) (oxc-project#19043) (leaysgur) - 5ea5bda oxfmt: Handle `isSingleJsxExpressionStatementInMarkdown()` check for js-in-md (oxc-project#19042) (leaysgur) - 5243307 formatter: Preserve numeric separators in number literals (oxc-project#19015) (Dunqing) - 9b205b3 formatter: Fallback to formatting when package.json sorting fails (oxc-project#19097) (Boshen) - b79c065 formatter: Preserve comment between callee and optional chaining operator (oxc-project#19020) (Dunqing) - 01d1be1 formatter: Remove unnecessary parentheses for single-member union types (oxc-project#19018) (Dunqing) - f5c7e75 formatter: Preserve parentheses around await with private field access (oxc-project#19014) (Dunqing) - 5a75785 formatter: Preserve parentheses around nested sequence expressions (oxc-project#19013) (Dunqing) - f39c96c oxfmt: Do not override `babel-ts` for now (oxc-project#19030) (leaysgur) - 0ef11bb formatter: Add space before type annotation with leading comment (oxc-project#19012) (Dunqing) - cc232e1 formatter: Keep spread with callback on same line (oxc-project#18999) (Dunqing) - ef5bfab oxfmt: Workaround Node.js ThreadsafeFunction cleanup race condition (oxc-project#18980) (Boshen) - d53f5c4 formatter: Require string first arg in test calls (oxc-project#18935) (Dunqing) - 57917ee parser: Parse decorators on rest parameters (oxc-project#18938) (Boshen) - 2db8c05 formatter: Avoid breaking generic call assignments (oxc-project#18933) (Dunqing) - 1e023e1 formatter: Preserve trailing comma in mts/cts arrow generics (oxc-project#18928) (Dunqing) - 7c4e558 formatter/detect_code_removal: Do not count `TemplateLiteral` content (oxc-project#18848) (leaysgur) ### ⚡ Performance - 467724f oxfmt: Collect glob paths in parallel (oxc-project#19209) (leaysgur) - 61e0efa oxfmt: Use RwLock instead of Mutex for TSFN handles (oxc-project#18888) (Boshen) Co-authored-by: camc314 <[email protected]>

Previously when a rule provided a single fix or suggestion, the range of the fix was not checked to ensure it is valid.
If the fix had an invalid range (
start <= end,endnot out of bounds of source text) this would cause a panic when attempting to slice the source text with the invalid range.Catch these cases earlier and produce a
MergeFixesError, so the invalid fix is not applied, avoiding the panic.Notes:
The error messages for negative offsets or offsets >
u32::MAXare not great, but I don't think it really matters. These shouldn't happen in practice, so IMO it'd be wasteful to introduce extra code paths to handle these cases. The important thing is that they don't cause panics.No additional validation is required when rule produces multiple fixes, as these same checks are already performed in
CompositeFix::merge_fixes_fallible, which handles combining multiple fixes.