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.
67 lines
1.6 KiB
67 lines
1.6 KiB
/** |
|
* @author kevsommer Kevin Sommer |
|
* See LICENSE file in root directory for full license. |
|
*/ |
|
'use strict' |
|
const utils = require('../utils') |
|
|
|
module.exports = { |
|
meta: { |
|
type: 'problem', |
|
docs: { |
|
description: 'enforce maximum number of props in Vue component', |
|
categories: undefined, |
|
url: 'https://eslint.vuejs.org/rules/max-props.html' |
|
}, |
|
fixable: null, |
|
schema: [ |
|
{ |
|
type: 'object', |
|
properties: { |
|
maxProps: { |
|
type: 'integer', |
|
minimum: 1 |
|
} |
|
}, |
|
additionalProperties: false, |
|
minProperties: 1 |
|
} |
|
], |
|
messages: { |
|
tooManyProps: |
|
'Component has too many props ({{propCount}}). Maximum allowed is {{limit}}.' |
|
} |
|
}, |
|
/** @param {RuleContext} context */ |
|
create(context) { |
|
/** @type {Record<string, number>} */ |
|
const option = context.options[0] || {} |
|
|
|
/** |
|
* @param {import('../utils').ComponentProp[]} props |
|
*/ |
|
function checkMaxNumberOfProps(props) { |
|
if (props.length > option.maxProps && props[0].node) { |
|
context.report({ |
|
node: props[0].node.parent, |
|
messageId: 'tooManyProps', |
|
data: { |
|
propCount: props.length, |
|
limit: option.maxProps |
|
} |
|
}) |
|
} |
|
} |
|
|
|
return utils.compositingVisitors( |
|
utils.executeOnVue(context, (obj) => { |
|
checkMaxNumberOfProps(utils.getComponentPropsFromOptions(obj)) |
|
}), |
|
utils.defineScriptSetupVisitor(context, { |
|
onDefinePropsEnter(_, props) { |
|
checkMaxNumberOfProps(props) |
|
} |
|
}) |
|
) |
|
} |
|
}
|
|
|