8000 [Update] Make `vue/html-quotes` fixable (#275) · Demivan/eslint-plugin-vue@7897252 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7897252

Browse files
mysticateamichalsnik
authored andcommitted
[Update] Make vue/html-quotes fixable (vuejs#275)
* Fix: incorrect errors in invalid EOF cases (fixes vuejs#268) * Update: make vue/html-quotes fixable
1 parent a93a234 commit 7897252

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

lib/rules/html-quotes.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,38 @@ function create (context) {
2626
const double = context.options[0] !== 'single'
2727
const quoteChar = double ? '"' : "'"
2828
const quoteName = double ? 'double quotes' : 'single quotes'
29+
const quotePattern = double ? /"/g : /'/g
30+
const quoteEscaped = double ? '"' : '''
31+
let hasInvalidEOF
2932

3033
return utils.defineTemplateBodyVisitor(context, {
3134
'VAttribute[value!=null]' (node) {
35+
if (hasInvalidEOF) {
36+
return
37+
}
38+
3239
const text = sourceCode.getText(node.value)
3340
const firstChar = text[0]
41+
3442
if (firstChar !== quoteChar) {
3543
context.report({
3644
node: node.value,
3745
loc: node.value.loc,
3846
message: 'Expected to be enclosed by {{kind}}.',
39-
data: { kind: quoteName }
47+
data: { kind: quoteName },
48+
fix (fixer) {
49+
const contentText = (firstChar === "'" || firstChar === '"') ? text.slice(1, -1) : text
50+
const replacement = quoteChar + contentText.replace(quotePattern, quoteEscaped) + quoteChar
51+
52+
return fixer.replaceText(node.value, replacement)
53+
}
4054
})
4155
}
4256
}
57+
}, {
58+
Program (node) {
59+
hasInvalidEOF = utils.hasInvalidEOF(node)
60+
}
4361
})
4462
}
4563

@@ -54,7 +72,7 @@ module.exports = {
5472
description: 'enforce quotes style of HTML attributes',
5573
category: 'recommended'
5674
},
57-
fixable: false,
75+
fixable: 'code',
5876
schema: [
5977
{ enum: ['double', 'single'] }
6078
]

tests/lib/rules/html-quotes.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,91 +54,116 @@ tester.run('html-quotes', rule, {
5454
filename: 'test.vue',
5555
code: "<template><div :class='foo'></div></template>",
5656
options: ['single']
57+
},
58+
59+
// Invalid EOF
60+
{
61+
code: '<template><div class="foo></div></template>',
62+
options: ['single']
63+
},
64+
{
65+
code: '<template><div class=\'foo></div></template>',
66+
options: ['double']
5767
}
5868
],
5969
invalid: [
6070
{
6171
filename: 'test.vue',
6272
code: '<template><div class=foo></div></template>',
73+
output: '<template><div class="foo"></div></template>',
6374
errors: ['Expected to be enclosed by double quotes.']
6475
},
6576
{
6677
filename: 'test.vue',
6778
code: "<template><div class='foo'></div></template>",
79+
output: '<template><div class="foo"></div></template>',
6880
errors: ['Expected to be enclosed by double quotes.']
6981
},
7082
{
7183
filename: 'test.vue',
7284
code: '<template><div :class=foo></div></template>',
85+
output: '<template><div :class="foo"></div></template>',
7386
errors: ['Expected to be enclosed by double quotes.']
7487
},
7588
{
7689
filename: 'test.vue',
7790
code: "<template><div :class='foo'></div></template>",
91+
output: '<template><div :class="foo"></div></template>',
7892
errors: ['Expected to be enclosed by double quotes.']
7993
},
8094
{
8195
filename: 'test.vue',
8296
code: '<template><div :class=foo+"bar"></div></template>',
97+
output: '<template><div :class="foo+&quot;bar&quot;"></div></template>',
8398
errors: ['Expected to be enclosed by double quotes.']
8499
},
85100
{
86101
filename: 'test.vue',
87102
code: '<template><div class=foo></div></template>',
103+
output: '<template><div class="foo"></div></template>',
88104
options: ['double'],
89105
errors: ['Expected to be enclosed by double quotes.']
90106
},
91107
{
92108
filename: 'test.vue',
93109
code: "<template><div class='foo'></div></template>",
110+
output: '<template><div class="foo"></div></template>',
94111
options: ['double'],
95112
errors: ['Expected to be enclosed by double quotes.']
96113
},
97114
{
98115
filename: 'test.vue',
99116
code: '<template><div :class=foo></div></template>',
117+
output: '<template><div :class="foo"></div></template>',
100118
options: ['double'],
101119
errors: ['Expected to be enclosed by double quotes.']
102120
},
103121
{
104122
filename: 'test.vue',
105123
code: "<template><div :class='foo'></div></template>",
124+
output: '<template><div :class="foo"></div></template>',
106125
options: ['double'],
107126
errors: ['Expected to be enclosed by double quotes.']
108127
},
109128
{
110129
filename: 'test.vue',
111130
code: '<template><div :class=foo+"bar"></div></template>',
131+
output: '<template><div :class="foo+&quot;bar&quot;"></div></template>',
112132
options: ['double'],
113133
errors: ['Expected to be enclosed by double quotes.']
114134
},
115135
{
116136
filename: 'test.vue',
117137
code: '<template><div class=foo></div></template>',
138+
output: '<template><div class=\'foo\'></div></template>',
118139
options: ['single'],
119140
errors: ['Expected to be enclosed by single quotes.']
120141
},
121142
{
122143
filename: 'test.vue',
123144
code: '<template><div class="foo"></div></template>',
145+
output: '<template><div class=\'foo\'></div></template>',
124146
options: ['single'],
125147
errors: ['Expected to be enclosed by single quotes.']
126148
},
127149
{
128150
filename: 'test.vue',
129151
code: '<template><div :class=foo></div></template>',
152+
output: '<template><div :class=\'foo\'></div></template>',
130153
options: ['single'],
131154
errors: ['Expected to be enclosed by single quotes.']
132155
},
133156
{
134157
filename: 'test.vue',
135158
code: '<template><div :class="foo"></div></template>',
159+
output: '<template><div :class=\'foo\'></div></template>',
136160
options: ['single'],
137161
errors: ['Expected to be enclosed by single quotes.']
138162
},
139163
{
140164
filename: 'test.vue',
141165
code: "<template><div :class=foo+'bar'></div></template>",
166+
output: "<template><div :class='foo+&apos;bar&apos;'></div></template>",
142167
options: ['single'],
143168
errors: ['Expected to be enclosed by single quotes.']
144169
}

0 commit comments

Comments
 (0)
0