-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
feat(eslint-plugin): [switch-exhaustiveness-check] add support for "no default" comment #10218
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
feat(eslint-plugin): [switch-exhaustiveness-check] add support for "no default" comment #10218
Conversation
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. |
✅ Deploy Preview for typescript-eslint ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #10218 +/- ##
=======================================
Coverage 86.77% 86.78%
=======================================
Files 444 444
Lines 15320 15328 +8
Branches 4461 4465 +4
=======================================
+ Hits 13294 13302 +8
Misses 1672 1672
Partials 354 354
Flags with carried forward coverage won't be shown. Click here to find out more.
|
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
I will resolve the conflict by merging the changes to the considerDefaultExhaustiveForUnions option currently reflected in the main branch and request a review again. |
…eslint into feature/switch-exhaustiveness-check-nodefaultcomment
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.
I took a quick initial pass and think there should be an option added to maintain parity with ESLint core. I can take a deeper look once that's in (or if I'm wrong about that). Thanks!
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
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.
A few necessities aren't filled in: docs and tests for the option. If you fill those in we can review more deeply. Thanks!
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts
Outdated
Show resolved
Hide resolved
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.
Progress! 🚀
I'm not sure we want the no default
as a default - so you might want to hold off changes until the discussion there resolves.
packages/eslint-plugin/docs/rules/switch-exhaustiveness-check.mdx
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/docs/rules/switch-exhaustiveness-check.mdx
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/docs/rules/switch-exhaustiveness-check.mdx
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/docs/rules/switch-exhaustiveness-check.mdx
Outdated
Show resolved
Hide resolved
packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts
Outdated
Show resolved
Hide resolved
…eslint into feature/switch-exhaustiveness-check-nodefaultcomment
6e0b96c
to
e8ed38f
Compare
@@ -14,9 +14,11 @@ import { | |||
requiresQuoting, | |||
} from '../util'; | |||
|
|||
const DEFAULT_COMMENT_PATTERN = /^no default$/iu; |
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.
If there's a default value, please specify it in defaultOptions
.
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.
�In order to put a default value in defaultOptions, the defaultCaseCommentPattern option must be able to receive a flag. Therefore, this option should be in the form of an array, with an expression at the first index and a flag at the second index.
defaultCaseCommentPattern:["no default", "iu"]
Previously, the default value was treated as a separate variable because of equivalence with eslint rules. Would there be any problem with implementing it like this?
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.
As much as I would love to keep things to the defaultOptions
plumbing, I don't think this is doable. I think this PR is fine as-is.
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.
LGTM, thanks for all the iteration on this! Your hard work is paying off 🔥
packages/eslint-plugin/docs/rules/switch-exhaustiveness-check.mdx
Outdated
Show resolved
Hide resolved
47f1ab3
into
typescript-eslint:main
##### [v8.18.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8180-2024-12-09) ##### 🚀 Features - **eslint-plugin:** \[switch-exhaustiveness-check] add support for "no default" comment ([#10218](typescript-eslint/typescript-eslint#10218)) - **eslint-plugin:** \[no-deprecated] report on super call of deprecated constructor ([#10397](typescript-eslint/typescript-eslint#10397)) ##### 🩹 Fixes - **eslint-plugin:** \[use-unknown-in-catch-callback-variable] only flag function literals ([#10436](typescript-eslint/typescript-eslint#10436)) - **eslint-plugin:** \[no-base-to-string] handle more robustly when multiple `toString()` declarations are present for a type ([#10432](typescript-eslint/typescript-eslint#10432)) - **eslint-plugin:** \[no-deprecated] check if a JSX attribute is deprecated ([#10374](typescript-eslint/typescript-eslint#10374)) - typescript peer dependency ([#10373](typescript-eslint/typescript-eslint#10373)) ##### ❤️ Thank You - Kim Sang Du [@developer-bandi](https://github.com/developer-bandi) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - mdm317 - rtritto 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.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.17.0 | 8.18.0 | | npm | @typescript-eslint/parser | 8.17.0 | 8.18.0 | ## [v8.18.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8180-2024-12-09) ##### 🚀 Features - **eslint-plugin:** \[switch-exhaustiveness-check] add support for "no default" comment ([#10218](typescript-eslint/typescript-eslint#10218)) - **eslint-plugin:** \[no-deprecated] report on super call of deprecated constructor ([#10397](typescript-eslint/typescript-eslint#10397)) ##### 🩹 Fixes - **eslint-plugin:** \[use-unknown-in-catch-callback-variable] only flag function literals ([#10436](typescript-eslint/typescript-eslint#10436)) - **eslint-plugin:** \[no-base-to-string] handle more robustly when multiple `toString()` declarations are present for a type ([#10432](typescript-eslint/typescript-eslint#10432)) - **eslint-plugin:** \[no-deprecated] check if a JSX attribute is deprecated ([#10374](typescript-eslint/typescript-eslint#10374)) - typescript peer dependency ([#10373](typescript-eslint/typescript-eslint#10373)) ##### ❤️ Thank You - Kim Sang Du [@developer-bandi](https://github.com/developer-bandi) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - mdm317 - rtritto 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.
| datasource | package | from | to | | ---------- | -------------------------------- | ------ | ------ | | npm | @typescript-eslint/eslint-plugin | 8.17.0 | 8.18.0 | | npm | @typescript-eslint/parser | 8.17.0 | 8.18.0 | ## [v8.18.0](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#8180-2024-12-09) ##### 🚀 Features - **eslint-plugin:** \[switch-exhaustiveness-check] add support for "no default" comment ([#10218](typescript-eslint/typescript-eslint#10218)) - **eslint-plugin:** \[no-deprecated] report on super call of deprecated constructor ([#10397](typescript-eslint/typescript-eslint#10397)) ##### 🩹 Fixes - **eslint-plugin:** \[use-unknown-in-catch-callback-variable] only flag function literals ([#10436](typescript-eslint/typescript-eslint#10436)) - **eslint-plugin:** \[no-base-to-string] handle more robustly when multiple `toString()` declarations are present for a type ([#10432](typescript-eslint/typescript-eslint#10432)) - **eslint-plugin:** \[no-deprecated] check if a JSX attribute is deprecated ([#10374](typescript-eslint/typescript-eslint#10374)) - typescript peer dependency ([#10373](typescript-eslint/typescript-eslint#10373)) ##### ❤️ Thank You - Kim Sang Du [@developer-bandi](https://github.com/developer-bandi) - Kirk Waiblinger [@kirkwaiblinger](https://github.com/kirkwaiblinger) - mdm317 - rtritto 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.
PR Checklist
Overview
similar to eslint's default-case rule, i modified to have the same effect as writing a default clause by specifying the
no default
comment. In the allowDefaultCaseForExhaustiveSwitch option, if no default is specified, an error may occur in the annotation in some cases, so it is necessary to review whether it is okay.one additional work is left The option considerDefaultExhaustiveForUnions in PR #9954 is in preparation for merging, so you will need to write a test case for that option once this PR is merged.