Skip to content

Commit 7bc4a9e

Browse files
authored
Added support for defineOptions and defineSlots to defineScriptSetupVisitor (#2156)
1 parent e1747fc commit 7bc4a9e

File tree

2 files changed

+80
-35
lines changed

2 files changed

+80
-35
lines changed

Diff for: lib/utils/index.js

+76-35
Original file line numberDiff line numberDiff line change
@@ -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
}

Diff for: typings/eslint-plugin-vue/util-types/utils.ts

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ export interface ScriptSetupVisitor extends ScriptSetupVisitorBase {
4040
onDefinePropsExit?(node: CallExpression, props: ComponentProp[]): void
4141
onDefineEmitsEnter?(node: CallExpression, emits: ComponentEmit[]): void
4242
onDefineEmitsExit?(node: CallExpression, emits: ComponentEmit[]): void
43+
onDefineOptionsEnter?(node: CallExpression): void
44+
onDefineOptionsExit?(node: CallExpression): void
45+
onDefineSlotsEnter?(node: CallExpression): void
46+
onDefineSlotsExit?(node: CallExpression): void
4347
[query: string]:
4448
| ((node: VAST.ParamNode) => void)
4549
| ((node: CallExpression, props: ComponentProp[]) => void)

0 commit comments

Comments
 (0)