diff --git a/docs/rules/one-component-per-file.md b/docs/rules/one-component-per-file.md index b163d0daa..f3a852fa3 100644 --- a/docs/rules/one-component-per-file.md +++ b/docs/rules/one-component-per-file.md @@ -1,12 +1,23 @@ -# enforce that each component should be in its own file +--- +pageClass: rule-details +sidebarDepth: 0 +title: vue/one-component-per-file +description: enforce that each component should be in its own file +--- +# vue/one-component-per-file +> enforce that each component should be in its own file + +- :gear: This rule is included in all of `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. ## :book: Rule Details -This rule checks if there is oly one component per file. +This rule checks if there is only one component per file. -:-1: Examples of **incorrect** code for this rule: + ```js +/* ✗ BAD */ + Vue.component('TodoList', { // ... }) @@ -16,14 +27,21 @@ Vue.component('TodoItem', { }) ``` -:+1: Examples of **correct** code for this rule: + -```js + + +```vue + ``` + + ## :wrench: Options Nothing. @@ -31,3 +49,8 @@ Nothing. ## :books: Further reading - [Style guide - Component files](https://vuejs.org/v2/style-guide/#Component-files-strongly-recommended) + +## :mag: Implementation + +- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/one-component-per-file.js) +- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/one-component-per-file.js) diff --git a/lib/rules/one-component-per-file.js b/lib/rules/one-component-per-file.js index d6d67b813..f21f6fdee 100644 --- a/lib/rules/one-component-per-file.js +++ b/lib/rules/one-component-per-file.js @@ -14,8 +14,8 @@ module.exports = { type: 'suggestion', docs: { description: 'enforce that each component should be in its own file', - category: undefined, // strongly-recommended - url: 'https://github.com/vuejs/eslint-plugin-vue/blob/v5.0.0-beta.5/docs/rules/one-component-per-file.md' + categories: ['vue3-strongly-recommended', 'strongly-recommended'], + url: 'https://eslint.vuejs.org/rules/one-component-per-file.html' }, fixable: null, schema: [], @@ -24,19 +24,21 @@ module.exports = { } }, create (context) { - let componentCount = 0 + const components = [] return Object.assign({}, - utils.executeOnVueComponent(context, () => { - ++componentCount + utils.executeOnVueComponent(context, (node) => { + components.push(node) }), { - 'Program:exit' (node) { - if (componentCount > 1) { - context.report({ - node: node, - messageId: 'toManyComponents' - }) + 'Program:exit' () { + if (components.length > 1) { + for (const node of components) { + context.report({ + node: node, + messageId: 'toManyComponents' + }) + } } } } diff --git a/tests/lib/rules/one-component-per-file.js b/tests/lib/rules/one-component-per-file.js index 3c3c30961..201b391f3 100644 --- a/tests/lib/rules/one-component-per-file.js +++ b/tests/lib/rules/one-component-per-file.js @@ -60,9 +60,10 @@ ruleTester.run('one-component-per-file', rule, { Vue.component('name', {}) Vue.component('name', {}) `, - errors: [{ - message: 'There is more than one component in this file.' - }] + errors: [ + 'There is more than one component in this file.', + 'There is more than one component in this file.' + ] }, { filename: 'test.js', @@ -70,15 +71,16 @@ ruleTester.run('one-component-per-file', rule, { Vue.component('TodoList', { // ... }) - + Vue.component('TodoItem', { // ... }) export default {} `, - errors: [{ - message: 'There is more than one component in this file.' - }] + errors: [ + 'There is more than one component in this file.', + 'There is more than one component in this file.' + ] }, { filename: 'test.vue', @@ -86,9 +88,10 @@ ruleTester.run('one-component-per-file', rule, { Vue.component('name', {}) export default {} `, - errors: [{ - message: 'There is more than one component in this file.' - }] + errors: [ + 'There is more than one component in this file.', + 'There is more than one component in this file.' + ] } ] })