Skip to content

Commit 3f393a2

Browse files
committed
Fix no-unused-prop-types to ignore validation when spread is used (fixes #840)
1 parent f227eb4 commit 3f393a2

File tree

2 files changed

+12
-25
lines changed

2 files changed

+12
-25
lines changed

lib/rules/no-unused-prop-types.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ module.exports = {
605605

606606
var component = components.get(utils.getParentComponent());
607607
var usedPropTypes = component && component.usedPropTypes || [];
608+
var ignorePropsValidation = component && component.ignorePropsValidation || false;
608609

609610
switch (type) {
610611
case 'direct':
@@ -621,7 +622,8 @@ module.exports = {
621622
case 'destructuring':
622623
for (var k = 0, l = (properties || []).length; k < l; k++) {
623624
if (hasSpreadOperator(properties[k]) || properties[k].computed) {
624-
continue;
625+
ignorePropsValidation = true;
626+
break;
625627
}
626628
var propName = getKeyValue(properties[k]);
627629

@@ -646,7 +648,8 @@ module.exports = {
646648
}
647649

648650
components.set(node, {
649-
usedPropTypes: usedPropTypes
651+
usedPropTypes: usedPropTypes,
652+
ignorePropsValidation: ignorePropsValidation
650653
});
651654
}
652655

@@ -658,7 +661,7 @@ module.exports = {
658661
function markPropTypesAsDeclared(node, propTypes) {
659662
var component = components.get(node);
660663
var declaredPropTypes = component && component.declaredPropTypes || [];
661-
var ignorePropsValidation = false;
664+
var ignorePropsValidation = component && component.ignorePropsValidation || false;
662665

663666
switch (propTypes && propTypes.type) {
664667
case 'ObjectTypeAnnotation':
@@ -936,4 +939,3 @@ module.exports = {
936939
};
937940
})
938941
};
939-

tests/lib/rules/no-unused-prop-types.js

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,19 @@ ruleTester.run('no-unused-prop-types', rule, {
177177
].join('\n'),
178178
parserOptions: parserOptions
179179
}, {
180+
// Props validation is ignored when spread is used
180181
code: [
181182
'class Hello extends React.Component {',
182183
' render() {',
183-
' var { firstname, ...other } = this.props;',
184+
' var { firstname, ...props } = this.props;',
185+
' var { category, icon } = props;',
184186
' return <div>Hello {firstname}</div>;',
185187
' }',
186188
'}',
187189
'Hello.propTypes = {',
188-
' firstname: React.PropTypes.string',
190+
' firstname: React.PropTypes.string,',
191+
' category: React.PropTypes.string,',
192+
' icon: React.PropTypes.bool',
189193
'};'
190194
].join('\n'),
191195
parser: 'babel-eslint',
@@ -1653,25 +1657,6 @@ ruleTester.run('no-unused-prop-types', rule, {
16531657
{message: '\'a.unused\' PropType is defined but prop is never used'},
16541658
{message: '\'a.anotherunused\' PropType is defined but prop is never used'}
16551659
]
1656-
}, {
1657-
code: [
1658-
'class Hello extends React.Component {',
1659-
' render() {',
1660-
' var { ',
1661-
' "aria-controls": ariaControls, ',
1662-
' propX,',
1663-
' ...props } = this.props;',
1664-
' return <div>Hello</div>;',
1665-
' }',
1666-
'}',
1667-
'Hello.propTypes = {',
1668-
' "aria-unused": React.PropTypes.string',
1669-
'};'
1670-
].join('\n'),
1671-
parser: 'babel-eslint',
1672-
errors: [
1673-
{message: '\'aria-unused\' PropType is defined but prop is never used'}
1674-
]
16751660
}, {
16761661
code: [
16771662
'class Hello extends React.Component {',

0 commit comments

Comments
 (0)