/** * @fileoverview Flag shouldComponentUpdate when extending PureComponent */ 'use strict'; const Components = require('../util/Components'); const astUtil = require('../util/ast'); const docsUrl = require('../util/docsUrl'); // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: 'Flag shouldComponentUpdate when extending PureComponent', category: 'Possible Errors', recommended: false, url: docsUrl('no-redundant-should-component-update') }, messages: { noShouldCompUpdate: '{{component}} does not need shouldComponentUpdate when extending React.PureComponent.' }, schema: [] }, create: Components.detect((context, components, utils) => { /** * Checks for shouldComponentUpdate property * @param {ASTNode} node The AST node being checked. * @returns {Boolean} Whether or not the property exists. */ function hasShouldComponentUpdate(node) { const properties = astUtil.getComponentProperties(node); return properties.some((property) => { const name = astUtil.getPropertyName(property); return name === 'shouldComponentUpdate'; }); } /** * Get name of node if available * @param {ASTNode} node The AST node being checked. * @return {String} The name of the node */ function getNodeName(node) { if (node.id) { return node.id.name; } if (node.parent && node.parent.id) { return node.parent.id.name; } return ''; } /** * Checks for violation of rule * @param {ASTNode} node The AST node being checked. */ function checkForViolation(node) { if (utils.isPureComponent(node)) { const hasScu = hasShouldComponentUpdate(node); if (hasScu) { const className = getNodeName(node); context.report({ node, messageId: 'noShouldCompUpdate', data: { component: className } }); } } } return { ClassDeclaration: checkForViolation, ClassExpression: checkForViolation }; }) };