@@ -8,18 +8,27 @@ const utils = require('../utils')
8
8
9
9
/**
10
10
* @typedef {import('../utils').ComponentProp } ComponentProp
11
+ * @typedef {import('../utils').ComponentObjectProp } ComponentObjectProp
11
12
*/
12
13
13
14
/**
14
- * @param {Property | SpreadElement } prop
15
+ * @param {Expression|undefined } node
16
+ */
17
+ function isBooleanIdentifier ( node ) {
18
+ return Boolean ( node && node . type === 'Identifier' && node . name === 'Boolean' )
19
+ }
20
+
21
+ /**
22
+ * Detects whether given prop node is a Boolean
23
+ * @param {ComponentObjectProp } prop
24
+ * @return {Boolean }
15
25
*/
16
26
function isBooleanProp ( prop ) {
27
+ const value = utils . skipTSAsExpression ( prop . value )
17
28
return (
18
- prop . type === 'Property' &&
19
- prop . key . type === 'Identifier' &&
20
- prop . key . name === 'type' &&
21
- prop . value . type === 'Identifier' &&
22
- prop . value . name === 'Boolean'
29
+ isBooleanIdentifier ( value ) ||
30
+ ( value . type === 'ObjectExpression' &&
31
+ isBooleanIdentifier ( utils . findProperty ( value , 'type' ) ?. value ) )
23
32
)
24
33
}
25
34
@@ -55,40 +64,40 @@ module.exports = {
55
64
const booleanType = context . options [ 0 ] || 'no-default'
56
65
/**
57
66
* @param {ComponentProp } prop
58
- * @param { { [key : string]: Expression | undefined } } [withDefaultsExpressions]
67
+ * @param {(propName : string) => Expression[] } otherDefaultProvider
59
68
*/
60
- function processProp ( prop , withDefaultsExpressions ) {
69
+ function processProp ( prop , otherDefaultProvider ) {
61
70
if ( prop . type === 'object' ) {
62
- if ( prop . value . type !== 'ObjectExpression' ) {
71
+ if ( ! isBooleanProp ( prop ) ) {
63
72
return
64
73
}
65
- if ( ! prop . value . properties . some ( isBooleanProp ) ) {
66
- return
74
+ if ( prop . value . type === 'ObjectExpression' ) {
75
+ const defaultNode = getDefaultNode ( prop . value )
76
+ if ( defaultNode ) {
77
+ verifyDefaultExpression ( defaultNode . value )
78
+ }
67
79
}
68
- const defaultNode = getDefaultNode ( prop . value )
69
- if ( ! defaultNode ) {
70
- return
80
+ if ( prop . propName != null ) {
81
+ for ( const defaultNode of otherDefaultProvider ( prop . propName ) ) {
82
+ verifyDefaultExpression ( defaultNode )
83
+ }
71
84
}
72
- verifyDefaultExpression ( defaultNode . value )
73
85
} else if ( prop . type === 'type' ) {
74
86
if ( prop . types . length !== 1 || prop . types [ 0 ] !== 'Boolean' ) {
75
87
return
76
88
}
77
- const defaultNode =
78
- withDefaultsExpressions && withDefaultsExpressions [ prop . propName ]
79
- if ( ! defaultNode ) {
80
- return
89
+ for ( const defaultNode of otherDefaultProvider ( prop . propName ) ) {
90
+ verifyDefaultExpression ( defaultNode )
81
91
}
82
- verifyDefaultExpression ( defaultNode )
83
92
}
84
93
}
85
94
/**
86
95
* @param {ComponentProp[] } props
87
- * @param { { [key : string]: Expression | undefined } } [withDefaultsExpressions]
96
+ * @param {(propName : string) => Expression[] } otherDefaultProvider
88
97
*/
89
- function processProps ( props , withDefaultsExpressions ) {
98
+ function processProps ( props , otherDefaultProvider ) {
90
99
for ( const prop of props ) {
91
- processProp ( prop , withDefaultsExpressions )
100
+ processProp ( prop , otherDefaultProvider )
92
101
}
93
102
}
94
103
@@ -118,11 +127,20 @@ module.exports = {
118
127
}
119
128
return utils . compositingVisitors (
120
129
utils . executeOnVueComponent ( context , ( obj ) => {
121
- processProps ( utils . getComponentPropsFromOptions ( obj ) )
130
+ processProps ( utils . getComponentPropsFromOptions ( obj ) , ( ) => [ ] )
122
131
} ) ,
123
132
utils . defineScriptSetupVisitor ( context , {
124
133
onDefinePropsEnter ( node , props ) {
125
- processProps ( props , utils . getWithDefaultsPropExpressions ( node ) )
134
+ const defaultsByWithDefaults =
135
+ utils . getWithDefaultsPropExpressions ( node )
136
+ const defaultsByAssignmentPatterns =
137
+ utils . getDefaultPropExpressionsForPropsDestructure ( node )
138
+ processProps ( props , ( propName ) =>
139
+ [
140
+ defaultsByWithDefaults [ propName ] ,
141
+ defaultsByAssignmentPatterns [ propName ] ?. expression
142
+ ] . filter ( utils . isDef )
143
+ )
126
144
}
127
145
} )
128
146
)
0 commit comments