@@ -1148,6 +1148,10 @@ module.exports = {
11481148 * - `onDefinePropsExit` ... Event when defineProps visit ends.
11491149 * - `onDefineEmitsEnter` ... Event when defineEmits is found.
11501150 * - `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.
11511155 *
11521156 * @param {RuleContext } context The ESLint rule context object.
11531157 * @param {ScriptSetupVisitor } visitor The visitor to traverse the AST nodes.
@@ -1186,11 +1190,58 @@ module.exports = {
11861190 scriptSetupVisitor [ key ] = ( node ) => callVisitor ( key , node )
11871191 }
11881192
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 ) {
11941245 /** @type {Expression | null } */
11951246 let candidateMacro = null
11961247 /** @param {VariableDeclarator|ExpressionStatement } node */
@@ -1213,8 +1264,6 @@ module.exports = {
12131264 candidateMacro = null
12141265 }
12151266 }
1216- const definePropsMap = new Map ( )
1217- const defineEmitsMap = new Map ( )
12181267 /**
12191268 * @param {CallExpression } node
12201269 */
@@ -1224,40 +1273,32 @@ module.exports = {
12241273 inScriptSetup ( node ) &&
12251274 node . callee . type === 'Identifier'
12261275 ) {
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
12481287 }
12491288 }
12501289 callVisitor ( 'CallExpression' , node )
12511290 }
12521291 scriptSetupVisitor [ 'CallExpression:exit' ] = ( node ) => {
12531292 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+ }
12611302 }
12621303 }
12631304 }
0 commit comments