You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.5 KiB
57 lines
1.5 KiB
/** |
|
* @fileoverview enforce that each component should be in its own file |
|
* @author Armano |
|
*/ |
|
'use strict' |
|
const utils = require('../utils') |
|
const { getVueComponentDefinitionType } = require('../utils') |
|
|
|
// ------------------------------------------------------------------------------ |
|
// Rule Definition |
|
// ------------------------------------------------------------------------------ |
|
|
|
module.exports = { |
|
meta: { |
|
type: 'suggestion', |
|
docs: { |
|
description: 'enforce that each component should be in its own file', |
|
categories: ['vue3-strongly-recommended', 'strongly-recommended'], |
|
url: 'https://eslint.vuejs.org/rules/one-component-per-file.html' |
|
}, |
|
fixable: null, |
|
schema: [], |
|
messages: { |
|
toManyComponents: 'There is more than one component in this file.' |
|
} |
|
}, |
|
/** @param {RuleContext} context */ |
|
create(context) { |
|
/** @type {ObjectExpression[]} */ |
|
const components = [] |
|
|
|
return Object.assign( |
|
{}, |
|
utils.executeOnVueComponent(context, (node, type) => { |
|
if (type === 'definition') { |
|
const defType = getVueComponentDefinitionType(node) |
|
if (defType === 'mixin') { |
|
return |
|
} |
|
} |
|
components.push(node) |
|
}), |
|
{ |
|
'Program:exit'() { |
|
if (components.length > 1) { |
|
for (const node of components) { |
|
context.report({ |
|
node, |
|
messageId: 'toManyComponents' |
|
}) |
|
} |
|
} |
|
} |
|
} |
|
) |
|
} |
|
}
|
|
|