Skip to content

Commit 9d6e99a

Browse files
refactor: modify vue-transformation wrap function (#73)
1 parent 6fc2a6d commit 9d6e99a

14 files changed

+199
-492
lines changed

src/wrapVueTransformation.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import * as _ from 'lodash'
21
import type { Operation } from './operationUtils'
32
import type VueTransformation from './VueTransformation'
3+
import { Node } from 'vue-eslint-parser/ast/nodes'
4+
import * as parser from 'vue-eslint-parser'
45

56
const BOM = '\uFEFF'
67

@@ -18,6 +19,44 @@ export type VueASTTransformation<Params = void> = {
1819
type?: string
1920
}
2021

22+
export function createTransformAST(
23+
nodeFilter: (node: Node) => boolean,
24+
fix: (node: Node, source?: string) => Operation[]
25+
) {
26+
function findNodes(context: any): Node[] {
27+
const { file } = context
28+
const source = file.source
29+
const options = { sourceType: 'module' }
30+
const ast = parser.parse(source, options)
31+
let toFixNodes: Node[] = []
32+
let root: Node = <Node>ast.templateBody
33+
34+
parser.AST.traverseNodes(root, {
35+
enterNode(node: Node) {
36+
if (nodeFilter(node)) {
37+
toFixNodes.push(node)
38+
}
39+
},
40+
leaveNode(node: Node) {}
41+
})
42+
43+
return toFixNodes
44+
}
45+
46+
const transformAST: VueASTTransformation = context => {
47+
let fixOperations: Operation[] = []
48+
const { file } = context
49+
const source = file.source
50+
const toFixNodes: Node[] = findNodes(context)
51+
toFixNodes.forEach(node => {
52+
fixOperations = fixOperations.concat(fix(node, source))
53+
})
54+
return fixOperations
55+
}
56+
57+
return transformAST
58+
}
59+
2160
export default function astTransformationToVueTransformationModule<
2261
Params = any
2362
>(transformAST: VueASTTransformation<Params>): VueTransformation {

vue-transformations/remove-listeners.ts

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,24 @@
11
import { Node } from 'vue-eslint-parser/ast/nodes'
22
import * as OperationUtils from '../src/operationUtils'
33
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'
4+
import {
5+
default as wrap,
6+
createTransformAST
7+
} from '../src/wrapVueTransformation'
78

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-
}
9+
export const transformAST = createTransformAST(nodeFilter, fix)
1610

1711
export default wrap(transformAST)
1812

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
13+
function nodeFilter(node: Node): boolean {
14+
return (
15+
node.type === 'VAttribute' &&
16+
node.key.type === 'VDirectiveKey' &&
17+
node.key.name.name === 'on' &&
18+
node.value?.type === 'VExpressionContainer' &&
19+
node.value.expression?.type === 'Identifier' &&
20+
node.value.expression.name === '$listeners'
21+
)
4222
}
4323

4424
function fix(node: Node): Operation[] {

vue-transformations/remove-v-on-native.ts

Lines changed: 13 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,29 @@
11
import { Node } from 'vue-eslint-parser/ast/nodes'
22
import * as OperationUtils from '../src/operationUtils'
33
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-
import _ from 'lodash'
4+
import {
5+
default as wrap,
6+
createTransformAST
7+
} from '../src/wrapVueTransformation'
88

9-
export const transformAST: VueASTTransformation = context => {
10-
let fixOperations: Operation[] = []
11-
const { file } = context
12-
const source = file.source
13-
const toFixNodes: Node[] = findNodes(context)
14-
toFixNodes.forEach(node => {
15-
fixOperations = fixOperations.concat(fix(node, source))
16-
})
17-
return fixOperations
18-
}
9+
export const transformAST = createTransformAST(nodeFilter, fix)
1910

2011
export default wrap(transformAST)
12+
2113
/**
22-
* search v-on nodes
23-
*
24-
* @param context
25-
* @returns v-on attribute nodes
14+
* Filter for v-on nodes
2615
*/
27-
function findNodes(context: any): Node[] {
28-
const { file } = context
29-
const source = file.source
30-
const options = { sourceType: 'module' }
31-
const ast = parser.parse(source, options)
32-
let toFixNodes: Node[] = []
33-
let root: Node = <Node>ast.templateBody
34-
parser.AST.traverseNodes(root, {
35-
enterNode(node: Node) {
36-
if (
37-
node.type === 'VAttribute' &&
38-
node.directive &&
39-
node.key.name.name === 'on'
40-
) {
41-
toFixNodes.push(node)
42-
}
43-
},
44-
leaveNode(node: Node) {}
45-
})
46-
return toFixNodes
16+
function nodeFilter(node: Node): boolean {
17+
return (
18+
node.type === 'VAttribute' && node.directive && node.key.name.name === 'on'
19+
)
4720
}
21+
4822
/**
4923
* fix logic
5024
* @param node
5125
*/
52-
function fix(node: Node, source: string): Operation[] {
26+
function fix(node: Node): Operation[] {
5327
let fixOperations: Operation[] = []
5428
// @ts-ignore
5529
const keyNode = node.key

vue-transformations/router-link-event-tag.ts

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,18 @@
11
import { Node, VElement } from 'vue-eslint-parser/ast/nodes'
22
import * as OperationUtils from '../src/operationUtils'
33
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'
4+
import {
5+
default as wrap,
6+
createTransformAST
7+
} from '../src/wrapVueTransformation'
78

8-
export const transformAST: VueASTTransformation = context => {
9-
let fixOperations: Operation[] = []
10-
const toFixNodes: Node[] = findNodes(context)
11-
const { file } = context
12-
const source = file.source
13-
toFixNodes.forEach(node => {
14-
fixOperations = fixOperations.concat(fix(node, source))
15-
})
16-
return fixOperations
17-
}
9+
export const transformAST = createTransformAST(nodeFilter, fix)
1810

1911
export default wrap(transformAST)
2012

21-
function findNodes(context: any): Node[] {
22-
const { file } = context
23-
const source = file.source
24-
const options = { sourceType: 'module' }
25-
const ast = parser.parse(source, options)
26-
let toFixNodes: Node[] = []
27-
let root: Node = <Node>ast.templateBody
28-
29-
// find router-link nodes
30-
parser.AST.traverseNodes(root, {
31-
enterNode(node: Node) {
32-
if (node.type === 'VElement' && node.name === 'router-link') {
33-
toFixNodes.push(node)
34-
}
35-
},
36-
leaveNode(node: Node) {}
37-
})
38-
39-
return toFixNodes
13+
function nodeFilter(node: Node): boolean {
14+
// filter for router-link node
15+
return node.type === 'VElement' && node.name === 'router-link'
4016
}
4117

4218
function fix(node: Node, source: string): Operation[] {

vue-transformations/router-link-exact.ts

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,18 @@
11
import { Node, VElement } from 'vue-eslint-parser/ast/nodes'
22
import * as OperationUtils from '../src/operationUtils'
33
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'
4+
import {
5+
default as wrap,
6+
createTransformAST
7+
} from '../src/wrapVueTransformation'
78

8-
export const transformAST: VueASTTransformation = context => {
9-
let fixOperations: Operation[] = []
10-
const { file } = context
11-
const source = file.source
12-
const toFixNodes: Node[] = findNodes(context)
13-
toFixNodes.forEach(node => {
14-
fixOperations = fixOperations.concat(fix(node, source))
15-
})
16-
return fixOperations
17-
}
9+
export const transformAST = createTransformAST(nodeFilter, fix)
1810

1911
export default wrap(transformAST)
2012

21-
function findNodes(context: any): Node[] {
22-
const { file } = context
23-
const source = file.source
24-
const options = { sourceType: 'module' }
25-
const ast = parser.parse(source, options)
26-
let toFixNodes: Node[] = []
27-
let root: Node = <Node>ast.templateBody
28-
29-
// find router-link nodes
30-
parser.AST.traverseNodes(root, {
31-
enterNode(node: Node) {
32-
if (node.type === 'VElement' && node.name === 'router-link') {
33-
toFixNodes.push(node)
34-
}
35-
},
36-
leaveNode(node: Node) {}
37-
})
38-
39-
return toFixNodes
13+
function nodeFilter(node: Node): boolean {
14+
// filter for router-link node
15+
return node.type === 'VElement' && node.name === 'router-link'
4016
}
4117

4218
function fix(node: Node, source: string): Operation[] {

vue-transformations/router-view-keep-alive-transition.ts

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,22 @@
11
import { Node, VElement } from 'vue-eslint-parser/ast/nodes'
22
import * as OperationUtils from '../src/operationUtils'
33
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'
4+
import {
5+
default as wrap,
6+
createTransformAST
7+
} from '../src/wrapVueTransformation'
78

8-
export const transformAST: VueASTTransformation = context => {
9-
let fixOperations: Operation[] = []
10-
const { file } = context
11-
const source = file.source
12-
const toFixNodes: Node[] = findNodes(context)
13-
toFixNodes.forEach(node => {
14-
fixOperations = fixOperations.concat(fix(node, source))
15-
})
16-
return fixOperations
17-
}
9+
export const transformAST = createTransformAST(nodeFilter, fix)
1810

1911
export default wrap(transformAST)
2012

21-
function findNodes(context: any): Node[] {
22-
const { file } = context
23-
const source = file.source
24-
const options = { sourceType: 'module' }
25-
const ast = parser.parse(source, options)
26-
let toFixNodes: Node[] = []
27-
let root: Node = <Node>ast.templateBody
28-
29-
// find transition nodes
30-
parser.AST.traverseNodes(root, {
31-
enterNode(node: Node) {
32-
if (
33-
node.type === 'VElement' &&
34-
node.name === 'transition' &&
35-
node.children.length
36-
) {
37-
toFixNodes.push(node)
38-
}
39-
},
40-
leaveNode(node: Node) {}
41-
})
42-
43-
return toFixNodes
13+
function nodeFilter(node: Node): boolean {
14+
// filter for transition node
15+
return (
16+
node.type === 'VElement' &&
17+
node.name === 'transition' &&
18+
node.children.length > 0
19+
)
4420
}
4521

4622
function fix(node: Node, source: string): Operation[] {

vue-transformations/slot-attribute.ts

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,20 @@
11
import { Node } from 'vue-eslint-parser/ast/nodes'
22
import * as OperationUtils from '../src/operationUtils'
33
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'
4+
import {
5+
default as wrap,
6+
createTransformAST
7+
} from '../src/wrapVueTransformation'
78

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-
}
9+
export const transformAST = createTransformAST(nodeFilter, fix)
1610

1711
export default wrap(transformAST)
18-
/**
19-
* search slot attribute nodes
20-
*
21-
* @param context
22-
* @returns slot attribute nodes
23-
*/
24-
function findNodes(context: any): Node[] {
25-
const { file } = context
26-
const source = file.source
27-
const options = { sourceType: 'module' }
28-
const ast = parser.parse(source, options)
29-
let toFixNodes: Node[] = []
30-
let root: Node = <Node>ast.templateBody
31-
parser.AST.traverseNodes(root, {
32-
enterNode(node: Node) {
33-
if (node.type === 'VAttribute' && node.key.name === 'slot') {
34-
toFixNodes.push(node)
35-
}
36-
},
37-
leaveNode(node: Node) {}
38-
})
39-
return toFixNodes
12+
13+
function nodeFilter(node: Node): boolean {
14+
// filter for slot attribute node
15+
return node.type === 'VAttribute' && node.key.name === 'slot'
4016
}
17+
4118
/**
4219
* fix logic
4320
* @param node

0 commit comments

Comments
 (0)