diff --git a/lib/rules/require-meta-type.js b/lib/rules/require-meta-type.js index aa2f4860..d0c5a3f8 100644 --- a/lib/rules/require-meta-type.js +++ b/lib/rules/require-meta-type.js @@ -5,6 +5,7 @@ 'use strict'; +const { getStaticValue } = require('eslint-utils'); const utils = require('../utils'); const VALID_TYPES = new Set(['problem', 'suggestion', 'layout']); @@ -52,10 +53,19 @@ module.exports = { metaNode.properties && metaNode.properties.find(p => p.type === 'Property' && utils.getKeyName(p) === 'type'); - if (typeNode && typeNode.value.type === 'Literal' && !VALID_TYPES.has(typeNode.value.value)) { - context.report({ node: metaNode, messageId: 'unexpected' }); - } else if (!typeNode) { + if (!typeNode) { context.report({ node: metaNode, messageId: 'missing' }); + return; + } + + const staticValue = getStaticValue(typeNode.value, context.getScope()); + if (!staticValue) { + // Ignore non-static values since we can't determine what they look like. + return; + } + + if (!VALID_TYPES.has(staticValue.value)) { + context.report({ node: typeNode.value, messageId: 'unexpected' }); } }, }; diff --git a/tests/lib/rules/require-meta-type.js b/tests/lib/rules/require-meta-type.js index 41bd6d9f..c3fae3e4 100644 --- a/tests/lib/rules/require-meta-type.js +++ b/tests/lib/rules/require-meta-type.js @@ -37,6 +37,25 @@ ruleTester.run('require-meta-type', rule, { create(context) {} }; `, + ` + const type = 'problem'; + module.exports = { + meta: { type }, + create(context) {} + }; + `, + ` + module.exports = { + meta: { type: getType() }, + create(context) {} + }; + `, + ` + module.exports = { + meta: { type: FOO }, + create(context) {} + }; + `, `module.exports = { create(context) {} }`, @@ -60,7 +79,7 @@ ruleTester.run('require-meta-type', rule, { create(context) {} }; `, - errors: [{ messageId: 'missing' }], + errors: [{ messageId: 'missing', type: 'ObjectExpression' }], }, { code: ` @@ -70,7 +89,7 @@ ruleTester.run('require-meta-type', rule, { create, }; `, - errors: [{ messageId: 'missing' }], + errors: [{ messageId: 'missing', type: 'ObjectExpression' }], }, { code: ` @@ -80,7 +99,7 @@ ruleTester.run('require-meta-type', rule, { create, }; `, - errors: [{ messageId: 'missing' }], + errors: [{ messageId: 'missing', type: 'ObjectExpression' }], }, { code: ` @@ -90,7 +109,7 @@ ruleTester.run('require-meta-type', rule, { create, }; `, - errors: [{ messageId: 'missing' }], + errors: [{ messageId: 'missing', type: 'ObjectExpression' }], }, { code: ` @@ -99,7 +118,35 @@ ruleTester.run('require-meta-type', rule, { create(context) {} }; `, - errors: [{ messageId: 'unexpected' }], + errors: [{ messageId: 'unexpected', type: 'Literal' }], + }, + { + code: ` + const type = 'invalid-type'; + module.exports = { + meta: { type }, + create(context) {} + }; + `, + errors: [{ messageId: 'unexpected', type: 'Identifier' }], + }, + { + code: ` + module.exports = { + meta: { type: null }, + create(context) {} + }; + `, + errors: [{ messageId: 'unexpected', type: 'Literal' }], + }, + { + code: ` + module.exports = { + meta: { type: undefined }, + create(context) {} + }; + `, + errors: [{ messageId: 'unexpected', type: 'Identifier' }], }, ], });