Skip to content

Commit 9986967

Browse files
committed
feat: implement remove-listeners
1 parent 182fc20 commit 9986967

File tree

5 files changed

+79
-1
lines changed

5 files changed

+79
-1
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { runTest } from '../../src/testUtils'
2+
3+
runTest(
4+
'remove v-on="$listeners"',
5+
'remove-listeners',
6+
'remove-listeners',
7+
'vue',
8+
'vue'
9+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<template>
2+
<label>
3+
<input type="text" v-bind="$attrs" v-on="$listeners" />
4+
</label>
5+
</template>
6+
<script>
7+
export default {
8+
inheritAttrs: false
9+
}
10+
</script>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<template>
2+
<label>
3+
<input type="text" v-bind="$attrs" />
4+
</label>
5+
</template>
6+
<script>
7+
export default {
8+
inheritAttrs: false
9+
}
10+
</script>

vue-transformations/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const transformationMap: {
1414
'v-else-if-key': require('./v-else-if-key'),
1515
'transition-group-root': require('./transition-group-root'),
1616
'v-bind-order-sensitive': require('./v-bind-order-sensitive'),
17-
'v-for-v-if-precedence-changed': require('./v-for-v-if-precedence-changed')
17+
'v-for-v-if-precedence-changed': require('./v-for-v-if-precedence-changed'),
18+
'remove-listeners': require('./remove-listeners')
1819
}
1920

2021
export default transformationMap
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Node } from 'vue-eslint-parser/ast/nodes'
2+
import * as OperationUtils from '../src/operationUtils'
3+
import type { Operation } from '../src/operationUtils'
4+
import type { VueASTTransformation } from '../src/wrapVueTransformation'
5+
import * as parser from 'vue-eslint-parser'
6+
import wrap from '../src/wrapVueTransformation'
7+
8+
export const transformAST: VueASTTransformation = (context) => {
9+
let fixOperations: Operation[] = []
10+
const toFixNodes: Node[] = findNodes(context)
11+
toFixNodes.forEach((node) => {
12+
fixOperations = fixOperations.concat(fix(node))
13+
})
14+
return fixOperations
15+
}
16+
17+
export default wrap(transformAST)
18+
19+
function findNodes(context: any): Node[] {
20+
const { file } = context
21+
const source = file.source
22+
const options = { sourceType: 'module' }
23+
const ast = parser.parse(source, options)
24+
let toFixNodes: Node[] = []
25+
let root: Node = <Node>ast.templateBody
26+
parser.AST.traverseNodes(root, {
27+
enterNode(node: Node) {
28+
if (
29+
node.type === 'VAttribute' &&
30+
node.key.type === 'VDirectiveKey' &&
31+
node.key.name.name === 'on' &&
32+
node.value?.type === 'VExpressionContainer' &&
33+
node.value.expression?.type === 'Identifier' &&
34+
node.value.expression.name === '$listeners'
35+
) {
36+
toFixNodes.push(node)
37+
}
38+
},
39+
leaveNode(node: Node) {},
40+
})
41+
return toFixNodes
42+
}
43+
44+
function fix(node: Node): Operation[] {
45+
let fixOperations: Operation[] = []
46+
fixOperations.push(OperationUtils.remove(node))
47+
return fixOperations
48+
}

0 commit comments

Comments
 (0)