Skip to content

Commit 5ec4ff0

Browse files
committed
extend support for TemplateLiteral with no interpolation
1 parent 6eea288 commit 5ec4ff0

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

lib/rules/component-definition-name-casing.js

+25-6
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,39 @@ module.exports = {
3636
// ----------------------------------------------------------------------
3737

3838
function convertName (node) {
39-
const value = casing.getConverter(caseType)(node.value)
40-
if (value !== node.value) {
39+
let nodeValue
40+
let range
41+
if (node.type === 'TemplateLiteral') {
42+
const quasis = node.quasis[0]
43+
nodeValue = quasis.value.cooked
44+
range = quasis.range
45+
} else {
46+
nodeValue = node.value
47+
range = node.range
48+
}
49+
50+
const value = casing.getConverter(caseType)(nodeValue)
51+
if (value !== nodeValue) {
4152
context.report({
4253
node: node,
4354
message: 'Property name "{{value}}" is not {{caseType}}.',
4455
data: {
45-
value: node.value,
56+
value: nodeValue,
4657
caseType: caseType
4758
},
48-
fix: fixer => fixer.replaceText(node, node.raw.replace(node.value, value))
59+
fix: fixer => fixer.replaceTextRange([range[0] + 1, range[1] - 1], value)
4960
})
5061
}
5162
}
5263

64+
function canConvert (node) {
65+
return node.type === 'Literal' || (
66+
node.type === 'TemplateLiteral' &&
67+
node.expressions.length === 0 &&
68+
node.quasis.length === 1
69+
)
70+
}
71+
5372
return Object.assign({},
5473
{
5574
"CallExpression > MemberExpression > Identifier[name='component']" (node) {
@@ -59,7 +78,7 @@ module.exports = {
5978
if (calleeObject.type === 'Identifier' && calleeObject.name === 'Vue') {
6079
if (parent.arguments && parent.arguments.length === 2) {
6180
const argument = parent.arguments[0]
62-
if (argument.type === 'Literal') {
81+
if (canConvert(argument)) {
6382
convertName(argument)
6483
}
6584
}
@@ -71,7 +90,7 @@ module.exports = {
7190
.find(item => (
7291
item.type === 'Property' &&
7392
item.key.name === 'name' &&
74-
item.value.type === 'Literal'
93+
canConvert(item.value)
7594
))
7695

7796
if (!node) return

tests/lib/rules/component-definition-name-casing.js

+18
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ ruleTester.run('component-definition-name-casing', rule, {
130130
filename: 'test.vue',
131131
code: `foo('foo-bar', {})`,
132132
parserOptions
133+
},
134+
{
135+
filename: 'test.vue',
136+
code: `Vue.component(\`fooBar\${foo}\`, component)`,
137+
options: ['kebab-case'],
138+
parserOptions
133139
}
134140
],
135141

@@ -326,6 +332,18 @@ ruleTester.run('component-definition-name-casing', rule, {
326332
type: 'Literal',
327333
line: 1
328334
}]
335+
},
336+
{
337+
filename: 'test.vue',
338+
code: `Vue.component(\`foo_bar\`, {})`,
339+
output: `Vue.component(\`foo-bar\`, {})`,
340+
options: ['kebab-case'],
341+
parserOptions,
342+
errors: [{
343+
message: 'Property name "foo_bar" is not kebab-case.',
344+
type: 'TemplateLiteral',
345+
line: 1
346+
}]
329347
}
330348
]
331349
})

0 commit comments

Comments
 (0)