Skip to content

Commit 27f9e08

Browse files
authored
Merge pull request #1932 from alexzherdev/1928-fix-assignment-handling
[Fix] stop crashing when assigning to propTypes
2 parents a33384d + 44a3bf6 commit 27f9e08

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-3
lines changed

lib/util/propTypes.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,6 @@ module.exports = function propTypesInstructions(context, components, utils) {
430430
const component = components.get(componentNode);
431431
const declaredPropTypes = component && component.declaredPropTypes || {};
432432
let ignorePropsValidation = component && component.ignorePropsValidation || false;
433-
434433
switch (propTypes && propTypes.type) {
435434
case 'ObjectTypeAnnotation':
436435
ignorePropsValidation = declarePropTypesForObjectTypeAnnotation(propTypes, declaredPropTypes);
@@ -470,13 +469,18 @@ module.exports = function propTypesInstructions(context, components, utils) {
470469
}
471470
}
472471
if (propTypes && propTypes.parent && propTypes.property) {
472+
if (!(propTypes === propTypes.parent.left && propTypes.parent.left.object)) {
473+
ignorePropsValidation = true;
474+
break;
475+
}
476+
const parentProp = context.getSource(propTypes.parent.left.object).replace(/^.*\.propTypes\./, '');
473477
const types = buildReactDeclarationTypes(
474478
propTypes.parent.right,
475-
propTypes.parent.left.object.property.name
479+
parentProp
476480
);
477481

478482
types.name = propTypes.property.name;
479-
types.fullName = propTypes.property.name;
483+
types.fullName = [parentProp, propTypes.property.name].join('.');
480484
types.node = propTypes.property;
481485
curDeclaredPropTypes[propTypes.property.name] = types;
482486
} else {

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

+23
Original file line numberDiff line numberDiff line change
@@ -4642,6 +4642,29 @@ ruleTester.run('no-unused-prop-types', rule, {
46424642
errors: [{
46434643
message: '\'age\' PropType is defined but prop is never used'
46444644
}]
4645+
}, {
4646+
code: [
4647+
'class Hello extends React.Component {',
4648+
' render() {',
4649+
' return <div>Hello</div>;',
4650+
' }',
4651+
'}',
4652+
'Hello.propTypes = {',
4653+
' a: PropTypes.shape({',
4654+
' b: PropTypes.shape({',
4655+
' })',
4656+
' })',
4657+
'};',
4658+
'Hello.propTypes.a.b.c = PropTypes.number;'
4659+
].join('\n'),
4660+
options: [{skipShapeProps: false}],
4661+
errors: [{
4662+
message: '\'a\' PropType is defined but prop is never used'
4663+
}, {
4664+
message: '\'a.b\' PropType is defined but prop is never used'
4665+
}, {
4666+
message: '\'a.b.c\' PropType is defined but prop is never used'
4667+
}]
46454668
}
46464669

46474670
/* , {

tests/lib/rules/prop-types.js

+34
Original file line numberDiff line numberDiff line change
@@ -1939,6 +1939,24 @@ ruleTester.run('prop-types', rule, {
19391939
}
19401940
`,
19411941
parser: 'babel-eslint'
1942+
},
1943+
{
1944+
code: `
1945+
const Slider = props => (
1946+
<RcSlider {...props} />
1947+
);
1948+
1949+
Slider.propTypes = RcSlider.propTypes;
1950+
`
1951+
},
1952+
{
1953+
code: `
1954+
const Slider = props => (
1955+
<RcSlider foo={props.bar} />
1956+
);
1957+
1958+
Slider.propTypes = RcSlider.propTypes;
1959+
`
19421960
}
19431961
],
19441962

@@ -2137,6 +2155,22 @@ ruleTester.run('prop-types', rule, {
21372155
errors: [{
21382156
message: '\'a.b.c\' is missing in props validation'
21392157
}]
2158+
}, {
2159+
code: [
2160+
'class Hello extends React.Component {',
2161+
' render() {',
2162+
' this.props.a.b.c;',
2163+
' return <div>Hello</div>;',
2164+
' }',
2165+
'}',
2166+
'Hello.propTypes = {',
2167+
' a: PropTypes.shape({})',
2168+
'};',
2169+
'Hello.propTypes.a.b = PropTypes.shape({});'
2170+
].join('\n'),
2171+
errors: [{
2172+
message: '\'a.b.c\' is missing in props validation'
2173+
}]
21402174
}, {
21412175
code: [
21422176
'class Hello extends React.Component {',

0 commit comments

Comments
 (0)