diff --git a/lib/utils.js b/lib/utils.js index 77779e7c..edc31c43 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -467,14 +467,17 @@ module.exports = { // Suggestion messages ...((reportInfo.suggest && reportInfo.suggest.elements) || []) .map(suggestObjNode => { + if (suggestObjNode.type !== 'ObjectExpression') { + // Ignore non-objects (like variables or function calls). + return null; + } return { messageId: findObjectPropertyValueByKeyName(suggestObjNode, 'messageId'), message: findObjectPropertyValueByKeyName(suggestObjNode, 'desc'), // Note: suggestion message named `desc` data: findObjectPropertyValueByKeyName(suggestObjNode, 'data'), fix: findObjectPropertyValueByKeyName(suggestObjNode, 'fix'), }; - } - ), + }).filter(item => item !== null), ]; }, diff --git a/tests/lib/utils.js b/tests/lib/utils.js index e4d9240e..2bc3b5cf 100644 --- a/tests/lib/utils.js +++ b/tests/lib/utils.js @@ -626,6 +626,7 @@ describe('utils', () => { describe('collectReportViolationAndSuggestionData', () => { const CASES = [ { + // One suggestion. code: ` context.report({ node: {}, @@ -656,6 +657,68 @@ describe('utils', () => { }, ], }, + { + // Suggestions using an array variable. + code: ` + context.report({ + node: {}, + message: "message1", + messageId: "messageId1", + data: { foo: 'hello' }, + fix(fixer) {}, + suggest: SUGGESTIONS + }); + `, + shouldMatch: [ + { + message: { type: 'Literal', value: 'message1' }, + messageId: { type: 'Literal', value: 'messageId1' }, + data: { type: 'ObjectExpression', properties: [{ key: { name: 'foo' } }] }, + fix: { type: 'FunctionExpression' }, + }, + ], + }, + { + // Suggestions using array item variables. + code: ` + context.report({ + node: {}, + message: "message1", + messageId: "messageId1", + data: { foo: 'hello' }, + fix(fixer) {}, + suggest: [ SUGGEST_1, SUGGEST_2 ] + }); + `, + shouldMatch: [ + { + message: { type: 'Literal', value: 'message1' }, + messageId: { type: 'Literal', value: 'messageId1' }, + data: { type: 'ObjectExpression', properties: [{ key: { name: 'foo' } }] }, + fix: { type: 'FunctionExpression' }, + }, + ], + }, + { + // No suggestions. + code: ` + context.report({ + node: {}, + message: "message1", + messageId: "messageId1", + data: { foo: 'hello' }, + fix(fixer) {}, + }); + `, + shouldMatch: [ + { + message: { type: 'Literal', value: 'message1' }, + messageId: { type: 'Literal', value: 'messageId1' }, + data: { type: 'ObjectExpression', properties: [{ key: { name: 'foo' } }] }, + fix: { type: 'FunctionExpression' }, + }, + ], + }, ]; it('behaves correctly', () => {