Skip to content

Commit 8672712

Browse files
authored
Fix false positives for type-only defineProps in vue/require-default-prop rule (#1592)
* Fix false positives for type-only defineProps in `vue/require-default-prop` rule * fix test
1 parent 476b444 commit 8672712

File tree

3 files changed

+67
-10
lines changed

3 files changed

+67
-10
lines changed

Diff for: lib/rules/require-default-prop.js

+6
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,12 @@ module.exports = {
175175
withDefaults &&
176176
withDefaultsExpressions
177177
) {
178+
if (prop.required) {
179+
continue
180+
}
181+
if (prop.types.length === 1 && prop.types[0] === 'Boolean') {
182+
continue
183+
}
178184
if (!withDefaultsExpressions[prop.propName]) {
179185
context.report({
180186
node: prop.node,

Diff for: tests/lib/rules/require-default-prop.js

+51-4
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ ruleTester.run('require-default-prop', rule, {
235235
code: `
236236
<script setup lang="ts">
237237
interface Props {
238-
foo: number
238+
foo?: number
239239
}
240240
defineProps<Props>()
241241
</script>
@@ -251,7 +251,7 @@ ruleTester.run('require-default-prop', rule, {
251251
code: `
252252
<script setup lang="ts">
253253
interface Props {
254-
foo: number
254+
foo?: number
255255
}
256256
withDefaults(defineProps<Props>(), {foo:42})
257257
</script>
@@ -267,7 +267,7 @@ ruleTester.run('require-default-prop', rule, {
267267
code: `
268268
<script setup lang="ts">
269269
interface Props {
270-
foo: number
270+
foo?: number
271271
}
272272
defineProps<Props>({
273273
foo:{
@@ -281,6 +281,53 @@ ruleTester.run('require-default-prop', rule, {
281281
...parserOptions,
282282
parser: require.resolve('@typescript-eslint/parser')
283283
}
284+
},
285+
{
286+
// https://github.com/vuejs/eslint-plugin-vue/issues/1591
287+
filename: 'test.vue',
288+
code: `
289+
<template>
290+
<div>
291+
{{ required }}
292+
{{ optional }}
293+
</div>
294+
</template>
295+
296+
<script setup lang="ts">
297+
import { defineProps, withDefaults } from 'vue';
298+
299+
interface Props {
300+
required: boolean;
301+
optional?: boolean;
302+
}
303+
304+
const props = withDefaults(defineProps<Props>(), {
305+
optional: false,
306+
});
307+
</script>
308+
`,
309+
parser: require.resolve('vue-eslint-parser'),
310+
parserOptions: {
311+
...parserOptions,
312+
parser: require.resolve('@typescript-eslint/parser')
313+
}
314+
},
315+
{
316+
filename: 'test.vue',
317+
code: `
318+
<script setup lang="ts">
319+
interface Props {
320+
optional?: boolean;
321+
}
322+
323+
const props = defineProps<Props>();
324+
</script>
325+
`,
326+
parser: require.resolve('vue-eslint-parser'),
327+
parserOptions: {
328+
...parserOptions,
329+
parser: require.resolve('@typescript-eslint/parser')
330+
}
284331
}
285332
],
286333

@@ -503,7 +550,7 @@ ruleTester.run('require-default-prop', rule, {
503550
code: `
504551
<script setup lang="ts">
505552
interface Props {
506-
foo: number
553+
foo?: number
507554
}
508555
withDefaults(defineProps<Props>(), {bar:42})
509556
</script>

Diff for: tests/lib/utils/index.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
'use strict'
22

3-
const babelEslint = require('babel-eslint')
43
const espree = require('espree')
54
const utils = require('../../../lib/utils/index')
65
const assert = require('assert')
76

87
describe('getComputedProperties', () => {
98
const parse = function (code) {
10-
return babelEslint.parse(code).body[0].declarations[0].init
9+
return espree.parse(code, { ecmaVersion: 2020 }).body[0].declarations[0]
10+
.init
1111
}
1212

1313
it('should return empty array when there is no computed property', () => {
@@ -112,7 +112,8 @@ describe('getComputedProperties', () => {
112112

113113
describe('getStaticPropertyName', () => {
114114
const parse = function (code) {
115-
return babelEslint.parse(code).body[0].declarations[0].init
115+
return espree.parse(code, { ecmaVersion: 2020 }).body[0].declarations[0]
116+
.init
116117
}
117118

118119
it('should parse property expression with identifier', () => {
@@ -137,7 +138,8 @@ describe('getStaticPropertyName', () => {
137138

138139
describe('getStringLiteralValue', () => {
139140
const parse = function (code) {
140-
return babelEslint.parse(code).body[0].declarations[0].init
141+
return espree.parse(code, { ecmaVersion: 2020 }).body[0].declarations[0]
142+
.init
141143
}
142144

143145
it('should parse literal', () => {
@@ -275,7 +277,8 @@ describe('getMemberChaining', () => {
275277

276278
describe('getRegisteredComponents', () => {
277279
const parse = function (code) {
278-
return babelEslint.parse(code).body[0].declarations[0].init
280+
return espree.parse(code, { ecmaVersion: 2020 }).body[0].declarations[0]
281+
.init
279282
}
280283

281284
it('should return empty array when there are no components registered', () => {
@@ -335,7 +338,8 @@ describe('getRegisteredComponents', () => {
335338

336339
describe('getComponentProps', () => {
337340
const parse = function (code) {
338-
const data = babelEslint.parse(code).body[0].declarations[0].init
341+
const data = espree.parse(code, { ecmaVersion: 2020 }).body[0]
342+
.declarations[0].init
339343
return utils.getComponentProps(data)
340344
}
341345

0 commit comments

Comments
 (0)