From a94ab88179d5e6f2aada28a5cd1ebfe88f520ae3 Mon Sep 17 00:00:00 2001 From: tyankatsu Date: Tue, 23 Jun 2020 13:32:38 +0900 Subject: [PATCH 1/8] feat: Add --- docs/rules/no-multiple-object-in-class.md | 0 lib/rules/no-multiple-object-in-class.js | 0 tests/lib/rules/no-multiple-object-in-class.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/rules/no-multiple-object-in-class.md create mode 100644 lib/rules/no-multiple-object-in-class.js create mode 100644 tests/lib/rules/no-multiple-object-in-class.js diff --git a/docs/rules/no-multiple-object-in-class.md b/docs/rules/no-multiple-object-in-class.md new file mode 100644 index 000000000..e69de29bb diff --git a/lib/rules/no-multiple-object-in-class.js b/lib/rules/no-multiple-object-in-class.js new file mode 100644 index 000000000..e69de29bb diff --git a/tests/lib/rules/no-multiple-object-in-class.js b/tests/lib/rules/no-multiple-object-in-class.js new file mode 100644 index 000000000..e69de29bb From ad508eb4f40f0fb0830e9089473d5ea379281a17 Mon Sep 17 00:00:00 2001 From: tyankatsu Date: Tue, 23 Jun 2020 21:49:21 +0900 Subject: [PATCH 2/8] feat: Add rule, test, and docs --- docs/rules/no-multiple-object-in-class.md | 37 ++++++++++++ lib/rules/no-multiple-object-in-class.js | 59 +++++++++++++++++++ .../lib/rules/no-multiple-object-in-class.js | 38 ++++++++++++ 3 files changed, 134 insertions(+) diff --git a/docs/rules/no-multiple-object-in-class.md b/docs/rules/no-multiple-object-in-class.md index e69de29bb..f6ec6eb77 100644 --- a/docs/rules/no-multiple-object-in-class.md +++ b/docs/rules/no-multiple-object-in-class.md @@ -0,0 +1,37 @@ +--- +pageClass: rule-details +sidebarDepth: 0 +title: vue/no-multiple-object-in-class +description: disallow to pass multiple objects into array to class +--- +# vue/no-multiple-object-in-class +> disallow to pass multiple objects into array to class + +## :book: Rule Details + +This rule disallows to pass multiple objects into array to class. + + + +```vue + +``` + + + +## :wrench: Options + +Nothing. + +## :mag: Implementation + +- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-multiple-object-in-class.js) +- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-multiple-object-in-class.js) diff --git a/lib/rules/no-multiple-object-in-class.js b/lib/rules/no-multiple-object-in-class.js index e69de29bb..18ff950d4 100644 --- a/lib/rules/no-multiple-object-in-class.js +++ b/lib/rules/no-multiple-object-in-class.js @@ -0,0 +1,59 @@ +/** + * @author tyankatsu + * See LICENSE file in root directory for full license. + */ +'use strict' + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +const { defineTemplateBodyVisitor } = require('../utils') + +// ------------------------------------------------------------------------------ +// Rule Definition +// ------------------------------------------------------------------------------ + +/** + * count ObjectExpression element + * @param {VAttribute} node + * @return {number} + */ +function countObjectExpression(node) { + return node.value.expression.elements.filter( + (element) => element.type === 'ObjectExpression' + ).length +} + +module.exports = { + meta: { + type: 'suggestion', + docs: { + description: 'disallow to pass multiple objects into array to class', + categories: undefined, + url: 'https://eslint.vuejs.org/rules/no-multiple-object-in-class.html' + }, + fixable: null, + schema: [], + messages: { + unexpected: 'Unexpected multiple objects. Merge objects.' + } + }, + /** @param {RuleContext} context */ + create(context) { + return defineTemplateBodyVisitor(context, { + /** @param {VAttribute} node */ + 'VAttribute[directive=true][key.argument.name="class"][value.expression.type="ArrayExpression"]'( + node + ) { + if (countObjectExpression(node) > 1) { + context.report({ + node, + loc: node.loc, + messageId: 'unexpected' + }) + } + } + }) + } +} diff --git a/tests/lib/rules/no-multiple-object-in-class.js b/tests/lib/rules/no-multiple-object-in-class.js index e69de29bb..d381f6182 100644 --- a/tests/lib/rules/no-multiple-object-in-class.js +++ b/tests/lib/rules/no-multiple-object-in-class.js @@ -0,0 +1,38 @@ +/** + * @author tyankatsu + */ +'use strict' + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +const rule = require('../../../lib/rules/no-multiple-object-in-class') +const RuleTester = require('eslint').RuleTester + +// ------------------------------------------------------------------------------ +// Tests +// ------------------------------------------------------------------------------ + +const ruleTester = new RuleTester({ + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 2015, sourceType: 'module' } +}) + +ruleTester.run('no-multiple-object-in-class', rule, { + valid: [ + ``, + `` + ], + invalid: [ + { + code: ``, + errors: [ + { + message: 'Unexpected multiple objects. Merge objects.', + type: 'VAttribute' + } + ] + } + ] +}) From 9c26cb07854f7fe32715a52fb9f7ac7e25808fe7 Mon Sep 17 00:00:00 2001 From: tyankatsu Date: Tue, 23 Jun 2020 21:49:52 +0900 Subject: [PATCH 3/8] chore: run update --- docs/rules/README.md | 1 + lib/index.js | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/rules/README.md b/docs/rules/README.md index 1fe658682..d1e64daf3 100644 --- a/docs/rules/README.md +++ b/docs/rules/README.md @@ -285,6 +285,7 @@ For example: | [vue/no-bare-strings-in-template](./no-bare-strings-in-template.md) | disallow the use of bare strings in `