@@ -62,6 +62,7 @@ module.exports = {
62
62
/** @param {RuleContext } context */
63
63
create ( context ) {
64
64
const sourceCode = context . getSourceCode ( )
65
+
65
66
/**
66
67
* @param {Expression } node
67
68
* @returns {string | null }
@@ -131,6 +132,24 @@ module.exports = {
131
132
return undefined
132
133
}
133
134
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
+
134
153
const scriptSetup = utils . getScriptSetupElement ( context )
135
154
if ( ! scriptSetup || ! utils . hasAttribute ( scriptSetup , 'lang' , 'ts' ) ) {
136
155
return { }
@@ -147,7 +166,12 @@ module.exports = {
147
166
messageId : 'hasArg' ,
148
167
* fix ( fixer ) {
149
168
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
+ }
151
175
152
176
if ( prop . type !== 'object' ) {
153
177
return unknownType
@@ -157,26 +181,42 @@ module.exports = {
157
181
return unknownType
158
182
}
159
183
const required = optionGetRequired ( prop . value )
184
+ const defaultValue = optionGetDefault ( prop . value )
160
185
161
186
return {
162
187
name : prop . propName ,
163
188
type : mapNativeType ( type ) ,
164
- required
189
+ required,
190
+ defaultValue
165
191
}
166
192
} )
167
193
168
194
const definePropsType = `{ ${ propTypes
169
195
. map (
170
- ( { name, type, required } ) =>
171
- `${ name } ${ required === false ? '?' : '' } : ${ type } `
196
+ ( { name, type, required, defaultValue } ) =>
197
+ `${ name } ${ ( required === false || defaultValue ) ? '?' : '' } : ${ type } `
172
198
)
173
199
. join ( ', ' ) } }`
174
200
201
+ yield fixer . replaceText ( node . arguments [ 0 ] , '' )
175
202
yield fixer . insertTextAfter (
176
203
node . callee ,
177
204
`<${ definePropsType } >`
178
205
)
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
+ }
180
220
}
181
221
} )
182
222
}
0 commit comments