diff --git a/lib/eslint/flat-eslint.js b/lib/eslint/flat-eslint.js index d5911853172..479d5f14f2c 100644 --- a/lib/eslint/flat-eslint.js +++ b/lib/eslint/flat-eslint.js @@ -688,6 +688,10 @@ class FlatESLint { const allMessages = result.messages.concat(result.suppressedMessages); for (const { ruleId } of allMessages) { + if (!ruleId) { + continue; + } + const rule = getRuleFromConfig(ruleId, config); // ensure the rule exists diff --git a/tests/lib/eslint/eslint.js b/tests/lib/eslint/eslint.js index 9a3ee9b2538..112f0c85ae8 100644 --- a/tests/lib/eslint/eslint.js +++ b/tests/lib/eslint/eslint.js @@ -4987,6 +4987,7 @@ describe("ESLint", () => { const results = await engine.lintText("a"); const rulesMeta = engine.getRulesMetaForResults(results); + assert.strictEqual(Object.keys(rulesMeta).length, 1); assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta); }); @@ -5003,6 +5004,7 @@ describe("ESLint", () => { const results = await engine.lintText("a // eslint-disable-line semi"); const rulesMeta = engine.getRulesMetaForResults(results); + assert.strictEqual(Object.keys(rulesMeta).length, 1); assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta); }); @@ -5051,6 +5053,51 @@ describe("ESLint", () => { nodePlugin.rules["no-new-require"].meta ); }); + + it("should ignore messages not related to a rule", async () => { + const engine = new ESLint({ + useEslintrc: false, + overrideConfig: { + ignorePatterns: "ignored.js", + rules: { + "no-var": "warn" + } + }, + reportUnusedDisableDirectives: "warn" + }); + + { + const results = await engine.lintText("syntax error"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, {}); + } + { + const results = await engine.lintText("// eslint-disable-line no-var"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, {}); + } + { + const results = await engine.lintText("", { filePath: "ignored.js", warnIgnored: true }); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, {}); + } + }); + + it("should return a non-empty value if some of the messages are related to a rule", async () => { + const engine = new ESLint({ + useEslintrc: false, + overrideConfig: { rules: { "no-var": "warn" } }, + reportUnusedDisableDirectives: "warn" + }); + + const results = await engine.lintText("// eslint-disable-line no-var\nvar foo;"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, { "no-var": coreRules.get("no-var").meta }); + }); }); describe("outputFixes()", () => { diff --git a/tests/lib/eslint/flat-eslint.js b/tests/lib/eslint/flat-eslint.js index be2a5d617ce..9e2b694f9c8 100644 --- a/tests/lib/eslint/flat-eslint.js +++ b/tests/lib/eslint/flat-eslint.js @@ -3770,6 +3770,24 @@ describe("FlatESLint", () => { const results = await engine.lintText("a", { filePath: "foo.js" }); const rulesMeta = engine.getRulesMetaForResults(results); + assert.strictEqual(Object.keys(rulesMeta).length, 1); + assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta); + }); + + it("should return one rule meta when there is a suppressed linting error", async () => { + const engine = new FlatESLint({ + overrideConfigFile: true, + overrideConfig: { + rules: { + semi: 2 + } + } + }); + + const results = await engine.lintText("a // eslint-disable-line semi"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.strictEqual(Object.keys(rulesMeta).length, 1); assert.strictEqual(rulesMeta.semi, coreRules.get("semi").meta); }); @@ -3817,6 +3835,51 @@ describe("FlatESLint", () => { nodePlugin.rules["no-new-require"].meta ); }); + + it("should ignore messages not related to a rule", async () => { + const engine = new FlatESLint({ + overrideConfigFile: true, + ignorePatterns: "ignored.js", + overrideConfig: { + rules: { + "no-var": "warn" + } + }, + reportUnusedDisableDirectives: "warn" + }); + + { + const results = await engine.lintText("syntax error"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, {}); + } + { + const results = await engine.lintText("// eslint-disable-line no-var"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, {}); + } + { + const results = await engine.lintText("", { filePath: "ignored.js", warnIgnored: true }); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, {}); + } + }); + + it("should return a non-empty value if some of the messages are related to a rule", async () => { + const engine = new FlatESLint({ + overrideConfigFile: true, + overrideConfig: { rules: { "no-var": "warn" } }, + reportUnusedDisableDirectives: "warn" + }); + + const results = await engine.lintText("// eslint-disable-line no-var\nvar foo;"); + const rulesMeta = engine.getRulesMetaForResults(results); + + assert.deepStrictEqual(rulesMeta, { "no-var": coreRules.get("no-var").meta }); + }); }); describe("outputFixes()", () => {