Skip to content

Commit

Permalink
Fix no-unused-prop-types to ignore validation when spread is used (fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
yannickcr committed Sep 25, 2016
1 parent f227eb4 commit 3f393a2
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 25 deletions.
10 changes: 6 additions & 4 deletions lib/rules/no-unused-prop-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,7 @@ module.exports = {

var component = components.get(utils.getParentComponent());
var usedPropTypes = component && component.usedPropTypes || [];
var ignorePropsValidation = component && component.ignorePropsValidation || false;

switch (type) {
case 'direct':
Expand All @@ -621,7 +622,8 @@ module.exports = {
case 'destructuring':
for (var k = 0, l = (properties || []).length; k < l; k++) {
if (hasSpreadOperator(properties[k]) || properties[k].computed) {
continue;
ignorePropsValidation = true;
break;
}
var propName = getKeyValue(properties[k]);

Expand All @@ -646,7 +648,8 @@ module.exports = {
}

components.set(node, {
usedPropTypes: usedPropTypes
usedPropTypes: usedPropTypes,
ignorePropsValidation: ignorePropsValidation
});
}

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

switch (propTypes && propTypes.type) {
case 'ObjectTypeAnnotation':
Expand Down Expand Up @@ -936,4 +939,3 @@ module.exports = {
};
})
};

27 changes: 6 additions & 21 deletions tests/lib/rules/no-unused-prop-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -177,15 +177,19 @@ ruleTester.run('no-unused-prop-types', rule, {
].join('\n'),
parserOptions: parserOptions
}, {
// Props validation is ignored when spread is used
code: [
'class Hello extends React.Component {',
' render() {',
' var { firstname, ...other } = this.props;',
' var { firstname, ...props } = this.props;',
' var { category, icon } = props;',
' return <div>Hello {firstname}</div>;',
' }',
'}',
'Hello.propTypes = {',
' firstname: React.PropTypes.string',
' firstname: React.PropTypes.string,',
' category: React.PropTypes.string,',
' icon: React.PropTypes.bool',
'};'
].join('\n'),
parser: 'babel-eslint',
Expand Down Expand Up @@ -1653,25 +1657,6 @@ ruleTester.run('no-unused-prop-types', rule, {
{message: '\'a.unused\' PropType is defined but prop is never used'},
{message: '\'a.anotherunused\' PropType is defined but prop is never used'}
]
}, {
code: [
'class Hello extends React.Component {',
' render() {',
' var { ',
' "aria-controls": ariaControls, ',
' propX,',
' ...props } = this.props;',
' return <div>Hello</div>;',
' }',
'}',
'Hello.propTypes = {',
' "aria-unused": React.PropTypes.string',
'};'
].join('\n'),
parser: 'babel-eslint',
errors: [
{message: '\'aria-unused\' PropType is defined but prop is never used'}
]
}, {
code: [
'class Hello extends React.Component {',
Expand Down

0 comments on commit 3f393a2

Please sign in to comment.