From 83568682077a47d356041e52ac9b2b9f91523bec Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Thu, 22 Jun 2023 13:14:59 +0200 Subject: [PATCH 1/7] Rename `vue/component-tags-order` to `vue/block-order` --- ...component-tags-order.md => block-order.md} | 42 +++++++++---------- docs/rules/index.md | 2 +- lib/configs/recommended.js | 2 +- lib/configs/vue3-recommended.js | 2 +- lib/index.js | 2 +- ...component-tags-order.js => block-order.js} | 2 +- ...component-tags-order.js => block-order.js} | 10 ++--- 7 files changed, 29 insertions(+), 33 deletions(-) rename docs/rules/{component-tags-order.md => block-order.md} (65%) rename lib/rules/{component-tags-order.js => block-order.js} (98%) rename tests/lib/rules/{component-tags-order.js => block-order.js} (97%) diff --git a/docs/rules/component-tags-order.md b/docs/rules/block-order.md similarity index 65% rename from docs/rules/component-tags-order.md rename to docs/rules/block-order.md index 4fc8d245e..7d56304e1 100644 --- a/docs/rules/component-tags-order.md +++ b/docs/rules/block-order.md @@ -1,14 +1,14 @@ --- pageClass: rule-details sidebarDepth: 0 -title: vue/component-tags-order +title: vue/block-order description: enforce order of component top-level elements -since: v6.1.0 --- -# vue/component-tags-order +# vue/block-order > enforce order of component top-level elements +- :exclamation: ***This rule has not been released yet.*** - :gear: This rule is included in `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. - :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. @@ -20,7 +20,7 @@ This rule warns about the order of the top-level tags, such as `', @@ -478,7 +478,7 @@ tester.run('component-tags-order', rule, { describe('suppress reporting with eslint-disable-next-line', () => { it('do not report if ', async () => { const code = ` - + ` const [{ messages, output }] = await eslint.lintText(code, { filePath: 'test.vue' @@ -488,7 +488,7 @@ describe('suppress reporting with eslint-disable-next-line', () => { assert.strictEqual( output, ` - + ` ) }) From 842d1a0d41772b913d02a3ae8c5d75f6813516f5 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Thu, 22 Jun 2023 13:21:45 +0200 Subject: [PATCH 2/7] Add back (deprecated) `vue/component-tags-order` rule --- docs/rules/component-tags-order.md | 199 ++++++++++ docs/rules/index.md | 1 + lib/index.js | 1 + lib/rules/component-tags-order.js | 22 ++ tests/lib/rules/component-tags-order.js | 495 ++++++++++++++++++++++++ 5 files changed, 718 insertions(+) create mode 100644 docs/rules/component-tags-order.md create mode 100644 lib/rules/component-tags-order.js create mode 100644 tests/lib/rules/component-tags-order.js diff --git a/docs/rules/component-tags-order.md b/docs/rules/component-tags-order.md new file mode 100644 index 000000000..242a21154 --- /dev/null +++ b/docs/rules/component-tags-order.md @@ -0,0 +1,199 @@ +--- +pageClass: rule-details +sidebarDepth: 0 +title: vue/component-tags-order +description: enforce order of component top-level elements +since: v6.1.0 +--- +# vue/component-tags-order + +> enforce order of component top-level elements + +- :warning: This rule was **deprecated** and replaced by [vue/block-order](block-order.md) rule. +- :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. + +## :book: Rule Details + +This rule warns about the order of the top-level tags, such as ` + + +``` + + + + + +```vue + + + + +``` + + + + + +```vue + + + + +``` + + + +### `{ "order": ["template", "script", "style"] }` + + + +```vue + + + + +``` + + + + + +```vue + + + + +``` + + + +### `{ "order": ["docs", "template", "script", "style"] }` + + + +```vue + + documentation + + + +``` + + + + + +```vue + + + + documentation + +``` + + + +### `{ 'order': ['template', 'script:not([setup])', 'script[setup]'] }` + + + +```vue + + + + +``` + + + + + +```vue + + + + +``` + + + +### `{ 'order': ['template', 'style:not([scoped])', 'style[scoped]'] }` + + + +```vue + + + + +``` + + + + + +```vue + + + + +``` + + + +### `{ 'order': ['template', 'i18n:not([locale=en])', 'i18n[locale=en]'] }` + + + +```vue + + +/* ... */ +/* ... */ +``` + + + + + +```vue + + +/* ... */ +/* ... */ +``` + + + +## :books: Further Reading + +- [Style guide - Single-file component top-level element order](https://vuejs.org/style-guide/rules-recommended.html#single-file-component-top-level-element-order) + +## :rocket: Version + +This rule was introduced in eslint-plugin-vue v6.1.0 + +## :mag: Implementation + +- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/component-tags-order.js) +- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/component-tags-order.js) diff --git a/docs/rules/index.md b/docs/rules/index.md index 664551eb8..3c3673cf0 100644 --- a/docs/rules/index.md +++ b/docs/rules/index.md @@ -333,6 +333,7 @@ The following rules extend the rules provided by ESLint itself and apply them to | Rule ID | Replaced by | |:--------|:------------| +| [vue/component-tags-order](./component-tags-order.md) | [vue/block-order](./block-order.md) | | [vue/no-invalid-model-keys](./no-invalid-model-keys.md) | [vue/valid-model-definition](./valid-model-definition.md) | | [vue/script-setup-uses-vars](./script-setup-uses-vars.md) | (no replacement) | | [vue/v-on-function-call](./v-on-function-call.md) | [vue/v-on-handler-style](./v-on-handler-style.md) | diff --git a/lib/index.js b/lib/index.js index 07f5698cb..e0eecbf2c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -28,6 +28,7 @@ module.exports = { 'component-definition-name-casing': require('./rules/component-definition-name-casing'), 'component-name-in-template-casing': require('./rules/component-name-in-template-casing'), 'component-options-name-casing': require('./rules/component-options-name-casing'), + 'component-tags-order': require('./rules/component-tags-order'), 'custom-event-name-casing': require('./rules/custom-event-name-casing'), 'define-emits-declaration': require('./rules/define-emits-declaration'), 'define-macros-order': require('./rules/define-macros-order'), diff --git a/lib/rules/component-tags-order.js b/lib/rules/component-tags-order.js new file mode 100644 index 000000000..5955f4adf --- /dev/null +++ b/lib/rules/component-tags-order.js @@ -0,0 +1,22 @@ +'use strict' + +const baseRule = require('./block-order') + +module.exports = { + // eslint-disable-next-line eslint-plugin/require-meta-schema -- inherit schema from base rule + meta: { + ...baseRule.meta, + type: baseRule.meta.type, + docs: { + description: baseRule.meta.docs.description, + categories: undefined, + url: 'https://eslint.vuejs.org/rules/component-tags-order.html' + }, + deprecated: true, + replacedBy: ['block-order'] + }, + /** @param {RuleContext} context */ + create(context) { + return baseRule.create(context) + } +} diff --git a/tests/lib/rules/component-tags-order.js b/tests/lib/rules/component-tags-order.js new file mode 100644 index 000000000..51ed7140b --- /dev/null +++ b/tests/lib/rules/component-tags-order.js @@ -0,0 +1,495 @@ +/** + * @author Yosuke Ota + */ +'use strict' + +const rule = require('../../../lib/rules/component-tags-order') +const RuleTester = require('eslint').RuleTester +const assert = require('assert') +const { ESLint } = require('../../eslint-compat') + +// Initialize linter. +const eslint = new ESLint({ + overrideConfig: { + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ecmaVersion: 2015 + }, + plugins: ['vue'], + rules: { + 'vue/comment-directive': 'error', + 'vue/component-tags-order': 'error' + } + }, + useEslintrc: false, + plugins: { vue: require('../../../lib/index') }, + fix: true +}) + +const tester = new RuleTester({ + parser: require.resolve('vue-eslint-parser') +}) + +tester.run('component-tags-order', rule, { + valid: [ + // default + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + ` + + + + + + `, + ` + + + + + + `, + + // order + { + code: '', + output: null, + options: [{ order: ['script', 'template', 'style'] }] + }, + { + code: '', + output: null, + options: [{ order: ['template', 'script', 'style'] }] + }, + { + code: '', + output: null, + options: [{ order: ['style', 'template', 'script'] }] + }, + { + code: '', + output: null, + options: [{ order: ['template', 'docs', 'script', 'style'] }] + }, + { + code: '', + output: null, + options: [{ order: ['template', 'script', 'style'] }] + }, + { + code: '
text

', + output: null, + options: [{ order: ['docs', 'script', 'template', 'style'] }] + }, + { + code: '', + output: null, + options: [ + { order: ['script[setup]', 'script:not([setup])', 'template', 'style'] } + ] + }, + { + code: '', + output: null, + options: [ + { + order: [['script[setup]', 'script:not([setup])', 'template'], 'style'] + } + ] + }, + { + code: '', + output: null, + options: [{ order: ['script', 'template', 'style'] }] + }, + { + code: '', + output: null, + options: [{ order: [['script', 'template'], 'style'] }] + }, + { + code: '', + output: null, + options: [ + { order: ['script:not([setup])', 'script[setup]', 'template', 'style'] } + ] + }, + { + code: '', + output: null, + options: [ + { + order: [['script:not([setup])', 'script[setup]', 'template'], 'style'] + } + ] + }, + { + code: '', + output: null, + options: [ + { + order: [ + ['script:not([setup])', 'script[setup]', 'template'], + 'style[scoped]', + 'style:not([scoped])', + 'i18n:not([locale=en])', + 'i18n:not([locale=ja])' + ] + } + ] + }, + { + code: '', + output: null, + options: [ + { + order: [ + 'template', + 'script:not([setup])', + 'script[setup]', + 'style[scoped]', + 'style:not([scoped])', + 'i18n[locale=en]', + 'i18n[locale=ja]' + ] + } + ] + }, + { + code: '', + output: null, + options: [{ order: [['docs', 'script', 'template'], 'style'] }] + }, + { + code: '', + output: null, + options: [{ order: ['i18n[locale=en]', 'i18n[locale=ja]'] }] + }, + { + code: '', + output: null, + options: [{ order: ['style:not([scoped])', 'style[scoped]'] }] + }, + + ``, + + // Invalid EOF + '