diff --git a/lib/util/Components.js b/lib/util/Components.js index 71e400be77..fe90ccf05e 100644 --- a/lib/util/Components.js +++ b/lib/util/Components.js @@ -71,6 +71,12 @@ function isReturnsLogicalJSX(node, property, strict) { : (returnsLogicalJSXLeft || returnsLogicalJSXRight); } +function isReturnsSequentialJSX(node, property) { + return node[property] + && node[property].type === 'SequenceExpression' + && jsxUtil.isJSX(node[property].expressions[node[property].expressions.length - 1]); +} + const Lists = new WeakMap(); /** @@ -457,6 +463,7 @@ function componentRule(rule, context) { const returnsConditionalJSX = isReturnsConditionalJSX(node, property, strict); const returnsLogicalJSX = isReturnsLogicalJSX(node, property, strict); + const returnsSequentialJSX = isReturnsSequentialJSX(node, property); const returnsJSX = node[property] && jsxUtil.isJSX(node[property]); const returnsPragmaCreateElement = this.isCreateElement(node[property]); @@ -464,6 +471,7 @@ function componentRule(rule, context) { return !!( returnsConditionalJSX || returnsLogicalJSX + || returnsSequentialJSX || returnsJSX || returnsPragmaCreateElement ); diff --git a/tests/lib/rules/prop-types.js b/tests/lib/rules/prop-types.js index 29b04794cd..ab40f13bd3 100644 --- a/tests/lib/rules/prop-types.js +++ b/tests/lib/rules/prop-types.js @@ -2501,6 +2501,20 @@ ruleTester.run('prop-types', rule, { export default function() {} ` }, + { + code: ` + function Component(props) { + return 0, +
+ Hello, { props.name }! +
+ } + + Component.propTypes = { + name: PropTypes.string.isRequired + } + ` + }, parsers.TS([ { code: ` @@ -5591,6 +5605,19 @@ ruleTester.run('prop-types', rule, { message: '\'foo.baz\' is missing in props validation' }] }, + { + code: ` + function Component(props) { + return 0, +
+ Hello, { props.name }! +
+ } + `, + errors: [{ + message: '\'name\' is missing in props validation' + }] + }, parsers.TS([ { code: `