Skip to content

Commit 7055667

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

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

lib/rules/boolean-prop-naming.js

Lines changed: 7 additions & 2 deletions
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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,31 @@ 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
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'
310335
}],
311336

312337
invalid: [{
@@ -664,5 +689,41 @@ ruleTester.run('boolean-prop-naming', rule, {
664689
errors: [{
665690
message: 'It is better if your prop (something) matches this pattern: (^is[A-Z]([A-Za-z0-9]?)+)'
666691
}]
692+
}, {
693+
// Works when a prop isRequired in ES5.
694+
code: `
695+
var Hello = createReactClass({
696+
propTypes: {something: PropTypes.bool.isRequired},
697+
render: function() { return <div />; }
698+
});
699+
`,
700+
options: [{
701+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
702+
}],
703+
errors: [{
704+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
705+
}]
706+
}, {
707+
// Works when a prop isRequired in ES6.
708+
code: `
709+
class Hello extends React.Component {
710+
static propTypes = {
711+
something: PropTypes.bool.isRequired
712+
};
713+
714+
render() {
715+
return (
716+
<div />
717+
);
718+
}
719+
}
720+
`,
721+
options: [{
722+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
723+
}],
724+
parser: 'babel-eslint',
725+
errors: [{
726+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
727+
}]
667728
}]
668729
});

0 commit comments

Comments
 (0)