| /** |
| * @fileoverview Flag shouldComponentUpdate when extending PureComponent |
| */ |
| |
| 'use strict'; |
| |
| const Components = require('../util/Components'); |
| const astUtil = require('../util/ast'); |
| const docsUrl = require('../util/docsUrl'); |
| |
| function errorMessage(node) { |
| return `${node} does not need shouldComponentUpdate when extending React.PureComponent.`; |
| } |
| |
| // ------------------------------------------------------------------------------ |
| // Rule Definition |
| // ------------------------------------------------------------------------------ |
| |
| module.exports = { |
| meta: { |
| docs: { |
| description: 'Flag shouldComponentUpdate when extending PureComponent', |
| category: 'Possible Errors', |
| recommended: false, |
| url: docsUrl('no-redundant-should-component-update') |
| }, |
| 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, |
| message: errorMessage(className) |
| }); |
| } |
| } |
| } |
| |
| return { |
| ClassDeclaration: checkForViolation, |
| ClassExpression: checkForViolation |
| }; |
| }) |
| }; |