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.