Skip to content

Commit ef2054b

Browse files
authored
Merge pull request jsx-eslint#1303 from DianaSuvorova/noUsedProps
no-unused-props: not ignoring components with no used props
2 parents ac72383 + 64e837b commit ef2054b

File tree

2 files changed

+53
-71
lines changed

2 files changed

+53
-71
lines changed

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ module.exports = {
175175
function mustBeValidated(component) {
176176
return Boolean(
177177
component &&
178-
component.usedPropTypes &&
179178
!component.ignorePropsValidation
180179
);
181180
}
@@ -234,8 +233,9 @@ module.exports = {
234233
* @returns {Boolean} True if the prop is used, false if not.
235234
*/
236235
function isPropUsed(node, prop) {
237-
for (let i = 0, l = node.usedPropTypes.length; i < l; i++) {
238-
const usedProp = node.usedPropTypes[i];
236+
const usedPropTypes = node.usedPropTypes || [];
237+
for (let i = 0, l = usedPropTypes.length; i < l; i++) {
238+
const usedProp = usedPropTypes[i];
239239
if (
240240
prop.type === 'shape' ||
241241
prop.name === '__ANY_KEY__' ||
@@ -897,6 +897,13 @@ module.exports = {
897897
}
898898
},
899899

900+
JSXSpreadAttribute: function(node) {
901+
const component = components.get(utils.getParentComponent());
902+
components.set(component ? component.node : node, {
903+
ignorePropsValidation: true
904+
});
905+
},
906+
900907
MethodDefinition: function(node) {
901908
if (!isPropTypesDeclaration(node.key)) {
902909
return;

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

Lines changed: 43 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -557,26 +557,6 @@ ruleTester.run('no-unused-prop-types', rule, {
557557
'});'
558558
].join('\n'),
559559
options: [{customValidators: ['CustomValidator']}]
560-
}, {
561-
code: [
562-
'class Comp1 extends Component {',
563-
' render() {',
564-
' return <span />;',
565-
' }',
566-
'}',
567-
'Comp1.propTypes = {',
568-
' prop1: PropTypes.number',
569-
'};',
570-
'class Comp2 extends Component {',
571-
' render() {',
572-
' return <span />;',
573-
' }',
574-
'}',
575-
'Comp2.propTypes = {',
576-
' prop2: PropTypes.arrayOf(Comp1.propTypes.prop1)',
577-
'};'
578-
].join('\n'),
579-
parser: 'babel-eslint'
580560
}, {
581561
code: [
582562
'const SomeComponent = createReactClass({',
@@ -782,54 +762,6 @@ ruleTester.run('no-unused-prop-types', rule, {
782762
' }',
783763
'});'
784764
].join('\n')
785-
}, {
786-
code: [
787-
'const statelessComponent = (props) => {',
788-
' const subRender = () => {',
789-
' return <span>{props.someProp}</span>;',
790-
' };',
791-
' return <div>{subRender()}</div>;',
792-
'};',
793-
'statelessComponent.propTypes = {',
794-
' someProp: PropTypes.string',
795-
'};'
796-
].join('\n')
797-
}, {
798-
code: [
799-
'const statelessComponent = ({ someProp }) => {',
800-
' const subRender = () => {',
801-
' return <span>{someProp}</span>;',
802-
' };',
803-
' return <div>{subRender()}</div>;',
804-
'};',
805-
'statelessComponent.propTypes = {',
806-
' someProp: PropTypes.string',
807-
'};'
808-
].join('\n')
809-
}, {
810-
code: [
811-
'const statelessComponent = function({ someProp }) {',
812-
' const subRender = () => {',
813-
' return <span>{someProp}</span>;',
814-
' };',
815-
' return <div>{subRender()}</div>;',
816-
'};',
817-
'statelessComponent.propTypes = {',
818-
' someProp: PropTypes.string',
819-
'};'
820-
].join('\n')
821-
}, {
822-
code: [
823-
'function statelessComponent({ someProp }) {',
824-
' const subRender = () => {',
825-
' return <span>{someProp}</span>;',
826-
' };',
827-
' return <div>{subRender()}</div>;',
828-
'};',
829-
'statelessComponent.propTypes = {',
830-
' someProp: PropTypes.string',
831-
'};'
832-
].join('\n')
833765
}, {
834766
code: [
835767
'function notAComponent({ something }) {',
@@ -3215,6 +3147,49 @@ ruleTester.run('no-unused-prop-types', rule, {
32153147
line: 11,
32163148
column: 8
32173149
}]
3150+
}, { // None of the props are used issue #1162
3151+
code: [
3152+
'import React from "react"; ',
3153+
'var Hello = React.createReactClass({',
3154+
' propTypes: {',
3155+
' name: React.PropTypes.string',
3156+
' },',
3157+
' render: function() {',
3158+
' return <div>Hello Bob</div>;',
3159+
' }',
3160+
'});'
3161+
].join('\n'),
3162+
errors: [{
3163+
message: '\'name\' PropType is defined but prop is never used'
3164+
}]
3165+
}, {
3166+
code: [
3167+
'class Comp1 extends Component {',
3168+
' render() {',
3169+
' return <span />;',
3170+
' }',
3171+
'}',
3172+
'Comp1.propTypes = {',
3173+
' prop1: PropTypes.number',
3174+
'};',
3175+
'class Comp2 extends Component {',
3176+
' render() {',
3177+
' return <span />;',
3178+
' }',
3179+
'}',
3180+
'Comp2.propTypes = {',
3181+
' prop2: PropTypes.arrayOf(Comp1.propTypes.prop1)',
3182+
'};'
3183+
].join('\n'),
3184+
parser: 'babel-eslint',
3185+
errors: [{
3186+
message: '\'prop1\' PropType is defined but prop is never used'
3187+
}, {
3188+
message: '\'prop2\' PropType is defined but prop is never used'
3189+
}, {
3190+
message: '\'prop2.*\' PropType is defined but prop is never used'
3191+
}]
3192+
32183193
}
32193194
/* , {
32203195
// Enable this when the following issue is fixed

0 commit comments

Comments
 (0)