Skip to content

Commit 6ba850b

Browse files
committed
New: Add autofixer to require-meta-has-suggestions rule
1 parent 0459f12 commit 6ba850b

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Name | ✔️ | 🛠 | 💡 | Description
6565
[require-meta-docs-description](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-docs-description.md) | | | | require rules to implement a `meta.docs.description` property with the correct format
6666
[require-meta-docs-url](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-docs-url.md) | | 🛠 | | require rules to implement a `meta.docs.url` property
6767
[require-meta-fixable](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-fixable.md) | ✔️ | | | require rules to implement a `meta.fixable` property
68-
[require-meta-has-suggestions](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-has-suggestions.md) | | | | require suggestable rules to implement a `meta.hasSuggestions` property
68+
[require-meta-has-suggestions](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-has-suggestions.md) | | 🛠 | | require suggestable rules to implement a `meta.hasSuggestions` property
6969
[require-meta-schema](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-schema.md) | | 🛠 | | require rules to implement a `meta.schema` property
7070
[require-meta-type](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/require-meta-type.md) | | | | require rules to implement a `meta.type` property
7171
[test-case-property-ordering](https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/blob/master/docs/rules/test-case-property-ordering.md) | | 🛠 | | require the properties of a test case to be placed in a consistent order

docs/rules/require-meta-has-suggestions.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Require suggestable rules to implement a `meta.hasSuggestions` property (require-meta-has-suggestions)
22

3+
⚒️ The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#-fix) can automatically fix some of the problems reported by this rule.
4+
35
A suggestable ESLint rule should specify the `meta.hasSuggestions` property with a value of `true`. This makes it easier for both humans and tooling to tell whether a rule provides suggestions. [As of ESLint 8](https://eslint.org/blog/2021/06/whats-coming-in-eslint-8.0.0#rules-with-suggestions-now-require-the-metahassuggestions-property), an exception will be thrown if a suggestable rule is missing this property.
46

57
Likewise, rules that do not report suggestions should not enable the `meta.hasSuggestions` property.

lib/rules/require-meta-has-suggestions.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module.exports = {
1515
category: 'Rules',
1616
recommended: false,
1717
},
18+
fixable: 'code',
1819
schema: [],
1920
messages: {
2021
shouldBeSuggestable: 'Suggestable rules should specify a `meta.hasSuggestions` property with value `true`.',
@@ -67,7 +68,15 @@ module.exports = {
6768
context.report({ node: metaNode ? metaNode : ruleInfo.create, messageId: 'shouldBeSuggestable' });
6869
} else if (hasSuggestionsStaticValue && hasSuggestionsStaticValue.value !== true) {
6970
// Rule reports suggestions but does not have `meta.hasSuggestions` property enabled.
70-
context.report({ node: hasSuggestionsProperty.value, messageId: 'shouldBeSuggestable' });
71+
context.report({
72+
node: hasSuggestionsProperty.value,
73+
messageId: 'shouldBeSuggestable',
74+
fix (fixer) {
75+
if (hasSuggestionsProperty.value.type === 'Literal' || (hasSuggestionsProperty.value.type === 'Identifier' && hasSuggestionsProperty.value.name === 'undefined')) {
76+
return fixer.replaceText(hasSuggestionsProperty.value, 'true');
77+
}
78+
},
79+
});
7180
}
7281
} else if (!ruleReportsSuggestions && hasSuggestionsProperty && hasSuggestionsStaticValue && hasSuggestionsStaticValue.value === true) {
7382
// Rule does not report suggestions but has the `meta.hasSuggestions` property enabled.

tests/lib/rules/require-meta-has-suggestions.js

+43
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ ruleTester.run('require-meta-has-suggestions', rule, {
164164
create(context) { context.report({node, message, suggest: [{}]}); }
165165
};
166166
`,
167+
output: null,
167168
errors: [{ messageId: 'shouldBeSuggestable', type: 'FunctionExpression', line: 3, column: 17, endLine: 3, endColumn: 78 }],
168169
},
169170
{
@@ -174,6 +175,7 @@ ruleTester.run('require-meta-has-suggestions', rule, {
174175
create(context) { context.report({node, message, suggest: [{}]}); }
175176
};
176177
`,
178+
output: null,
177179
errors: [{ messageId: 'shouldBeSuggestable', type: 'ObjectExpression', line: 3, column: 17, endLine: 3, endColumn: 19 }],
178180
},
179181
{
@@ -185,6 +187,7 @@ ruleTester.run('require-meta-has-suggestions', rule, {
185187
create(context) { context.report({node, message, suggest: SUGGESTIONS}); }
186188
};
187189
`,
190+
output: null,
188191
errors: [{ messageId: 'shouldBeSuggestable', type: 'ObjectExpression', line: 4, column: 17, endLine: 4, endColumn: 19 }],
189192
},
190193
{
@@ -195,8 +198,46 @@ ruleTester.run('require-meta-has-suggestions', rule, {
195198
create(context) { context.report({node, message, suggest: [{}]}); }
196199
};
197200
`,
201+
output: `
202+
module.exports = {
203+
meta: { hasSuggestions: true },
204+
create(context) { context.report({node, message, suggest: [{}]}); }
205+
};
206+
`,
198207
errors: [{ messageId: 'shouldBeSuggestable', type: 'Literal', line: 3, column: 35, endLine: 3, endColumn: 40 }],
199208
},
209+
{
210+
// Reports suggestions, hasSuggestions property set to `null`, violation should be on `null`
211+
code: `
212+
module.exports = {
213+
meta: { hasSuggestions: null },
214+
create(context) { context.report({node, message, suggest: [{}]}); }
215+
};
216+
`,
217+
output: `
218+
module.exports = {
219+
meta: { hasSuggestions: true },
220+
create(context) { context.report({node, message, suggest: [{}]}); }
221+
};
222+
`,
223+
errors: [{ messageId: 'shouldBeSuggestable', type: 'Literal', line: 3, column: 35, endLine: 3, endColumn: 39 }],
224+
},
225+
{
226+
// Reports suggestions, hasSuggestions property set to `undefined`, violation should be on `undefined`
227+
code: `
228+
module.exports = {
229+
meta: { hasSuggestions: undefined },
230+
create(context) { context.report({node, message, suggest: [{}]}); }
231+
};
232+
`,
233+
output: `
234+
module.exports = {
235+
meta: { hasSuggestions: true },
236+
create(context) { context.report({node, message, suggest: [{}]}); }
237+
};
238+
`,
239+
errors: [{ messageId: 'shouldBeSuggestable', type: 'Identifier', line: 3, column: 35, endLine: 3, endColumn: 44 }],
240+
},
200241
{
201242
// Reports suggestions, hasSuggestions property set to false (as variable), violation should be on variable
202243
code: `
@@ -206,6 +247,7 @@ ruleTester.run('require-meta-has-suggestions', rule, {
206247
create(context) { context.report({node, message, suggest: [{}]}); }
207248
};
208249
`,
250+
output: null,
209251
errors: [{ messageId: 'shouldBeSuggestable', type: 'Identifier', line: 4, column: 19, endLine: 4, endColumn: 33 }],
210252
},
211253
{
@@ -216,6 +258,7 @@ ruleTester.run('require-meta-has-suggestions', rule, {
216258
create(context) { context.report({node, message}); }
217259
};
218260
`,
261+
output: null,
219262
errors: [{ messageId: 'shouldNotBeSuggestable', type: 'Literal', line: 3, column: 35, endLine: 3, endColumn: 39 }],
220263
},
221264
],

0 commit comments

Comments
 (0)