/** * @fileoverview Enforce style prop value is an object * @author David Petersen */ 'use strict'; const variableUtil = require('../util/variable'); const docsUrl = require('../util/docsUrl'); // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: 'Enforce style prop value is an object', category: '', recommended: false, url: docsUrl('style-prop-object') }, schema: [] }, create(context) { /** * @param {ASTNode} expression An Identifier node */ function isNonNullaryLiteral(expression) { return expression.type === 'Literal' && expression.value !== null; } /** * @param {object} node A Identifier node */ function checkIdentifiers(node) { const variable = variableUtil.variablesInScope(context).find(item => item.name === node.name); if (!variable || !variable.defs[0] || !variable.defs[0].node.init) { return; } if (isNonNullaryLiteral(variable.defs[0].node.init)) { context.report({ node, message: 'Style prop value must be an object' }); } } return { CallExpression(node) { if ( node.callee && node.callee.type === 'MemberExpression' && node.callee.property.name === 'createElement' && node.arguments.length > 1 ) { if (node.arguments[1].type === 'ObjectExpression') { const style = node.arguments[1].properties.find(property => property.key && property.key.name === 'style' && !property.computed); if (style) { if (style.value.type === 'Identifier') { checkIdentifiers(style.value); } else if (isNonNullaryLiteral(style.value)) { context.report({ node: style.value, message: 'Style prop value must be an object' }); } } } } }, JSXAttribute(node) { if (!node.value || node.name.name !== 'style') { return; } if (node.value.type !== 'JSXExpressionContainer' || isNonNullaryLiteral(node.value.expression)) { context.report({ node, message: 'Style prop value must be an object' }); } else if (node.value.expression.type === 'Identifier') { checkIdentifiers(node.value.expression); } } }; } };