Skip to content

Commit 1e20b43

Browse files
committed
feat: add classes: ignore option
1 parent 329e6ea commit 1e20b43

File tree

2 files changed

+69
-5
lines changed

2 files changed

+69
-5
lines changed

lib/rules/require-default-props.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,9 @@ module.exports = {
4040
forbidDefaultForRequired: {
4141
type: 'boolean',
4242
},
43-
/**
44-
* For now, this wouldn't support any other choices, and would be optional,
45-
* but later could be set to "ignore" as long as `functions` wasn't set to "ignore"
46-
*/
4743
classes: {
4844
allow: {
49-
enum: ['defaultProps'],
45+
enum: ['defaultProps', 'ignore'],
5046
},
5147
},
5248
functions: {
@@ -68,6 +64,7 @@ module.exports = {
6864
create: Components.detect((context, components) => {
6965
const configuration = context.options[0] || {};
7066
const forbidDefaultForRequired = configuration.forbidDefaultForRequired || false;
67+
const classes = configuration.classes || 'defaultProps';
7168
/**
7269
* @todo
7370
* - Remove ignoreFunctionalComponents
@@ -177,6 +174,9 @@ module.exports = {
177174
if (functions === 'ignore' && astUtil.isFunctionLike(component.node)) {
178175
return false;
179176
}
177+
if (classes === 'ignore' && astUtil.isClass(component.node)) {
178+
return false;
179+
}
180180
// If this defaultProps is "unresolved", then we should ignore this component and not report
181181
// any errors for it, to avoid false-positives with e.g. external defaultProps declarations or spread operators.
182182
if (component.defaultProps === 'unresolved') {

tests/lib/rules/require-default-props.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,56 @@ ruleTester.run('require-default-props', rule, {
649649
`,
650650
options: [{ functions: 'defaultArguments' }],
651651
},
652+
{
653+
code: `
654+
class Greeting extends React.Component {
655+
render() {
656+
return (
657+
<h1>Hello, {this.props.foo} {this.props.bar}</h1>
658+
);
659+
}
660+
}
661+
Greeting.propTypes = {
662+
foo: PropTypes.string,
663+
bar: PropTypes.string.isRequired
664+
};
665+
`,
666+
options: [{ classes: 'ignore' }],
667+
},
668+
{
669+
code: `
670+
class Greeting extends React.Component {
671+
render() {
672+
return (
673+
<h1>Hello, {this.props.foo} {this.props.bar}</h1>
674+
);
675+
}
676+
}
677+
Greeting.propTypes = {
678+
foo: PropTypes.string,
679+
bar: PropTypes.string
680+
};
681+
Greeting.defaultProps = {
682+
foo: "foo"
683+
};
684+
`,
685+
options: [{ classes: 'ignore' }],
686+
},
687+
{
688+
code: `
689+
class Hello extends React.Component {
690+
static get propTypes() {
691+
return {
692+
name: PropTypes.string
693+
};
694+
}
695+
render() {
696+
return <div>Hello {this.props.name}</div>;
697+
}
698+
}
699+
`,
700+
options: [{ classes: 'ignore' }],
701+
},
652702

653703
// edge cases
654704

@@ -676,6 +726,20 @@ ruleTester.run('require-default-props', rule, {
676726
};
677727
`,
678728
},
729+
{
730+
code: `
731+
let Greetings = {};
732+
Greetings.Hello = class extends React.Component {
733+
render () {
734+
return <div>Hello {this.props.foo}</div>;
735+
}
736+
}
737+
Greetings.Hello.propTypes = {
738+
foo: PropTypes.string
739+
};
740+
`,
741+
options: [{ classes: 'ignore' }],
742+
},
679743
// external references
680744
{
681745
code: `

0 commit comments

Comments
 (0)