Skip to content

Commit f980c38

Browse files
committed
Handle isRequired for boolean-prop-naming
1 parent b7665b7 commit f980c38

File tree

2 files changed

+105
-2
lines changed

2 files changed

+105
-2
lines changed

lib/rules/boolean-prop-naming.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ module.exports = {
6262
* propTypes: {
6363
* full: React.PropTypes.bool,
6464
* short: PropTypes.bool,
65-
* direct: bool
65+
* direct: bool,
66+
* required: PropTypes.bool.isRequired
6667
* }
6768
* @param {Object} node The node we're getting the name of
6869
*/
@@ -73,7 +74,11 @@ module.exports = {
7374
return null;
7475
}
7576
if (node.value.property) {
76-
return node.value.property.name;
77+
const name = node.value.property.name;
78+
if (name === 'isRequired') {
79+
return node.value.object.property.name;
80+
}
81+
return name;
7782
}
7883
if (node.value.type === 'Identifier') {
7984
return node.value.name;

tests/lib/rules/boolean-prop-naming.js

+98
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,47 @@ ruleTester.run('boolean-prop-naming', rule, {
307307
options: [{
308308
rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+'
309309
}]
310+
}, {
311+
// Ensure the rule does not throw when a prop isRequired when ES5.
312+
code: `
313+
var Hello = createReactClass({
314+
propTypes: {isSomething: PropTypes.bool.isRequired, hasValue: PropTypes.bool.isRequired},
315+
render: function() { return <div />; }
316+
});
317+
`
318+
}, {
319+
// Ensure the rule does not throw when a prop isRequired when ES6 with static properties.
320+
code: `
321+
class Hello extends React.Component {
322+
static propTypes = {
323+
isSomething: PropTypes.bool.isRequired,
324+
hasValue: PropTypes.bool.isRequired
325+
};
326+
327+
render() {
328+
return (
329+
<div />
330+
);
331+
}
332+
}
333+
`,
334+
parser: 'babel-eslint'
335+
}, {
336+
// Ensure the rule does not throw when a prop isRequired when ES6 without static properties.
337+
code: `
338+
class Hello extends React.Component {
339+
render() {
340+
return (
341+
<div />
342+
);
343+
}
344+
}
345+
346+
Hello.propTypes = {
347+
isSomething: PropTypes.bool.isRequired,
348+
hasValue: PropTypes.bool.isRequired
349+
}
350+
`
310351
}],
311352

312353
invalid: [{
@@ -664,5 +705,62 @@ ruleTester.run('boolean-prop-naming', rule, {
664705
errors: [{
665706
message: 'It is better if your prop (something) matches this pattern: (^is[A-Z]([A-Za-z0-9]?)+)'
666707
}]
708+
}, {
709+
// Works when a prop isRequired in ES5.
710+
code: `
711+
var Hello = createReactClass({
712+
propTypes: {something: PropTypes.bool.isRequired},
713+
render: function() { return <div />; }
714+
});
715+
`,
716+
options: [{
717+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
718+
}],
719+
errors: [{
720+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
721+
}]
722+
}, {
723+
// Works when a prop isRequired in ES6 with static properties.
724+
code: `
725+
class Hello extends React.Component {
726+
static propTypes = {
727+
something: PropTypes.bool.isRequired
728+
};
729+
730+
render() {
731+
return (
732+
<div />
733+
);
734+
}
735+
}
736+
`,
737+
options: [{
738+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
739+
}],
740+
parser: 'babel-eslint',
741+
errors: [{
742+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
743+
}]
744+
}, {
745+
// Works when a prop isRequired in ES6 without static properties.
746+
code: `
747+
class Hello extends React.Component {
748+
render() {
749+
return (
750+
<div />
751+
);
752+
}
753+
}
754+
755+
Hello.propTypes = {
756+
something: PropTypes.bool.isRequired
757+
}
758+
`,
759+
options: [{
760+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
761+
}],
762+
errors: [{
763+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
764+
}]
667765
}]
668766
});

0 commit comments

Comments
 (0)