From 0e70a3aeb35aaa0a5a41efbf56bfb91e5fcc6fda Mon Sep 17 00:00:00 2001 From: Luke Page Date: Fri, 26 Jul 2019 11:35:58 +0200 Subject: [PATCH] Fix #2358 - Recognize props wrapped in flow $ReadOnly<> utility type --- lib/util/propTypes.js | 10 ++++++++++ tests/lib/rules/no-unused-prop-types.js | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/util/propTypes.js b/lib/util/propTypes.js index ae8a3edacb..b03607b73c 100644 --- a/lib/util/propTypes.js +++ b/lib/util/propTypes.js @@ -545,6 +545,16 @@ module.exports = function propTypesInstructions(context, components, utils) { case 'IntersectionTypeAnnotation': ignorePropsValidation = declarePropTypesForIntersectionTypeAnnotation(propTypes, declaredPropTypes); break; + case 'GenericTypeAnnotation': + if (propTypes.id.name === '$ReadOnly') { + ignorePropsValidation = declarePropTypesForObjectTypeAnnotation( + propTypes.typeParameters.params[0], + declaredPropTypes + ); + } else { + ignorePropsValidation = true; + } + break; case null: break; default: diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index ab327ce4b8..498310a3f3 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -2710,6 +2710,17 @@ ruleTester.run('no-unused-prop-types', rule, { }; `, parser: parsers.BABEL_ESLINT + }, { + code: [ + 'type Props = $ReadOnly<{foo: number}>;', + 'class Hello extends React.Component {', + ' props: Props;', + ' render () {', + ' return
{this.props.foo}
;', + ' }', + '}' + ].join('\n'), + parser: parsers.BABEL_ESLINT }, { // issue #933 code: ` @@ -3656,6 +3667,20 @@ ruleTester.run('no-unused-prop-types', rule, { errors: [ {message: '\'unused\' PropType is defined but prop is never used'} ] + }, { + code: [ + 'type Props = $ReadOnly<{unused: Object;}>;', + 'class Hello extends React.Component {', + ' props: Props;', + ' render () {', + ' return
Hello {this.props.firstname}
;', + ' }', + '}' + ].join('\n'), + parser: parsers.BABEL_ESLINT, + errors: [ + {message: '\'unused\' PropType is defined but prop is never used'} + ] }, { code: ` type PropsA = { a: string }