Highlights
Faster linting for large codebases
Rslint 0.7.3 reduces repeated work across the linting pipeline with parallel TypeScript Program construction, shared program metadata and configuration plans, and optimized rule hot paths. This release also expands adoption of the shared Refs API, improving the consistency of reference resolution across rules.
12 new rules
This release adds 12 rules across ESLint, Jest, Unicorn, and Rstest, expanding coverage for control flow, error handling, modern Node.js patterns, collection usage, and test quality.
What's Changed
New Features 🎉
- feat(jest): declare options JSON Schema for jest/ rules by @swwind in #1417
- feat(unicorn): declare options JSON Schema for unicorn/ rules by @swwind in #1418
- feat(jsx-a11y): declare options JSON Schema for jsx-a11y/ rules by @swwind in #1346
- feat(eslint-plugin-jest): add
require-top-level-describerule by @eryue0220 in #1455 - feat(react): declare options JSON Schema for react/ rules by @swwind in #1426
- feat(rule): fallback to TypeChecker in RefStore.Resolve for cross-file symbols by @swwind in #1450
- feat(rule): resolve local named export specifiers in RefStore by @swwind in #1459
- feat(eslint-plugin-jest): add
require-to-throw-messagerule by @eryue0220 in #1456 - feat: expose external symbols in tsgo semantic data by @CPunisher in #1453
- feat(rstest): add no-identical-title rule by @elecmonkey in #1473
- feat(unicorn): port rule prefer-node-protocol by @elecmonkey in #1483
- feat: port rule no-useless-assignment by @swwind in #1468
- feat(unicorn): port rule prefer-array-some by @elecmonkey in #1484
- feat(unicorn): port rule prefer-set-has by @elecmonkey in #1479
- feat(rstest): add no-commented-out-tests rule by @elecmonkey in #1339
- feat: expose symbol id and object from type data by @quininer in #1522
- feat: port rule unicorn/error-message by @swwind in #1478
- feat: port rule no-unreachable-loop by @swwind in #1569
- feat(rstest): add no-disabled-tests rule by @elecmonkey in #1475
- feat: port rule preserve-caught-error by @swwind in #1482
Performance 🚀
- perf: port no-const-assign to ctx.Refs.Resolve by @swwind in #1425
- perf: speed up Program target binding by @fansenze in #1466
- perf: cache program metadata across projects by @fansenze in #1467
- perf: optimize no-loop-func rule by @swwind in #1437
- perf: optimize no-unmodified-loop-condition rule by @swwind in #1428
- perf: parallelize TypeScript program builds by @fansenze in #1485
- perf: reuse effective config plans by match shape by @fansenze in #1490
- perf: coalesce parallel program realpath queries by @fansenze in #1491
- perf: optimize prefer-literal-enum-member by @fansenze in #1500
- perf: optimize no-redeclare declaration collection by @fansenze in #1502
- perf: optimize no-dupe-class-members by @fansenze in #1503
- perf: optimize no-useless-switch-case reporting by @fansenze in #1504
- perf: optimize no-class-assign by @fansenze in #1505
- perf: optimize ban-ts-comment by @fansenze in #1506
- perf: optimize no-misused-new by @fansenze in #1508
- perf: optimize no-useless-assignment analysis by @fansenze in #1509
- perf: optimize no-this-alias diagnostics by @fansenze in #1510
- perf: optimize default-param-last rule by @fansenze in #1511
- perf: optimize no-useless-escape by @fansenze in #1513
- perf: optimize no-extra-non-null-assertion diagnostics by @fansenze in #1514
- perf: optimize no-unsafe-declaration-merging by @fansenze in #1515
- perf: optimize no-nonoctal-decimal-escape by @fansenze in #1521
- perf: optimize prefer-enum-initializers by @fansenze in #1519
- perf: optimize no-require-imports by @fansenze in #1517
- perf: optimize no-dupe-keys by @fansenze in #1523
- perf: optimize no-import-assign traversal by @fansenze in #1525
- perf: optimize no-useless-backreference by @fansenze in #1520
- perf: optimize no-unexpected-multiline by @fansenze in #1527
- perf: optimize prefer-number-properties by @fansenze in #1526
- perf: speed up no-unused-vars by @fansenze in #1524
- perf: optimize no-useless-constructor by @fansenze in #1529
- perf: optimize no-obj-calls hot paths by @fansenze in #1530
- perf: optimize anchor-is-valid by @fansenze in #1528
- perf: optimize no-array-constructor hot paths by @fansenze in #1535
- perf: optimize duplicate enum value tracking by @fansenze in #1536
- perf: optimize use-isnan hot paths by @fansenze in #1537
- perf: optimize no-octal hot paths by @fansenze in #1538
- perf: optimize prefer-const hot paths by @fansenze in #1540
- perf: optimize no-unsafe-optional-chaining by @fansenze in #1539
- perf: optimize no-async-promise-executor by @fansenze in #1541
- perf: optimize require-yield hot paths by @fansenze in #1542
- perf: optimize no-global-assign resolution by @fansenze in #1546
- perf: optimize prefer-namespace-keyword by @fansenze in #1544
- perf: optimize for-direction by @fansenze in #1547
- perf: optimize no-const-assign hot paths by @fansenze in #1549
- perf: port require-atomic-updates to the Refs API by @swwind in #1493
- perf: optimize filename-case hot paths by @fansenze in #1550
- perf: optimize prefer-as-const hot paths by @fansenze in #1552
- perf: optimize unicorn no-thenable rule by @fansenze in #1553
- perf: optimize react no-deprecated rule by @fansenze in #1554
- perf: optimize constructor-super duplicate detection by @fansenze in #1555
- perf: optimize no-eval hot paths by @fansenze in #1556
- perf: optimize react display name rule by @fansenze in #1559
- perf: optimize new-for-builtins hot paths by @fansenze in #1563
- perf: optimize no-useless-rename hot paths by @fansenze in #1564
- perf: optimize import/no-cycle traversal by @fansenze in #1567
- perf: optimize rules-of-hooks hot paths by @fansenze in #1568
- perf: optimize no-duplicates hot paths by @fansenze in #1572
- perf: optimize max-lines line counting by @fansenze in #1573
- perf: improve no-self-assign performance by @fansenze in #1565
- perf: optimize max-lines-per-function line counting by @fansenze in #1571
- perf: optimize no-unstable-nested-components hot paths by @fansenze in #1574
- perf: optimize no-unused-vars hot paths by @fansenze in #1582
- perf: optimize no-unreachable-loop hot paths by @fansenze in #1581
Bug Fixes 🐞
- fix: drop stale RequiresTypeInfo from prefer-const by @swwind in #1454
- fix(unicorn): avoid redundant shadow fallback by @fansenze in #1470
- fix: resolve type-only exports in the correct symbol space by @fansenze in #1476
- fix: resolve type-only exports for unused variables by @fansenze in #1477
- fix(unicorn): align prefer-node-protocol with upstream v72 by @fansenze in #1501
- fix(linter): traverse computed assignment keys by @fansenze in #1584
Refactor 🔨
- refactor(jest,rstest): share test framework utilities between Jest and Rstest by @elecmonkey in #1460
- refactor(jest,rstest): share no-mocks-import rule by @elecmonkey in #1461
- refactor(rule): port no-ex-assign to the Refs API by @swwind in #1492
- refactor(rule): converge binding-symbol lookups on utils helpers by @swwind in #1516
- refactor: extract shared control-flow graph into internal/utils/cfg by @swwind in #1566
Document 📖
- docs: show rule release versions by @fansenze in #1472
- docs: normalize rule documentation titles by @elecmonkey in #1474
- docs: init typescript-go submodule shallow and non-recursive by @elecmonkey in #1545
Other Changes
- test: make nil guard control flow explicit by @fansenze in #1448
- chore: move to pnpm catalog by @swwind in #1358
- chore(deps): update actions/checkout digest to d23441a by @renovate[bot] in #1161
- chore(deps): update actions/setup-go digest to 924ae3a by @renovate[bot] in #1162
- chore: upgrade monaco-editor to 0.56.0 by @elecmonkey in #1457
- test(rule-tester): validate test case options against the rule's schema by @swwind in #1464
- chore(deps): update dependency eslint to ^10.8.0 by @renovate[bot] in #1410
- chore(deps): update actions/cache action to v5.1.0 by @renovate[bot] in #1488
- chore(deps): update dependency eslint-plugin-playwright to ^2.11.0 by @renovate[bot] in #1496
- chore(deps): update module golang.org/x/text to v0.40.0 by @renovate[bot] in #1499
- test: make go test work with -trimpath by @swwind in #1507
- test: adapt no-useless-backreference test to embedfs Root by @swwind in #1532
- chore(deps): update dependency vscode to ^1.131.0 by @renovate[bot] in #1498
- chore(deps): update dtolnay/rust-toolchain digest to 4cda84d by @renovate[bot] in #1487
- chore(deps): update dependency @napi-rs/cli to ^3.8.2 by @renovate[bot] in #1495
- ci: add timeout to Go test job by @fansenze in #1543
- chore(deps): update actions/setup-node digest to 2499707 by @renovate[bot] in #1486
- test: stabilize parallel program panic test by @fansenze in #1557
- chore(deps): upgrade eslint-plugin-unicorn to 72 by @elecmonkey in #1533
- test: isolate broken nested config workspace by @fansenze in #1575
- test: cover computed assignment keys in core rules by @fansenze in #1586
Full Changelog: v0.7.2...v0.7.3