Skip to content

Commit 971aa26

Browse files
committed
require-meta-docs-suggestion: improve reporting location and improve handling of empty suggest array
1 parent 2913ed8 commit 971aa26

File tree

2 files changed

+55
-16
lines changed

2 files changed

+55
-16
lines changed

lib/rules/require-meta-docs-suggestion.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,17 @@ module.exports = {
3939
node.callee.property.name === 'report' &&
4040
(node.arguments.length > 4 || (
4141
node.arguments.length === 1 &&
42-
node.arguments[0].type === 'ObjectExpression' &&
43-
node.arguments[0].properties.some(prop => utils.getKeyName(prop) === 'suggest')
42+
node.arguments[0].type === 'ObjectExpression'
4443
))
4544
) {
46-
ruleReportsSuggestions = true;
45+
const suggestProp = node.arguments[0].properties.find(prop => utils.getKeyName(prop) === 'suggest');
46+
if (suggestProp && (suggestProp.value.type !== 'ArrayExpression' || (suggestProp.value.type === 'ArrayExpression' && suggestProp.value.elements.length > 0))) {
47+
// These are all considered reporting suggestions:
48+
// suggest: [{...}]
49+
// suggest: getSuggestions()
50+
// suggest: MY_SUGGESTIONS
51+
ruleReportsSuggestions = true;
52+
}
4753
}
4854
},
4955
'Program:exit' () {
@@ -58,7 +64,7 @@ module.exports = {
5864
if (ruleReportsSuggestions) {
5965
if (!suggestionProperty) {
6066
// Rule reports suggestions but is missing the `meta.docs.suggestion` property altogether.
61-
context.report({ node: ruleInfo.create, messageId: 'shouldBeSuggestable' });
67+
context.report({ node: docsNode ? docsNode.value : ruleInfo.meta ? ruleInfo.meta : ruleInfo.create, messageId: 'shouldBeSuggestable' });
6268
} else if (suggestionPropertyValue !== true) {
6369
// Rule reports suggestions but does not have `meta.docs.suggestion` property enabled.
6470
context.report({ node: suggestionProperty.value, messageId: 'shouldBeSuggestable' });

tests/lib/rules/require-meta-docs-suggestion.js

+45-12
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 6 } });
1515
ruleTester.run('require-meta-docs-suggestion', rule, {
1616
valid: [
1717
'module.exports = context => {};',
18+
// No suggestions reported, no violations reported, no meta object.
19+
`
20+
module.exports = {
21+
create(context) {}
22+
};
23+
`,
1824
// No suggestions reported, no violations reported, no docs object.
1925
`
2026
module.exports = {
@@ -49,6 +55,15 @@ ruleTester.run('require-meta-docs-suggestion', rule, {
4955
}
5056
};
5157
`,
58+
// No suggestions reported (empty suggest array), no suggestion property.
59+
`
60+
module.exports = {
61+
meta: { docs: {} },
62+
create(context) {
63+
context.report({node, message, suggest:[]});
64+
}
65+
};
66+
`,
5267
// No suggestions reported, suggestion property set to false.
5368
`
5469
module.exports = {
@@ -63,7 +78,16 @@ ruleTester.run('require-meta-docs-suggestion', rule, {
6378
module.exports = {
6479
meta: { docs: { suggestion: true } },
6580
create(context) {
66-
context.report({node, message, suggest: []});
81+
context.report({node, message, suggest: [{}]});
82+
}
83+
};
84+
`,
85+
// Provides *dynamic* suggestions, has suggestion property.
86+
`
87+
module.exports = {
88+
meta: { docs: { suggestion: true } },
89+
create(context) {
90+
context.report({node, message, suggest: getSuggestions()});
6791
}
6892
};
6993
`,
@@ -85,44 +109,53 @@ ruleTester.run('require-meta-docs-suggestion', rule, {
85109

86110
invalid: [
87111
{
88-
// Reports suggestions, no suggestion property, no docs object.
112+
// Reports suggestions, no meta object, violation should be on create function.
113+
code: `
114+
module.exports = {
115+
create(context) { context.report({node, message, suggest: [{}]}); }
116+
};
117+
`,
118+
errors: [{ messageId: 'shouldBeSuggestable', type: 'FunctionExpression', line: 3, column: 17, endLine: 3, endColumn: 78 }],
119+
},
120+
{
121+
// Reports suggestions, no docs object, violation should be on meta object.
89122
code: `
90123
module.exports = {
91124
meta: {},
92-
create(context) { context.report({node, message, suggest: []}); }
125+
create(context) { context.report({node, message, suggest: [{}]}); }
93126
};
94127
`,
95-
errors: [{ messageId: 'shouldBeSuggestable', type: 'FunctionExpression' }],
128+
errors: [{ messageId: 'shouldBeSuggestable', type: 'ObjectExpression', line: 3, column: 17, endLine: 3, endColumn: 19 }],
96129
},
97130
{
98-
// Reports suggestions, no suggestion property, with docs object.
131+
// Reports suggestions, no suggestion property, violation should be on docs object
99132
code: `
100133
module.exports = {
101134
meta: { docs: {} },
102-
create(context) { context.report({node, loc, message, data, suggest: []}); }
135+
create(context) { context.report({node, loc, message, data, suggest: [{}]}); }
103136
};
104137
`,
105-
errors: [{ messageId: 'shouldBeSuggestable', type: 'FunctionExpression' }],
138+
errors: [{ messageId: 'shouldBeSuggestable', type: 'ObjectExpression', line: 3, column: 25, endLine: 3, endColumn: 27 }],
106139
},
107140
{
108-
// Reports suggestions, suggestion property set to false.
141+
// Reports suggestions, suggestion property set to false, violation should be on `false`
109142
code: `
110143
module.exports = {
111144
meta: { docs: { suggestion: false } },
112-
create(context) { context.report({node, message, suggest: []}); }
145+
create(context) { context.report({node, message, suggest: [{}]}); }
113146
};
114147
`,
115-
errors: [{ messageId: 'shouldBeSuggestable', type: 'Literal' }],
148+
errors: [{ messageId: 'shouldBeSuggestable', type: 'Literal', line: 3, column: 39, endLine: 3, endColumn: 44 }],
116149
},
117150
{
118-
// Does not report suggestions, suggestion property set to true.
151+
// Does not report suggestions, suggestion property set to true, violation should be on `true`
119152
code: `
120153
module.exports = {
121154
meta: { docs: { suggestion: true } },
122155
create(context) { context.report({node, message}); }
123156
};
124157
`,
125-
errors: [{ messageId: 'shouldNotBeSuggestable', type: 'Literal' }],
158+
errors: [{ messageId: 'shouldNotBeSuggestable', type: 'Literal', line: 3, column: 39, endLine: 3, endColumn: 43 }],
126159
},
127160
],
128161
});

0 commit comments

Comments
 (0)