From 5f9876e138377fa870e1b7a34b7b78ada0d55184 Mon Sep 17 00:00:00 2001 From: Mikol Graves Date: Sat, 19 Sep 2020 18:53:31 -0700 Subject: [PATCH] [Fix] `prop-types`: Detect JSX returned by sequential expression Resolves #2800. Implements `isReturnsSequentialJSX()` and uses it in `isReturningJSX()` (in conjunction with `isReturnsConditionalJSX()` and `isReturnsLogicalJSX()`). --- lib/util/Components.js | 8 ++++++++ tests/lib/rules/prop-types.js | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) 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: `