From 8bdb2a905b362434cfcf91e561fab5338d0c70a9 Mon Sep 17 00:00:00 2001 From: hiroki osame Date: Sun, 11 Apr 2021 23:40:36 -0400 Subject: [PATCH 001/614] feat(max-attributes-per-line): singleline.allowFirstLine option (#1465) * feat(max-attributes-per-line): allow max attribues 0 for singleline * feat(max-attributes-per-line): allowFirstLine option * docs(max-attributes-per-line): updated options and added example --- docs/rules/max-attributes-per-line.md | 26 ++++++++++++- lib/rules/max-attributes-per-line.js | 45 +++++++++++++++------- tests/lib/rules/max-attributes-per-line.js | 13 +++++++ 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/docs/rules/max-attributes-per-line.md b/docs/rules/max-attributes-per-line.md index 69bd77949..dac9d2d72 100644 --- a/docs/rules/max-attributes-per-line.md +++ b/docs/rules/max-attributes-per-line.md @@ -57,7 +57,10 @@ There is a configurable number of attributes that are acceptable in one-line cas ```json { "vue/max-attributes-per-line": ["error", { - "singleline": 1, + "singleline": { + "max": 1, + "allowFirstLine": true + }, "multiline": { "max": 1, "allowFirstLine": false @@ -66,7 +69,8 @@ There is a configurable number of attributes that are acceptable in one-line cas } ``` -- `singleline` (`number`) ... The number of maximum attributes per line when the opening tag is in a single line. Default is `1`. +- `singleline.max` (`number`) ... The number of maximum attributes per line when the opening tag is in a single line. Default is `1`. +- `singleline.allowFirstLine` (`boolean`) ... If `true`, it allows attributes on the same line as that tag name. Default is `true`. - `multiline.max` (`number`) ... The max number of attributes per line when the opening tag is in multiple lines. Default is `1`. This can be `{ multiline: 1 }` instead of `{ multiline: { max: 1 }}` if you don't configure `allowFirstLine` property. - `multiline.allowFirstLine` (`boolean`) ... If `true`, it allows attributes on the same line as that tag name. Default is `false`. @@ -86,6 +90,24 @@ There is a configurable number of attributes that are acceptable in one-line cas +### `"singleline": 1, "allowFirstLine": false` + + + +```vue + +``` + + + ### `"multiline": 2` diff --git a/lib/rules/max-attributes-per-line.js b/lib/rules/max-attributes-per-line.js index e379df47f..d50a78d6d 100644 --- a/lib/rules/max-attributes-per-line.js +++ b/lib/rules/max-attributes-per-line.js @@ -34,6 +34,9 @@ module.exports = { max: { type: 'number', minimum: 1 + }, + allowFirstLine: { + type: 'boolean' } }, additionalProperties: false @@ -72,7 +75,8 @@ module.exports = { const configuration = parseOptions(context.options[0]) const multilineMaximum = configuration.multiline const singlelinemMaximum = configuration.singleline - const canHaveFirstLine = configuration.allowFirstLine + const canHaveSinglelineFirstLine = configuration.singlelineAllowFirstLine + const canHaveMultilineFirstLine = configuration.multilineAllowFirstLine const template = context.parserServices.getTemplateBodyTokenStore && context.parserServices.getTemplateBodyTokenStore() @@ -83,16 +87,22 @@ module.exports = { if (!numberOfAttributes) return - if ( - utils.isSingleLine(node) && - numberOfAttributes > singlelinemMaximum - ) { - showErrors(node.attributes.slice(singlelinemMaximum)) + if (utils.isSingleLine(node)) { + if ( + !canHaveSinglelineFirstLine && + node.attributes[0].loc.start.line === node.loc.start.line + ) { + showErrors([node.attributes[0]]) + } + + if (numberOfAttributes > singlelinemMaximum) { + showErrors(node.attributes.slice(singlelinemMaximum)) + } } if (!utils.isSingleLine(node)) { if ( - !canHaveFirstLine && + !canHaveMultilineFirstLine && node.attributes[0].loc.start.line === node.loc.start.line ) { showErrors([node.attributes[0]]) @@ -114,27 +124,36 @@ module.exports = { function parseOptions(options) { const defaults = { singleline: 1, + singlelineAllowFirstLine: true, multiline: 1, - allowFirstLine: false + multilineAllowFirstLine: false } if (options) { if (typeof options.singleline === 'number') { defaults.singleline = options.singleline - } else if (options.singleline && options.singleline.max) { - defaults.singleline = options.singleline.max + } else if (typeof options.singleline === 'object') { + if (typeof options.singleline.max === 'number') { + defaults.singleline = options.singleline.max + } + + if (typeof options.singleline.allowFirstLine === 'boolean') { + defaults.singlelineAllowFirstLine = + options.singleline.allowFirstLine + } } if (options.multiline) { if (typeof options.multiline === 'number') { defaults.multiline = options.multiline } else if (typeof options.multiline === 'object') { - if (options.multiline.max) { + if (typeof options.multiline.max === 'number') { defaults.multiline = options.multiline.max } - if (options.multiline.allowFirstLine) { - defaults.allowFirstLine = options.multiline.allowFirstLine + if (typeof options.multiline.allowFirstLine === 'boolean') { + defaults.multilineAllowFirstLine = + options.multiline.allowFirstLine } } } diff --git a/tests/lib/rules/max-attributes-per-line.js b/tests/lib/rules/max-attributes-per-line.js index fa7210027..aedc6d6d8 100644 --- a/tests/lib/rules/max-attributes-per-line.js +++ b/tests/lib/rules/max-attributes-per-line.js @@ -299,6 +299,19 @@ petname="Snoopy" extra="foo"> line: 3 } ] + }, + { + code: ``, + options: [{ singleline: { allowFirstLine: false } }], + output: ``, + errors: [ + { + message: "'name' should be on a new line.", + type: 'VAttribute', + line: 1 + } + ] } ] }) From 26d9920e4da87cd053ec89afa3ff4ce07b1901fe Mon Sep 17 00:00:00 2001 From: frozenbonito Date: Mon, 12 Apr 2021 12:40:54 +0900 Subject: [PATCH 002/614] Fix false negative with require-valid-default-prop (#1469) --- lib/rules/require-valid-default-prop.js | 5 +- tests/lib/rules/require-valid-default-prop.js | 90 +++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/lib/rules/require-valid-default-prop.js b/lib/rules/require-valid-default-prop.js index ef9453b23..e40cad861 100644 --- a/lib/rules/require-valid-default-prop.js +++ b/lib/rules/require-valid-default-prop.js @@ -49,10 +49,11 @@ function getPropertyNode(obj, name) { } /** - * @param {Expression} node + * @param {Expression} targetNode * @returns {string[]} */ -function getTypes(node) { +function getTypes(targetNode) { + const node = utils.skipTSAsExpression(targetNode) if (node.type === 'Identifier') { return [node.name] } else if (node.type === 'ArrayExpression') { diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js index 58adccadf..836f06d5c 100644 --- a/tests/lib/rules/require-valid-default-prop.js +++ b/tests/lib/rules/require-valid-default-prop.js @@ -207,6 +207,51 @@ ruleTester.run('require-valid-default-prop', rule, { } }`, parserOptions + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Array as PropType, + default: () => [] + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Object as PropType<{ [key: number]: number }>, + default: () => {} + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Function as PropType<() => number>, + default: () => 10 + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') } ], @@ -781,6 +826,51 @@ ruleTester.run('require-valid-default-prop', rule, { }`, parserOptions, errors: errorMessage('string') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Array as PropType, + default: [] + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Object as PropType<{ [key: number]: number }>, + default: {} + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') + }, + { + filename: 'test.vue', + code: `export default Vue.extend({ + props: { + foo: { + type: Function as PropType<() => number>, + default: 10 + } + } + }); + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, + parser: require.resolve('@typescript-eslint/parser'), + errors: errorMessage('function') } ] }) From 084bfe3a2eee243fbfed61baee2f1c5834d2a5ab Mon Sep 17 00:00:00 2001 From: Alexander Sokolov Date: Mon, 12 Apr 2021 06:41:11 +0300 Subject: [PATCH 003/614] New: Add `vue/no-invalid-model-keys` rule (#1466) * added no-invalid-model-keys rule * added no-invalid-model-keys to rules list * added no-invalid-model-keys tests * removed unused * added docs for no-invalid-model-keys * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota * Update lib/rules/no-invalid-model-keys.js Co-authored-by: Yosuke Ota * Update lib/rules/no-invalid-model-keys.js Co-authored-by: Yosuke Ota * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota * Update no-invalid-model-keys.md * Update no-invalid-model-keys.js * Update no-invalid-model-keys.js * Update no-invalid-model-keys.js * Update no-invalid-model-keys.js Co-authored-by: Alex Sokolov <4497128+Alex-Sokolov@users.noreply.github.com> Co-authored-by: Yosuke Ota --- docs/rules/no-invalid-model-keys.md | 103 ++++++++++++++++ lib/index.js | 1 + lib/rules/no-invalid-model-keys.js | 56 +++++++++ tests/lib/rules/no-invalid-model-keys.js | 151 +++++++++++++++++++++++ 4 files changed, 311 insertions(+) create mode 100644 docs/rules/no-invalid-model-keys.md create mode 100644 lib/rules/no-invalid-model-keys.js create mode 100644 tests/lib/rules/no-invalid-model-keys.js diff --git a/docs/rules/no-invalid-model-keys.md b/docs/rules/no-invalid-model-keys.md new file mode 100644 index 000000000..b69cbf952 --- /dev/null +++ b/docs/rules/no-invalid-model-keys.md @@ -0,0 +1,103 @@ +--- +pageClass: rule-details +sidebarDepth: 0 +title: vue/no-invalid-model-keys +description: require valid keys in model option +--- +# vue/no-invalid-model-keys + +> require valid keys in model option + + +## :book: Rule Details + +This rule is aimed at preventing invalid keys in model option. + + +```vue + +``` + + + +```vue + +``` + + + +```vue + +``` + + + +```vue + +``` + + + +```vue + +``` + + + +```vue + +``` + + + +## :mag: Implementation + +- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-invalid-model-keys.js) +- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-invalid-model-keys.js) diff --git a/lib/index.js b/lib/index.js index cc18e3055..a5f632314 100644 --- a/lib/index.js +++ b/lib/index.js @@ -81,6 +81,7 @@ module.exports = { 'no-empty-component-block': require('./rules/no-empty-component-block'), 'no-empty-pattern': require('./rules/no-empty-pattern'), 'no-extra-parens': require('./rules/no-extra-parens'), + 'no-invalid-model-keys': require('./rules/no-invalid-model-keys'), 'no-irregular-whitespace': require('./rules/no-irregular-whitespace'), 'no-lifecycle-after-await': require('./rules/no-lifecycle-after-await'), 'no-lone-template': require('./rules/no-lone-template'), diff --git a/lib/rules/no-invalid-model-keys.js b/lib/rules/no-invalid-model-keys.js new file mode 100644 index 000000000..3a4b7ccf6 --- /dev/null +++ b/lib/rules/no-invalid-model-keys.js @@ -0,0 +1,56 @@ +/** + * @fileoverview Requires valid keys in model option. + * @author Alex Sokolov + */ +'use strict' + +const utils = require('../utils') + +/** + * @typedef {import('../utils').GroupName} GroupName + */ + +// ------------------------------------------------------------------------------ +// Rule Definition +// ------------------------------------------------------------------------------ +/** @type {GroupName[]} */ +const GROUP_NAMES = ['model'] + +const VALID_MODEL_KEYS = ['prop', 'event'] + +module.exports = { + meta: { + type: 'problem', + docs: { + description: 'require valid keys in model option', + categories: undefined, + url: 'https://eslint.vuejs.org/rules/no-invalid-model-keys.html' + }, + fixable: null, + schema: [] + }, + /** @param {RuleContext} context */ + create(context) { + const groups = new Set(GROUP_NAMES) + + // ---------------------------------------------------------------------- + // Public + // ---------------------------------------------------------------------- + + return utils.executeOnVue(context, (obj) => { + const properties = utils.iterateProperties(obj, groups) + + for (const o of properties) { + if (VALID_MODEL_KEYS.indexOf(o.name) === -1) { + context.report({ + node: o.node, + message: "Invalid key '{{name}}' in model option.", + data: { + name: o.name + } + }) + } + } + }) + } +} diff --git a/tests/lib/rules/no-invalid-model-keys.js b/tests/lib/rules/no-invalid-model-keys.js new file mode 100644 index 000000000..ebe4de973 --- /dev/null +++ b/tests/lib/rules/no-invalid-model-keys.js @@ -0,0 +1,151 @@ +/** + * @fileoverview Prevents invalid keys in model option. + * @author Alex Sokolov + */ +'use strict' + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +const rule = require('../../../lib/rules/no-invalid-model-keys') +const RuleTester = require('eslint').RuleTester + +// ------------------------------------------------------------------------------ +// Tests +// ------------------------------------------------------------------------------ + +const ruleTester = new RuleTester({ + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module' + } +}) +ruleTester.run('no-invalid-model-keys', rule, { + valid: [ + { + filename: 'test.vue', + code: ` + export default { + model: { + prop: 'list' + } + } + ` + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + event: 'update' + } + } + ` + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + prop: 'list', + event: 'update' + } + } + ` + } + ], + + invalid: [ + { + filename: 'test.vue', + code: ` + export default { + model: { + props: 'list' + } + } + `, + errors: ["Invalid key 'props' in model option."] + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + events: 'update' + } + } + `, + errors: ["Invalid key 'events' in model option."] + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + props: 'list', + event: 'update' + } + } + `, + errors: ["Invalid key 'props' in model option."] + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + prop: 'list', + events: 'update' + } + } + `, + errors: ["Invalid key 'events' in model option."] + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + props: 'list', + events: 'update' + } + } + `, + errors: [ + "Invalid key 'props' in model option.", + "Invalid key 'events' in model option." + ] + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + prop: 'checked', + props: 'list', + event: 'update' + } + } + `, + errors: ["Invalid key 'props' in model option."] + }, + { + filename: 'test.vue', + code: ` + export default { + model: { + name: 'checked', + props: 'list', + event: 'update' + } + } + `, + errors: [ + "Invalid key 'name' in model option.", + "Invalid key 'props' in model option." + ] + } + ] +}) From 238de1b195cf84d6b314799700e6c5e8f4a29263 Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Mon, 12 Apr 2021 16:34:41 +0900 Subject: [PATCH 004/614] Add `vue/no-unused-refs` rule (#1474) * Add `vue/no-unused-refs` rule * update doc --- docs/rules/README.md | 2 + docs/rules/no-unused-refs.md | 50 ++++ lib/index.js | 1 + lib/rules/no-unused-refs.js | 204 ++++++++++++++++ tests/lib/rules/no-unused-refs.js | 384 ++++++++++++++++++++++++++++++ 5 files changed, 641 insertions(+) create mode 100644 docs/rules/no-unused-refs.md create mode 100644 lib/rules/no-unused-refs.js create mode 100644 tests/lib/rules/no-unused-refs.js diff --git a/docs/rules/README.md b/docs/rules/README.md index d00e5478b..cb65b19ac 100644 --- a/docs/rules/README.md +++ b/docs/rules/README.md @@ -300,6 +300,7 @@ For example: | [vue/no-boolean-default](./no-boolean-default.md) | disallow boolean defaults | :wrench: | | [vue/no-duplicate-attr-inheritance](./no-duplicate-attr-inheritance.md) | enforce `inheritAttrs` to be set to `false` when using `v-bind="$attrs"` | | | [vue/no-empty-component-block](./no-empty-component-block.md) | disallow the ` ``` @@ -52,7 +52,7 @@ This rule disallows using `target="_blank"` attribute without `rel="noopener nor link - + ``` @@ -68,7 +68,7 @@ This rule disallows using `target="_blank"` attribute without `rel="noopener nor link - + ``` @@ -84,7 +84,7 @@ This rule disallows using `target="_blank"` attribute without `rel="noopener nor link - + ``` @@ -100,7 +100,7 @@ This rule disallows using `target="_blank"` attribute without `rel="noopener nor link - + ``` From c775584b922d21fe62f6aee0f638ed9b75968f1f Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Wed, 5 May 2021 09:19:43 +0900 Subject: [PATCH 008/614] Fix typo (#1486) --- docs/rules/html-button-has-type.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/rules/html-button-has-type.md b/docs/rules/html-button-has-type.md index 5974f72da..24f997e6a 100644 --- a/docs/rules/html-button-has-type.md +++ b/docs/rules/html-button-has-type.md @@ -48,13 +48,13 @@ This rule aims to warn if no type or an invalid type is used on a button type at - `button` ... `` - `true` (default) ... allow value `button`. - - `false"` ... disallow value `button`. + - `false` ... disallow value `button`. - `submit` ... `` - `true` (default) ... allow value `submit`. - - `false"` ... disallow value `submit`. + - `false` ... disallow value `submit`. - `reset` ... `` - `true` (default) ... allow value `reset`. - - `false"` ... disallow value `reset`. + - `false` ... disallow value `reset`. ## :rocket: Version From 8a0a0ed837e088e3013cf7219011642572422456 Mon Sep 17 00:00:00 2001 From: Lukas Date: Sat, 29 May 2021 03:41:25 +0200 Subject: [PATCH 009/614] docs: fix vue/sort-keys options (#1500) --- docs/rules/sort-keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rules/sort-keys.md b/docs/rules/sort-keys.md index cb8836f36..b573e4eaa 100644 --- a/docs/rules/sort-keys.md +++ b/docs/rules/sort-keys.md @@ -15,7 +15,7 @@ This rule is almost the same rule as core [sort-keys] rule but it will not error ```json { - "sort-keys": ["error", "asc", { + "vue/sort-keys": ["error", "asc", { "caseSensitive": true, "ignoreChildrenOf": ["model"], "ignoreGrandchildrenOf": ["computed", "directives", "inject", "props", "watch"], From 793112d2ffaab146bd7d5315c738a9d9d3bafd48 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY <974153916@qq.com> Date: Sat, 29 May 2021 09:51:45 +0800 Subject: [PATCH 010/614] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20https://github.c?= =?UTF-8?q?om/vuejs/eslint-plugin-vue/issues/1492=20(#1493)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 https://github.com/vuejs/eslint-plugin-vue/issues/1492 * docs: ✏️ update doc * fix: 🐛 fix eslint --- .../components/eslint-code-block.vue | 15 +-- docs/rules/README.md | 4 +- docs/rules/this-in-template.md | 5 +- lib/rules/attributes-order.js | 6 +- lib/rules/component-definition-name-casing.js | 3 +- .../component-name-in-template-casing.js | 3 +- lib/rules/experimental-script-setup-vars.js | 5 +- lib/rules/html-self-closing.js | 6 +- lib/rules/max-attributes-per-line.js | 9 +- lib/rules/max-len.js | 3 +- .../multiline-html-element-content-newline.js | 17 +-- .../new-line-between-multi-line-property.js | 3 +- .../no-deprecated-data-object-declaration.js | 3 +- .../no-deprecated-destroyed-lifecycle.js | 3 +- .../no-deprecated-dollar-listeners-api.js | 3 +- .../no-deprecated-dollar-scopedslots-api.js | 3 +- .../no-deprecated-functional-template.js | 3 +- lib/rules/no-deprecated-props-default-this.js | 3 +- lib/rules/no-deprecated-scope-attribute.js | 5 +- .../no-deprecated-slot-scope-attribute.js | 3 +- .../no-deprecated-v-on-native-modifier.js | 3 +- .../no-deprecated-v-on-number-modifiers.js | 3 +- .../no-deprecated-vue-config-keycodes.js | 3 +- lib/rules/no-extra-parens.js | 3 +- lib/rules/no-irregular-whitespace.js | 9 +- .../no-potential-component-option-typo.js | 3 +- lib/rules/no-restricted-v-bind.js | 5 +- .../no-side-effects-in-computed-properties.js | 9 +- ...-spaces-around-equal-signs-in-attribute.js | 3 +- lib/rules/no-useless-mustaches.js | 7 +- lib/rules/no-useless-v-bind.js | 3 +- lib/rules/require-explicit-emits.js | 42 +++--- lib/rules/require-toggle-inside-transition.js | 3 +- ...singleline-html-element-content-newline.js | 17 +-- .../syntaxes/dynamic-directive-arguments.js | 3 +- lib/rules/syntaxes/scope-attribute.js | 3 +- lib/rules/syntaxes/slot-attribute.js | 3 +- .../v-bind-prop-modifier-shorthand.js | 3 +- lib/rules/this-in-template.js | 11 +- lib/rules/v-for-delimiter-style.js | 14 +- lib/rules/v-slot-style.js | 5 +- lib/utils/indent-common.js | 96 ++++++-------- lib/utils/index.js | 42 +++--- tests/lib/rules/attribute-hyphenation.js | 30 ++--- tests/lib/rules/attributes-order.js | 21 +-- tests/lib/rules/block-spacing.js | 6 +- tests/lib/rules/block-tag-newline.js | 21 +-- tests/lib/rules/brace-style.js | 3 +- .../component-name-in-template-casing.js | 3 +- tests/lib/rules/component-tags-order.js | 9 +- tests/lib/rules/html-button-has-type.js | 6 +- .../rules/mustache-interpolation-spacing.js | 6 +- tests/lib/rules/no-confusing-v-for-v-if.js | 18 +-- tests/lib/rules/no-deprecated-filter.js | 6 +- .../rules/no-deprecated-inline-template.js | 15 +-- tests/lib/rules/no-deprecated-v-bind-sync.js | 39 ++---- .../no-deprecated-v-on-number-modifiers.js | 9 +- tests/lib/rules/no-dupe-v-else-if.js | 123 ++++++------------ tests/lib/rules/no-duplicate-attributes.js | 3 +- tests/lib/rules/no-extra-parens.js | 6 +- tests/lib/rules/no-irregular-whitespace.js | 7 +- tests/lib/rules/no-multi-spaces.js | 3 +- tests/lib/rules/no-multiple-template-root.js | 9 +- tests/lib/rules/no-parsing-error.js | 3 +- .../rules/no-restricted-static-attribute.js | 3 +- tests/lib/rules/no-restricted-v-bind.js | 3 +- tests/lib/rules/no-template-key.js | 21 +-- tests/lib/rules/no-template-shadow.js | 3 +- tests/lib/rules/no-template-target-blank.js | 27 ++-- tests/lib/rules/no-textarea-mustache.js | 6 +- tests/lib/rules/no-unused-vars.js | 48 +++---- tests/lib/rules/no-use-v-if-with-v-for.js | 42 ++---- .../rules/no-v-for-template-key-on-child.js | 30 ++--- tests/lib/rules/no-v-for-template-key.js | 21 +-- tests/lib/rules/no-v-model-argument.js | 6 +- tests/lib/rules/require-explicit-emits.js | 42 ++---- .../rules/require-toggle-inside-transition.js | 30 ++--- tests/lib/rules/require-v-for-key.js | 57 +++----- tests/lib/rules/this-in-template.js | 44 +++++++ tests/lib/rules/valid-template-root.js | 9 +- tests/lib/rules/valid-v-bind-sync.js | 42 ++---- tests/lib/rules/valid-v-else-if.js | 42 ++---- tests/lib/rules/valid-v-else.js | 30 ++--- tests/lib/rules/valid-v-for.js | 120 ++++++----------- tests/lib/rules/valid-v-if.js | 3 +- tests/lib/rules/valid-v-model.js | 60 +++------ tests/lib/rules/valid-v-slot.js | 12 +- tools/lib/categories.js | 18 +-- 88 files changed, 575 insertions(+), 888 deletions(-) diff --git a/docs/.vuepress/components/eslint-code-block.vue b/docs/.vuepress/components/eslint-code-block.vue index 00b694825..381d9985f 100644 --- a/docs/.vuepress/components/eslint-code-block.vue +++ b/docs/.vuepress/components/eslint-code-block.vue @@ -122,15 +122,12 @@ export default { async mounted() { // Load linter. - const [ - { default: Linter }, - { default: coreRules }, - { parseForESLint } - ] = await Promise.all([ - import('eslint4b/dist/linter'), - import('eslint4b/dist/core-rules'), - import('espree').then(() => import('vue-eslint-parser')) - ]) + const [{ default: Linter }, { default: coreRules }, { parseForESLint }] = + await Promise.all([ + import('eslint4b/dist/linter'), + import('eslint4b/dist/core-rules'), + import('espree').then(() => import('vue-eslint-parser')) + ]) const linter = (this.linter = new Linter()) diff --git a/docs/rules/README.md b/docs/rules/README.md index e34e4ca2b..9717d49ae 100644 --- a/docs/rules/README.md +++ b/docs/rules/README.md @@ -157,7 +157,7 @@ Enforce all the rules in this category, as well as all higher priority rules, wi | [vue/no-multiple-slot-args](./no-multiple-slot-args.md) | disallow to pass multiple arguments to scoped slots | | | [vue/no-v-html](./no-v-html.md) | disallow use of v-html to prevent XSS attack | | | [vue/order-in-components](./order-in-components.md) | enforce order of properties in components | :wrench: | -| [vue/this-in-template](./this-in-template.md) | disallow usage of `this` in template | | +| [vue/this-in-template](./this-in-template.md) | disallow usage of `this` in template | :wrench: | ## Priority A: Essential (Error Prevention) for Vue.js 2.x @@ -267,7 +267,7 @@ Enforce all the rules in this category, as well as all higher priority rules, wi | [vue/no-multiple-slot-args](./no-multiple-slot-args.md) | disallow to pass multiple arguments to scoped slots | | | [vue/no-v-html](./no-v-html.md) | disallow use of v-html to prevent XSS attack | | | [vue/order-in-components](./order-in-components.md) | enforce order of properties in components | :wrench: | -| [vue/this-in-template](./this-in-template.md) | disallow usage of `this` in template | | +| [vue/this-in-template](./this-in-template.md) | disallow usage of `this` in template | :wrench: | ## Uncategorized diff --git a/docs/rules/this-in-template.md b/docs/rules/this-in-template.md index 7924ad3b5..f193e7e37 100644 --- a/docs/rules/this-in-template.md +++ b/docs/rules/this-in-template.md @@ -10,12 +10,13 @@ since: v3.13.0 > disallow usage of `this` in template - :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. ## :book: Rule Details This rule aims at preventing usage of `this` in Vue templates. - + ```vue `, - options: buildOptions(), output: null, + options: buildOptions(), errors: [ { message: '`v-slot` are not supported until Vue.js "2.6.0".', @@ -310,8 +310,8 @@ tester.run('no-unsupported-features/v-slot', rule, { `, - options: buildOptions(), output: null, + options: buildOptions(), errors: [ { message: '`v-slot` are not supported until Vue.js "2.6.0".', @@ -328,8 +328,8 @@ tester.run('no-unsupported-features/v-slot', rule, { `, - options: buildOptions(), output: null, + options: buildOptions(), errors: [ { message: '`v-slot` are not supported until Vue.js "2.6.0".', diff --git a/tests/lib/rules/no-unused-properties.js b/tests/lib/rules/no-unused-properties.js index 2db132c48..0139559b1 100644 --- a/tests/lib/rules/no-unused-properties.js +++ b/tests/lib/rules/no-unused-properties.js @@ -1651,9 +1651,6 @@ tester.run('no-unused-properties', rule, { { // https://github.com/vuejs/eslint-plugin-vue/issues/1643 filename: 'test.vue', - parserOptions: { - parser: '@typescript-eslint/parser' - }, code: ` `, - options: [ - 'never', - { - objectsInObjects: true - } - ], output: ` `, + options: [ + 'never', + { + objectsInObjects: true + } + ], errors: [ "There should be no space after '{'.", "There should be no space after '{'.", @@ -145,13 +145,13 @@ tester.run('object-curly-spacing', rule, { Hello World `, - options: ['never'], output: ` `, + options: ['never'], errors: [ "There should be no space after '{'.", "There should be no space after '{'.", diff --git a/tests/lib/rules/order-in-components.js b/tests/lib/rules/order-in-components.js index b12c41a33..669383e52 100644 --- a/tests/lib/rules/order-in-components.js +++ b/tests/lib/rules/order-in-components.js @@ -197,7 +197,6 @@ ruleTester.run('order-in-components', rule, { }, } `, - parserOptions, output: ` export default { name: 'app', @@ -211,6 +210,7 @@ ruleTester.run('order-in-components', rule, { }, } `, + parserOptions, errors: [ { message: @@ -239,11 +239,6 @@ ruleTester.run('order-in-components', rule, { }, } `, - parserOptions: { - ecmaVersion: 6, - sourceType: 'module', - ecmaFeatures: { jsx: true } - }, output: ` export default { name: 'app', @@ -262,6 +257,11 @@ ruleTester.run('order-in-components', rule, { }, } `, + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + ecmaFeatures: { jsx: true } + }, errors: [ { message: @@ -294,7 +294,6 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, - parserOptions: { ecmaVersion: 6 }, output: ` Vue.component('smart-list', { name: 'app', @@ -307,6 +306,7 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, + parserOptions: { ecmaVersion: 6 }, errors: [ { message: @@ -329,7 +329,6 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, - parserOptions: { ecmaVersion: 6 }, output: ` app.component('smart-list', { name: 'app', @@ -342,6 +341,7 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, + parserOptions: { ecmaVersion: 6 }, errors: [ { message: @@ -365,7 +365,6 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, - parserOptions: { ecmaVersion: 6 }, output: ` const { component } = Vue; component('smart-list', { @@ -379,6 +378,7 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, + parserOptions: { ecmaVersion: 6 }, errors: [ { message: @@ -402,7 +402,6 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, - parserOptions: { ecmaVersion: 6 }, output: ` new Vue({ el: '#app', @@ -416,6 +415,7 @@ ruleTester.run('order-in-components', rule, { template: '
' }) `, + parserOptions: { ecmaVersion: 6 }, errors: [ { message: @@ -449,7 +449,6 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: ` export default { name: 'burger', @@ -468,6 +467,7 @@ ruleTester.run('order-in-components', rule, { }, }; `, + parserOptions, errors: [ { message: @@ -486,7 +486,6 @@ ruleTester.run('order-in-components', rule, { test: 'ok' }; `, - parserOptions, output: ` export default { data() { @@ -496,6 +495,7 @@ ruleTester.run('order-in-components', rule, { }; `, options: [{ order: ['data', 'test', 'name'] }], + parserOptions, errors: [ { message: @@ -515,7 +515,6 @@ ruleTester.run('order-in-components', rule, { name: 'burger' }; `, - parserOptions, output: ` export default { /** name of vue component */ @@ -525,6 +524,7 @@ ruleTester.run('order-in-components', rule, { } }; `, + parserOptions, errors: [ { message: @@ -544,7 +544,6 @@ ruleTester.run('order-in-components', rule, { name: 'burger' }; `, - parserOptions, output: ` export default { /** name of vue component */ @@ -554,6 +553,7 @@ ruleTester.run('order-in-components', rule, { }/*test*/ }; `, + parserOptions, errors: [ { message: @@ -565,8 +565,8 @@ ruleTester.run('order-in-components', rule, { { filename: 'example.vue', code: `export default {data(){},name:'burger'};`, - parserOptions, output: `export default {name:'burger',data(){}};`, + parserOptions, errors: [ { message: @@ -586,8 +586,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -607,8 +607,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -628,8 +628,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -649,8 +649,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -670,8 +670,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -691,8 +691,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -712,8 +712,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -733,8 +733,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -754,8 +754,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -775,8 +775,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -796,8 +796,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -817,8 +817,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -838,8 +838,8 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: null, + parserOptions, errors: [ { message: @@ -859,7 +859,6 @@ ruleTester.run('order-in-components', rule, { test: fn(), }; `, - parserOptions, output: ` export default { name: 'burger', @@ -868,6 +867,7 @@ ruleTester.run('order-in-components', rule, { test: fn(), }; `, + parserOptions, errors: [ { message: @@ -896,7 +896,6 @@ ruleTester.run('order-in-components', rule, { name: 'burger', }; `, - parserOptions, output: ` export default { name: 'burger', @@ -914,6 +913,7 @@ ruleTester.run('order-in-components', rule, { testOptionalChaining: a?.b?.c, }; `, + parserOptions, errors: [ { message: @@ -934,11 +934,6 @@ ruleTester.run('order-in-components', rule, { }; `, - parser: require.resolve('vue-eslint-parser'), - parserOptions: { - ...parserOptions, - parser: { ts: require.resolve('@typescript-eslint/parser') } - }, output: ` `, + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ...parserOptions, + parser: { ts: require.resolve('@typescript-eslint/parser') } + }, errors: [ { message: @@ -967,8 +967,6 @@ ruleTester.run('order-in-components', rule, { }) `, - parser: require.resolve('vue-eslint-parser'), - parserOptions, output: ` `, + parser: require.resolve('vue-eslint-parser'), + parserOptions, errors: [ { message: diff --git a/tests/lib/rules/padding-line-between-blocks.js b/tests/lib/rules/padding-line-between-blocks.js index 622839bdc..f53461bae 100644 --- a/tests/lib/rules/padding-line-between-blocks.js +++ b/tests/lib/rules/padding-line-between-blocks.js @@ -125,12 +125,12 @@ tester.run('padding-line-between-blocks', rule, { `, - options: ['never'], output: ` `, + options: ['never'], errors: [ { message: 'Unexpected blank line before this block.', @@ -214,7 +214,6 @@ tester.run('padding-line-between-blocks', rule, { `, - options: ['never'], output: ` @@ -225,6 +224,7 @@ tester.run('padding-line-between-blocks', rule, { `, + options: ['never'], errors: [ { message: 'Unexpected blank line before this block.', @@ -290,7 +290,6 @@ tester.run('padding-line-between-blocks', rule, { `, - options: ['never'], output: ` @@ -304,6 +303,7 @@ tester.run('padding-line-between-blocks', rule, { TEXT `, + options: ['never'], errors: [ { message: 'Unexpected blank line before this block.', diff --git a/tests/lib/rules/padding-line-between-tags.js b/tests/lib/rules/padding-line-between-tags.js index 67aa6b228..70c7a57bb 100644 --- a/tests/lib/rules/padding-line-between-tags.js +++ b/tests/lib/rules/padding-line-between-tags.js @@ -498,18 +498,18 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'always', prev: '*', next: '*' }, + { blankLine: 'never', prev: 'br', next: '*' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', line: 7, column: 13 } - ], - options: [ - [ - { blankLine: 'always', prev: '*', next: '*' }, - { blankLine: 'never', prev: 'br', next: '*' } - ] ] }, { @@ -541,18 +541,18 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'always', prev: '*', next: '*' }, + { blankLine: 'never', prev: '*', next: 'br' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', line: 8, column: 13 } - ], - options: [ - [ - { blankLine: 'always', prev: '*', next: '*' }, - { blankLine: 'never', prev: '*', next: 'br' } - ] ] }, { @@ -586,6 +586,7 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', @@ -597,8 +598,7 @@ tester.run('padding-line-between-tags', rule, { line: 11, column: 13 } - ], - options: [[{ blankLine: 'never', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -624,6 +624,7 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', @@ -635,8 +636,7 @@ tester.run('padding-line-between-tags', rule, { line: 9, column: 11 } - ], - options: [[{ blankLine: 'never', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -669,18 +669,18 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'never', prev: '*', next: '*' }, + { blankLine: 'always', prev: 'br', next: 'div' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', line: 8, column: 13 } - ], - options: [ - [ - { blankLine: 'never', prev: '*', next: '*' }, - { blankLine: 'always', prev: 'br', next: 'div' } - ] ] }, { @@ -712,6 +712,13 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'always', prev: '*', next: '*' }, + { blankLine: 'never', prev: 'br', next: 'div' }, + { blankLine: 'never', prev: 'br', next: 'img' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', @@ -728,13 +735,6 @@ tester.run('padding-line-between-tags', rule, { line: 9, column: 11 } - ], - options: [ - [ - { blankLine: 'always', prev: '*', next: '*' }, - { blankLine: 'never', prev: 'br', next: 'div' }, - { blankLine: 'never', prev: 'br', next: 'img' } - ] ] }, { @@ -764,18 +764,18 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'always', prev: 'br', next: 'div' }, + { blankLine: 'always', prev: 'div', next: 'br' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', line: 8, column: 11 } - ], - options: [ - [ - { blankLine: 'always', prev: 'br', next: 'div' }, - { blankLine: 'always', prev: 'div', next: 'br' } - ] ] }, { @@ -805,18 +805,18 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'always', prev: 'br', next: 'div' }, + { blankLine: 'always', prev: 'br', next: 'br' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', line: 9, column: 11 } - ], - options: [ - [ - { blankLine: 'always', prev: 'br', next: 'div' }, - { blankLine: 'always', prev: 'br', next: 'br' } - ] ] }, { @@ -848,6 +848,12 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'always', prev: '*', next: '*' }, + { blankLine: 'never', prev: 'br', next: 'br' } + ] + ], errors: [ { message: 'Expected blank line before this tag.', @@ -864,12 +870,6 @@ tester.run('padding-line-between-tags', rule, { line: 10, column: 11 } - ], - options: [ - [ - { blankLine: 'always', prev: '*', next: '*' }, - { blankLine: 'never', prev: 'br', next: 'br' } - ] ] }, { @@ -901,14 +901,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: 'br', next: 'br' }]], errors: [ { message: 'Unexpected blank line before this tag.', line: 11, column: 11 } - ], - options: [[{ blankLine: 'never', prev: 'br', next: 'br' }]] + ] }, { filename: 'test.vue', @@ -935,14 +935,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'always', prev: '*', next: 'br' }]], errors: [ { message: 'Expected blank line before this tag.', line: 7, column: 11 } - ], - options: [[{ blankLine: 'always', prev: '*', next: 'br' }]] + ] }, { filename: 'test.vue', @@ -1015,14 +1015,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', line: 6, column: 12 } - ], - options: [[{ blankLine: 'never', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -1045,14 +1045,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', line: 7, column: 12 } - ], - options: [[{ blankLine: 'never', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -1076,14 +1076,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', line: 8, column: 12 } - ], - options: [[{ blankLine: 'never', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -1109,14 +1109,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'never', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', line: 10, column: 12 } - ], - options: [[{ blankLine: 'never', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -1147,14 +1147,14 @@ tester.run('padding-line-between-tags', rule, {
`, + options: [[{ blankLine: 'consistent', prev: '*', next: '*' }]], errors: [ { message: 'Expected blank line before this tag.', line: 7, column: 11 } - ], - options: [[{ blankLine: 'consistent', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -1191,6 +1191,7 @@ tester.run('padding-line-between-tags', rule, {
`, + options: [[{ blankLine: 'consistent', prev: '*', next: '*' }]], errors: [ { message: 'Expected blank line before this tag.', @@ -1207,8 +1208,7 @@ tester.run('padding-line-between-tags', rule, { line: 9, column: 11 } - ], - options: [[{ blankLine: 'consistent', prev: '*', next: '*' }]] + ] }, { filename: 'test.vue', @@ -1243,6 +1243,12 @@ tester.run('padding-line-between-tags', rule, { `, + options: [ + [ + { blankLine: 'consistent', prev: '*', next: '*' }, + { blankLine: 'never', prev: 'br', next: 'br' } + ] + ], errors: [ { message: 'Unexpected blank line before this tag.', @@ -1259,12 +1265,6 @@ tester.run('padding-line-between-tags', rule, { line: 13, column: 11 } - ], - options: [ - [ - { blankLine: 'consistent', prev: '*', next: '*' }, - { blankLine: 'never', prev: 'br', next: 'br' } - ] ] }, { @@ -1288,14 +1288,14 @@ tester.run('padding-line-between-tags', rule, { `, + options: [[{ blankLine: 'consistent', prev: '*', next: '*' }]], errors: [ { message: 'Unexpected blank line before this tag.', line: 7, column: 11 } - ], - options: [[{ blankLine: 'consistent', prev: '*', next: '*' }]] + ] } ] }) diff --git a/tests/lib/rules/prefer-true-attribute-shorthand.js b/tests/lib/rules/prefer-true-attribute-shorthand.js index e7d52ef7f..0bad5c173 100644 --- a/tests/lib/rules/prefer-true-attribute-shorthand.js +++ b/tests/lib/rules/prefer-true-attribute-shorthand.js @@ -157,6 +157,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { `, + output: null, errors: [ { messageId: 'expectShort', @@ -172,8 +173,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { } ] } - ], - output: null + ] }, { filename: 'test.vue', @@ -181,6 +181,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { `, + output: null, errors: [ { messageId: 'expectShort', @@ -196,8 +197,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { } ] } - ], - output: null + ] }, { filename: 'test.vue', @@ -205,6 +205,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { `, + output: null, options: ['always'], errors: [ { @@ -221,8 +222,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { } ] } - ], - output: null + ] }, { filename: 'test.vue', @@ -230,6 +230,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { `, + output: null, options: ['always'], errors: [ { @@ -246,8 +247,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { } ] } - ], - output: null + ] }, { filename: 'test.vue', @@ -255,6 +255,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { `, + output: null, options: ['never'], errors: [ { @@ -276,8 +277,7 @@ tester.run('prefer-true-attribute-shorthand', rule, { } ] } - ], - output: null + ] } ] }) diff --git a/tests/lib/rules/require-emit-validator.js b/tests/lib/rules/require-emit-validator.js index 2b60e8910..d539b55ea 100644 --- a/tests/lib/rules/require-emit-validator.js +++ b/tests/lib/rules/require-emit-validator.js @@ -118,8 +118,8 @@ ruleTester.run('require-emit-validator', rule, { } }) `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', @@ -132,8 +132,8 @@ ruleTester.run('require-emit-validator', rule, { }, }) `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', @@ -333,8 +333,8 @@ ruleTester.run('require-emit-validator', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { messageId: 'missing', diff --git a/tests/lib/rules/require-explicit-emits.js b/tests/lib/rules/require-explicit-emits.js index 43a3c2599..af90569dd 100644 --- a/tests/lib/rules/require-explicit-emits.js +++ b/tests/lib/rules/require-explicit-emits.js @@ -1975,14 +1975,14 @@ emits: {'foo': null} emit('baz') emit('qux') `, - ...getTypeScriptFixtureTestOptions(), errors: [ { message: 'The "qux" event has been triggered but not declared on `defineEmits`.', line: 8 } - ] + ], + ...getTypeScriptFixtureTestOptions() } ] }) diff --git a/tests/lib/rules/require-expose.js b/tests/lib/rules/require-expose.js index 64d073c24..76932cd95 100644 --- a/tests/lib/rules/require-expose.js +++ b/tests/lib/rules/require-expose.js @@ -95,15 +95,13 @@ tester.run('require-expose', rule, { ` }, - { - code: ` + ` Vue.mixin({ methods: { foo () {} } }) - ` - }, + `, { filename: 'test.vue', code: ` diff --git a/tests/lib/rules/require-macro-variable-name.js b/tests/lib/rules/require-macro-variable-name.js index c54c224a5..ed99a64e5 100644 --- a/tests/lib/rules/require-macro-variable-name.js +++ b/tests/lib/rules/require-macro-variable-name.js @@ -237,6 +237,7 @@ tester.run('require-macro-variable-name', rule, { const attrs = useAttrs({}) `, + options: [customOptions], errors: [ { message: `The variable name of "defineSlots" must be "${customOptions.defineSlots}".`, @@ -289,8 +290,7 @@ tester.run('require-macro-variable-name', rule, { } ] } - ], - options: [customOptions] + ] }, { filename: 'test.vue', @@ -300,6 +300,7 @@ tester.run('require-macro-variable-name', rule, { const attrsCustom = useAttrs({}) `, + options: [{ defineSlots: 'slotsCustom' }], errors: [ { message: `The variable name of "useAttrs" must be "attrs".`, @@ -317,8 +318,7 @@ tester.run('require-macro-variable-name', rule, { } ] } - ], - options: [{ defineSlots: 'slotsCustom' }] + ] } ] }) diff --git a/tests/lib/rules/require-prop-comment.js b/tests/lib/rules/require-prop-comment.js index 900f25ec3..3863abc3d 100644 --- a/tests/lib/rules/require-prop-comment.js +++ b/tests/lib/rules/require-prop-comment.js @@ -20,8 +20,7 @@ const tester = new RuleTester({ tester.run('require-prop-comment', rule, { valid: [ - { - code: ` + ` - ` - }, + `, { code: ` - ` - }, + `, { code: ` `, + parserOptions: { + parser: require.resolve('@typescript-eslint/parser') + }, errors: [ { line: 4, column: 9, message: 'The "a" property should have a JSDoc comment.' } - ], - parserOptions: { - parser: require.resolve('@typescript-eslint/parser') - } + ] } ] }) diff --git a/tests/lib/rules/require-prop-type-constructor.js b/tests/lib/rules/require-prop-type-constructor.js index 9cd4eae6e..a4d6766df 100644 --- a/tests/lib/rules/require-prop-type-constructor.js +++ b/tests/lib/rules/require-prop-type-constructor.js @@ -224,13 +224,13 @@ ruleTester.run('require-prop-type-constructor', rule, { } } `, + parser: require.resolve('@typescript-eslint/parser'), errors: [ { message: 'The "a" property should be a constructor.', line: 5 } - ], - parser: require.resolve('@typescript-eslint/parser') + ] }, { filename: 'ExtraCommas.vue', @@ -248,13 +248,13 @@ ruleTester.run('require-prop-type-constructor', rule, { } } `, + parser: require.resolve('@typescript-eslint/parser'), errors: [ { message: 'The "name" property should be a constructor.', line: 4 } - ], - parser: require.resolve('@typescript-eslint/parser') + ] }, { filename: 'LiteralsComponent.vue', diff --git a/tests/lib/rules/require-prop-types.js b/tests/lib/rules/require-prop-types.js index 9b7077fc1..fdb91dd30 100644 --- a/tests/lib/rules/require-prop-types.js +++ b/tests/lib/rules/require-prop-types.js @@ -137,8 +137,8 @@ ruleTester.run('require-prop-types', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', @@ -151,8 +151,8 @@ ruleTester.run('require-prop-types', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', @@ -163,8 +163,8 @@ ruleTester.run('require-prop-types', rule, { }) `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', @@ -173,12 +173,12 @@ ruleTester.run('require-prop-types', rule, { defineProps<{foo:string}>() `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, { code: ` @@ -308,8 +308,8 @@ ruleTester.run('require-prop-types', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { message: 'Prop "foo" should define at least its type.', @@ -326,8 +326,8 @@ ruleTester.run('require-prop-types', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { message: 'Prop "foo" should define at least its type.', @@ -344,8 +344,8 @@ ruleTester.run('require-prop-types', rule, { }) `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { message: 'Prop "foo" should define at least its type.', @@ -360,8 +360,8 @@ ruleTester.run('require-prop-types', rule, { defineProps(['foo']) `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { message: 'Prop "foo" should define at least its type.', diff --git a/tests/lib/rules/require-typed-object-prop.js b/tests/lib/rules/require-typed-object-prop.js index 5d93965a5..f574e82d8 100644 --- a/tests/lib/rules/require-typed-object-prop.js +++ b/tests/lib/rules/require-typed-object-prop.js @@ -14,235 +14,235 @@ ruleTester.run('require-typed-object-prop', rule, { // empty { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: {} } - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default Vue.extend({ props: {} }); - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, // array props { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: ['foo'] } - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default Vue.extend({ props: ['foo'] }); - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, // primitive props { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: { foo: String } } - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default Vue.extend({ props: { foo: String } }); - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, // union { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: { foo: [Number, String, Boolean] } } - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default Vue.extend({ props: { foo: [Number, String, Boolean] } }); - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, // function { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: { foo: someFunction() } } - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default Vue.extend({ props: { foo: someFunction() } }); - ` + `, + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, // typed object { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: { foo: Object as PropType } } `, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default { props: { foo: Array as PropType } } `, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, code: ` export default Vue.extend({ props: { foo: Object as PropType } }); `, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', - parserOptions: { - ecmaVersion: 6, - sourceType: 'module', - parser: require.resolve('@typescript-eslint/parser') - }, code: ` `, - parser: require.resolve('vue-eslint-parser') - }, - - { - filename: 'test.vue', + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, + } + }, + + { + filename: 'test.vue', code: ` export default { props: { foo: Object as () => User } } `, - parser: require.resolve('@typescript-eslint/parser') - }, - { - filename: 'test.vue', + parser: require.resolve('@typescript-eslint/parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, + } + }, + { + filename: 'test.vue', code: ` export default Vue.extend({ props: { foo: Object as () => User } }); `, - parser: require.resolve('@typescript-eslint/parser') - }, - { - filename: 'test.vue', + parser: require.resolve('@typescript-eslint/parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, + } + }, + { + filename: 'test.vue', code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve('vue-eslint-parser'), + parserOptions: { + ecmaVersion: 6, + sourceType: 'module', + parser: require.resolve('@typescript-eslint/parser') + } }, // any { @@ -252,12 +252,12 @@ ruleTester.run('require-typed-object-prop', rule, { defineProps({ foo: { type: Object as any } }); `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, { filename: 'test.vue', @@ -270,12 +270,12 @@ ruleTester.run('require-typed-object-prop', rule, { }; `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, { filename: 'test.vue', @@ -288,12 +288,12 @@ ruleTester.run('require-typed-object-prop', rule, { }); `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, // unknown { @@ -303,12 +303,12 @@ ruleTester.run('require-typed-object-prop', rule, { defineProps({ foo: { type: Object as unknown } }); `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, { filename: 'test.vue', @@ -321,12 +321,12 @@ ruleTester.run('require-typed-object-prop', rule, { }; `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, { filename: 'test.vue', @@ -339,12 +339,12 @@ ruleTester.run('require-typed-object-prop', rule, { }); `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } } ], invalid: [ @@ -355,8 +355,8 @@ ruleTester.run('require-typed-object-prop', rule, { defineProps({ foo: Object }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { messageId: 'expectedTypeAnnotation', @@ -394,8 +394,8 @@ ruleTester.run('require-typed-object-prop', rule, { defineProps({ foo: Array }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { messageId: 'expectedTypeAnnotation', @@ -585,8 +585,8 @@ ruleTester.run('require-typed-object-prop', rule, { defineProps({ foo: { type: Object } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { messageId: 'expectedTypeAnnotation', diff --git a/tests/lib/rules/require-typed-ref.js b/tests/lib/rules/require-typed-ref.js index 571b5c5de..3da293b9a 100644 --- a/tests/lib/rules/require-typed-ref.js +++ b/tests/lib/rules/require-typed-ref.js @@ -75,13 +75,13 @@ tester.run('require-typed-ref', rule, { }, { filename: 'test.vue', - parser: require.resolve('vue-eslint-parser'), code: ` - ` + `, + parser: require.resolve('vue-eslint-parser') }, { filename: 'test.js', @@ -197,13 +197,13 @@ tester.run('require-typed-ref', rule, { }, { filename: 'test.vue', - parser: require.resolve('vue-eslint-parser'), code: ` `, + parser: require.resolve('vue-eslint-parser'), errors: [ { messageId: 'noType', diff --git a/tests/lib/rules/require-valid-default-prop.js b/tests/lib/rules/require-valid-default-prop.js index cec05ba05..1e6f7cd7a 100644 --- a/tests/lib/rules/require-valid-default-prop.js +++ b/tests/lib/rules/require-valid-default-prop.js @@ -122,8 +122,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, - parser: require.resolve('@typescript-eslint/parser') + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' } }, { filename: 'test.vue', @@ -214,8 +214,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function') }, { @@ -229,8 +229,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function') }, { @@ -244,8 +244,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function') }, { @@ -264,12 +264,12 @@ ruleTester.run('require-valid-default-prop', rule, { num: 1 }); `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') - }, - parser: require.resolve('vue-eslint-parser') + } }, { code: ` @@ -614,8 +614,8 @@ ruleTester.run('require-valid-default-prop', rule, { } as PropOptions } });`, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function or number') }, @@ -874,8 +874,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function') }, { @@ -889,8 +889,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function') }, { @@ -904,8 +904,8 @@ ruleTester.run('require-valid-default-prop', rule, { } }); `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: errorMessage('function') }, { @@ -920,8 +920,8 @@ ruleTester.run('require-valid-default-prop', rule, { }) `, - parserOptions: { ecmaVersion: 6, sourceType: 'module' }, parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 6, sourceType: 'module' }, errors: [ { message: "Type of the default value for 'foo' prop must be a string.", @@ -938,12 +938,12 @@ ruleTester.run('require-valid-default-prop', rule, { }) `, + parser: require.resolve('vue-eslint-parser'), parserOptions: { ecmaVersion: 6, sourceType: 'module', parser: require.resolve('@typescript-eslint/parser') }, - parser: require.resolve('vue-eslint-parser'), errors: [ { message: "Type of the default value for 'foo' prop must be a string.", @@ -967,7 +967,6 @@ ruleTester.run('require-valid-default-prop', rule, { i: ['foo', 'bar'], }) `, - ...getTypeScriptFixtureTestOptions(), errors: [ { message: "Type of the default value for 'a' prop must be a string.", @@ -1006,7 +1005,8 @@ ruleTester.run('require-valid-default-prop', rule, { message: "Type of the default value for 'i' prop must be a function.", line: 13 } - ] + ], + ...getTypeScriptFixtureTestOptions() } ] }) diff --git a/tests/lib/rules/return-in-computed-property.js b/tests/lib/rules/return-in-computed-property.js index 9fbe2c84e..71afcc3eb 100644 --- a/tests/lib/rules/return-in-computed-property.js +++ b/tests/lib/rules/return-in-computed-property.js @@ -94,8 +94,8 @@ ruleTester.run('return-in-computed-property', rule, { } } `, - parserOptions, - options: [{ treatUndefinedAsUnspecified: false }] + options: [{ treatUndefinedAsUnspecified: false }], + parserOptions }, { filename: 'test.vue', @@ -144,8 +144,8 @@ ruleTester.run('return-in-computed-property', rule, { } } `, - parserOptions, - options: [{ treatUndefinedAsUnspecified: false }] + options: [{ treatUndefinedAsUnspecified: false }], + parserOptions } ], @@ -264,8 +264,8 @@ ruleTester.run('return-in-computed-property', rule, { } } `, - parserOptions, options: [{ treatUndefinedAsUnspecified: false }], + parserOptions, errors: [ { message: 'Expected to return a value in "foo" computed property.', @@ -284,8 +284,8 @@ ruleTester.run('return-in-computed-property', rule, { } } `, - parserOptions, options: [{ treatUndefinedAsUnspecified: true }], + parserOptions, errors: [ { message: 'Expected to return a value in "foo" computed property.', @@ -378,8 +378,8 @@ ruleTester.run('return-in-computed-property', rule, { } } `, - parserOptions, options: [{ treatUndefinedAsUnspecified: false }], + parserOptions, errors: [ { message: 'Expected to return a value in computed function.', diff --git a/tests/lib/rules/singleline-html-element-content-newline.js b/tests/lib/rules/singleline-html-element-content-newline.js index a740ff0ed..5bf2c9392 100644 --- a/tests/lib/rules/singleline-html-element-content-newline.js +++ b/tests/lib/rules/singleline-html-element-content-newline.js @@ -372,7 +372,6 @@ content
singleline content
`, - options: [{ ignoreWhenNoAttributes: false }], output: ` `, + options: [{ ignoreWhenNoAttributes: false }], errors: [ 'Expected 1 line break after opening tag (`
`), but no line breaks found.', 'Expected 1 line break before closing tag (`
`), but no line breaks found.' @@ -391,7 +391,6 @@ singleline content singlelinechildren `, - options: [{ ignoreWhenNoAttributes: false }], output: ` `, + options: [{ ignoreWhenNoAttributes: false }], errors: [ 'Expected 1 line break after opening tag (``), but no line breaks found.', 'Expected 1 line break after opening tag (``), but no line breaks found.', @@ -418,7 +418,6 @@ children
`, - options: [{ ignoreWhenNoAttributes: false }], output: ` `, + options: [{ ignoreWhenNoAttributes: false }], errors: [ 'Expected 1 line break after opening tag (`
`), but no line breaks found.', 'Expected 1 line break before closing tag (`
`), but no line breaks found.' @@ -437,7 +437,6 @@ children
singleline element
`, - options: [{ ignoreWhenNoAttributes: false }], output: ` `, + options: [{ ignoreWhenNoAttributes: false }], errors: [ 'Expected 1 line break after opening tag (`
`), but no line breaks found.', 'Expected 1 line break before closing tag (`
`), but no line breaks found.' @@ -456,13 +456,13 @@ singleline element
`, - options: [{ ignoreWhenEmpty: false, ignoreWhenNoAttributes: false }], output: ` `, + options: [{ ignoreWhenEmpty: false, ignoreWhenNoAttributes: false }], errors: [ 'Expected 1 line break after opening tag (`
`), but no line breaks found.' ] @@ -473,13 +473,13 @@ singleline element
`, - options: [{ ignoreWhenEmpty: false, ignoreWhenNoAttributes: false }], output: ` `, + options: [{ ignoreWhenEmpty: false, ignoreWhenNoAttributes: false }], errors: [ 'Expected 1 line break after opening tag (`
`), but no line breaks found.' ] diff --git a/tests/lib/rules/space-in-parens.js b/tests/lib/rules/space-in-parens.js index 8791652ed..ef6fe628e 100644 --- a/tests/lib/rules/space-in-parens.js +++ b/tests/lib/rules/space-in-parens.js @@ -94,13 +94,13 @@ tester.run('space-in-parens', rule, { @click="foo(arg)" /> `, - options: ['always'], output: ` `, + options: ['always'], errors: [ errorMessage({ messageId: 'missingOpeningSpace', @@ -143,13 +143,13 @@ tester.run('space-in-parens', rule, { :value="(1 + 2) + 3" > `, - options: ['always'], output: ` `, + options: ['always'], errors: [ errorMessage({ messageId: 'missingOpeningSpace', @@ -192,13 +192,13 @@ tester.run('space-in-parens', rule, { :[(1+2)]="(1 + 2) + 3" > `, - options: ['always'], output: ` `, + options: ['always'], errors: [ errorMessage({ messageId: 'missingOpeningSpace', diff --git a/tests/lib/rules/space-unary-ops.js b/tests/lib/rules/space-unary-ops.js index 6b3e7c25f..63539a5a7 100644 --- a/tests/lib/rules/space-unary-ops.js +++ b/tests/lib/rules/space-unary-ops.js @@ -50,8 +50,8 @@ tester.run('space-unary-ops', rule, { }, { code: '', - options: [{ nonwords: true }], output: '', + options: [{ nonwords: true }], errors: ["Unary operator '!' must be followed by whitespace."] }, diff --git a/tests/lib/rules/template-curly-spacing.js b/tests/lib/rules/template-curly-spacing.js index 6c4376969..0fe530511 100644 --- a/tests/lib/rules/template-curly-spacing.js +++ b/tests/lib/rules/template-curly-spacing.js @@ -41,14 +41,13 @@ tester.run('template-curly-spacing', rule, { }, // CSS vars injection - { - code: ` + ` ` - } + + ` ], invalid: [ { @@ -79,12 +78,12 @@ tester.run('template-curly-spacing', rule, {
`, - options: ['always'], output: ` `, + options: ['always'], errors: [ { message: "Expected space(s) after '${'.", diff --git a/tests/lib/rules/this-in-template.js b/tests/lib/rules/this-in-template.js index 904aa00c4..5686bf137 100644 --- a/tests/lib/rules/this-in-template.js +++ b/tests/lib/rules/this-in-template.js @@ -248,14 +248,14 @@ ruleTester.run('this-in-template', rule, { { code: ``, output: ``, - errors: ["Unexpected usage of 'this'."], - options: ['never'] + options: ['never'], + errors: ["Unexpected usage of 'this'."] }, { code: ``, output: ``, - errors: ["Unexpected usage of 'this'."], - options: ['never'] + options: ['never'], + errors: ["Unexpected usage of 'this'."] } ] }) diff --git a/tests/lib/rules/use-v-on-exact.js b/tests/lib/rules/use-v-on-exact.js index 73ac2408b..929fd746a 100644 --- a/tests/lib/rules/use-v-on-exact.js +++ b/tests/lib/rules/use-v-on-exact.js @@ -15,92 +15,48 @@ const ruleTester = new RuleTester({ ruleTester.run('use-v-on-exact', rule, { valid: [ - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: `` - }, - { - code: ` + ` ], invalid: [ diff --git a/tests/lib/rules/v-bind-style.js b/tests/lib/rules/v-bind-style.js index 2fd1ce7c2..0cb67f62f 100644 --- a/tests/lib/rules/v-bind-style.js +++ b/tests/lib/rules/v-bind-style.js @@ -67,44 +67,44 @@ tester.run('v-bind-style', rule, { }, { filename: 'test.vue', - options: ['shorthand'], code: '', output: '', + options: ['shorthand'], errors: ["Unexpected 'v-bind' before ':'."] }, { filename: 'test.vue', - options: ['longform'], code: '', output: '', + options: ['longform'], errors: ["Expected 'v-bind' before ':'."] }, { filename: 'test.vue', - options: ['longform'], code: '', output: '', + options: ['longform'], errors: ["Expected 'v-bind:' instead of '.'."] }, { filename: 'test.vue', - options: ['longform'], code: '', output: '', + options: ['longform'], errors: ["Expected 'v-bind:' instead of '.'."] }, { filename: 'test.vue', - options: ['longform'], code: '', output: '', + options: ['longform'], errors: ["Expected 'v-bind:' instead of '.'."] }, { filename: 'test.vue', - options: ['longform'], code: '', output: '', + options: ['longform'], errors: ["Expected 'v-bind:' instead of '.'."] } ] diff --git a/tests/lib/rules/v-for-delimiter-style.js b/tests/lib/rules/v-for-delimiter-style.js index b1500af50..23665a32c 100644 --- a/tests/lib/rules/v-for-delimiter-style.js +++ b/tests/lib/rules/v-for-delimiter-style.js @@ -94,9 +94,9 @@ tester.run('v-for-delimiter-style', rule, { }, { filename: 'test.vue', - options: ['in'], code: '', output: '', + options: ['in'], errors: [ { message: "Expected 'in' instead of 'of' in 'v-for'.", @@ -106,9 +106,9 @@ tester.run('v-for-delimiter-style', rule, { }, { filename: 'test.vue', - options: ['of'], code: '', output: '', + options: ['of'], errors: [ { message: "Expected 'of' instead of 'in' in 'v-for'.", diff --git a/tests/lib/rules/v-on-event-hyphenation.js b/tests/lib/rules/v-on-event-hyphenation.js index 087e5d00a..beaa5e3fa 100644 --- a/tests/lib/rules/v-on-event-hyphenation.js +++ b/tests/lib/rules/v-on-event-hyphenation.js @@ -73,12 +73,12 @@ tester.run('v-on-event-hyphenation', rule, { `, - options: ['always', { autofix: true }], output: ` `, + options: ['always', { autofix: true }], errors: [ { message: "v-on event '@customEvent' must be hyphenated.", @@ -95,12 +95,12 @@ tester.run('v-on-event-hyphenation', rule, { `, - options: ['never', { autofix: true }], output: ` `, + options: ['never', { autofix: true }], errors: ["v-on event 'v-on:custom-event' can't be hyphenated."] }, { @@ -110,13 +110,13 @@ tester.run('v-on-event-hyphenation', rule, { `, - options: ['always', { autofix: true }], output: ` `, + options: ['always', { autofix: true }], errors: ["v-on event '@update:modelValue' must be hyphenated."] }, { @@ -126,13 +126,13 @@ tester.run('v-on-event-hyphenation', rule, { `, - options: ['never', { autofix: true }], output: ` `, + options: ['never', { autofix: true }], errors: ["v-on event '@update:model-value' can't be hyphenated."] }, { @@ -144,7 +144,6 @@ tester.run('v-on-event-hyphenation', rule, { `, - options: ['always', { autofix: true }], output: ` `, + options: ['always', { autofix: true }], errors: [ "v-on event '@upDate:modelValue' must be hyphenated.", "v-on event '@up-date:modelValue' must be hyphenated.", @@ -168,7 +168,6 @@ tester.run('v-on-event-hyphenation', rule, { `, - options: ['never', { autofix: true }], output: ` `, + options: ['never', { autofix: true }], errors: [ "v-on event '@up-date:modelValue' can't be hyphenated.", "v-on event '@upDate:model-value' can't be hyphenated.", diff --git a/tests/lib/rules/v-on-function-call.js b/tests/lib/rules/v-on-function-call.js index d8486a448..d06bbe231 100644 --- a/tests/lib/rules/v-on-function-call.js +++ b/tests/lib/rules/v-on-function-call.js @@ -161,37 +161,37 @@ tester.run('v-on-function-call', rule, { filename: 'test.vue', code: '', output: null, + options: ['always'], errors: [ "Method calls inside of 'v-on' directives must have parentheses." - ], - options: ['always'] + ] }, { filename: 'test.vue', code: '', output: ``, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', code: '', output: ``, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', code: '', output: null, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -204,13 +204,13 @@ tester.run('v-on-function-call', rule, { ">
`, output: null, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses.", "Method calls without arguments inside of 'v-on' directives must not have parentheses.", "Method calls without arguments inside of 'v-on' directives must not have parentheses.", "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -222,10 +222,10 @@ tester.run('v-on-function-call', rule, { `, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -237,10 +237,10 @@ tester.run('v-on-function-call', rule, { `, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -254,11 +254,11 @@ tester.run('v-on-function-call', rule, {
`, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses.", "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -270,10 +270,10 @@ tester.run('v-on-function-call', rule, { `, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -285,19 +285,19 @@ tester.run('v-on-function-call', rule, { `, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', code: '', output: '', + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -319,10 +319,10 @@ tester.run('v-on-function-call', rule, { } } `, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] }, { filename: 'test.vue', @@ -344,10 +344,10 @@ tester.run('v-on-function-call', rule, { } } `, + options: ['never'], errors: [ "Method calls without arguments inside of 'v-on' directives must not have parentheses." - ], - options: ['never'] + ] } ] }) diff --git a/tests/lib/rules/v-on-handler-style.js b/tests/lib/rules/v-on-handler-style.js index e3afd05d5..314bbf8c8 100644 --- a/tests/lib/rules/v-on-handler-style.js +++ b/tests/lib/rules/v-on-handler-style.js @@ -78,12 +78,12 @@ tester.run('v-on-handler-style', rule, {