Skip to content

fix(eslint-plugin): [prefer-optional-chain] remove dangling closing parenthesis#11865

Merged
JoshuaKGoldberg merged 4 commits intotypescript-eslint:mainfrom
mdm317:fix-11818-prefer-optional-chain-addtional-paren
Mar 21, 2026
Merged

fix(eslint-plugin): [prefer-optional-chain] remove dangling closing parenthesis#11865
JoshuaKGoldberg merged 4 commits intotypescript-eslint:mainfrom
mdm317:fix-11818-prefer-optional-chain-addtional-paren

Conversation

@mdm317
Copy link
Copy Markdown
Contributor

@mdm317 mdm317 commented Dec 21, 2025

PR Checklist

Overview

foo && (foo.bar && (foo.bar as any).baz) => foo?.bar && (foo.bar as any).baz

foo && (foo.bar && baz) => foo?.bar && baz

new playground link

@typescript-eslint
Copy link
Copy Markdown
Contributor

Thanks for the PR, @mdm317!

typescript-eslint is a 100% community driven project, and we are incredibly grateful that you are contributing to that community.

The core maintainers work on this in their personal time, so please understand that it may not be possible for them to review your work immediately.

Thanks again!


🙏 Please, if you or your company is finding typescript-eslint valuable, help us sustain the project by sponsoring it transparently on https://opencollective.com/typescript-eslint.

@netlify
Copy link
Copy Markdown

netlify bot commented Dec 21, 2025

Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit 46dc43b
🔍 Latest deploy log https://app.netlify.com/projects/typescript-eslint/deploys/69568d65039cd0000848ef9f
😎 Deploy Preview https://deploy-preview-11865--typescript-eslint.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 98 (🟢 up 8 from production)
Accessibility: 97 (no change from production)
Best Practices: 100 (no change from production)
SEO: 92 (no change from production)
PWA: 80 (no change from production)
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify project configuration.

@nx-cloud
Copy link
Copy Markdown

nx-cloud bot commented Dec 21, 2025

View your CI Pipeline Execution ↗ for commit 46dc43b

Command Status Duration Result
nx run-many -t lint ✅ Succeeded 3m 16s View ↗
nx run-many -t typecheck ✅ Succeeded 2m 3s View ↗
nx test eslint-plugin-internal --coverage=false ✅ Succeeded 5s View ↗
nx run types:build ✅ Succeeded 2s View ↗
nx run integration-tests:test ✅ Succeeded 3s View ↗
nx test typescript-estree --coverage=false ✅ Succeeded 2s View ↗
nx run generate-configs ✅ Succeeded 7s View ↗
nx run-many --target=build --parallel --exclude... ✅ Succeeded 3s View ↗
Additional runs (28) ✅ Succeeded ... View ↗

☁️ Nx Cloud last updated this comment at 2026-01-01 15:17:42 UTC

@codecov
Copy link
Copy Markdown

codecov bot commented Dec 21, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 90.68%. Comparing base (46fc7fe) to head (46dc43b).
⚠️ Report is 129 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #11865   +/-   ##
=======================================
  Coverage   90.68%   90.68%           
=======================================
  Files         525      525           
  Lines       53480    53521   +41     
  Branches     8930     8942   +12     
=======================================
+ Hits        48496    48537   +41     
  Misses       4971     4971           
  Partials       13       13           
Flag Coverage Δ
unittest 90.68% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
.../rules/prefer-optional-chain-utils/analyzeChain.ts 100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@mdm317 mdm317 changed the title fix(eslint-plugin): [prefer-optional-chain] remove dangling closing parenthesis fix(eslint-plugin): [prefer-optional-chain] remove dangling closing parenthesis Dec 21, 2025
@mdm317 mdm317 marked this pull request as ready for review December 21, 2025 16:48
Copy link
Copy Markdown
Member

@JoshuaKGoldberg JoshuaKGoldberg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The general direction is a good start, but I believe there's a bug that'll need to be handled? Thanks for jumping on this one too! ❤️

);
let unclosedParens = 0;

for (const char of replacedCode) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Bug] The problem with counting characters in raw sourceCode.text is that you also have to account for comments. Which is really, really hard.

Adding this as a test case causes an error:

foo && /* gotcha :( */ (foo.bar && (foo.bar as any).baz)

Instead of going off sourceCode.text, I believe this logic will have to actually look for parentheses. You should be able to use sourceCode.getToken to look for them.

But let me know if this is actually a huge pain and a lot of code to deal with. I know tokens can be... tricky 😅

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I implemented this using getToken and fixed a few additional error cases.

@JoshuaKGoldberg JoshuaKGoldberg added the awaiting response Issues waiting for a reply from the OP or another party label Dec 26, 2025
@mdm317 mdm317 marked this pull request as draft January 1, 2026 15:03
@mdm317 mdm317 marked this pull request as ready for review January 1, 2026 16:09
@mdm317 mdm317 requested a review from JoshuaKGoldberg January 1, 2026 16:09
@github-actions github-actions bot removed the awaiting response Issues waiting for a reply from the OP or another party label Jan 1, 2026
Copy link
Copy Markdown
Member

@JoshuaKGoldberg JoshuaKGoldberg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the delay - this looks great! I appreciate the detailed logic & comprehensive test cases about all sorts of parenthesis shenanigans. Well done! 🧹

@JoshuaKGoldberg JoshuaKGoldberg merged commit 42a1c89 into typescript-eslint:main Mar 21, 2026
66 checks passed
736-c41-2c1-e464fc974 pushed a commit to Swiss-Armed-Forces/Loom that referenced this pull request Mar 30, 2026
This MR contains the following updates:

| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)) | devDependencies | patch | [`8.57.0` → `8.57.2`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/8.57.0/8.57.2) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/typescript-eslint/typescript-eslint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) |
| [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | devDependencies | patch | [`8.57.0` → `8.57.2`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.57.0/8.57.2) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/typescript-eslint/typescript-eslint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) |
| [i18next](https://www.i18next.com) ([source](https://github.com/i18next/i18next)) | dependencies | patch | [`25.10.9` → `25.10.10`](https://renovatebot.com/diffs/npm/i18next/25.10.9/25.10.10) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/i18next/i18next/badge)](https://securityscorecards.dev/viewer/?uri=github.com/i18next/i18next) |
| [react-router-dom](https://github.com/remix-run/react-router) ([source](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom)) | dependencies | patch | [`7.13.1` → `7.13.2`](https://renovatebot.com/diffs/npm/react-router-dom/7.13.1/7.13.2) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/remix-run/react-router/badge)](https://securityscorecards.dev/viewer/?uri=github.com/remix-run/react-router) |
| [typescript-eslint](https://typescript-eslint.io/packages/typescript-eslint) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)) | devDependencies | patch | [`8.57.0` → `8.57.2`](https://renovatebot.com/diffs/npm/typescript-eslint/8.57.0/8.57.2) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/typescript-eslint/typescript-eslint/badge)](https://securityscorecards.dev/viewer/?uri=github.com/typescript-eslint/typescript-eslint) |
| [vitest](https://vitest.dev) ([source](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)) | devDependencies | patch | [`4.1.0` → `4.1.2`](https://renovatebot.com/diffs/npm/vitest/4.1.0/4.1.2) | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/vitest-dev/vitest/badge)](https://securityscorecards.dev/viewer/?uri=github.com/vitest-dev/vitest) |

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint (@&#8203;typescript-eslint/eslint-plugin)</summary>

### [`v8.57.2`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8572-2026-03-23)

[Compare Source](typescript-eslint/typescript-eslint@v8.57.1...v8.57.2)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-readonly-parameter-types] preserve type alias infomation ([#&#8203;11954](typescript-eslint/typescript-eslint#11954))
- **eslint-plugin:** \[no-useless-default-assignment] skip reporting false positives for unresolved type parameters ([#&#8203;12127](typescript-eslint/typescript-eslint#12127))
- **eslint-plugin:** \[no-unsafe-return] false positive on unwrapping generic ([#&#8203;12125](typescript-eslint/typescript-eslint#12125))
- **eslint-plugin:** \[no-restricted-types] flag banned generics in extends or implements ([#&#8203;12120](typescript-eslint/typescript-eslint#12120))
- **eslint-plugin:** \[array-type] ignore Array and ReadonlyArray without type arguments ([#&#8203;11971](typescript-eslint/typescript-eslint#11971))
- **eslint-plugin:** \[prefer-optional-chain] remove dangling closing parenthesis ([#&#8203;11865](typescript-eslint/typescript-eslint#11865))

##### ❤️ Thank You

- Kirk Waiblinger [@&#8203;kirkwaiblinger](https://github.com/kirkwaiblinger)
- Konv Suu
- mdm317
- Newton Yuan [@&#8203;NewtonYuan](https://github.com/NewtonYuan)
- SungHyun627 [@&#8203;SungHyun627](https://github.com/SungHyun627)
- Tamashoo [@&#8203;Tamashoo](https://github.com/Tamashoo)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.2) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.57.1`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8571-2026-03-16)

[Compare Source](typescript-eslint/typescript-eslint@v8.57.0...v8.57.1)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-optional-chain] no report for property on intersection type ([#&#8203;12126](typescript-eslint/typescript-eslint#12126))

##### ❤️ Thank You

- Newton Yuan [@&#8203;NewtonYuan](https://github.com/NewtonYuan)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.1) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint (@&#8203;typescript-eslint/parser)</summary>

### [`v8.57.2`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8572-2026-03-23)

[Compare Source](typescript-eslint/typescript-eslint@v8.57.1...v8.57.2)

This was a version bump only for parser to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.2) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.57.1`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8571-2026-03-16)

[Compare Source](typescript-eslint/typescript-eslint@v8.57.0...v8.57.1)

This was a version bump only for parser to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.1) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>i18next/i18next (i18next)</summary>

### [`v25.10.10`](https://github.com/i18next/i18next/blob/HEAD/CHANGELOG.md#251010)

[Compare Source](i18next/i18next@v25.10.9...v25.10.10)

- feat: suppress support notice automatically in production environments (`NODE_ENV=production`)

</details>

<details>
<summary>remix-run/react-router (react-router-dom)</summary>

### [`v7.13.2`](https://github.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#7132)

[Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.13.1...react-router-dom@7.13.2)

##### Patch Changes

- Updated dependencies:
  - `react-router@7.13.2`

</details>

<details>
<summary>typescript-eslint/typescript-eslint (typescript-eslint)</summary>

### [`v8.57.2`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8572-2026-03-23)

[Compare Source](typescript-eslint/typescript-eslint@v8.57.1...v8.57.2)

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.2) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

### [`v8.57.1`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8571-2026-03-16)

[Compare Source](typescript-eslint/typescript-eslint@v8.57.0...v8.57.1)

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.1) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.

</details>

<details>
<summary>vitest-dev/vitest (vitest)</summary>

### [`v4.1.2`](https://github.com/vitest-dev/vitest/releases/tag/v4.1.2)

[Compare Source](vitest-dev/vitest@v4.1.1...v4.1.2)

This release bumps Vitest's `flatted` version and removes version pinning to resolve `flatted`'s CVE related issues ([#&#8203;9975](vitest-dev/vitest#9975)).

#####    🐞 Bug Fixes

- Don't resolve `setupFiles` from parent directory  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9960](vitest-dev/vitest#9960) [<samp>(7aa93)</samp>](vitest-dev/vitest@7aa937776)
- Ensure sequential mock/unmock resolution  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) and **Claude Opus 4.6** in [#&#8203;9830](vitest-dev/vitest#9830) [<samp>(7c065)</samp>](vitest-dev/vitest@7c06598db)
- **browser**: Take failure screenshot if `toMatchScreenshot` can't capture a stable screenshot  -  by [@&#8203;macarie](https://github.com/macarie) in [#&#8203;9847](vitest-dev/vitest#9847) [<samp>(faace)</samp>](vitest-dev/vitest@faace1fbe)
- **coverage**: Correct `coverageConfigDefaults` values and types  -  by [@&#8203;Arthie](https://github.com/Arthie) in [#&#8203;9940](vitest-dev/vitest#9940) [<samp>(b3c99)</samp>](vitest-dev/vitest@b3c992cb2)
- **pretty-format**: Fix output limit over counting  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9965](vitest-dev/vitest#9965) [<samp>(d3b7a)</samp>](vitest-dev/vitest@d3b7a40fa)
- Disable colors if agent is detected  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) and [@&#8203;AriPerkkio](https://github.com/AriPerkkio) in [#&#8203;9851](vitest-dev/vitest#9851) [<samp>(6f97b)</samp>](vitest-dev/vitest@6f97b55dd)

#####     [View changes on GitHub](vitest-dev/vitest@v4.1.1...v4.1.2)

### [`v4.1.1`](https://github.com/vitest-dev/vitest/releases/tag/v4.1.1)

[Compare Source](vitest-dev/vitest@v4.1.0...v4.1.1)

#####    🚀 Features

- **experimental**:
  - Expose `matchesTags` to test if the current filter matches tags  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9913](vitest-dev/vitest#9913) [<samp>(eec53)</samp>](vitest-dev/vitest@eec53d9f5)
  - Introduce `experimental.vcsProvider`  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9928](vitest-dev/vitest#9928) [<samp>(56115)</samp>](vitest-dev/vitest@561150036)

#####    🐞 Bug Fixes

- Mark `TestProject.testFilesList` internal properly  -  by [@&#8203;sapphi-red](https://github.com/sapphi-red) in [#&#8203;9867](vitest-dev/vitest#9867) [<samp>(54f26)</samp>](vitest-dev/vitest@54f2660f5)
- Detect fixture that returns without calling `use`  -  by [@&#8203;oilater](https://github.com/oilater) in [#&#8203;9831](vitest-dev/vitest#9831) and [#&#8203;9861](vitest-dev/vitest#9861) [<samp>(633ae)</samp>](vitest-dev/vitest@633ae2303)
- Drop vite 8.beta support  -  by [@&#8203;AriPerkkio](https://github.com/AriPerkkio) in [#&#8203;9862](vitest-dev/vitest#9862) [<samp>(b78f5)</samp>](vitest-dev/vitest@b78f5389d)
- Type regression in vi.mocked() static class methods  -  by [@&#8203;purepear](https://github.com/purepear) and [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9857](vitest-dev/vitest#9857) [<samp>(90926)</samp>](vitest-dev/vitest@90926641b)
- Properly re-evaluate actual modules of mocked external  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9898](vitest-dev/vitest#9898) [<samp>(ae5ec)</samp>](vitest-dev/vitest@ae5ec03ef)
- Preserve coverage report when html reporter overlaps  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9889](vitest-dev/vitest#9889) [<samp>(2d81a)</samp>](vitest-dev/vitest@2d81ad897)
- Provide `vi.advanceTimers` to the preview provider  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9891](vitest-dev/vitest#9891) [<samp>(1bc3e)</samp>](vitest-dev/vitest@1bc3e63be)
- Don't leak event listener in playwright provider  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9910](vitest-dev/vitest#9910) [<samp>(d9355)</samp>](vitest-dev/vitest@d93550ff7)
- Open browser in `--standalone` mode without running tests  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9911](vitest-dev/vitest#9911) [<samp>(e78ad)</samp>](vitest-dev/vitest@e78adcf97)
- Guard disposable and optional `body`  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9912](vitest-dev/vitest#9912) [<samp>(6fdb2)</samp>](vitest-dev/vitest@6fdb2ba61)
- Resolve `retry.condition` RegExp serialization issue  -  by [@&#8203;nstepien](https://github.com/nstepien) and [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9942](vitest-dev/vitest#9942) [<samp>(7b605)</samp>](vitest-dev/vitest@7b6054328)
- **collect**:
  - Don't treat extra props on `test` return as tests  -  by [@&#8203;sheremet-va](https://github.com/sheremet-va) in [#&#8203;9871](vitest-dev/vitest#9871) [<samp>(141e7)</samp>](vitest-dev/vitest@141e72aa1)
- **coverage**:
  - Simplify provider types  -  by [@&#8203;AriPerkkio](https://github.com/AriPerkkio) in [#&#8203;9931](vitest-dev/vitest#9931) [<samp>(aaf9f)</samp>](vitest-dev/vitest@aaf9f18ae)
  - Load built-in provider without module runner  -  by [@&#8203;AriPerkkio](https://github.com/AriPerkkio) in [#&#8203;9939](vitest-dev/vitest#9939) [<samp>(bf892)</samp>](vitest-dev/vitest@bf8920817)
- **expect**:
  - Soft assertions continue after .resolves/.rejects promise errors  -  by [@&#8203;mixelburg](https://github.com/mixelburg), **Maks Pikov**, **Claude Opus 4.6 (1M context)** and [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9843](vitest-dev/vitest#9843) [<samp>(6d74b)</samp>](vitest-dev/vitest@6d74b4948)
  - Fix sinon-chai style API  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) in [#&#8203;9943](vitest-dev/vitest#9943) [<samp>(0f08d)</samp>](vitest-dev/vitest@0f08dda2c)
- **pretty-format**:
  - Limit output for large object  -  by [@&#8203;hi-ogawa](https://github.com/hi-ogawa) and **Claude Opus 4.6 (1M context)** in [#&#8203;9949](vitest-dev/vitest#9949) [<samp>(0d5f9)</samp>](vitest-dev/vitest@0d5f9d6ef)

#####     [View changes on GitHub](vitest-dev/vitest@v4.1.0...v4.1.1)

</details>

---

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

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My44NC4yIiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIiwicmVub3ZhdGUiXX0=-->

See merge request swiss-armed-forces/cyber-command/cea/loom!411

Co-authored-by: persistent-chamoisee yield <persistent-chamoisee-yield-9fd-f86-2e0-f31d23b2e@swiss-armed-forces-open-source.ch>
renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Mar 31, 2026
| datasource | package                          | from   | to     |
| ---------- | -------------------------------- | ------ | ------ |
| npm        | @typescript-eslint/eslint-plugin | 8.56.0 | 8.58.0 |
| npm        | @typescript-eslint/parser        | 8.56.0 | 8.58.0 |


## [v8.58.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8580-2026-03-30)

##### 🚀 Features

- support TypeScript 6 ([#12124](typescript-eslint/typescript-eslint#12124))

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-regexp-exec] avoid fixing unknown RegExp flags ([#12161](typescript-eslint/typescript-eslint#12161))
- **eslint-plugin:** \[no-extraneous-class] handle index signatures ([#12142](typescript-eslint/typescript-eslint#12142))
- **eslint-plugin:** crash in `no-unnecessary-type-arguments` ([#12163](typescript-eslint/typescript-eslint#12163))

##### ❤️ Thank You

- ej shafran [@ej-shafran](https://github.com/ej-shafran)
- Evyatar Daud [@StyleShit](https://github.com/StyleShit)
- GG ZIBLAKING
- milkboy2564 [@SeolJaeHyeok](https://github.com/SeolJaeHyeok)
- teee32 [@teee32](https://github.com/teee32)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.58.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.


## [v8.57.2](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8572-2026-03-23)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-readonly-parameter-types] preserve type alias infomation ([#11954](typescript-eslint/typescript-eslint#11954))
- **eslint-plugin:** \[no-useless-default-assignment] skip reporting false positives for unresolved type parameters ([#12127](typescript-eslint/typescript-eslint#12127))
- **eslint-plugin:** \[no-unsafe-return] false positive on unwrapping generic ([#12125](typescript-eslint/typescript-eslint#12125))
- **eslint-plugin:** \[no-restricted-types] flag banned generics in extends or implements ([#12120](typescript-eslint/typescript-eslint#12120))
- **eslint-plugin:** \[array-type] ignore Array and ReadonlyArray without type arguments ([#11971](typescript-eslint/typescript-eslint#11971))
- **eslint-plugin:** \[prefer-optional-chain] remove dangling closing parenthesis ([#11865](typescript-eslint/typescript-eslint#11865))

##### ❤️ Thank You

- Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger)
- Konv Suu
- mdm317
- Newton Yuan [@NewtonYuan](https://github.com/NewtonYuan)
- SungHyun627 [@SungHyun627](https://github.com/SungHyun627)
- Tamashoo [@Tamashoo](https://github.com/Tamashoo)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.2) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.


## [v8.57.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8571-2026-03-16)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-optional-chain] no report for property on intersection type ([#12126](typescript-eslint/typescript-eslint#12126))

##### ❤️ Thank You

- Newton Yuan [@NewtonYuan](https://github.com/NewtonYuan)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.1) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.


## [v8.57.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8570-2026-03-09)

##### 🚀 Features

- **eslint-plugin:** \[no-unnecessary-condition] allow literal loop conditions in for/do loops ([#12080](typescript-eslint/typescript-eslint#12080))

##### 🩹 Fixes

- **eslint-plugin:** \[no-base-to-string] fix false positive for toString with overloads ([#12089](typescript-eslint/typescript-eslint#12089))
- **eslint-plugin:** \[prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors ([#12094](typescript-eslint/typescript-eslint#12094))
- **typescript-estree:** if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` ([#11355](typescript-eslint/typescript-eslint#11355))
- **eslint-plugin:** guard against negative paramIndex in no-useless-default-assignment ([#12077](typescript-eslint/typescript-eslint#12077))
- **eslint-plugin:** handle statically analyzable computed keys in prefer-readonly ([#12079](typescript-eslint/typescript-eslint#12079))
- **eslint-plugin:** \[strict-void-return] false positives with overloads ([#12055](typescript-eslint/typescript-eslint#12055))

##### ❤️ Thank You

- Brad Zacher [@bradzacher](https://github.com/bradzacher)
- Brian Schlenker [@bschlenk](https://github.com/bschlenk)
- Evyatar Daud [@StyleShit](https://github.com/StyleShit)
- James Henry [@JamesHenry](https://github.com/JamesHenry)
- Josh Goldberg
- Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger)
- Moses Odutusin [@thebolarin](https://github.com/thebolarin)
- Newton Yuan [@NewtonYuan](https://github.com/NewtonYuan)
- SungHyun627 [@SungHyun627](https://github.com/SungHyun627)
- Younsang Na [@nayounsang](https://github.com/nayounsang)

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.57.0) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.


## [v8.56.1](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8561-2026-02-23)

This was a version bump only for eslint-plugin to align it with other projects, there were no code changes.

See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.56.1) for more information.

You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: [prefer-optional-chain] suggestion produces syntax error when there's additional parentheses

2 participants