diff --git a/lib/rules/require-meta-schema.js b/lib/rules/require-meta-schema.js index 01510520..f46b0392 100644 --- a/lib/rules/require-meta-schema.js +++ b/lib/rules/require-meta-schema.js @@ -1,5 +1,6 @@ 'use strict'; +const { findVariable } = require('eslint-utils'); const utils = require('../utils'); // ------------------------------------------------------------------------------ @@ -34,7 +35,8 @@ module.exports = { create (context) { const sourceCode = context.getSourceCode(); - const info = utils.getRuleInfo(sourceCode.ast, sourceCode.scopeManager); + const { ast, scopeManager } = sourceCode; + const info = utils.getRuleInfo(ast, scopeManager); return { Program () { @@ -56,8 +58,33 @@ module.exports = { return utils.insertProperty(fixer, metaNode, 'schema: []', sourceCode); }, }); - } else if (!['ArrayExpression', 'ObjectExpression'].includes(schemaNode.value.type)) { - context.report({ node: schemaNode.value, messageId: 'wrongType' }); + return; + } + + let { value } = schemaNode; + if (value.type === 'Identifier') { + const variable = findVariable( + scopeManager.acquire(value) || scopeManager.globalScope, + value + ); + + // If we can't find the declarator, we have to assume it's in correct type + if ( + !variable || + !variable.defs || + !variable.defs[0] || + !variable.defs[0].node || + variable.defs[0].node.type !== 'VariableDeclarator' || + !variable.defs[0].node.init + ) { + return; + } + + value = variable.defs[0].node.init; + } + + if (!['ArrayExpression', 'ObjectExpression'].includes(value.type)) { + context.report({ node: value, messageId: 'wrongType' }); } }, }; diff --git a/package.json b/package.json index 4eb7dda3..a95bb19f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "url": "https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin/issues" }, "homepage": "https://github.com/not-an-aardvark/eslint-plugin-eslint-plugin#readme", - "dependencies": {}, + "dependencies": { + "eslint-utils": "^2.1.0" + }, "devDependencies": { "@not-an-aardvark/node-release-script": "^0.1.0", "chai": "^4.1.0", diff --git a/tests/lib/rules/require-meta-schema.js b/tests/lib/rules/require-meta-schema.js index db79efba..25621162 100644 --- a/tests/lib/rules/require-meta-schema.js +++ b/tests/lib/rules/require-meta-schema.js @@ -32,6 +32,36 @@ ruleTester.run('require-meta-schema', rule, { create(context) {} }; `, + ` + const schema = []; + module.exports = { + meta: { schema }, + create(context) {} + }; + `, + ` + const foo = {}; + module.exports = { + meta: { schema: foo }, + create(context) {} + }; + `, + ` + let schema; + schema = foo ? [] : {}; + module.exports = { + meta: { schema }, + create(context) {} + }; + `, + ` + const schema = [], + created = (context) => {}; + module.exports = { + meta: { schema }, + create + }; + `, ], invalid: [ @@ -78,5 +108,16 @@ schema: [] }, output: null, errors: [{ messageId: 'wrongType', type: 'Literal' }], }, + { + code: ` + const schema = null; + module.exports = { + meta: { schema }, + create(context) {} + }; + `, + output: null, + errors: [{ messageId: 'wrongType', type: 'Literal' }], + }, ], });