Skip to content

feat(eslint-plugin): [prefer-nullish-coalescing] fix detection of ignoreConditionalTests involving boolean ! operator #10299

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

developer-bandi
Copy link
Contributor

@developer-bandi developer-bandi commented Nov 7, 2024

PR Checklist

Overview

Since we maintain the same logic as the ignoreBooleanCoercion option, should we add the same logic to this option as well?

let a: string | undefined;
let b: string | undefined;

Boolean(!!(a || b)) 
Boolean(!(a || b)) 

@typescript-eslint
Copy link
Contributor

Thanks for the PR, @developer-bandi!

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.

Copy link

netlify bot commented Nov 7, 2024

Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit 8bd626d
🔍 Latest deploy log https://app.netlify.com/sites/typescript-eslint/deploys/67347e1ad386df0008191153
😎 Deploy Preview https://deploy-preview-10299--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: 99 (no change from production)
Accessibility: 100 (no change from production)
Best Practices: 92 (no change from production)
SEO: 98 (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 site configuration.

Copy link

nx-cloud bot commented Nov 7, 2024

☁️ Nx Cloud Report

CI is running/has finished running commands for commit 8bd626d. As they complete they will appear below. Click to see the status, the terminal output, and the build insights.

📂 See all runs for this CI Pipeline Execution


✅ Successfully ran 2 targets

Sent with 💌 from NxCloud.

Copy link

codecov bot commented Nov 7, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 86.60%. Comparing base (90617a6) to head (8bd626d).
Report is 15 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #10299      +/-   ##
==========================================
+ Coverage   86.57%   86.60%   +0.02%     
==========================================
  Files         431      432       +1     
  Lines       15198    15166      -32     
  Branches     4421     4428       +7     
==========================================
- Hits        13158    13134      -24     
+ Misses       1683     1675       -8     
  Partials      357      357              
Flag Coverage Δ
unittest 86.60% <100.00%> (+0.02%) ⬆️

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

Files with missing lines Coverage Δ
...lint-plugin/src/rules/prefer-nullish-coalescing.ts 95.59% <100.00%> (+0.08%) ⬆️

... and 27 files with indirect coverage changes

@kirkwaiblinger kirkwaiblinger changed the title feat(eslint-plugin): [prefer-nullish-coalescing] modifies the unaryExpression type to run recursively. feat(eslint-plugin): [prefer-nullish-coalescing] modifies the unaryExpression type to run recursively Nov 7, 2024
@kirkwaiblinger
Copy link
Member

Hey! merging from main for ya to fix the build errors

Copy link
Member

@kirkwaiblinger kirkwaiblinger left a comment

Choose a reason for hiding this comment

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

thanks!

@kirkwaiblinger kirkwaiblinger added the 1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge label Nov 11, 2024
@kirkwaiblinger
Copy link
Member

Since we maintain the same logic as the ignoreBooleanCoercion option, should we add the same logic to this option as well?

let a: string | undefined;
let b: string | undefined;

Boolean(!!(a || b)) 
Boolean(!(a || b)) 

Yeah, probably a good idea to do this tbh.

Copy link
Member

@kirkwaiblinger kirkwaiblinger left a comment

Choose a reason for hiding this comment

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

What you have looks good, but I think it would be good to implement your suggestion in #10299 (comment)

@kirkwaiblinger kirkwaiblinger removed the 1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge label Nov 11, 2024
@kirkwaiblinger kirkwaiblinger changed the title feat(eslint-plugin): [prefer-nullish-coalescing] modifies the unaryExpression type to run recursively feat(eslint-plugin): [prefer-nullish-coalescing] fix detection of ignoreConditionalTests involving boolean ! operator Nov 11, 2024
Copy link
Member

@kirkwaiblinger kirkwaiblinger left a comment

Choose a reason for hiding this comment

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

salute gif

@kirkwaiblinger kirkwaiblinger added the 1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge label Nov 11, 2024
let a: string | undefined;
let b: string | undefined;

Boolean(!(a || b));
Copy link
Member

Choose a reason for hiding this comment

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

oh, hmm. I hate to do this. But actually, now that I'm thinking harder about this, I don't think we want this. This would be unambiguously better to write as !Boolean(a || b), so the ! really is the sort of implicit coercion that ignoreBooleanCoercion constructor is trying to force you to use Boolean on instead.

So sorry to change request changes one way and then request they be undone, but would you mind reverting the ignoreBooleanCoercion changes?

Copy link
Member

@kirkwaiblinger kirkwaiblinger left a comment

Choose a reason for hiding this comment

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

Changed my mind about #10299 (review), sorry! 🫣

See #10299 (comment)

@kirkwaiblinger kirkwaiblinger removed the 1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge label Nov 11, 2024
@developer-bandi
Copy link
Contributor Author

Thank you. I have reflected this.

Copy link
Member

@kirkwaiblinger kirkwaiblinger left a comment

Choose a reason for hiding this comment

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

Great! And sorry again for my previous mistaken review!

@kirkwaiblinger kirkwaiblinger added the 1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge label Nov 15, 2024
@bradzacher bradzacher added the bug Something isn't working label Nov 16, 2024
@bradzacher bradzacher merged commit a7746fb into typescript-eslint:main Nov 16, 2024
63 of 67 checks passed
renovate bot added a commit to mmkal/eslint-plugin-mmkal that referenced this pull request Nov 18, 2024
##### [v8.15.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8150-2024-11-18)

##### 🚀 Features

-   **eslint-plugin:** \[prefer-nullish-coalescing] fix detection of `ignoreConditionalTests` involving boolean `!` operator ([#10299](typescript-eslint/typescript-eslint#10299))
-   **eslint-plugin:** new rule `no-unsafe-type-assertion` ([#10051](typescript-eslint/typescript-eslint#10051))
-   **eslint-plugin:** added related-getter-setter-pairs rule ([#10192](typescript-eslint/typescript-eslint#10192))

##### 🩹 Fixes

-   **utils:** add defaultOptions to meta in rule ([#10339](typescript-eslint/typescript-eslint#10339))
-   **eslint-plugin:** report deprecations used in default export ([#10330](typescript-eslint/typescript-eslint#10330))
-   **eslint-plugin:** \[explicit-module-boundary-types] and \[explicit-function-return-type] don't report on `as const satisfies` ([#10315](typescript-eslint/typescript-eslint#10315))
-   **eslint-plugin:** \[await-thenable, return-await] don't flag awaiting unconstrained type parameter as unnecessary ([#10314](typescript-eslint/typescript-eslint#10314))
-   **eslint-plugin:** \[consistent-indexed-object-style] handle circular mapped types ([#10301](typescript-eslint/typescript-eslint#10301))

##### ❤️  Thank You

-   Josh Goldberg ✨
-   Kim Sang Du [@developer-bandi](https://github.com/developer-bandi)
-   Luis Sebastian Urrutia Fuentes [@LuisUrrutia](https://github.com/LuisUrrutia)
-   Phillip Huang
-   Ronen Amiel
-   Szydlak [@wszydlak](https://github.com/wszydlak)

You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Nov 19, 2024
| datasource | package                          | from   | to     |
| ---------- | -------------------------------- | ------ | ------ |
| npm        | @typescript-eslint/eslint-plugin | 8.14.0 | 8.15.0 |
| npm        | @typescript-eslint/parser        | 8.14.0 | 8.15.0 |


## [v8.15.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8150-2024-11-18)

##### 🚀 Features

-   **eslint-plugin:** \[prefer-nullish-coalescing] fix detection of `ignoreConditionalTests` involving boolean `!` operator ([#10299](typescript-eslint/typescript-eslint#10299))
-   **eslint-plugin:** new rule `no-unsafe-type-assertion` ([#10051](typescript-eslint/typescript-eslint#10051))
-   **eslint-plugin:** added related-getter-setter-pairs rule ([#10192](typescript-eslint/typescript-eslint#10192))

##### 🩹 Fixes

-   **utils:** add defaultOptions to meta in rule ([#10339](typescript-eslint/typescript-eslint#10339))
-   **eslint-plugin:** report deprecations used in default export ([#10330](typescript-eslint/typescript-eslint#10330))
-   **eslint-plugin:** \[explicit-module-boundary-types] and \[explicit-function-return-type] don't report on `as const satisfies` ([#10315](typescript-eslint/typescript-eslint#10315))
-   **eslint-plugin:** \[await-thenable, return-await] don't flag awaiting unconstrained type parameter as unnecessary ([#10314](typescript-eslint/typescript-eslint#10314))
-   **eslint-plugin:** \[consistent-indexed-object-style] handle circular mapped types ([#10301](typescript-eslint/typescript-eslint#10301))

##### ❤️  Thank You

-   Josh Goldberg ✨
-   Kim Sang Du [@developer-bandi](https://github.com/developer-bandi)
-   Luis Sebastian Urrutia Fuentes [@LuisUrrutia](https://github.com/LuisUrrutia)
-   Phillip Huang
-   Ronen Amiel
-   Szydlak [@wszydlak](https://github.com/wszydlak)

You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Nov 26, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
1 approval >=1 team member has approved this PR; we're now leaving it open for more reviews before we merge bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug: [prefer-nullish-coalescing] ignoreConditionalTests doesn't ignore the boolean ! operator in a condition
3 participants