Skip to content

Commit 1be76b5

Browse files
committed
⭐️New: Add vue/comma-dangle rule
1 parent 9c49dcc commit 1be76b5

File tree

6 files changed

+143
-0
lines changed

6 files changed

+143
-0
lines changed

docs/rules/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ For example:
140140
| Rule ID | Description | |
141141
|:--------|:------------|:---|
142142
| [vue/array-bracket-spacing](./array-bracket-spacing.md) | enforce consistent spacing inside array brackets | :wrench: |
143+
| [vue/comma-dangle](./comma-dangle.md) | require or disallow trailing commas | :wrench: |
143144
| [vue/component-name-in-template-casing](./component-name-in-template-casing.md) | enforce specific casing for the component naming style in template | :wrench: |
144145
| [vue/eqeqeq](./eqeqeq.md) | require the use of `===` and `!==` | :wrench: |
145146
| [vue/key-spacing](./key-spacing.md) | enforce consistent spacing between keys and values in object literal properties | :wrench: |

docs/rules/comma-dangle.md

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
pageClass: rule-details
3+
sidebarDepth: 0
4+
title: vue/comma-dangle
5+
description: require or disallow trailing commas
6+
---
7+
# vue/comma-dangle
8+
> require or disallow trailing commas
9+
10+
- :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule.
11+
12+
This rule is the same rule as core [comma-dangle] rule but it applies to the expressions in `<template>`.
13+
14+
## :books: Further reading
15+
16+
- [comma-dangle]
17+
18+
[comma-dangle]: https://eslint.org/docs/rules/comma-dangle
19+
20+
## :mag: Implementation
21+
22+
- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/comma-dangle.js)
23+
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/comma-dangle.js)

lib/configs/no-layout-rules.js

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
module.exports = {
77
rules: {
88
'vue/array-bracket-spacing': 'off',
9+
'vue/comma-dangle': 'off',
910
'vue/html-closing-bracket-newline': 'off',
1011
'vue/html-closing-bracket-spacing': 'off',
1112
'vue/html-indent': 'off',

lib/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module.exports = {
1010
'array-bracket-spacing': require('./rules/array-bracket-spacing'),
1111
'attribute-hyphenation': require('./rules/attribute-hyphenation'),
1212
'attributes-order': require('./rules/attributes-order'),
13+
'comma-dangle': require('./rules/comma-dangle'),
1314
'comment-directive': require('./rules/comment-directive'),
1415
'component-name-in-template-casing': require('./rules/component-name-in-template-casing'),
1516
'eqeqeq': require('./rules/eqeqeq'),

lib/rules/comma-dangle.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**
2+
* @author Yosuke Ota
3+
*/
4+
'use strict'
5+
6+
const { wrapCoreRule } = require('../utils')
7+
8+
// eslint-disable-next-line
9+
module.exports = wrapCoreRule(require('eslint/lib/rules/comma-dangle'))

tests/lib/rules/comma-dangle.js

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/**
2+
* @author Yosuke Ota
3+
*/
4+
'use strict'
5+
6+
const RuleTester = require('eslint').RuleTester
7+
const rule = require('../../../lib/rules/comma-dangle')
8+
9+
const tester = new RuleTester({
10+
parser: 'vue-eslint-parser',
11+
parserOptions: { ecmaVersion: 2018 }
12+
})
13+
14+
tester.run('comma-dangle', rule, {
15+
valid: [
16+
`<template>
17+
<button @click="() => fn([a, b])" ></button>
18+
</template>`,
19+
{
20+
code: `
21+
<template>
22+
<CustomButton @click="($event) => fn()" />
23+
</template>`,
24+
options: [{
25+
'functions': 'never'
26+
}]
27+
},
28+
{
29+
code: `
30+
<template>
31+
<button @click="() => fn([a, b, ])" ></button>
32+
</template>`,
33+
options: [{
34+
'arrays': 'ignore'
35+
}]
36+
}
37+
],
38+
invalid: [
39+
{
40+
code: `
41+
<template>
42+
<button @click="() => fn([a, b,])" ></button>
43+
</template>`,
44+
output: `
45+
<template>
46+
<button @click="() => fn([a, b])" ></button>
47+
</template>`,
48+
errors: [
49+
{
50+
message: 'Unexpected trailing comma.',
51+
line: 3
52+
}
53+
]
54+
},
55+
{
56+
code: `
57+
<template>
58+
<CustomButton @click="($event, ) => fn()" />
59+
</template>`,
60+
options: [{
61+
'functions': 'never'
62+
}],
63+
output: `
64+
<template>
65+
<CustomButton @click="($event ) => fn()" />
66+
</template>`,
67+
errors: [
68+
{
69+
message: 'Unexpected trailing comma.',
70+
line: 3
71+
}
72+
]
73+
},
74+
{
75+
code: `
76+
<template>
77+
<button @click="() => {
78+
fn([a, b, ])
79+
fn([
80+
a,
81+
b
82+
])
83+
}"></button>
84+
</template>`,
85+
options: ['always-multiline'],
86+
output: `
87+
<template>
88+
<button @click="() => {
89+
fn([a, b ])
90+
fn([
91+
a,
92+
b,
93+
])
94+
}"></button>
95+
</template>`,
96+
errors: [
97+
{
98+
message: 'Unexpected trailing comma.',
99+
line: 4
100+
},
101+
{
102+
message: 'Missing trailing comma.',
103+
line: 7
104+
}
105+
]
106+
}
107+
]
108+
})

0 commit comments

Comments
 (0)