Skip to content

Commit 3f9e8bf

Browse files
committed
feat: change option working
- Rename option `forceDefaultPropArguments` to `functions`. - The option has value `'defaultProps' | 'defaultArguments' | 'ignore'`. - Add `classes` option but now works as before.
1 parent c74bb1e commit 3f9e8bf

File tree

2 files changed

+48
-28
lines changed

2 files changed

+48
-28
lines changed

lib/rules/require-default-props.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,24 @@ module.exports = {
4040
forbidDefaultForRequired: {
4141
type: 'boolean',
4242
},
43-
ignoreFunctionalComponents: {
44-
type: 'boolean',
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+
*/
47+
classes: {
48+
allow: {
49+
enum: ['defaultProps'],
50+
},
51+
},
52+
functions: {
53+
allow: {
54+
enum: ['defaultArguments', 'defaultProps', 'ignore'],
55+
},
4556
},
46-
forceDefaultPropArguments: {
57+
/**
58+
* @deprecated
59+
*/
60+
ignoreFunctionalComponents: {
4761
type: 'boolean',
4862
},
4963
},
@@ -54,8 +68,14 @@ module.exports = {
5468
create: Components.detect((context, components) => {
5569
const configuration = context.options[0] || {};
5670
const forbidDefaultForRequired = configuration.forbidDefaultForRequired || false;
57-
const ignoreFunctionalComponents = configuration.ignoreFunctionalComponents || false;
58-
const forceDefaultPropArguments = configuration.forceDefaultPropArguments || false;
71+
/**
72+
* @todo
73+
* - Remove ignoreFunctionalComponents
74+
* - Change default to 'defaultArguments'
75+
*/
76+
const functions = configuration.ignoreFunctionalComponents
77+
? 'ignore'
78+
: configuration.functions || 'defaultProps';
5979

6080
/**
6181
* Reports all propTypes passed in that don't have a defaultProps counterpart.
@@ -90,7 +110,7 @@ module.exports = {
90110
}
91111

92112
/**
93-
* If forceDefaultPropArguments options is true, reports defaultProps is used and all params that doesn't initialized.
113+
* If functions option is 'defaultArguments', reports defaultProps is used and all params that doesn't initialized.
94114
* @param {Object} componentNode Node of component.
95115
* @param {Object[]} declaredPropTypes List of propTypes to check `isRequired`.
96116
* @param {Object} defaultProps Object of defaultProps to check used.
@@ -155,9 +175,7 @@ module.exports = {
155175
const list = components.list();
156176

157177
values(list).filter((component) => {
158-
if (ignoreFunctionalComponents
159-
&& astUtil.isFunctionLike(component.node)
160-
) {
178+
if (functions === 'ignore' && astUtil.isFunctionLike(component.node)) {
161179
return false;
162180
}
163181
// If this defaultProps is "unresolved", then we should ignore this component and not report
@@ -167,7 +185,9 @@ module.exports = {
167185
}
168186
return component.declaredPropTypes !== undefined;
169187
}).forEach((component) => {
170-
if (forceDefaultPropArguments && astUtil.isFunctionLike(component.node)) {
188+
if (functions === 'defaultArguments'
189+
&& astUtil.isFunctionLike(component.node)
190+
) {
171191
reportFunctionComponent(
172192
component.node,
173193
component.declaredPropTypes,

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ ruleTester.run('require-default-props', rule, {
235235
bar: PropTypes.string.isRequired
236236
};
237237
`,
238-
options: [{ forceDefaultPropArguments: true }],
238+
options: [{ functions: 'defaultArguments' }],
239239
},
240240
{
241241
code: `
@@ -247,7 +247,7 @@ ruleTester.run('require-default-props', rule, {
247247
bar: PropTypes.string
248248
};
249249
`,
250-
options: [{ forceDefaultPropArguments: true }],
250+
options: [{ functions: 'defaultArguments' }],
251251
},
252252
{
253253
code: `
@@ -259,7 +259,7 @@ ruleTester.run('require-default-props', rule, {
259259
bar: PropTypes.string.isRequired,
260260
};
261261
`,
262-
options: [{ forceDefaultPropArguments: true }],
262+
options: [{ functions: 'defaultArguments' }],
263263
},
264264
{
265265
code: `
@@ -273,7 +273,7 @@ ruleTester.run('require-default-props', rule, {
273273
world: PropTypes.string.isRequired
274274
}
275275
`,
276-
options: [{ forceDefaultPropArguments: true }],
276+
options: [{ functions: 'defaultArguments' }],
277277
},
278278
{
279279
code: `
@@ -287,7 +287,7 @@ ruleTester.run('require-default-props', rule, {
287287
world: PropTypes.string.isRequired
288288
}
289289
`,
290-
options: [{ forceDefaultPropArguments: true }],
290+
options: [{ functions: 'defaultArguments' }],
291291
},
292292

293293
// stateless components as function expressions
@@ -335,7 +335,7 @@ ruleTester.run('require-default-props', rule, {
335335
bar: PropTypes.string
336336
};
337337
`,
338-
options: [{ forceDefaultPropArguments: true }],
338+
options: [{ functions: 'defaultArguments' }],
339339
},
340340

341341
// stateless components as arrow function expressions
@@ -385,7 +385,7 @@ ruleTester.run('require-default-props', rule, {
385385
bar: PropTypes.string
386386
};
387387
`,
388-
options: [{ forceDefaultPropArguments: true }],
388+
options: [{ functions: 'defaultArguments' }],
389389
},
390390

391391
// createReactClass components
@@ -486,7 +486,7 @@ ruleTester.run('require-default-props', rule, {
486486
}
487487
});
488488
`,
489-
options: [{ forceDefaultPropArguments: true }],
489+
options: [{ functions: 'defaultArguments' }],
490490
},
491491

492492
// ES6 class component
@@ -623,7 +623,7 @@ ruleTester.run('require-default-props', rule, {
623623
foo: "foo"
624624
};
625625
`,
626-
options: [{ forceDefaultPropArguments: true }],
626+
options: [{ functions: 'defaultArguments' }],
627627
},
628628

629629
// edge cases
@@ -775,7 +775,7 @@ ruleTester.run('require-default-props', rule, {
775775
return <div>{foo}{bar}</div>;
776776
}
777777
`,
778-
options: [{ forceDefaultPropArguments: true }],
778+
options: [{ functions: 'defaultArguments' }],
779779
},
780780
{
781781
code: `
@@ -1116,7 +1116,7 @@ ruleTester.run('require-default-props', rule, {
11161116
}
11171117
`,
11181118
features: ['types'],
1119-
options: [{ forceDefaultPropArguments: true }],
1119+
options: [{ functions: 'defaultArguments' }],
11201120
},
11211121
{
11221122
code: `
@@ -1129,7 +1129,7 @@ ruleTester.run('require-default-props', rule, {
11291129
}
11301130
`,
11311131
features: ['types'],
1132-
options: [{ forceDefaultPropArguments: true }],
1132+
options: [{ functions: 'defaultArguments' }],
11331133
},
11341134
{
11351135
code: `
@@ -1172,7 +1172,7 @@ ruleTester.run('require-default-props', rule, {
11721172
}
11731173
`,
11741174
features: ['ts'],
1175-
options: [{ forceDefaultPropArguments: true }],
1175+
options: [{ functions: 'defaultArguments' }],
11761176
},
11771177
]),
11781178

@@ -1346,7 +1346,7 @@ ruleTester.run('require-default-props', rule, {
13461346
}
13471347
MyStatelessComponent.propTypes = types;
13481348
`,
1349-
options: [{ forceDefaultPropArguments: true }],
1349+
options: [{ functions: 'defaultArguments' }],
13501350
errors: [
13511351
{
13521352
messageId: 'shouldAssignObjectDefault',
@@ -1365,7 +1365,7 @@ ruleTester.run('require-default-props', rule, {
13651365
}
13661366
MyStatelessComponent.propTypes = types;
13671367
`,
1368-
options: [{ forceDefaultPropArguments: true }],
1368+
options: [{ functions: 'defaultArguments' }],
13691369
errors: [
13701370
{
13711371
messageId: 'destructureInSignature',
@@ -1386,7 +1386,7 @@ ruleTester.run('require-default-props', rule, {
13861386
world: PropTypes.string.isRequired
13871387
}
13881388
`,
1389-
options: [{ forceDefaultPropArguments: true }],
1389+
options: [{ functions: 'defaultArguments' }],
13901390
errors: [
13911391
{
13921392
messageId: 'shouldAssignObjectDefault',
@@ -2704,7 +2704,7 @@ ruleTester.run('require-default-props', rule, {
27042704
foo: 'bar'
27052705
};
27062706
`,
2707-
options: [{ forceDefaultPropArguments: true }],
2707+
options: [{ functions: 'defaultArguments' }],
27082708
errors: [
27092709
{
27102710
messageId: 'noDefaultPropsWithFunction',
@@ -2721,7 +2721,7 @@ ruleTester.run('require-default-props', rule, {
27212721
bar: PropTypes.string
27222722
};
27232723
`,
2724-
options: [{ forceDefaultPropArguments: true }],
2724+
options: [{ functions: 'defaultArguments' }],
27252725
errors: [
27262726
{
27272727
messageId: 'destructureInSignature',

0 commit comments

Comments
 (0)