From 1dda6e0858982520f398d036eaba30daf9871cd8 Mon Sep 17 00:00:00 2001
From: yuasa <99948866+yuasa-engineer@users.noreply.github.com>
Date: Tue, 24 Jun 2025 16:27:26 +0900
Subject: [PATCH 1/2] 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
---
lib/rules/require-default-prop.js | 13 ++++++
tests/lib/rules/require-default-prop.js | 59 +++++++++++++++++++++++++
2 files changed, 72 insertions(+)
diff --git a/lib/rules/require-default-prop.js b/lib/rules/require-default-prop.js
index acceacf08..775295499 100644
--- a/lib/rules/require-default-prop.js
+++ b/lib/rules/require-default-prop.js
@@ -207,6 +207,19 @@ module.exports = {
if (defaultsByWithDefaults[prop.propName]) {
return true
}
+ // If using props destructure and this is an optional prop that is NOT included
+ // in the destructure pattern, exclude it from the report
+ if (
+ isUsingPropsDestructure &&
+ !prop.required &&
+ prop.propName != null
+ ) {
+ const destructuredProps = utils.getPropsDestructure(node)
+ if (!destructuredProps[prop.propName]) {
+ // Optional prop is not destructured, so no default value is needed
+ return true
+ }
+ }
}
if (!isUsingPropsDestructure) {
return false
diff --git a/tests/lib/rules/require-default-prop.js b/tests/lib/rules/require-default-prop.js
index 43160dfda..2430ade0d 100644
--- a/tests/lib/rules/require-default-prop.js
+++ b/tests/lib/rules/require-default-prop.js
@@ -413,6 +413,40 @@ ruleTester.run('require-default-prop', rule, {
...languageOptions,
parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
}
+ },
+ // Optional props that are not destructured should not require default values
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions,
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ }
+ },
+ {
+ filename: 'test.vue',
+ code: `
+
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions,
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ }
}
],
@@ -728,6 +762,7 @@ ruleTester.run('require-default-prop', rule, {
},
{
// https://github.com/vuejs/eslint-plugin-vue/issues/2725
+ // Optional props that ARE destructured should still require default values
filename: 'type-with-props-destructure.vue',
code: `
+ `,
+ languageOptions: {
+ parser: require('vue-eslint-parser'),
+ ...languageOptions,
+ parserOptions: { parser: require.resolve('@typescript-eslint/parser') }
+ },
+ errors: [
+ {
+ message: "Prop 'foo' requires default value to be set.",
+ line: 3
+ },
+ {
+ message: "Prop 'baz' requires default value to be set.",
+ line: 3
+ }
+ ]
}
]
})
From 88b94f2fdecd862dc57cb594d99edd7e1eb7602d Mon Sep 17 00:00:00 2001
From: yuasa <99948866+yuasa-engineer@users.noreply.github.com>
Date: Tue, 24 Jun 2025 16:48:51 +0900
Subject: [PATCH 2/2] chore: add changeset for require-default-prop fix
---
.changeset/wise-bugs-peel.md | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 .changeset/wise-bugs-peel.md
diff --git a/.changeset/wise-bugs-peel.md b/.changeset/wise-bugs-peel.md
new file mode 100644
index 000000000..168531e14
--- /dev/null
+++ b/.changeset/wise-bugs-peel.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-vue': patch
+---
+
+[vue/require-default-prop](https://eslint.vuejs.org/rules/require-default-prop.html) now ignores optional props that are not included in Vue 3.5 props destructuring pattern.