@@ -62,6 +62,7 @@ module.exports = {
6262 /** @param {RuleContext } context */
6363 create ( context ) {
6464 const sourceCode = context . getSourceCode ( )
65+
6566 /**
6667 * @param {Expression } node
6768 * @returns {string | null }
@@ -131,6 +132,24 @@ module.exports = {
131132 return undefined
132133 }
133134
135+ /**
136+ * @param {Expression } node
137+ * @returns {Expression | undefined }
138+ */
139+ function optionGetDefault ( node ) {
140+ if ( node . type === 'ObjectExpression' ) {
141+ const defaultProperty = utils . findProperty ( node , 'default' )
142+ if ( defaultProperty == null ) {
143+ return undefined
144+ }
145+
146+ return defaultProperty . value
147+ }
148+
149+ // Unknown
150+ return undefined
151+ }
152+
134153 const scriptSetup = utils . getScriptSetupElement ( context )
135154 if ( ! scriptSetup || ! utils . hasAttribute ( scriptSetup , 'lang' , 'ts' ) ) {
136155 return { }
@@ -147,7 +166,12 @@ module.exports = {
147166 messageId : 'hasArg' ,
148167 * fix ( fixer ) {
149168 const propTypes = props . map ( ( prop ) => {
150- const unknownType = { name : prop . propName , type : 'unknown' , required : undefined }
169+ const unknownType = {
170+ name : prop . propName ,
171+ type : 'unknown' ,
172+ required : undefined ,
173+ defaultValue : undefined
174+ }
151175
152176 if ( prop . type !== 'object' ) {
153177 return unknownType
@@ -157,26 +181,42 @@ module.exports = {
157181 return unknownType
158182 }
159183 const required = optionGetRequired ( prop . value )
184+ const defaultValue = optionGetDefault ( prop . value )
160185
161186 return {
162187 name : prop . propName ,
163188 type : mapNativeType ( type ) ,
164- required
189+ required,
190+ defaultValue
165191 }
166192 } )
167193
168194 const definePropsType = `{ ${ propTypes
169195 . map (
170- ( { name, type, required } ) =>
171- `${ name } ${ required === false ? '?' : '' } : ${ type } `
196+ ( { name, type, required, defaultValue } ) =>
197+ `${ name } ${ ( required === false || defaultValue ) ? '?' : '' } : ${ type } `
172198 )
173199 . join ( ', ' ) } }`
174200
201+ yield fixer . replaceText ( node . arguments [ 0 ] , '' )
175202 yield fixer . insertTextAfter (
176203 node . callee ,
177204 `<${ definePropsType } >`
178205 )
179- yield fixer . replaceText ( node . arguments [ 0 ] , '' )
206+ const defaults = propTypes . filter (
207+ ( { defaultValue } ) => defaultValue
208+ )
209+ if ( defaults . length > 0 ) {
210+ const defaultsCode = defaults
211+ . map (
212+ ( { name, defaultValue } ) =>
213+ `${ name } : ${ sourceCode . getText ( defaultValue ) } `
214+ )
215+ . join ( ', ' )
216+
217+ yield fixer . insertTextBefore ( node , `withDefaults(` )
218+ yield fixer . insertTextAfter ( node , `, { ${ defaultsCode } })` )
219+ }
180220 }
181221 } )
182222 }
0 commit comments