From f9cc10d2b77ed868ae3aec82c89163e9c39c3e3d Mon Sep 17 00:00:00 2001 From: Tamas Sule Date: Sat, 20 Jan 2018 15:18:12 +0100 Subject: [PATCH 1/2] prop-types doesn't check nextProps of componentWillReceiveProps --- lib/rules/prop-types.js | 9 +++++++++ tests/lib/rules/prop-types.js | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/rules/prop-types.js b/lib/rules/prop-types.js index e6226d80dc..805c3da27f 100644 --- a/lib/rules/prop-types.js +++ b/lib/rules/prop-types.js @@ -606,6 +606,10 @@ module.exports = { type = 'destructuring'; properties = node.params[0].properties; break; + case 'MethodDefinition': + type = 'destructuring'; + properties = node.value.params[0].properties; + break; case 'VariableDeclarator': for (let i = 0, j = node.id.properties.length; i < j; i++) { // let {props: {firstname}} = this @@ -1018,6 +1022,11 @@ module.exports = { }, MethodDefinition: function(node) { + const destructuring = node.value && node.value.params && node.value.params[0] && node.value.params[0].type === 'ObjectPattern'; + if (node.key.name === 'componentWillReceiveProps' && destructuring) { + markPropTypesAsUsed(node); + } + if (!node.static || node.kind !== 'get' || !propsUtil.isPropTypesDeclaration(node)) { return; } diff --git a/tests/lib/rules/prop-types.js b/tests/lib/rules/prop-types.js index 08153a711a..3819768b0a 100644 --- a/tests/lib/rules/prop-types.js +++ b/tests/lib/rules/prop-types.js @@ -3095,6 +3095,26 @@ ruleTester.run('prop-types', rule, { errors: [ {message: '\'foo\' is missing in props validation'} ] + }, { + code: [ + 'class Hello extends Component {', + ' static propTypes = {', + ' bar: PropTypes.func', + ' }', + ' componentWillReceiveProps({foo}) {', + ' if (foo) {', + ' return;', + ' }', + ' }', + ' render() {', + ' return
;', + ' }', + '}' + ].join('\n'), + parser: 'babel-eslint', + errors: [ + {message: '\'foo\' is missing in props validation'} + ] }, { code: [ 'class Hello extends React.Component {', From 20dff229a934677cb5b9816c73f34c9e34988d57 Mon Sep 17 00:00:00 2001 From: Tamas Sule Date: Sun, 21 Jan 2018 16:16:07 +0100 Subject: [PATCH 2/2] Adds more checks to MethodDefinition case and adds new test case for default parser --- lib/rules/prop-types.js | 11 ++++++++--- tests/lib/rules/prop-types.js | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/rules/prop-types.js b/lib/rules/prop-types.js index 805c3da27f..a17d7cd0e9 100644 --- a/lib/rules/prop-types.js +++ b/lib/rules/prop-types.js @@ -607,9 +607,14 @@ module.exports = { properties = node.params[0].properties; break; case 'MethodDefinition': - type = 'destructuring'; - properties = node.value.params[0].properties; - break; + const destructuring = node.value && node.value.params && node.value.params[0] && node.value.params[0].type === 'ObjectPattern'; + if (destructuring) { + type = 'destructuring'; + properties = node.value.params[0].properties; + break; + } else { + return; + } case 'VariableDeclarator': for (let i = 0, j = node.id.properties.length; i < j; i++) { // let {props: {firstname}} = this diff --git a/tests/lib/rules/prop-types.js b/tests/lib/rules/prop-types.js index 3819768b0a..3ee4072ac3 100644 --- a/tests/lib/rules/prop-types.js +++ b/tests/lib/rules/prop-types.js @@ -3115,6 +3115,25 @@ ruleTester.run('prop-types', rule, { errors: [ {message: '\'foo\' is missing in props validation'} ] + }, { + code: [ + 'class Hello extends Component {', + ' componentWillReceiveProps({foo}) {', + ' if (foo) {', + ' return;', + ' }', + ' }', + ' render() {', + ' return
;', + ' }', + '}', + 'Hello.propTypes = {', + ' bar: PropTypes.func', + ' }' + ].join('\n'), + errors: [ + {message: '\'foo\' is missing in props validation'} + ] }, { code: [ 'class Hello extends React.Component {',