diff --git a/docs/rules/comment-directive.md b/docs/rules/comment-directive.md
index b6c30b2a6..01ad51826 100644
--- a/docs/rules/comment-directive.md
+++ b/docs/rules/comment-directive.md
@@ -49,8 +49,8 @@ The `eslint-disable`-like comments can be used in the `` and in the bl
-
+
```
@@ -60,15 +60,16 @@ The `eslint-disable` comments has no effect after one block.
```vue
-
-
-
-
-
-
+
+
+
+
```
diff --git a/docs/rules/component-tags-order.md b/docs/rules/component-tags-order.md
index 3d157dc00..50d43b83c 100644
--- a/docs/rules/component-tags-order.md
+++ b/docs/rules/component-tags-order.md
@@ -18,14 +18,14 @@ This rule warns about the order of the `
+
+```
+
+
+
+
+
```vue
@@ -62,6 +73,17 @@ This rule warns about the order of the `
+...
+
+```
+
+
+
### `{ "order": ["docs", "template", "script", "style"] }`
diff --git a/lib/rules/component-tags-order.js b/lib/rules/component-tags-order.js
index c19429637..6fa6f211e 100644
--- a/lib/rules/component-tags-order.js
+++ b/lib/rules/component-tags-order.js
@@ -10,7 +10,7 @@
const utils = require('../utils')
-const DEFAULT_ORDER = Object.freeze(['script', 'template', 'style'])
+const DEFAULT_ORDER = Object.freeze([['script', 'template'], 'style'])
// ------------------------------------------------------------------------------
// Rule Definition
@@ -25,22 +25,44 @@ module.exports = {
url: 'https://eslint.vuejs.org/rules/component-tags-order.html'
},
fixable: null,
- schema: {
- type: 'array',
- properties: {
- order: {
- type: 'array'
+ schema: [
+ {
+ type: 'object',
+ properties: {
+ order: {
+ type: 'array',
+ items: {
+ anyOf: [
+ { type: 'string' },
+ { type: 'array', items: { type: 'string' }, uniqueItems: true }
+ ]
+ },
+ uniqueItems: true,
+ additionalItems: false
+ }
}
}
- },
+ ],
messages: {
unexpected:
'The <{{name}}> should be above the <{{firstUnorderedName}}> on line {{line}}.'
}
},
create(context) {
- const order =
- (context.options[0] && context.options[0].order) || DEFAULT_ORDER
+ /** @type {Map {
+ if (Array.isArray(nameOrNames)) {
+ for (const name of nameOrNames) {
+ orderMap.set(name, index)
+ }
+ } else {
+ orderMap.set(nameOrNames, index)
+ }
+ })
const documentFragment =
context.parserServices.getDocumentFragment &&
context.parserServices.getDocumentFragment()
@@ -76,15 +98,15 @@ module.exports = {
const elements = getTopLevelHTMLElements()
elements.forEach((element, index) => {
- const expectedIndex = order.indexOf(element.name)
+ const expectedIndex = orderMap.get(element.name)
if (expectedIndex < 0) {
return
}
const firstUnordered = elements
.slice(0, index)
- .filter((e) => expectedIndex < order.indexOf(e.name))
+ .filter((e) => expectedIndex < orderMap.get(e.name))
.sort(
- (e1, e2) => order.indexOf(e1.name) - order.indexOf(e2.name)
+ (e1, e2) => orderMap.get(e1.name) - orderMap.get(e2.name)
)[0]
if (firstUnordered) {
report(element, firstUnordered)
diff --git a/tests/lib/rules/component-tags-order.js b/tests/lib/rules/component-tags-order.js
index fdb34d1d0..1630cbed1 100644
--- a/tests/lib/rules/component-tags-order.js
+++ b/tests/lib/rules/component-tags-order.js
@@ -22,10 +22,24 @@ tester.run('component-tags-order', rule, {
valid: [
// default
'',
+ '',
'text
',
'',
'',
+ '',
+ '',
'',
+ '',
+ `
+
+
+
+
+
+
+ `,
`
@@ -38,6 +52,11 @@ tester.run('component-tags-order', rule, {
`,
// order
+ {
+ code: '',
+ output: null,
+ options: [{ order: ['script', 'template', 'style'] }]
+ },
{
code: '',
output: null,
@@ -65,6 +84,12 @@ tester.run('component-tags-order', rule, {
output: null,
options: [{ order: ['docs', 'script', 'template', 'style'] }]
},
+ {
+ code:
+ '',
+ output: null,
+ options: [{ order: [['docs', 'script', 'template'], 'style'] }]
+ },
``,
@@ -73,8 +98,24 @@ tester.run('component-tags-order', rule, {
'