diff --git a/lib/util/Components.js b/lib/util/Components.js index c68aa06e2e..71e400be77 100644 --- a/lib/util/Components.js +++ b/lib/util/Components.js @@ -16,6 +16,7 @@ const propTypesUtil = require('./propTypes'); const jsxUtil = require('./jsx'); const usedPropTypesUtil = require('./usedPropTypes'); const defaultPropsUtil = require('./defaultProps'); +const isFirstLetterCapitalized = require('./isFirstLetterCapitalized'); function getId(node) { return node && node.range.join(':'); @@ -70,14 +71,6 @@ function isReturnsLogicalJSX(node, property, strict) { : (returnsLogicalJSXLeft || returnsLogicalJSXRight); } -function isFirstLetterCapitalized(word) { - if (!word) { - return false; - } - const firstLetter = word.charAt(0); - return firstLetter.toUpperCase() === firstLetter; -} - const Lists = new WeakMap(); /** diff --git a/lib/util/isFirstLetterCapitalized.js b/lib/util/isFirstLetterCapitalized.js new file mode 100644 index 0000000000..f487489b65 --- /dev/null +++ b/lib/util/isFirstLetterCapitalized.js @@ -0,0 +1,16 @@ +'use strict'; + +/** + * Check if the first letter of a string is capitalized. + * @param {String} word String to check + * @returns {Boolean} True if first letter is capitalized. + */ +function isFirstLetterCapitalized(word) { + if (!word) { + return false; + } + const firstLetter = word.charAt(0); + return firstLetter.toUpperCase() === firstLetter; +} + +module.exports = isFirstLetterCapitalized; diff --git a/lib/util/propTypes.js b/lib/util/propTypes.js index e816807127..50179dd647 100644 --- a/lib/util/propTypes.js +++ b/lib/util/propTypes.js @@ -12,6 +12,7 @@ const variableUtil = require('./variable'); const versionUtil = require('./version'); const propWrapperUtil = require('./propWrapper'); const astUtil = require('./ast'); +const isFirstLetterCapitalized = require('./isFirstLetterCapitalized'); /** * Check if node is function type. @@ -83,6 +84,13 @@ function isInsideClassBody(node) { return false; } +function startWithCapitalizedLetter(node) { + return ( + node.parent.type === 'VariableDeclarator' + && !isFirstLetterCapitalized(node.parent.id.name) + ); +} + module.exports = function propTypesInstructions(context, components, utils) { // Used to track the type annotations in scope. // Necessary because babel's scopes do not track type annotations. @@ -878,7 +886,7 @@ module.exports = function propTypesInstructions(context, components, utils) { } // Should ignore function that not return JSXElement - if (!utils.isReturningJSXOrNull(node)) { + if (!utils.isReturningJSXOrNull(node) || startWithCapitalizedLetter(node)) { return; } diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index e616972aaa..33f94a758b 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -3689,6 +3689,80 @@ ruleTester.run('no-unused-prop-types', rule, { } `, parser: parsers.BABEL_ESLINT + }, + { + code: ` + const Home = () => { + const renderStaticList = ({ + item, + }: { + item: IContent; + }) => ( +
} + title={item.title} + titleFontSize={theme.typography.FONT_SIZE_24} + > + +
+ ); + + return ( + + + + + ); + }; + `, + parser: parsers['@TYPESCRIPT_ESLINT'] + }, + { + code: ` + const Home = () => { + const renderStaticList = function({ + item, + }: { + item: IContent; + }) { + return ( +
} + title={item.title} + titleFontSize={theme.typography.FONT_SIZE_24} + > + +
+ ) + }; + + return ( + + + + + ); + }; + `, + parser: parsers['@TYPESCRIPT_ESLINT'] } ]) ), diff --git a/tests/util/isFirstLetterCapitalized.js b/tests/util/isFirstLetterCapitalized.js new file mode 100644 index 0000000000..5ccbfea68e --- /dev/null +++ b/tests/util/isFirstLetterCapitalized.js @@ -0,0 +1,23 @@ +'use strict'; + +const assert = require('assert'); + +const isFirstLetterCapitalized = require('../../lib/util/isFirstLetterCapitalized'); + +describe('isFirstLetterCapitalized', () => { + it('should return false for invalid input', () => { + assert.equal(isFirstLetterCapitalized(), false); + assert.equal(isFirstLetterCapitalized(null), false); + assert.equal(isFirstLetterCapitalized(''), false); + }); + + it('should return false for uncapitalized string', () => { + assert.equal(isFirstLetterCapitalized('isCapitalized'), false); + assert.equal(isFirstLetterCapitalized('lowercase'), false); + }); + + it('should return true for capitalized string', () => { + assert.equal(isFirstLetterCapitalized('IsCapitalized'), true); + assert.equal(isFirstLetterCapitalized('UPPERCASE'), true); + }); +});