Blame view
node_modules/eslint-plugin-react/lib/rules/jsx-key.js
1.92 KB
c39994410
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
/** * @fileoverview Report missing `key` props in iterators/collection literals. * @author Ben Mosher */ 'use strict'; // var Components = require('../util/Components'); // ------------------------------------------------------------------------------ // Rule Definition // ------------------------------------------------------------------------------ module.exports = function(context) { function hasKeyProp(node) { return node.openingElement.attributes.some(function(decl) { if (decl.type === 'JSXSpreadAttribute') { return false; } return (decl.name.name === 'key'); }); } function checkIteratorElement(node) { if (node.type === 'JSXElement' && !hasKeyProp(node)) { context.report(node, 'Missing "key" prop for element in iterator'); } } function getReturnStatement(body) { return body.filter(function(item) { return item.type === 'ReturnStatement'; })[0]; } return { JSXElement: function(node) { if (hasKeyProp(node)) { return; } if (node.parent.type === 'ArrayExpression') { context.report(node, 'Missing "key" prop for element in array'); } }, // Array.prototype.map CallExpression: function (node) { if (node.callee && node.callee.property && node.callee.property.name !== 'map') { return; } var fn = node.arguments[0]; var isFn = fn && fn.type === 'FunctionExpression'; var isArrFn = fn && fn.type === 'ArrowFunctionExpression'; if (isArrFn && fn.body.type === 'JSXElement') { checkIteratorElement(fn.body); } if (isFn || isArrFn) { if (fn.body.type === 'BlockStatement') { var returnStatement = getReturnStatement(fn.body.body); if (returnStatement && returnStatement.argument) { checkIteratorElement(returnStatement.argument); } } } } }; }; module.exports.schema = []; |