@@ -8,18 +8,27 @@ const utils = require('../utils')
88
99/**
1010 * @typedef {import('../utils').ComponentProp } ComponentProp
11+ * @typedef {import('../utils').ComponentObjectProp } ComponentObjectProp
1112 */
1213
1314/**
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 }
1525 */
1626function isBooleanProp ( prop ) {
27+ const value = utils . skipTSAsExpression ( prop . value )
1728 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 ) )
2332 )
2433}
2534
@@ -55,40 +64,40 @@ module.exports = {
5564 const booleanType = context . options [ 0 ] || 'no-default'
5665 /**
5766 * @param {ComponentProp } prop
58- * @param { { [key : string]: Expression | undefined } } [withDefaultsExpressions]
67+ * @param {(propName : string) => Expression[] } otherDefaultProvider
5968 */
60- function processProp ( prop , withDefaultsExpressions ) {
69+ function processProp ( prop , otherDefaultProvider ) {
6170 if ( prop . type === 'object' ) {
62- if ( prop . value . type !== 'ObjectExpression' ) {
71+ if ( ! isBooleanProp ( prop ) ) {
6372 return
6473 }
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+ }
6779 }
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+ }
7184 }
72- verifyDefaultExpression ( defaultNode . value )
7385 } else if ( prop . type === 'type' ) {
7486 if ( prop . types . length !== 1 || prop . types [ 0 ] !== 'Boolean' ) {
7587 return
7688 }
77- const defaultNode =
78- withDefaultsExpressions && withDefaultsExpressions [ prop . propName ]
79- if ( ! defaultNode ) {
80- return
89+ for ( const defaultNode of otherDefaultProvider ( prop . propName ) ) {
90+ verifyDefaultExpression ( defaultNode )
8191 }
82- verifyDefaultExpression ( defaultNode )
8392 }
8493 }
8594 /**
8695 * @param {ComponentProp[] } props
87- * @param { { [key : string]: Expression | undefined } } [withDefaultsExpressions]
96+ * @param {(propName : string) => Expression[] } otherDefaultProvider
8897 */
89- function processProps ( props , withDefaultsExpressions ) {
98+ function processProps ( props , otherDefaultProvider ) {
9099 for ( const prop of props ) {
91- processProp ( prop , withDefaultsExpressions )
100+ processProp ( prop , otherDefaultProvider )
92101 }
93102 }
94103
@@ -118,11 +127,20 @@ module.exports = {
118127 }
119128 return utils . compositingVisitors (
120129 utils . executeOnVueComponent ( context , ( obj ) => {
121- processProps ( utils . getComponentPropsFromOptions ( obj ) )
130+ processProps ( utils . getComponentPropsFromOptions ( obj ) , ( ) => [ ] )
122131 } ) ,
123132 utils . defineScriptSetupVisitor ( context , {
124133 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+ )
126144 }
127145 } )
128146 )
0 commit comments