Skip to content

Commit

Permalink
Update: Suggest missing rule in flat config (fixes #14027)
Browse files Browse the repository at this point in the history
  • Loading branch information
nzakas committed Sep 16, 2021
1 parent a744dfa commit b4bd83a
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
26 changes: 19 additions & 7 deletions lib/config/rule-validator.js
Expand Up @@ -35,16 +35,28 @@ function findRuleDefinition(ruleId, config) {
pluginName = ruleIdParts.join("/");
}

if (!config.plugins || !config.plugins[pluginName]) {
throw new TypeError(`Key "rules": Key "${ruleId}": Could not find plugin "${pluginName}".`);
}
if (config?.plugins) {

if (!config.plugins[pluginName].rules || !config.plugins[pluginName].rules[ruleName]) {
throw new TypeError(`Key "rules": Key "${ruleId}": Could not find "${ruleName}" in plugin "${pluginName}".`);
}
// first check for exact rule match
if (config.plugins?.[pluginName]?.rules?.[ruleName]) {
return config.plugins[pluginName].rules[ruleName];
}

return config.plugins[pluginName].rules[ruleName];
let errorMessage = `Key "rules": Key "${ruleId}": Could not find "${ruleName}" in plugin "${pluginName}".`;

// otherwise, let's see if we can find the rule name elsewhere
for (const [otherPluginName, plugin] of Object.entries(config.plugins)) {
if (plugin?.rules?.[ruleName]) {
errorMessage += ` Did you mean "${otherPluginName}/${ruleName}"?`;
break;
}
}

throw new TypeError(errorMessage);

}

throw new TypeError(`Key "rules": Key "${ruleId}": Could not find plugin "${pluginName}".`);
}

/**
Expand Down
32 changes: 32 additions & 0 deletions tests/lib/config/flat-config-array.js
Expand Up @@ -56,6 +56,16 @@ const baseConfig = {
}
}
}
},
test1: {
rules: {
match: {}
}
},
test2: {
rules: {
nomatch: {}
}
}
}
};
Expand Down Expand Up @@ -1278,6 +1288,28 @@ describe("FlatConfigArray", () => {
], "Key \"rules\": Key \"foo\": Expected severity of \"off\", 0, \"warn\", 1, \"error\", or 2.");
});

it("should error when rule doesn't exist", async () => {

await assertInvalidConfig([
{
rules: {
foox: [1, "bar"]
}
}
], /Key "rules": Key "foox": Could not find "foox" in plugin "@"./u);
});

it("should error and suggest alternative when rule doesn't exist", async () => {

await assertInvalidConfig([
{
rules: {
"test2/match": "error"
}
}
], /Key "rules": Key "test2\/match": Could not find "match" in plugin "test2"\. Did you mean "test1\/match"\?/u);
});

it("should error when rule options don't match schema", async () => {

await assertInvalidConfig([
Expand Down

0 comments on commit b4bd83a

Please sign in to comment.