Skip to content

Commit 577322a

Browse files
committed
feat: implement slot-scope attribute transformation
1 parent e98cfde commit 577322a

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
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+
'Convert usage of slot-scope before vue 2.6',
5+
'slot-scope-attribute',
6+
'slot-scope-attribute',
7+
'vue',
8+
'vue'
9+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<template>
2+
<div class="hello">
3+
<base-layout>
4+
<template slot-scope="scope">title-content</template>
5+
</base-layout>
6+
</div>
7+
</template>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<template>
2+
<div class="hello">
3+
<base-layout>
4+
<template v-slot="scope">title-content</template>
5+
</base-layout>
6+
</div>
7+
</template>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+
const { file } = context
12+
const source = file.source
13+
toFixNodes.forEach((node) => {
14+
fixOperations = fixOperations.concat(fix(node, source))
15+
})
16+
return fixOperations
17+
}
18+
19+
export default wrap(transformAST)
20+
/**
21+
* search slot attribute nodes
22+
*
23+
* @param context
24+
* @returns slot attribute nodes
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+
parser.AST.traverseNodes(root, {
34+
enterNode(node: Node) {
35+
if (node.type === 'VAttribute' &&
36+
node.directive &&
37+
node.key.name.name === 'slot-scope') {
38+
toFixNodes.push(node)
39+
}
40+
},
41+
leaveNode(node: Node) { },
42+
})
43+
return toFixNodes
44+
}
45+
/**
46+
* fix logic
47+
* @param node
48+
*/
49+
function fix(node: Node, source: string): Operation[] {
50+
let fixOperations: Operation[] = []
51+
const element: any = node!.parent!.parent
52+
// @ts-ignore
53+
const scopeValue: string = source.slice(node.value.range[0], node.value.range[1])
54+
55+
if (!!element && element.type == 'VElement' && element.name == 'template') {
56+
// template element replace slot-scope="xxx" to v-slot="xxx"
57+
fixOperations.push(OperationUtils.replaceText(node, `v-slot=${scopeValue}`))
58+
}
59+
60+
return fixOperations
61+
}

0 commit comments

Comments
 (0)