@persagy2/eslint-plugin
Version:
一个适用于 vue3.x、typescript 项目的通用eslint预设插件
109 lines (98 loc) • 3.31 kB
text/typescript
import type { Linter } from 'eslint'
import { rules as tsRules } from '@typescript-eslint/eslint-plugin'
export interface IRule {
/** 规则名称 */
name: string
/** 规则参数 */
options?: { [key: string]: any }
/** 规则描述 */
desc?: string
/**
* 是否启用 / 规则等级
*
* @default 'warn'
*/
enable?: false | 'warn' | 'error'
}
interface ICreateConfigRes {
/** 继承上级规则 */
extends(parent: string): ICreateConfigRes
/** 指示下面导入的规则的等级 */
level(value: 'warn' | 'error'): ICreateConfigRes
/** 导入规则 */
rule(name: string, options?: any): ICreateConfigRes
config(): Linter.Config
}
/** 是否为 vue 应用 */
const isVue = await (async () => {
try {
return !!(await import('vue'))
} catch (error) {
return false
}
})()
/** 写入规则 */
const writeRules = (list: Array<{ name: string; level: 'warn' | 'error'; options?: any }>): Linter.Config['rules'] => {
const rules: Linter.Config['rules'] = {}
const write = (level: 'warn' | 'error', name: string, options?: any): void => {
let r!: string
const isTsRule: boolean = /^@typescript-eslint\/.+?/.test(name)
const isVueRule: boolean = /^vue\/.+?/.test(name)
// ? 如果是 vue 规则, 在非vue环境下不启用
if (isVueRule && !isVue) return
// ? check @typescript-eslint's rules
if (isTsRule) {
r = name.replace('@typescript-eslint/', '')
// ? 如果是使用了 type checking 的规则, 需要禁用
if (tsRules[r]?.meta?.docs?.requiresTypeChecking) return
// ? 如果是eslint同名规则, 则应禁用eslint的规则
if (rules[r]) delete rules[r]
}
// ? check vue's rules
if (isVueRule) {
r = name.replace('vue/', '')
// ? 如果是eslint同名规则, 则应禁用eslint的规则
if (rules[r]) rules[r]
}
if (options) {
rules[name] = [level]
} else {
rules[name] = [level, options]
}
}
for (const { level, name, options } of list) {
write(level, name, options)
}
return rules
}
/** 通过链式调用方式创建规则配置 */
export const createConfig = (): ICreateConfigRes => {
const conf: Linter.Config = {
extends: [],
rules: {}
}
let level: 'warn' | 'error' = 'error'
const list: Array<{ name: string; level: 'warn' | 'error'; options?: any }> = []
return {
/** 继承哪个规则的配置 */
extends(parent: string) {
;(conf.extends as Array<string>).push(parent)
return this
},
/** 指示下面导入的规则的等级 */
level(value: 'warn' | 'error') {
level = value
return this
},
/** 添加规则 */
rule(name: string, options?: any) {
list.push({ level, name, options })
return this
},
/** 导出配置 */
config() {
conf.rules = writeRules(list)
return conf
}
}
}