@@ -47,9 +47,6 @@ function getComponentPropData(prop, sourceCode) {
47
47
throw new Error ( `Unexpected prop type: ${ prop . type } .` )
48
48
}
49
49
const type = optionGetType ( prop . value , sourceCode )
50
- if ( type === null ) {
51
- throw new Error ( `Unable to read prop type` )
52
- }
53
50
const required = optionGetRequired ( prop . value )
54
51
const defaultValue = optionGetDefault ( prop . value )
55
52
@@ -64,7 +61,7 @@ function getComponentPropData(prop, sourceCode) {
64
61
/**
65
62
* @param {Expression } node
66
63
* @param {SourceCode } sourceCode
67
- * @returns {string | null }
64
+ * @returns {string }
68
65
*/
69
66
function optionGetType ( node , sourceCode ) {
70
67
switch ( node . type ) {
@@ -74,7 +71,7 @@ function optionGetType(node, sourceCode) {
74
71
case 'ObjectExpression' : {
75
72
const typeProperty = utils . findProperty ( node , 'type' )
76
73
if ( typeProperty == null ) {
77
- return null
74
+ return sourceCode . getText ( node )
78
75
}
79
76
return optionGetType ( typeProperty . value , sourceCode )
80
77
}
@@ -83,7 +80,7 @@ function optionGetType(node, sourceCode) {
83
80
. map ( ( element ) => {
84
81
// TODO handle SpreadElement
85
82
if ( element === null || element . type === 'SpreadElement' ) {
86
- return null
83
+ return sourceCode . getText ( node )
87
84
}
88
85
89
86
return optionGetType ( element , sourceCode )
@@ -94,7 +91,7 @@ function optionGetType(node, sourceCode) {
94
91
case 'TSAsExpression' : {
95
92
const typeAnnotation = node . typeAnnotation
96
93
if ( typeAnnotation . typeName . name !== 'PropType' ) {
97
- return null
94
+ return sourceCode . getText ( node )
98
95
}
99
96
100
97
// in some project configuration parser populates deprecated field `typeParameters` instead of `typeArguments`
@@ -108,20 +105,15 @@ function optionGetType(node, sourceCode) {
108
105
: typeArguments . params [ 0 ]
109
106
110
107
if ( typeArgument === undefined ) {
111
- return null
108
+ return sourceCode . getText ( node )
112
109
}
113
110
114
111
return sourceCode . getText ( typeArgument )
115
112
}
116
-
117
- case 'FunctionExpression' :
118
- case 'ArrowFunctionExpression' : {
119
- return null
113
+ default : {
114
+ return sourceCode . getText ( node )
120
115
}
121
116
}
122
-
123
- // Unknown
124
- return null
125
117
}
126
118
127
119
/**
@@ -215,55 +207,66 @@ module.exports = {
215
207
node,
216
208
messageId : 'hasArg' ,
217
209
* fix ( fixer ) {
218
- const propTypes = props . map ( ( prop ) =>
219
- getComponentPropData ( prop , sourceCode )
220
- )
221
-
222
- const definePropsType = `{ ${ propTypes
223
- . map (
224
- ( { name, type, required, defaultValue } ) =>
225
- `${ name } ${
226
- required === false || defaultValue ? '?' : ''
227
- } : ${ type } `
210
+ try {
211
+ const propTypes = props . map ( ( prop ) =>
212
+ getComponentPropData ( prop , sourceCode )
228
213
)
229
- . join ( ', ' ) } }`
230
214
231
- // remove defineProps function parameters
232
- yield fixer . replaceText ( node . arguments [ 0 ] , '' )
215
+ const definePropsType = `{ ${ propTypes
216
+ . map (
217
+ ( { name, type, required, defaultValue } ) =>
218
+ `${ name } ${
219
+ required === false || defaultValue ? '?' : ''
220
+ } : ${ type } `
221
+ )
222
+ . join ( ', ' ) } }`
223
+
224
+ // remove defineProps function parameters
225
+ yield fixer . replaceText ( node . arguments [ 0 ] , '' )
233
226
234
- // add type annotation
235
- if ( separateInterface ) {
236
- const variableDeclarationNode = node . parent . parent
237
- if ( ! variableDeclarationNode ) {
238
- return
227
+ // add type annotation
228
+ if ( separateInterface ) {
229
+ const variableDeclarationNode = node . parent . parent
230
+ if ( ! variableDeclarationNode ) {
231
+ return
232
+ }
233
+
234
+ yield fixer . insertTextBefore (
235
+ variableDeclarationNode ,
236
+ `interface Props ${ definePropsType . replace (
237
+ / ; / g,
238
+ ','
239
+ ) } ; `
240
+ )
241
+ yield fixer . insertTextAfter ( node . callee , `<Props>` )
242
+ } else {
243
+ yield fixer . insertTextAfter (
244
+ node . callee ,
245
+ `<${ definePropsType } >`
246
+ )
239
247
}
240
248
241
- yield fixer . insertTextBefore (
242
- variableDeclarationNode ,
243
- `interface Props ${ definePropsType . replace ( / ; / g, ',' ) } ; `
244
- )
245
- yield fixer . insertTextAfter ( node . callee , `<Props>` )
246
- } else {
247
- yield fixer . insertTextAfter (
248
- node . callee ,
249
- `<${ definePropsType } >`
249
+ // add defaults if needed
250
+ const defaults = propTypes . filter (
251
+ ( { defaultValue } ) => defaultValue
250
252
)
251
- }
253
+ if ( defaults . length > 0 ) {
254
+ const defaultsCode = defaults
255
+ . map (
256
+ ( { name, defaultValue } ) =>
257
+ `${ name } : ${ sourceCode . getText ( defaultValue ) } `
258
+ )
259
+ . join ( ', ' )
252
260
253
- // add defaults if needed
254
- const defaults = propTypes . filter (
255
- ( { defaultValue } ) => defaultValue
256
- )
257
- if ( defaults . length > 0 ) {
258
- const defaultsCode = defaults
259
- . map (
260
- ( { name, defaultValue } ) =>
261
- `${ name } : ${ sourceCode . getText ( defaultValue ) } `
261
+ yield fixer . insertTextBefore ( node , `withDefaults(` )
262
+ yield fixer . insertTextAfter (
263
+ node ,
264
+ `, { ${ defaultsCode } })`
262
265
)
263
- . join ( ', ' )
264
-
265
- yield fixer . insertTextBefore ( node , `withDefaults(` )
266
- yield fixer . insertTextAfter ( node , `, { ${ defaultsCode } })` )
266
+ }
267
+ return null
268
+ } catch ( error ) {
269
+ return null
267
270
}
268
271
}
269
272
} )
0 commit comments