Skip to content

Commit c9afae4

Browse files
committed
Change to autofix
1 parent a0ca7dd commit c9afae4

File tree

2 files changed

+47
-70
lines changed

2 files changed

+47
-70
lines changed

Diff for: lib/rules/syntaxes/slot-scope-attribute.js

+24-31
Original file line numberDiff line numberDiff line change
@@ -11,54 +11,49 @@ module.exports = {
1111

1212
/**
1313
* Checks whether the given node can convert to the `v-slot`.
14-
* @param {VAttribute | null} slotAttr node of `slot`
15-
* @param {VElement} slotAttr node of `slot`
14+
* @param {VStartTag} startTag node of `<element v-slot ... >`
1615
* @returns {boolean} `true` if the given node can convert to the `v-slot`
1716
*/
18-
function canConvertToVSlot (slotAttr, element) {
17+
function canConvertToVSlot (startTag) {
18+
if (startTag.parent.name !== 'template') {
19+
return false
20+
}
21+
22+
const slotAttr = startTag.attributes
23+
.find(attr => attr.directive === false && attr.key.name === 'slot')
1924
if (slotAttr) {
20-
if (!slotAttr.value) {
21-
return true
22-
}
23-
const slotName = slotAttr.value.value
24-
// If non-Latin characters are included it can not be converted.
25-
return !/[^a-z]/i.test(slotName)
25+
// if the element have `slot` it can not be converted.
26+
// Conversion of `slot` is done with `vue/no-deprecated-slot-attribute`.
27+
return false
2628
}
2729

28-
const vBindSlotAttr = element.attributes
30+
const vBindSlotAttr = startTag.attributes
2931
.find(attr =>
3032
attr.directive === true &&
3133
attr.key.name.name === 'bind' &&
3234
attr.key.argument &&
3335
attr.key.argument.name === 'slot')
34-
// if the element have `v-bind:slot` it can not be converted.
35-
// Conversion of `v-bind:slot` is done with `vue/no-deprecated-slot-attribute`.
36-
return !vBindSlotAttr
36+
if (vBindSlotAttr) {
37+
// if the element have `v-bind:slot` it can not be converted.
38+
// Conversion of `v-bind:slot` is done with `vue/no-deprecated-slot-attribute`.
39+
return false
40+
}
41+
return true
3742
}
3843

3944
/**
4045
* Convert to `v-slot`.
4146
* @param {object} fixer fixer
42-
* @param {VAttribute | null} slotAttr node of `slot`
4347
* @param {VAttribute | null} scopeAttr node of `slot-scope`
4448
* @returns {*} fix data
4549
*/
46-
function fixSlotToVSlot (fixer, slotAttr, scopeAttr) {
47-
const nameArgument = slotAttr && slotAttr.value && slotAttr.value.value
48-
? `:${slotAttr.value.value}`
49-
: ''
50+
function fixSlotScopeToVSlot (fixer, scopeAttr) {
5051
const scopeValue = scopeAttr && scopeAttr.value
5152
? `=${sourceCode.getText(scopeAttr.value)}`
5253
: ''
5354

54-
const replaceText = `v-slot${nameArgument}${scopeValue}`
55-
const fixers = [
56-
fixer.replaceText(slotAttr || scopeAttr, replaceText)
57-
]
58-
if (slotAttr && scopeAttr) {
59-
fixers.push(fixer.remove(scopeAttr))
60-
}
61-
return fixers
55+
const replaceText = `v-slot${scopeValue}`
56+
return fixer.replaceText(scopeAttr, replaceText)
6257
}
6358
/**
6459
* Reports `slot-scope` node
@@ -72,13 +67,11 @@ module.exports = {
7267
fix: fixToUpgrade
7368
// fix to use `v-slot`
7469
? (fixer) => {
75-
const element = scopeAttr.parent
76-
const slotAttr = element.attributes
77-
.find(attr => attr.directive === false && attr.key.name === 'slot')
78-
if (!canConvertToVSlot(slotAttr, element)) {
70+
const startTag = scopeAttr.parent
71+
if (!canConvertToVSlot(startTag)) {
7972
return null
8073
}
81-
return fixSlotToVSlot(fixer, slotAttr, scopeAttr)
74+
return fixSlotScopeToVSlot(fixer, scopeAttr)
8275
}
8376
: null
8477
})

Diff for: tests/lib/rules/no-deprecated-slot-scope-attribute.js

+23-39
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,27 @@ tester.run('no-deprecated-slot-scope-attribute', rule, {
1414
valid: [
1515
`<template>
1616
<LinkList>
17-
<a v-slot:name />
17+
<template v-slot:name><a /></template>
1818
</LinkList>
1919
</template>`,
2020
`<template>
2121
<LinkList>
22-
<a #name />
22+
<template #name><a /></template>
2323
</LinkList>
2424
</template>`,
2525
`<template>
2626
<LinkList>
27-
<a v-slot="{a}" />
27+
<template v-slot="{a}"><a /></template>
28+
</LinkList>
29+
</template>`,
30+
`<template>
31+
<LinkList v-slot="{a}">
32+
<a />
2833
</LinkList>
2934
</template>`,
3035
`<template>
3136
<LinkList>
32-
<a #default="{a}" />
37+
<template #default="{a}"><a /></template>
3338
</LinkList>
3439
</template>`,
3540
`<template>
@@ -39,22 +44,26 @@ tester.run('no-deprecated-slot-scope-attribute', rule, {
3944
</template>`,
4045
`<template>
4146
<LinkList>
42-
<a />
47+
<template><a /></template>
4348
</LinkList>
44-
</template>`
49+
</template>`,
50+
`<template>
51+
<LinkList>
52+
<a />
53+
</LinkList>`
4554
],
4655
invalid: [
4756
{
4857
code: `
4958
<template>
5059
<LinkList>
51-
<a slot="name" disabled slot-scope="{a}"/>
60+
<template slot-scope="{a}"><a /></template>
5261
</LinkList>
5362
</template>`,
5463
output: `
5564
<template>
5665
<LinkList>
57-
<a v-slot:name="{a}" disabled />
66+
<template v-slot="{a}"><a /></template>
5867
</LinkList>
5968
</template>`,
6069
errors: [
@@ -68,13 +77,13 @@ tester.run('no-deprecated-slot-scope-attribute', rule, {
6877
code: `
6978
<template>
7079
<LinkList>
71-
<a slot-scope />
80+
<template slot-scope><a /></template>
7281
</LinkList>
7382
</template>`,
7483
output: `
7584
<template>
7685
<LinkList>
77-
<a v-slot />
86+
<template v-slot><a /></template>
7887
</LinkList>
7988
</template>`,
8089
errors: [
@@ -84,52 +93,27 @@ tester.run('no-deprecated-slot-scope-attribute', rule, {
8493
}
8594
]
8695
},
96+
// cannot fix
8797
{
8898
code: `
8999
<template>
90100
<LinkList>
91101
<a slot-scope="{a}" />
92102
</LinkList>
93103
</template>`,
94-
output: `
95-
<template>
96-
<LinkList>
97-
<a v-slot="{a}" />
98-
</LinkList>
99-
</template>`,
100-
errors: [
101-
{
102-
message: '`slot-scope` are deprecated.',
103-
line: 4
104-
}
105-
]
106-
},
107-
{
108-
code: `
109-
<template>
110-
<LinkList>
111-
<a slot-scope="{a}" slot="name"/>
112-
</LinkList>
113-
</template>`,
114-
output: `
115-
<template>
116-
<LinkList>
117-
<a v-slot:name="{a}"/>
118-
</LinkList>
119-
</template>`,
104+
output: null,
120105
errors: [
121106
{
122107
message: '`slot-scope` are deprecated.',
123108
line: 4
124109
}
125110
]
126111
},
127-
// cannot fix
128112
{
129113
code: `
130114
<template>
131115
<LinkList>
132-
<a slot-scope="{a}" slot="f o o"/>
116+
<template slot-scope="{a}" slot="foo"><a /></template>
133117
</LinkList>
134118
</template>`,
135119
output: null,
@@ -144,7 +128,7 @@ tester.run('no-deprecated-slot-scope-attribute', rule, {
144128
code: `
145129
<template>
146130
<LinkList>
147-
<a slot-scope="{a}" :slot="arg"/>
131+
<template slot-scope="{a}" :slot="arg"><a /></template>
148132
</LinkList>
149133
</template>`,
150134
output: null,

0 commit comments

Comments
 (0)