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.'
+ ]
}
]
})