Skip to content

Commit 740b208

Browse files
authored
fix: ignore messages without a ruleId in getRulesMetaForResults (#16409)
* fix: ignore messages without a `ruleId` in `getRulesMetaForResults` * `FlatESLint.prototype.getRulesMetaForResults` will now ignore messages without a `ruleId` instead of crashing with a `TypeError`. * Unit tests for `getRulesMetaForResults` added for both `FlatESLint` and `ESLint`. * The unit test "should return one rule meta when there is a suppressed linting error" was ported to `FlatESLint`. This was originally introduced for `ESLint` in #15459. Fixes #16402 * Update unit tests as suggested * Explicitly ignore a file path in a unit test for `getRulesMetaForResults`
1 parent 8f9759e commit 740b208

3 files changed

Lines changed: 114 additions & 0 deletions

File tree

lib/eslint/flat-eslint.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,10 @@ class FlatESLint {
688688
const allMessages = result.messages.concat(result.suppressedMessages);
689689

690690
for (const { ruleId } of allMessages) {
691+
if (!ruleId) {
692+
continue;
693+
}
694+
691695
const rule = getRuleFromConfig(ruleId, config);
692696

693697
// ensure the rule exists

tests/lib/eslint/eslint.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4987,6 +4987,7 @@ describe("ESLint", () => {
49874987
const results = await engine.lintText("a");
49884988
const rulesMeta = engine.getRulesMetaForResults(results);
49894989

4990+
assert.strictEqual(Object.keys(rulesMeta).length, 1);
49904991
assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta);
49914992
});
49924993

@@ -5003,6 +5004,7 @@ describe("ESLint", () => {
50035004
const results = await engine.lintText("a // eslint-disable-line semi");
50045005
const rulesMeta = engine.getRulesMetaForResults(results);
50055006

5007+
assert.strictEqual(Object.keys(rulesMeta).length, 1);
50065008
assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta);
50075009
});
50085010

@@ -5051,6 +5053,51 @@ describe("ESLint", () => {
50515053
nodePlugin.rules["no-new-require"].meta
50525054
);
50535055
});
5056+
5057+
it("should ignore messages not related to a rule", async () => {
5058+
const engine = new ESLint({
5059+
useEslintrc: false,
5060+
overrideConfig: {
5061+
ignorePatterns: "ignored.js",
5062+
rules: {
5063+
"no-var": "warn"
5064+
}
5065+
},
5066+
reportUnusedDisableDirectives: "warn"
5067+
});
5068+
5069+
{
5070+
const results = await engine.lintText("syntax error");
5071+
const rulesMeta = engine.getRulesMetaForResults(results);
5072+
5073+
assert.deepStrictEqual(rulesMeta, {});
5074+
}
5075+
{
5076+
const results = await engine.lintText("// eslint-disable-line no-var");
5077+
const rulesMeta = engine.getRulesMetaForResults(results);
5078+
5079+
assert.deepStrictEqual(rulesMeta, {});
5080+
}
5081+
{
5082+
const results = await engine.lintText("", { filePath: "ignored.js", warnIgnored: true });
5083+
const rulesMeta = engine.getRulesMetaForResults(results);
5084+
5085+
assert.deepStrictEqual(rulesMeta, {});
5086+
}
5087+
});
5088+
5089+
it("should return a non-empty value if some of the messages are related to a rule", async () => {
5090+
const engine = new ESLint({
5091+
useEslintrc: false,
5092+
overrideConfig: { rules: { "no-var": "warn" } },
5093+
reportUnusedDisableDirectives: "warn"
5094+
});
5095+
5096+
const results = await engine.lintText("// eslint-disable-line no-var\nvar foo;");
5097+
const rulesMeta = engine.getRulesMetaForResults(results);
5098+
5099+
assert.deepStrictEqual(rulesMeta, { "no-var": coreRules.get("no-var").meta });
5100+
});
50545101
});
50555102

50565103
describe("outputFixes()", () => {

tests/lib/eslint/flat-eslint.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3770,6 +3770,24 @@ describe("FlatESLint", () => {
37703770
const results = await engine.lintText("a", { filePath: "foo.js" });
37713771
const rulesMeta = engine.getRulesMetaForResults(results);
37723772

3773+
assert.strictEqual(Object.keys(rulesMeta).length, 1);
3774+
assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta);
3775+
});
3776+
3777+
it("should return one rule meta when there is a suppressed linting error", async () => {
3778+
const engine = new FlatESLint({
3779+
overrideConfigFile: true,
3780+
overrideConfig: {
3781+
rules: {
3782+
semi: 2
3783+
}
3784+
}
3785+
});
3786+
3787+
const results = await engine.lintText("a // eslint-disable-line semi");
3788+
const rulesMeta = engine.getRulesMetaForResults(results);
3789+
3790+
assert.strictEqual(Object.keys(rulesMeta).length, 1);
37733791
assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta);
37743792
});
37753793

@@ -3817,6 +3835,51 @@ describe("FlatESLint", () => {
38173835
nodePlugin.rules["no-new-require"].meta
38183836
);
38193837
});
3838+
3839+
it("should ignore messages not related to a rule", async () => {
3840+
const engine = new FlatESLint({
3841+
overrideConfigFile: true,
3842+
ignorePatterns: "ignored.js",
3843+
overrideConfig: {
3844+
rules: {
3845+
"no-var": "warn"
3846+
}
3847+
},
3848+
reportUnusedDisableDirectives: "warn"
3849+
});
3850+
3851+
{
3852+
const results = await engine.lintText("syntax error");
3853+
const rulesMeta = engine.getRulesMetaForResults(results);
3854+
3855+
assert.deepStrictEqual(rulesMeta, {});
3856+
}
3857+
{
3858+
const results = await engine.lintText("// eslint-disable-line no-var");
3859+
const rulesMeta = engine.getRulesMetaForResults(results);
3860+
3861+
assert.deepStrictEqual(rulesMeta, {});
3862+
}
3863+
{
3864+
const results = await engine.lintText("", { filePath: "ignored.js", warnIgnored: true });
3865+
const rulesMeta = engine.getRulesMetaForResults(results);
3866+
3867+
assert.deepStrictEqual(rulesMeta, {});
3868+
}
3869+
});
3870+
3871+
it("should return a non-empty value if some of the messages are related to a rule", async () => {
3872+
const engine = new FlatESLint({
3873+
overrideConfigFile: true,
3874+
overrideConfig: { rules: { "no-var": "warn" } },
3875+
reportUnusedDisableDirectives: "warn"
3876+
});
3877+
3878+
const results = await engine.lintText("// eslint-disable-line no-var\nvar foo;");
3879+
const rulesMeta = engine.getRulesMetaForResults(results);
3880+
3881+
assert.deepStrictEqual(rulesMeta, { "no-var": coreRules.get("no-var").meta });
3882+
});
38203883
});
38213884

38223885
describe("outputFixes()", () => {

0 commit comments

Comments
 (0)