From 170070853526b1a21c5299d77a0fa676ccf14aa9 Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Sat, 6 Jun 2020 06:27:59 +0900 Subject: [PATCH] Changed so that the names array can be specified in the one order option of the `vue/component-tags-order` rule, and the default setting has been changed. (#1189) --- docs/rules/comment-directive.md | 17 +++---- docs/rules/component-tags-order.md | 28 +++++++++-- lib/rules/component-tags-order.js | 46 +++++++++++++----- tests/lib/rules/component-tags-order.js | 62 ++++++++++++++++++++++++- 4 files changed, 128 insertions(+), 25 deletions(-) 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 ` - + ``` @@ -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 '', + '', '', '', '', + '', + '', '', + '', + ` + + + + + + `, ` @@ -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, { '