@@ -11,7 +11,9 @@ const { inferRuntimeTypeFromTypeNode } = require('./ts-types')
11
11
*/
12
12
/**
13
13
* @typedef {import('../index').ComponentTypeProp } ComponentTypeProp
14
+ * @typedef {import('../index').ComponentUnknownProp } ComponentUnknownProp
14
15
* @typedef {import('../index').ComponentTypeEmit } ComponentTypeEmit
16
+ * @typedef {import('../index').ComponentUnknownEmit } ComponentUnknownEmit
15
17
*/
16
18
17
19
const noop = Function . prototype
@@ -122,57 +124,87 @@ function isTSTypeLiteralOrTSFunctionType(node) {
122
124
* @see https://github.com/vuejs/vue-next/blob/253ca2729d808fc051215876aa4af986e4caa43c/packages/compiler-sfc/src/compileScript.ts#L1512
123
125
* @param {RuleContext } context The ESLint rule context object.
124
126
* @param {TSESTreeTSTypeLiteral | TSESTreeTSInterfaceBody } node
125
- * @returns {IterableIterator<ComponentTypeProp> }
127
+ * @returns {IterableIterator<ComponentTypeProp | ComponentUnknownProp > }
126
128
*/
127
129
function * extractRuntimeProps ( context , node ) {
128
130
const members = node . type === 'TSTypeLiteral' ? node . members : node . body
129
- for ( const m of members ) {
131
+ for ( const member of members ) {
130
132
if (
131
- ( m . type === 'TSPropertySignature' || m . type === 'TSMethodSignature' ) &&
132
- ( m . key . type === 'Identifier' || m . key . type === 'Literal' )
133
+ member . type === 'TSPropertySignature' ||
134
+ member . type === 'TSMethodSignature'
133
135
) {
136
+ if ( member . key . type !== 'Identifier' && member . key . type !== 'Literal' ) {
137
+ yield {
138
+ type : 'unknown' ,
139
+ propName : null ,
140
+ node : /** @type {Expression } */ ( member . key )
141
+ }
142
+ continue
143
+ }
134
144
/** @type {string[]|undefined } */
135
145
let types
136
- if ( m . type === 'TSMethodSignature' ) {
146
+ if ( member . type === 'TSMethodSignature' ) {
137
147
types = [ 'Function' ]
138
- } else if ( m . typeAnnotation ) {
139
- types = inferRuntimeType ( context , m . typeAnnotation . typeAnnotation )
148
+ } else if ( member . typeAnnotation ) {
149
+ types = inferRuntimeType ( context , member . typeAnnotation . typeAnnotation )
140
150
}
141
151
yield {
142
152
type : 'type' ,
143
- key : /** @type {Identifier | Literal } */ ( m . key ) ,
144
- propName : m . key . type === 'Identifier' ? m . key . name : `${ m . key . value } ` ,
145
- node : /** @type {TSPropertySignature | TSMethodSignature } */ ( m ) ,
153
+ key : /** @type {Identifier | Literal } */ ( member . key ) ,
154
+ propName :
155
+ member . key . type === 'Identifier'
156
+ ? member . key . name
157
+ : `${ member . key . value } ` ,
158
+ node : /** @type {TSPropertySignature | TSMethodSignature } */ ( member ) ,
146
159
147
- required : ! m . optional ,
160
+ required : ! member . optional ,
148
161
types : types || [ `null` ]
149
162
}
150
163
}
151
164
}
152
165
}
153
166
154
167
/**
155
- * @see https://github.com/vuejs/vue-next/blob/348c3b01e56383ffa70b180d1376fdf4ac12e274/packages/compiler-sfc/src/compileScript.ts#L1632
156
168
* @param {TSESTreeTSTypeLiteral | TSESTreeTSInterfaceBody | TSESTreeTSFunctionType } node
157
- * @returns {IterableIterator<ComponentTypeEmit> }
169
+ * @returns {IterableIterator<ComponentTypeEmit | ComponentUnknownEmit > }
158
170
*/
159
171
function * extractRuntimeEmits ( node ) {
160
- if ( node . type === 'TSTypeLiteral' || node . type === 'TSInterfaceBody' ) {
161
- const members = node . type === 'TSTypeLiteral' ? node . members : node . body
162
- for ( const t of members ) {
163
- if ( t . type === 'TSCallSignatureDeclaration' ) {
164
- yield * extractEventNames (
165
- t . params [ 0 ] ,
166
- /** @type {TSCallSignatureDeclaration } */ ( t )
167
- )
168
- }
169
- }
170
- return
171
- } else {
172
+ if ( node . type === 'TSFunctionType' ) {
172
173
yield * extractEventNames (
173
174
node . params [ 0 ] ,
174
175
/** @type {TSFunctionType } */ ( node )
175
176
)
177
+ return
178
+ }
179
+ const members = node . type === 'TSTypeLiteral' ? node . members : node . body
180
+ for ( const member of members ) {
181
+ if ( member . type === 'TSCallSignatureDeclaration' ) {
182
+ yield * extractEventNames (
183
+ member . params [ 0 ] ,
184
+ /** @type {TSCallSignatureDeclaration } */ ( member )
185
+ )
186
+ } else if (
187
+ member . type === 'TSPropertySignature' ||
188
+ member . type === 'TSMethodSignature'
189
+ ) {
190
+ if ( member . key . type !== 'Identifier' && member . key . type !== 'Literal' ) {
191
+ yield {
192
+ type : 'unknown' ,
193
+ emitName : null ,
194
+ node : /** @type {Expression } */ ( member . key )
195
+ }
196
+ continue
197
+ }
198
+ yield {
199
+ type : 'type' ,
200
+ key : /** @type {Identifier | Literal } */ ( member . key ) ,
201
+ emitName :
202
+ member . key . type === 'Identifier'
203
+ ? member . key . name
204
+ : `${ member . key . value } ` ,
205
+ node : /** @type {TSPropertySignature | TSMethodSignature } */ ( member )
206
+ }
207
+ }
176
208
}
177
209
}
178
210
0 commit comments