Skip to content

Commit 67f1cc8

Browse files
committed
Fix boolean-prop-naming issue with Object.spread syntax
1 parent a120758 commit 67f1cc8

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

lib/rules/boolean-prop-naming.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ module.exports = {
8585
* @param {Object} node The node we're getting the name of
8686
*/
8787
function getPropKey(node) {
88+
// Check for `ExperimentalSpreadProperty` so we can skip validation of those fields.
89+
// Otherwise it will look for `node.value.property` which doesn't exist and breaks Eslint.
90+
if (node.type === 'ExperimentalSpreadProperty') {
91+
return null;
92+
}
8893
if (node.value.property) {
8994
return node.value.property.name;
9095
}

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const parserOptions = {
1717
ecmaVersion: 6,
1818
sourceType: 'module',
1919
ecmaFeatures: {
20+
experimentalObjectRestSpread: true,
2021
jsx: true
2122
}
2223
};
@@ -145,6 +146,31 @@ ruleTester.run('boolean-prop-naming', rule, {
145146
rule: '^is[A-Z]([A-Za-z0-9]?)+'
146147
}],
147148
parser: 'babel-eslint'
149+
}, {
150+
// ES6 components with static class properties and Object.spread syntax in PropTypes
151+
code: `
152+
const spreadProps = { aSpreadProp: PropTypes.string };
153+
class Hello extends React.Component {
154+
static propTypes = {isSomething: PropTypes.bool, ...spreadProps};
155+
render () { return <div />; }
156+
}
157+
`,
158+
options: [{
159+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
160+
}],
161+
parser: 'babel-eslint'
162+
}, {
163+
// ES6 components as Component with boolean PropTypes and Object.spread syntax in PropTypes
164+
code: `
165+
const spreadProps = { aSpreadProp: PropTypes.string };
166+
class Hello extends Component {
167+
render () { return <div />; }
168+
}
169+
Hello.propTypes = {isSomething: PropTypes.bool, ...spreadProps}
170+
`,
171+
options: [{
172+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
173+
}]
148174
}, {
149175
// ES6 components with static class properties and React.PropTypes
150176
code: `
@@ -361,6 +387,37 @@ ruleTester.run('boolean-prop-naming', rule, {
361387
errors: [{
362388
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
363389
}]
390+
}, {
391+
// ES6 components as React.Component with non-boolean PropTypes and Object.spread syntax
392+
code: `
393+
const spreadProps = { aSpreadProp: PropTypes.string };
394+
class Hello extends Component {
395+
render () { return <div />; }
396+
}
397+
Hello.propTypes = {something: PropTypes.bool, ...spreadProps}
398+
`,
399+
options: [{
400+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
401+
}],
402+
errors: [{
403+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
404+
}]
405+
}, {
406+
// ES6 components as React.Component with static class property, non-boolean PropTypes, and Object.spread syntax
407+
code: `
408+
const spreadProps = { aSpreadProp: PropTypes.string };
409+
class Hello extends React.Component {
410+
static propTypes = {something: PropTypes.bool, ...spreadProps};
411+
render () { return <div />; }
412+
}
413+
`,
414+
options: [{
415+
rule: '^is[A-Z]([A-Za-z0-9]?)+'
416+
}],
417+
parser: 'babel-eslint',
418+
errors: [{
419+
message: 'Prop name (something) doesn\'t match rule (^is[A-Z]([A-Za-z0-9]?)+)'
420+
}]
364421
}, {
365422
// ES6 components as React.Component with non-boolean PropTypes
366423
code: `

0 commit comments

Comments
 (0)