Skip to content

Commit 473d5bf

Browse files
committed
class-order rule
1 parent c3111fe commit 473d5bf

File tree

5 files changed

+146
-0
lines changed

5 files changed

+146
-0
lines changed

docs/rules/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ For example:
144144
| [vue/block-spacing](./block-spacing.md) | disallow or enforce spaces inside of blocks after opening block and before closing block | :wrench: |
145145
| [vue/brace-style](./brace-style.md) | enforce consistent brace style for blocks | :wrench: |
146146
| [vue/camelcase](./camelcase.md) | enforce camelcase naming convention | |
147+
| [vue/class-order](./class-order.md) | enforce classnames order | :wrench: |
147148
| [vue/comma-dangle](./comma-dangle.md) | require or disallow trailing commas | :wrench: |
148149
| [vue/component-name-in-template-casing](./component-name-in-template-casing.md) | enforce specific casing for the component naming style in template | :wrench: |
149150
| [vue/dot-location](./dot-location.md) | enforce consistent newlines before and after dots | :wrench: |
@@ -161,6 +162,8 @@ For example:
161162
| [vue/space-infix-ops](./space-infix-ops.md) | require spacing around infix operators | :wrench: |
162163
| [vue/space-unary-ops](./space-unary-ops.md) | enforce consistent spacing before or after unary operators | :wrench: |
163164
| [vue/v-on-function-call](./v-on-function-call.md) | enforce or forbid parentheses after method calls without arguments in `v-on` directives | :wrench: |
165+
| [vue/v-slot-style](./v-slot-style.md) | enforce `v-slot` directive style | :wrench: |
166+
| [vue/valid-v-slot](./valid-v-slot.md) | enforce valid `v-slot` directives | |
164167

165168
## Deprecated
166169

docs/rules/class-order.md

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
pageClass: rule-details
3+
sidebarDepth: 0
4+
title: vue/class-order
5+
description: enforce classnames order
6+
---
7+
# vue/class-order
8+
> enforce classnames order
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+
## :books: Further reading
13+
14+
- [class-order]
15+
16+
[class-order]: https://eslint.org/docs/rules/class-order
17+
18+
## :mag: Implementation
19+
20+
- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/class-order.js)
21+
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/class-order.js)

lib/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module.exports = {
1414
'block-spacing': require('./rules/block-spacing'),
1515
'brace-style': require('./rules/brace-style'),
1616
'camelcase': require('./rules/camelcase'),
17+
'class-order': require('./rules/class-order'),
1718
'comma-dangle': require('./rules/comma-dangle'),
1819
'comment-directive': require('./rules/comment-directive'),
1920
'component-name-in-template-casing': require('./rules/component-name-in-template-casing'),
@@ -75,6 +76,7 @@ module.exports = {
7576
'v-bind-style': require('./rules/v-bind-style'),
7677
'v-on-function-call': require('./rules/v-on-function-call'),
7778
'v-on-style': require('./rules/v-on-style'),
79+
'v-slot-style': require('./rules/v-slot-style'),
7880
'valid-template-root': require('./rules/valid-template-root'),
7981
'valid-v-bind': require('./rules/valid-v-bind'),
8082
'valid-v-cloak': require('./rules/valid-v-cloak'),
@@ -88,6 +90,7 @@ module.exports = {
8890
'valid-v-once': require('./rules/valid-v-once'),
8991
'valid-v-pre': require('./rules/valid-v-pre'),
9092
'valid-v-show': require('./rules/valid-v-show'),
93+
'valid-v-slot': require('./rules/valid-v-slot'),
9194
'valid-v-text': require('./rules/valid-v-text')
9295
},
9396
configs: {

lib/rules/class-order.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @fileoverview Alphabetizes classnames.
3+
* @author Maciej Chmurski
4+
*/
5+
'use strict'
6+
7+
// ------------------------------------------------------------------------------
8+
// Requirements
9+
// ------------------------------------------------------------------------------
10+
11+
const utils = require('../utils')
12+
13+
// ------------------------------------------------------------------------------
14+
// Helpers
15+
// ------------------------------------------------------------------------------
16+
17+
// ------------------------------------------------------------------------------
18+
// Rule Definition
19+
// ------------------------------------------------------------------------------
20+
module.exports = {
21+
meta: {
22+
type: 'suggestion',
23+
docs: {
24+
url: 'https://eslint.vuejs.org/rules/class-order.html',
25+
description: 'enforce classnames order',
26+
category: undefined
27+
},
28+
fixable: 'code',
29+
schema: []
30+
},
31+
create: context => {
32+
return utils.defineTemplateBodyVisitor(context, {
33+
"VAttribute[directive=false][key.name='class']" (node) {
34+
const classList = node.value.value
35+
const classListSorted = classList.split(' ').sort().join(' ')
36+
37+
if (classList !== classListSorted) {
38+
context.report({
39+
node,
40+
loc: node.loc,
41+
message: 'Classes should be ordered alphabetically.',
42+
fix: (fixer) => fixer.replaceTextRange(
43+
[node.value.range[0], node.value.range[1]], `"${classListSorted}"`
44+
)
45+
})
46+
}
47+
}
48+
})
49+
}
50+
}

tests/lib/rules/class-order.js

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* @fileoverview enforce ordering of classes
3+
* @author Maciej Chmurski
4+
*/
5+
'use strict'
6+
7+
// ------------------------------------------------------------------------------
8+
// Requirements
9+
// ------------------------------------------------------------------------------
10+
11+
var rule = require('../../../lib/rules/class-order')
12+
var RuleTester = require('eslint').RuleTester
13+
14+
// ------------------------------------------------------------------------------
15+
// Tests
16+
// ------------------------------------------------------------------------------
17+
18+
var tester = new RuleTester({
19+
parser: 'vue-eslint-parser',
20+
parserOptions: { ecmaVersion: 2015 }
21+
})
22+
tester.run('class-order', rule, {
23+
24+
valid: [
25+
{
26+
filename: 'test.vue',
27+
code: '<template><div></div></template>'
28+
},
29+
{
30+
filename: 'test.vue',
31+
code: '<template><div class="a b"></div></template>'
32+
},
33+
{
34+
filename: 'test.vue',
35+
code: '<template><div class="a"></div></template>'
36+
}
37+
],
38+
39+
invalid: [
40+
{
41+
filename: 'test.vue',
42+
code: '<template><div class="b a"></div></template>',
43+
output: '<template><div class="a b"></div></template>',
44+
errors: [{
45+
message: 'Classes should be ordered alphabetically.',
46+
type: 'VAttribute'
47+
}]
48+
},
49+
{
50+
filename: 'test.vue',
51+
code:
52+
`<template>
53+
<div class="c b a">
54+
</div>
55+
</template>`,
56+
output:
57+
`<template>
58+
<div class="a b c">
59+
</div>
60+
</template>`,
61+
errors: [
62+
{
63+
message: 'Classes should be ordered alphabetically.',
64+
type: 'VAttribute'
65+
}
66+
]
67+
}
68+
]
69+
})

0 commit comments

Comments
 (0)