Merged
Conversation
- Add .oxlintrc.json with full rule set: correctness (error), suspicious (warn), perf (warn) TypeScript, React, jsx-a11y, react-perf, Jest, Mocha plugins license-header enforced via jsPlugins promise plugin for async/await patterns - Slim down eslint.config.mjs to a single rule: no-restricted-syntax (AST selectors for @vscode/l10n import guard) TypeScript parser kept so ESLint can parse .ts/.tsx files - Install oxlint + eslint-plugin-oxlint devDependencies - Update lint/lint-fix scripts: oxlint runs first, then eslint - Remove stale eslint-disable comments from source files (rules migrated to oxlint no longer need inline suppressions) - Add oxlint-disable comment in test/global.test.ts for intentional top-level mocha hook
Remove ~170 lines of explicit 'error' rules that are already enabled automatically by oxlint's default correctness category: - Top-level rules: removed all 55 Default=Γ standard ESLint correctness rules (constructor-super, no-debugger, no-unused-labels, etc.) - TS/TSX overrides: removed 10 TypeScript Default=Γ rules (no-duplicate-enum-values, no-misused-new, no-this-alias, no-wrapper-object-types, prefer-as-const, triple-slash-reference, no-extra-non-null-assertion, no-non-null-asserted-optional-chain, no-unsafe-declaration-merging, prefer-namespace-keyword) - Removed no-unused-expressions (Default=Γ correctness) - Removed no-op 'off' entries for Pedantic rules that aren't enabled (no-throw-literal, prefer-promise-reject-errors, require-await) Config shrinks from ~400 to ~230 lines. Rule count unchanged: 87 rules.
The lint script was calling oxlint but the package was missing from devDependencies, causing CI to fail with 'oxlint: not found' since npm ci only installs declared dependencies.
- Install oxlint-tsgolint package (required for typeAware option)
- Add options.typeAware: true to .oxlintrc.json
- Add type-aware rules for *.ts and *.tsx:
no-floating-promises (error), no-misused-promises (error),
require-await (warn), unbound-method (warn), no-base-to-string (warn)
- Disable type-aware rules for test files (jest/mocha overrides)
- Revert eslint.config.mjs to truly minimal (no-restricted-syntax only)
Type-aware mode adds only ~1.5s overhead (8s -> 9.4s) thanks to
oxlint-tsgolint's Rust-based type resolution.
…-shadow in oxlint; restore tsconfig.json
… TS2742 pipeline failures
sevoku
approved these changes
Apr 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Migrate linting from ESLint to oxlint
Summary
Replaces the majority of ESLint rules with oxlint — a Rust-based linter that is 50–100× faster than ESLint. ESLint is kept only for a single rule (
no-restricted-syntaxwith AST node selectors) that oxlint does not yet support.Why oxlint?
The speed gain comes from oxlint running all rules in parallel across 22 threads in a single Rust binary — no Node.js startup, no type-aware graph traversal for most rules.
Changes
New:
.oxlintrc.jsonFull oxlint configuration with:
correctness(error, default) +suspicious(warn) +perf(warn)import,promise,react-perfeslint-plugin-license-header,eslint-plugin-mocha(loaded natively by oxlint)*.ts/*.tsx, Jest for unit tests, Mocha for integration testsUpdated:
eslint.config.mjsReduced from ~270 lines to ~60 lines. The only remaining rule: