-
-
Notifications
You must be signed in to change notification settings - Fork 681
/
Copy pathslot-attribute.js
60 lines (58 loc) · 1.75 KB
/
slot-attribute.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* @author Yosuke Ota
* See LICENSE file in root directory for full license.
*/
'use strict'
module.exports = {
deprecated: '2.6.0',
createTemplateBodyVisitor (context) {
const sourceCode = context.getSourceCode()
/**
* Convert to `v-slot`.
* @param {object} fixer fixer
* @param {VAttribute | null} slotAttr node of `slot`
* @param {VAttribute | null} scopeAttr node of `scope`
* @returns {*} fix data
*/
function fixSlotToVSlot (fixer, slotAttr, scopeAttr) {
const nameArgument = slotAttr && slotAttr.value && slotAttr && slotAttr.value.value
? `:${slotAttr.value.value}`
: ''
const scopeValue = scopeAttr && scopeAttr.value
? `=${sourceCode.getText(scopeAttr.value)}`
: ''
const replaceText = `v-slot${nameArgument}${scopeValue}`
const fixers = [
fixer.replaceText(slotAttr || scopeAttr, replaceText)
]
if (slotAttr && scopeAttr) {
fixers.push(fixer.remove(scopeAttr))
}
return fixers
}
/**
* Reports `slot` node
* @param {VAttribute} slotAttr node of `slot`
* @returns {void}
*/
function reportSlot (slotAttr) {
context.report({
node: slotAttr.key,
messageId: 'forbiddenSlotAttribute',
// fix to use `v-slot`
fix (fixer) {
const element = slotAttr.parent
const scopeAttr = element.attributes
.find(attr => attr.directive === true && attr.key.name && (
attr.key.name.name === 'slot-scope' ||
attr.key.name.name === 'scope'
))
return fixSlotToVSlot(fixer, slotAttr, scopeAttr)
}
})
}
return {
"VAttribute[directive=false][key.name='slot']": reportSlot
}
}
}