@@ -1148,6 +1148,10 @@ module.exports = {
1148
1148
* - `onDefinePropsExit` ... Event when defineProps visit ends.
1149
1149
* - `onDefineEmitsEnter` ... Event when defineEmits is found.
1150
1150
* - `onDefineEmitsExit` ... Event when defineEmits visit ends.
1151
+ * - `onDefineOptionsEnter` ... Event when defineOptions is found.
1152
+ * - `onDefineOptionsExit` ... Event when defineOptions visit ends.
1153
+ * - `onDefineSlotsEnter` ... Event when defineSlots is found.
1154
+ * - `onDefineSlotsExit` ... Event when defineSlots visit ends.
1151
1155
*
1152
1156
* @param {RuleContext } context The ESLint rule context object.
1153
1157
* @param {ScriptSetupVisitor } visitor The visitor to traverse the AST nodes.
@@ -1186,11 +1190,58 @@ module.exports = {
1186
1190
scriptSetupVisitor [ key ] = ( node ) => callVisitor ( key , node )
1187
1191
}
1188
1192
1189
- const hasPropsEvent =
1190
- visitor . onDefinePropsEnter || visitor . onDefinePropsExit
1191
- const hasEmitsEvent =
1192
- visitor . onDefineEmitsEnter || visitor . onDefineEmitsExit
1193
- if ( hasPropsEvent || hasEmitsEvent ) {
1193
+ class MacroListener {
1194
+ /**
1195
+ * @param {string } name
1196
+ * @param {string } enterName
1197
+ * @param {string } exitName
1198
+ * @param {(candidateMacro: Expression | null, node: CallExpression) => boolean } isMacroNode
1199
+ * @param {(context: RuleContext, node: CallExpression) => unknown } buildParam
1200
+ */
1201
+ constructor ( name , enterName , exitName , isMacroNode , buildParam ) {
1202
+ this . name = name
1203
+ this . enterName = enterName
1204
+ this . exitName = exitName
1205
+ this . isMacroNode = isMacroNode
1206
+ this . buildParam = buildParam
1207
+ this . hasListener = Boolean (
1208
+ visitor [ this . enterName ] || visitor [ this . exitName ]
1209
+ )
1210
+ this . paramsMap = new Map ( )
1211
+ }
1212
+ }
1213
+ const macroListenerList = [
1214
+ new MacroListener (
1215
+ 'defineProps' ,
1216
+ 'onDefinePropsEnter' ,
1217
+ 'onDefinePropsExit' ,
1218
+ ( candidateMacro , node ) =>
1219
+ candidateMacro === node || candidateMacro === getWithDefaults ( node ) ,
1220
+ getComponentPropsFromDefineProps
1221
+ ) ,
1222
+ new MacroListener (
1223
+ 'defineEmits' ,
1224
+ 'onDefineEmitsEnter' ,
1225
+ 'onDefineEmitsExit' ,
1226
+ ( candidateMacro , node ) => candidateMacro === node ,
1227
+ getComponentEmitsFromDefineEmits
1228
+ ) ,
1229
+ new MacroListener (
1230
+ 'defineOptions' ,
1231
+ 'onDefineOptionsEnter' ,
1232
+ 'onDefineOptionsExit' ,
1233
+ ( candidateMacro , node ) => candidateMacro === node ,
1234
+ ( ) => undefined
1235
+ ) ,
1236
+ new MacroListener (
1237
+ 'defineSlots' ,
1238
+ 'onDefineSlotsEnter' ,
1239
+ 'onDefineSlotsExit' ,
1240
+ ( candidateMacro , node ) => candidateMacro === node ,
1241
+ ( ) => undefined
1242
+ )
1243
+ ] . filter ( ( m ) => m . hasListener )
1244
+ if ( macroListenerList . length > 0 ) {
1194
1245
/** @type {Expression | null } */
1195
1246
let candidateMacro = null
1196
1247
/** @param {VariableDeclarator|ExpressionStatement } node */
@@ -1213,8 +1264,6 @@ module.exports = {
1213
1264
candidateMacro = null
1214
1265
}
1215
1266
}
1216
- const definePropsMap = new Map ( )
1217
- const defineEmitsMap = new Map ( )
1218
1267
/**
1219
1268
* @param {CallExpression } node
1220
1269
*/
@@ -1224,40 +1273,32 @@ module.exports = {
1224
1273
inScriptSetup ( node ) &&
1225
1274
node . callee . type === 'Identifier'
1226
1275
) {
1227
- if (
1228
- hasPropsEvent &&
1229
- ( candidateMacro === node ||
1230
- candidateMacro === getWithDefaults ( node ) ) &&
1231
- node . callee . name === 'defineProps'
1232
- ) {
1233
- /** @type {ComponentProp[] } */
1234
- const props = getComponentPropsFromDefineProps ( context , node )
1235
-
1236
- callVisitor ( 'onDefinePropsEnter' , node , props )
1237
- definePropsMap . set ( node , props )
1238
- } else if (
1239
- hasEmitsEvent &&
1240
- candidateMacro === node &&
1241
- node . callee . name === 'defineEmits'
1242
- ) {
1243
- /** @type {ComponentEmit[] } */
1244
- const emits = getComponentEmitsFromDefineEmits ( context , node )
1245
-
1246
- callVisitor ( 'onDefineEmitsEnter' , node , emits )
1247
- defineEmitsMap . set ( node , emits )
1276
+ for ( const macroListener of macroListenerList ) {
1277
+ if (
1278
+ node . callee . name !== macroListener . name ||
1279
+ ! macroListener . isMacroNode ( candidateMacro , node )
1280
+ ) {
1281
+ continue
1282
+ }
1283
+ const param = macroListener . buildParam ( context , node )
1284
+ callVisitor ( macroListener . enterName , node , param )
1285
+ macroListener . paramsMap . set ( node , param )
1286
+ break
1248
1287
}
1249
1288
}
1250
1289
callVisitor ( 'CallExpression' , node )
1251
1290
}
1252
1291
scriptSetupVisitor [ 'CallExpression:exit' ] = ( node ) => {
1253
1292
callVisitor ( 'CallExpression:exit' , node )
1254
- if ( definePropsMap . has ( node ) ) {
1255
- callVisitor ( 'onDefinePropsExit' , node , definePropsMap . get ( node ) )
1256
- definePropsMap . delete ( node )
1257
- }
1258
- if ( defineEmitsMap . has ( node ) ) {
1259
- callVisitor ( 'onDefineEmitsExit' , node , defineEmitsMap . get ( node ) )
1260
- defineEmitsMap . delete ( node )
1293
+ for ( const macroListener of macroListenerList ) {
1294
+ if ( macroListener . paramsMap . has ( node ) ) {
1295
+ callVisitor (
1296
+ macroListener . exitName ,
1297
+ node ,
1298
+ macroListener . paramsMap . get ( node )
1299
+ )
1300
+ macroListener . paramsMap . delete ( node )
1301
+ }
1261
1302
}
1262
1303
}
1263
1304
}
0 commit comments