Skip to content

Commit c3d85ab

Browse files
authored
Fix: Avoid crash when provided suggestions array has non-object (#216)
1 parent 36fdd85 commit c3d85ab

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

lib/utils.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -467,14 +467,17 @@ module.exports = {
467467
// Suggestion messages
468468
...((reportInfo.suggest && reportInfo.suggest.elements) || [])
469469
.map(suggestObjNode => {
470+
if (suggestObjNode.type !== 'ObjectExpression') {
471+
// Ignore non-objects (like variables or function calls).
472+
return null;
473+
}
470474
return {
471475
messageId: findObjectPropertyValueByKeyName(suggestObjNode, 'messageId'),
472476
message: findObjectPropertyValueByKeyName(suggestObjNode, 'desc'), // Note: suggestion message named `desc`
473477
data: findObjectPropertyValueByKeyName(suggestObjNode, 'data'),
474478
fix: findObjectPropertyValueByKeyName(suggestObjNode, 'fix'),
475479
};
476-
}
477-
),
480+
}).filter(item => item !== null),
478481
];
479482
},
480483

tests/lib/utils.js

+63
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ describe('utils', () => {
626626
describe('collectReportViolationAndSuggestionData', () => {
627627
const CASES = [
628628
{
629+
// One suggestion.
629630
code: `
630631
context.report({
631632
node: {},
@@ -656,6 +657,68 @@ describe('utils', () => {
656657
},
657658
],
658659
},
660+
{
661+
// Suggestions using an array variable.
662+
code: `
663+
context.report({
664+
node: {},
665+
message: "message1",
666+
messageId: "messageId1",
667+
data: { foo: 'hello' },
668+
fix(fixer) {},
669+
suggest: SUGGESTIONS
670+
});
671+
`,
672+
shouldMatch: [
673+
{
674+
message: { type: 'Literal', value: 'message1' },
675+
messageId: { type: 'Literal', value: 'messageId1' },
676+
data: { type: 'ObjectExpression', properties: [{ key: { name: 'foo' } }] },
677+
fix: { type: 'FunctionExpression' },
678+
},
679+
],
680+
},
681+
{
682+
// Suggestions using array item variables.
683+
code: `
684+
context.report({
685+
node: {},
686+
message: "message1",
687+
messageId: "messageId1",
688+
data: { foo: 'hello' },
689+
fix(fixer) {},
690+
suggest: [ SUGGEST_1, SUGGEST_2 ]
691+
});
692+
`,
693+
shouldMatch: [
694+
{
695+
message: { type: 'Literal', value: 'message1' },
696+
messageId: { type: 'Literal', value: 'messageId1' },
697+
data: { type: 'ObjectExpression', properties: [{ key: { name: 'foo' } }] },
698+
fix: { type: 'FunctionExpression' },
699+
},
700+
],
701+
},
702+
{
703+
// No suggestions.
704+
code: `
705+
context.report({
706+
node: {},
707+
message: "message1",
708+
messageId: "messageId1",
709+
data: { foo: 'hello' },
710+
fix(fixer) {},
711+
});
712+
`,
713+
shouldMatch: [
714+
{
715+
message: { type: 'Literal', value: 'message1' },
716+
messageId: { type: 'Literal', value: 'messageId1' },
717+
data: { type: 'ObjectExpression', properties: [{ key: { name: 'foo' } }] },
718+
fix: { type: 'FunctionExpression' },
719+
},
720+
],
721+
},
659722
];
660723

661724
it('behaves correctly', () => {

0 commit comments

Comments
 (0)