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);
+ });
+});