Skip to content

Commit 1c597a8

Browse files
committed
require-default-prop:
* fix issue #596 * allow to use shorthand
1 parent 67e6ced commit 1c597a8

File tree

2 files changed

+34
-19
lines changed

2 files changed

+34
-19
lines changed

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

+22-19
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@
66

77
const utils = require('../utils')
88

9+
const NATIVE_TYPES = new Set([
10+
'String',
11+
'Number',
12+
'Boolean',
13+
'Function',
14+
'Object',
15+
'Array',
16+
'Symbol'
17+
])
18+
919
// ------------------------------------------------------------------------------
1020
// Rule Definition
1121
// ------------------------------------------------------------------------------
@@ -32,7 +42,7 @@ module.exports = {
3242
* @return {boolean}
3343
*/
3444
function propIsRequired (prop) {
35-
const propRequiredNode = utils.unwrapTypes(prop.value).properties
45+
const propRequiredNode = prop.value.properties
3646
.find(p =>
3747
p.type === 'Property' &&
3848
p.key.name === 'required' &&
@@ -49,7 +59,7 @@ module.exports = {
4959
* @return {boolean}
5060
*/
5161
function propHasDefault (prop) {
52-
const propDefaultNode = utils.unwrapTypes(prop.value).properties
62+
const propDefaultNode = prop.value.properties
5363
.find(p =>
5464
p.key &&
5565
(p.key.name === 'default' || p.key.value === 'default')
@@ -60,15 +70,14 @@ module.exports = {
6070

6171
/**
6272
* Finds all props that don't have a default value set
63-
* @param {Property} propsNode - Vue component's "props" node
73+
* @param {Array} props - Vue component's "props" node
6474
* @return {Array} Array of props without "default" value
6575
*/
66-
function findPropsWithoutDefaultValue (propsNode) {
67-
return propsNode.value.properties
68-
.filter(prop => prop.type === 'Property')
76+
function findPropsWithoutDefaultValue (props) {
77+
return props
6978
.filter(prop => {
70-
if (utils.unwrapTypes(prop.value).type !== 'ObjectExpression') {
71-
return true
79+
if (prop.value.type !== 'ObjectExpression') {
80+
return (prop.value.type !== 'CallExpression' && prop.value.type !== 'Identifier') || NATIVE_TYPES.has(prop.value.name)
7281
}
7382

7483
return !propIsRequired(prop) && !propHasDefault(prop)
@@ -124,22 +133,16 @@ module.exports = {
124133
// ----------------------------------------------------------------------
125134

126135
return utils.executeOnVue(context, (obj) => {
127-
const propsNode = obj.properties
128-
.find(p =>
129-
p.type === 'Property' &&
130-
p.key.type === 'Identifier' &&
131-
p.key.name === 'props' &&
132-
p.value.type === 'ObjectExpression'
133-
)
134-
135-
if (!propsNode) return
136+
const props = utils.getPropsProperties(obj)
137+
.props
138+
.filter(prop => prop.value && !prop.node.shorthand)
136139

137-
const propsWithoutDefault = findPropsWithoutDefaultValue(propsNode)
140+
const propsWithoutDefault = findPropsWithoutDefaultValue(props)
138141
const propsToReport = excludeBooleanProps(propsWithoutDefault)
139142

140143
for (const prop of propsToReport) {
141144
context.report({
142-
node: prop,
145+
node: prop.node,
143146
message: `Prop '{{propName}}' requires default value to be set.`,
144147
data: {
145148
propName: prop.key.name

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

+12
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,18 @@ ruleTester.run('require-default-prop', rule, {
141141
});
142142
`,
143143
parser: 'typescript-eslint-parser'
144+
},
145+
{
146+
filename: 'test.vue',
147+
code: `
148+
export default {
149+
props: {
150+
bar,
151+
baz: prop,
152+
bar1: foo()
153+
}
154+
}
155+
`
144156
}
145157
],
146158

0 commit comments

Comments
 (0)