eslint-plugin-taro
Version:
Taro specific linting plugin for ESLint
76 lines (70 loc) • 1.9 kB
JavaScript
const { buildDocsMeta, isTaroComponent } = require('../utils/utils')
const NUMBER_ERROR = '方法名包含数字可能会在小程序中无法使用'
const UNDERSCOPE_ERROR = '方法名以下划线 `_` 开头或结尾可能在小程序无法使用'
const LENGTH_ERROR = '方法名的长度大于 22 可能在小程序中无法使用'
const lifeCycles = new Set([
'shouldComponentUpdate',
'getDerivedStateFromProps',
'getSnapshotBeforeUpdate',
'componentWillReceiveProps',
'componentDidCatchError',
'componentDidNotFound',
'componentDidCatch'
])
module.exports = {
meta: {
docs: buildDocsMeta('方法命名规范', 'function-naming')
},
create (context) {
function examine (key) {
if (lifeCycles.has(key.name)) {
return
}
if (/\d/g.test(key.name)) {
context.report({
message: NUMBER_ERROR,
node: key
})
}
if (key.name.startsWith('_') || key.name.endsWith('_')) {
context.report({
message: UNDERSCOPE_ERROR,
node: key
})
}
if (key.name.length >= 22) {
context.report({
message: LENGTH_ERROR,
node: key
})
}
}
function checkClassProperty(node) {
if (!isTaroComponent(context, node)) {
return
}
const key = node.key
const value = node.value
if (
key.type === 'Identifier' &&
value &&
(value.type === 'ArrowFunctionExpression' || value.type === 'FunctionExpression')
) {
examine(key)
}
}
return {
MethodDefinition (node) {
if (!isTaroComponent(context, node)) {
return
}
const key = node.key
if (key.type === 'Identifier') {
examine(key)
}
},
ClassProperty: checkClassProperty,
PropertyDefinition: checkClassProperty,
}
}
}