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
Change Request: Correct and unify LintMessage
type
#16968
Comments
I recall from a previous discussion that changes in JSDoc should not be treated as breaking, so there should be no problem in redeclaring |
Thanks for flagging this! I think updating the type definition so it reflects reality is the right way to go. Because we don't export types, this is non-breaking. To answer your questions:
I think this is okay because it appears we normalize
I also think this option is preferable to limit the amount of changes we are introducing into the codebase. I agree that if we were doing type checking from the start, we'd probably want the other option, but since we aren't, I'll favor the less invasive change. @mdjermanovic what do you think? |
`LintMessage.nodeType` is currently defined as required but nullable. Actual implementation explicitly sets it to `null` in a couple places and omits it in several. After discussion in eslint#16968, we initially leaned toward making it non-nullable but optional. I pursued that, but it resulted in slightly more runtime code changes, including some branching to set it conditionally. Instead, I'm presenting the opposite solution of updating the remaining implementations to match the existing type definition by explicitly setting `nodeType` to `null`.
`LintMessage.nodeType` is currently defined as required but nullable. Actual implementations explicitly set it to `null` in a couple places and omit it in several. After discussion in eslint#16968, we initially leaned toward making it non-nullable but optional. I pursued that, but it resulted in slightly more runtime code changes, including some branching in `report-translator` to set it conditionally. Instead, I'm presenting the opposite solution of updating the remaining implementations to match the existing type definition by explicitly setting `nodeType` to `null`.
`LintMessage.nodeType` is currently defined as required but nullable. Actual implementations explicitly set it to `null` in a couple places and omit it in several. After discussion in eslint#16968, we initially leaned toward making it non-nullable but optional. I pursued that, but it resulted in slightly more runtime code changes, including some branching in `report-translator` to set it conditionally. Instead, I'm presenting the opposite solution of updating the remaining implementations to match the existing type definition by explicitly setting `nodeType` to `null`.
`LintMessage.nodeType` is currently defined as required but nullable. Actual implementations explicitly set it to `null` in a couple places and omit it in several. After discussion in eslint#16968, we initially leaned toward making it non-nullable but optional. I pursued that, but it resulted in slightly more runtime code changes, including some branching in `report-translator` to set it conditionally. Instead, I'm presenting the opposite solution of updating the remaining implementations to match the existing type definition by explicitly setting `nodeType` to `null`.
`LintMessage.nodeType` is currently defined as required but nullable. Actual implementations explicitly set it to `null` in a couple places and omit it in several. After discussion in eslint#16968, we initially leaned toward making it non-nullable but optional. I pursued that, but it resulted in slightly more runtime code changes, including some branching in `report-translator` to set it conditionally. Instead, I'm presenting the opposite solution of updating the remaining implementations to match the existing type definition by explicitly setting `nodeType` to `null`.
* Update LintMessage type to reflect implementation I made three changes to `LintMessage` and `SuppressedLintMessage` 1. Many places that create `LintMessage`s don't set `fatal`, so I made it optional. This would be a breaking change if we made types part of our exports, but in this case I believe it's updating JSDoc documentation to reflect reality. 2. Added an optional `messageId` property that's set by reports from rules. 3. Added an optional, nullable `nodeType` property. - Reports from rules set it to a value. - `applyDirectives()` explicitly sets it to `null` for unused disable directives. - `Linter`'s `createLintingProblem()` explicitly sets it to `null`. * Add missing LintResult type import * Use LintMessage type All of these previously referenced a `Problem` type that does not have a definition. * Replace ReportInfo type with LintMessage type `ReportInfo` was defined within `report-translator.js` to be very similar to `LintMessage`. It had one extra property, `source`, which wasn't ever set, so it would've been removed anyway. In `Linter.runRules()`, the return value from `reportTranslator()` gets pushed into a `lintingProblems` array and returned, and the return type annotation is `LintMessage[]`, which gives me confidence that `ReportInfo` was intended to be the same type as `LintMessage` elsewhere. * Make ruleId required but nullable Originally, we talked about the reverse - making `ruleId` optional but non-nullable and relying on `report-translator.js`'s `createProblem()` to normalize it. However, the `LintMessage` type would differ from `createProblem()`'s return value only by `null` vs `undefined` for `ruleId`. So instead, I made `ruleId` required but nullable and explicitly set it to `null` in the few remaining places that didn't already. * Add missing null nodeTypes `LintMessage.nodeType` is currently defined as required but nullable. Actual implementations explicitly set it to `null` in a couple places and omit it in several. After discussion in #16968, we initially leaned toward making it non-nullable but optional. I pursued that, but it resulted in slightly more runtime code changes, including some branching in `report-translator` to set it conditionally. Instead, I'm presenting the opposite solution of updating the remaining implementations to match the existing type definition by explicitly setting `nodeType` to `null`. * Update LintMessage docs This updates existing documented properties to match the updated `LintMessage` type and implementations. `messageId`, `nodeType`, and `suppressions` remain undocumented.
ESLint version
v8.35.0
What problem do you want to solve?
For the processor docs update, we need to know why the
LintMessage
JSDoc typedef differs from real lint messages I captured at runtime. The short version is "because it doesn't reflect the implementation." I'll update the typedef or implementation, whichever is appropriate, to make sure they match.What do you think is the correct solution?
After examining the implementation, I'm confident in at least three changes to the
LintMessage
type:LintMessage
s don't setfatal
, so I made it optional. This would be a breaking change if we made types part of our exports, but in this case I believe it's not because it's updating JSDoc documentation to reflect the reality of the implementation.messageId
property that's set by reports from rules.nodeType
property.applyDirectives()
explicitly sets it tonull
for unused disable directives.Linter
'screateLintingProblem()
explicitly sets it tonull
.In addition, there are a couple types we can unify:
Problem
type that really meansLintMessage
, and I'll update those.ReportInfo
type duplicatesLintMessage
, and I'll update that to referenceLintMessage
instead.Participation
Additional comments
I have two open questions:
Should I make
nodeType
non-nullable and update the places in the implementation that explicitly set it tonull
to omit it instead? A few places already omit it for e.g. parse errors or ignored file messages, so API consumers already have to check that it might not be set.line
andcolumn
are currently required but possiblyundefined
.line
andcolumn
.Linter
explicitly sets them to0
for two configuration errors (configured parser not found and no configuration found for file).Linter
'screateLintingProblem()
has aDEFAULT_ERROR_LOC
that defaults to line 1 column 0, but the default is only used for missing rule definition messages.Should I either:
line
andcolumn
required but possiblyundefined
and update ignored file messages to explicitly set them to0
, following precedent elsewhere?line
andcolumn
optional and remove fallback 0/0 or 1/0 values from configuration issues?The second option is how I'd design the API from scratch because I wouldn't report a location unless we had a real location. But it might be a breaking change. Even though the type is specified as possibly
undefined
, in practice, some API consumers might only see messages that have real or fallback locations if they don't encounter ignored file messages. The second option would slightly increase the prevalence of location-less messages.The text was updated successfully, but these errors were encountered: