Skip to content

Commit 1dda6e0

Browse files
fix(require-default-prop): avoid requiring defaults for optional props not included in destructuring
- Only require default values for optional props that are explicitly destructured - Optional props not included in destructuring pattern are now ignored - Fixes regression introduced in v10.1.0 where all optional props required defaults
1 parent ca97301 commit 1dda6e0

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

lib/rules/require-default-prop.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,19 @@ module.exports = {
207207
if (defaultsByWithDefaults[prop.propName]) {
208208
return true
209209
}
210+
// If using props destructure and this is an optional prop that is NOT included
211+
// in the destructure pattern, exclude it from the report
212+
if (
213+
isUsingPropsDestructure &&
214+
!prop.required &&
215+
prop.propName != null
216+
) {
217+
const destructuredProps = utils.getPropsDestructure(node)
218+
if (!destructuredProps[prop.propName]) {
219+
// Optional prop is not destructured, so no default value is needed
220+
return true
221+
}
222+
}
210223
}
211224
if (!isUsingPropsDestructure) {
212225
return false

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,40 @@ ruleTester.run('require-default-prop', rule, {
413413
...languageOptions,
414414
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
415415
}
416+
},
417+
// Optional props that are not destructured should not require default values
418+
{
419+
filename: 'test.vue',
420+
code: `
421+
<script setup lang="ts">
422+
const { bar } = defineProps<{
423+
foo?: string;
424+
bar: string;
425+
}>()
426+
</script>
427+
`,
428+
languageOptions: {
429+
parser: require('vue-eslint-parser'),
430+
...languageOptions,
431+
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
432+
}
433+
},
434+
{
435+
filename: 'test.vue',
436+
code: `
437+
<script setup lang="ts">
438+
const { bar } = defineProps<{
439+
foo?: string;
440+
bar: string;
441+
baz?: number;
442+
}>()
443+
</script>
444+
`,
445+
languageOptions: {
446+
parser: require('vue-eslint-parser'),
447+
...languageOptions,
448+
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
449+
}
416450
}
417451
],
418452

@@ -728,6 +762,7 @@ ruleTester.run('require-default-prop', rule, {
728762
},
729763
{
730764
// https://github.com/vuejs/eslint-plugin-vue/issues/2725
765+
// Optional props that ARE destructured should still require default values
731766
filename: 'type-with-props-destructure.vue',
732767
code: `
733768
<script setup lang="ts">
@@ -745,6 +780,30 @@ ruleTester.run('require-default-prop', rule, {
745780
line: 3
746781
}
747782
]
783+
},
784+
{
785+
// Optional props that are NOT destructured should still cause errors if they are used in destructuring without defaults
786+
filename: 'mixed-optional-destructure.vue',
787+
code: `
788+
<script setup lang="ts">
789+
const {foo, bar, baz} = defineProps<{foo?: number; bar: number; baz?: string}>()
790+
</script>
791+
`,
792+
languageOptions: {
793+
parser: require('vue-eslint-parser'),
794+
...languageOptions,
795+
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
796+
},
797+
errors: [
798+
{
799+
message: "Prop 'foo' requires default value to be set.",
800+
line: 3
801+
},
802+
{
803+
message: "Prop 'baz' requires default value to be set.",
804+
line: 3
805+
}
806+
]
748807
}
749808
]
750809
})

0 commit comments

Comments
 (0)