-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
feat(eslint-plugin): [prefer-nullish-coalescing] add ignoreTernaryTests option #4965
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Thanks for the PR, @jguddas! 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. As a thank you, your profile/company logo will be added to our main README which receives thousands of unique visitors per day. |
✅ Deploy Preview for typescript-eslint ready!
To edit notification comments on pull requests, go to your Netlify site settings. |
Codecov Report
@@ Coverage Diff @@
## main #4965 +/- ##
==========================================
+ Coverage 91.36% 93.80% +2.44%
==========================================
Files 132 290 +158
Lines 1494 9967 +8473
Branches 226 2999 +2773
==========================================
+ Hits 1365 9350 +7985
- Misses 65 336 +271
- Partials 64 281 +217
Flags with carried forward coverage won't be shown. Click here to find out more.
|
ed7f382
to
1a36d4b
Compare
How about the |
1a36d4b
to
1a02bdc
Compare
da7c7c6
to
f9e8c44
Compare
Not sure about the rule source code, but the tests look great to me! 👍 |
Is there a utility that alrealy exists that allows me to compare member expressions? |
I just added support for |
I would love some feedback on the functionality and know what besides cleaning up the code needs to be done to get this merged, are there any edge cases I have forgotten to cover? |
Hi @jguddas! This PR is in the queue of PRs to reviewed, and will be re-reviewed as soon as we are able. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right, this is getting to be a lot of code 😄. But that feels reasonable, this is a very tricky change you're tackling. Lots of edge cases! Nice job getting it this far 👏.
There are also a lot of missing cases as pointed out by the TypeScript errors & codecov complaints. In good TDD form, I'd suggest you fill in all those tests so we can get a feel for what the code needs to do. Then it should be more clear what can or can't be refactored.
d21395f
to
39ea876
Compare
@JoshuaKGoldberg I cleaned this up a bit, maybe you can take a look again.
Yeah, those errors are super helpful but look worse than they are, I fixed this by adding 2 new test case and deleting one unreachable/duplicated check. |
Funky edge caseThe following code will log let i = 0
const x = { get x() { return i++ } };
console.log (x.x != null ? x.x : y); // logs 1 But the fixed version with let i = 0
const x = { get x() { return i++ } };
console.log (x.x ?? y); // logs 0 |
2587035
to
cafa047
Compare
Just... don't force push |
Okay, do you @Josh-Cena prefer merge commits from main to this branch instead of rebasing? |
At least that's what's said in the CONTRIBUTING guides... I'm not a maintainer/reviewer anyway, and my reviewing habit doesn't include doing incremental reviews. But the TS-ESLint maintainers do use that, so it's best to respect their workflow. |
This is in a presentable state now 🎉 |
Re the force pushing: yup, it's not a blocker for review, but does make it a little harder on our end. Thanks 😄 #5170 |
) { | ||
operator = '!='; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The other way to solve this is to put a bunch of else { return; }
here instead of the one if (!operator) { return; }
at the end
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I tried refactoring a bit and couldn't find anything significantly cleaner. 🤷
@JoshuaKGoldberg what do you think about changing the default But anyway, let's get this merged first 😄 |
Sorry for taking so long to re-review! I've been a little swamped this month (book release, conferences, etc.). But this is still on the backlog!
Yeah I like that 🙂 agreed. Would you be open to filing a new issue so we can track with the |
…option-to-prefer-nullish-coalescing-rule
) { | ||
operator = '!='; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I tried refactoring a bit and couldn't find anything significantly cleaner. 🤷
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yup, this looks great - thanks for all your hard work on this @jguddas!
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.30.7` -> `5.31.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/5.30.7/5.31.0) | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.30.7` -> `5.31.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/5.30.7/5.31.0) | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v5.31.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#​5310-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5307v5310-2022-07-25) [Compare Source](typescript-eslint/typescript-eslint@v5.30.7...v5.31.0) ##### Bug Fixes - **eslint-plugin:** \[typedef] Support nested array destructuring with type annotation ([#​5311](typescript-eslint/typescript-eslint#5311)) ([6d19efe](typescript-eslint/typescript-eslint@6d19efe)) - **scope-manager:** handle typeParameters of TSInstantiationExpression ([#​5355](typescript-eslint/typescript-eslint#5355)) ([2595ccf](typescript-eslint/typescript-eslint@2595ccf)) ##### Features - **eslint-plugin:** \[consistent-generic-ctors] check class field declaration ([#​5288](typescript-eslint/typescript-eslint#5288)) ([48f996e](typescript-eslint/typescript-eslint@48f996e)) - **eslint-plugin:** \[prefer-nullish-coalescing] add ignoreTernaryTests option ([#​4965](typescript-eslint/typescript-eslint#4965)) ([f82727f](typescript-eslint/typescript-eslint@f82727f)) #### [5.30.7](typescript-eslint/typescript-eslint@v5.30.6...v5.30.7) (2022-07-18) ##### Bug Fixes - **eslint-plugin:** \[no-inferrable] fix optional param to valid code ([#​5342](typescript-eslint/typescript-eslint#5342)) ([98f6d5e](typescript-eslint/typescript-eslint@98f6d5e)) - **eslint-plugin:** \[no-unused-vars] highlight last write reference ([#​5267](typescript-eslint/typescript-eslint#5267)) ([c3f199a](typescript-eslint/typescript-eslint@c3f199a)) #### [5.30.6](typescript-eslint/typescript-eslint@v5.30.5...v5.30.6) (2022-07-11) **Note:** Version bump only for package [@​typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin) #### [5.30.5](typescript-eslint/typescript-eslint@v5.30.4...v5.30.5) (2022-07-04) ##### Bug Fixes - **eslint-plugin:** \[consistent-indexed-object-style] fix record mode fixer for generics with a default value ([#​5280](typescript-eslint/typescript-eslint#5280)) ([57f032c](typescript-eslint/typescript-eslint@57f032c)) #### [5.30.4](typescript-eslint/typescript-eslint@v5.30.3...v5.30.4) (2022-07-03) **Note:** Version bump only for package [@​typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin) #### [5.30.3](typescript-eslint/typescript-eslint@v5.30.2...v5.30.3) (2022-07-01) **Note:** Version bump only for package [@​typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin) #### [5.30.2](typescript-eslint/typescript-eslint@v5.30.1...v5.30.2) (2022-07-01) **Note:** Version bump only for package [@​typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin) #### [5.30.1](typescript-eslint/typescript-eslint@v5.30.0...v5.30.1) (2022-07-01) ##### Bug Fixes - **eslint-plugin:** \[no-base-to-string] add missing apostrophe to message ([#​5270](typescript-eslint/typescript-eslint#5270)) ([d320174](typescript-eslint/typescript-eslint@58034e3)) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v5.31.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#​5310-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5307v5310-2022-07-25) [Compare Source](typescript-eslint/typescript-eslint@v5.30.7...v5.31.0) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.30.7](typescript-eslint/typescript-eslint@v5.30.6...v5.30.7) (2022-07-18) ##### Bug Fixes - expose types supporting old versions of typescript ([#​5339](typescript-eslint/typescript-eslint#5339)) ([4ba9bdb](typescript-eslint/typescript-eslint@4ba9bdb)) #### [5.30.6](typescript-eslint/typescript-eslint@v5.30.5...v5.30.6) (2022-07-11) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.30.5](typescript-eslint/typescript-eslint@v5.30.4...v5.30.5) (2022-07-04) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.30.4](typescript-eslint/typescript-eslint@v5.30.3...v5.30.4) (2022-07-03) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.30.3](typescript-eslint/typescript-eslint@v5.30.2...v5.30.3) (2022-07-01) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.30.2](typescript-eslint/typescript-eslint@v5.30.1...v5.30.2) (2022-07-01) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### 5.30.1 (2022-07-01) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **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, click this checkbox. --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzMi4xMjcuMCIsInVwZGF0ZWRJblZlciI6IjMyLjEyNy4wIn0=--> Co-authored-by: cabr2-bot <cabr2.help@gmail.com> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1480 Reviewed-by: Epsilon_02 <epsilon_02@noreply.codeberg.org> Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org> Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
PR Checklist
Overview
I added an option to
prefer-nullish-coalescing
(ignoreTernaryTests
) which when set tofalse
highlights ternary expressions that can be converted to use the nullish coalescing operator (??
) instead.If I have forgotten anything, or you have suggestions what I can do better please let me know, this is my first contribution here 😄