Skip to content

Commit

Permalink
fix: ignore messages without a ruleId in getRulesMetaForResults (#…
Browse files Browse the repository at this point in the history
…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`
  • Loading branch information
fasttime committed Oct 19, 2022
1 parent 8f9759e commit 740b208
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/eslint/flat-eslint.js
Expand Up @@ -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
Expand Down
47 changes: 47 additions & 0 deletions tests/lib/eslint/eslint.js
Expand Up @@ -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);
});

Expand All @@ -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);
});

Expand Down Expand Up @@ -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()", () => {
Expand Down
63 changes: 63 additions & 0 deletions tests/lib/eslint/flat-eslint.js
Expand Up @@ -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);
});

Expand Down Expand Up @@ -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()", () => {
Expand Down

0 comments on commit 740b208

Please sign in to comment.