Skip to content

Commit

Permalink
Merge pull request #1303 from DianaSuvorova/noUsedProps
Browse files Browse the repository at this point in the history
no-unused-props: not ignoring components with no used props
  • Loading branch information
ljharb committed Jul 21, 2017
2 parents ac72383 + 64e837b commit ef2054b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 71 deletions.
13 changes: 10 additions & 3 deletions lib/rules/no-unused-prop-types.js
Expand Up @@ -175,7 +175,6 @@ module.exports = {
function mustBeValidated(component) {
return Boolean(
component &&
component.usedPropTypes &&
!component.ignorePropsValidation
);
}
Expand Down Expand Up @@ -234,8 +233,9 @@ module.exports = {
* @returns {Boolean} True if the prop is used, false if not.
*/
function isPropUsed(node, prop) {
for (let i = 0, l = node.usedPropTypes.length; i < l; i++) {
const usedProp = node.usedPropTypes[i];
const usedPropTypes = node.usedPropTypes || [];
for (let i = 0, l = usedPropTypes.length; i < l; i++) {
const usedProp = usedPropTypes[i];
if (
prop.type === 'shape' ||
prop.name === '__ANY_KEY__' ||
Expand Down Expand Up @@ -897,6 +897,13 @@ module.exports = {
}
},

JSXSpreadAttribute: function(node) {
const component = components.get(utils.getParentComponent());
components.set(component ? component.node : node, {
ignorePropsValidation: true
});
},

MethodDefinition: function(node) {
if (!isPropTypesDeclaration(node.key)) {
return;
Expand Down
111 changes: 43 additions & 68 deletions tests/lib/rules/no-unused-prop-types.js
Expand Up @@ -557,26 +557,6 @@ ruleTester.run('no-unused-prop-types', rule, {
'});'
].join('\n'),
options: [{customValidators: ['CustomValidator']}]
}, {
code: [
'class Comp1 extends Component {',
' render() {',
' return <span />;',
' }',
'}',
'Comp1.propTypes = {',
' prop1: PropTypes.number',
'};',
'class Comp2 extends Component {',
' render() {',
' return <span />;',
' }',
'}',
'Comp2.propTypes = {',
' prop2: PropTypes.arrayOf(Comp1.propTypes.prop1)',
'};'
].join('\n'),
parser: 'babel-eslint'
}, {
code: [
'const SomeComponent = createReactClass({',
Expand Down Expand Up @@ -782,54 +762,6 @@ ruleTester.run('no-unused-prop-types', rule, {
' }',
'});'
].join('\n')
}, {
code: [
'const statelessComponent = (props) => {',
' const subRender = () => {',
' return <span>{props.someProp}</span>;',
' };',
' return <div>{subRender()}</div>;',
'};',
'statelessComponent.propTypes = {',
' someProp: PropTypes.string',
'};'
].join('\n')
}, {
code: [
'const statelessComponent = ({ someProp }) => {',
' const subRender = () => {',
' return <span>{someProp}</span>;',
' };',
' return <div>{subRender()}</div>;',
'};',
'statelessComponent.propTypes = {',
' someProp: PropTypes.string',
'};'
].join('\n')
}, {
code: [
'const statelessComponent = function({ someProp }) {',
' const subRender = () => {',
' return <span>{someProp}</span>;',
' };',
' return <div>{subRender()}</div>;',
'};',
'statelessComponent.propTypes = {',
' someProp: PropTypes.string',
'};'
].join('\n')
}, {
code: [
'function statelessComponent({ someProp }) {',
' const subRender = () => {',
' return <span>{someProp}</span>;',
' };',
' return <div>{subRender()}</div>;',
'};',
'statelessComponent.propTypes = {',
' someProp: PropTypes.string',
'};'
].join('\n')
}, {
code: [
'function notAComponent({ something }) {',
Expand Down Expand Up @@ -3215,6 +3147,49 @@ ruleTester.run('no-unused-prop-types', rule, {
line: 11,
column: 8
}]
}, { // None of the props are used issue #1162
code: [
'import React from "react"; ',
'var Hello = React.createReactClass({',
' propTypes: {',
' name: React.PropTypes.string',
' },',
' render: function() {',
' return <div>Hello Bob</div>;',
' }',
'});'
].join('\n'),
errors: [{
message: '\'name\' PropType is defined but prop is never used'
}]
}, {
code: [
'class Comp1 extends Component {',
' render() {',
' return <span />;',
' }',
'}',
'Comp1.propTypes = {',
' prop1: PropTypes.number',
'};',
'class Comp2 extends Component {',
' render() {',
' return <span />;',
' }',
'}',
'Comp2.propTypes = {',
' prop2: PropTypes.arrayOf(Comp1.propTypes.prop1)',
'};'
].join('\n'),
parser: 'babel-eslint',
errors: [{
message: '\'prop1\' PropType is defined but prop is never used'
}, {
message: '\'prop2\' PropType is defined but prop is never used'
}, {
message: '\'prop2.*\' PropType is defined but prop is never used'
}]

}
/* , {
// Enable this when the following issue is fixed
Expand Down

0 comments on commit ef2054b

Please sign in to comment.