UNPKG

@persagy2/eslint-plugin

Version:

一个适用于 vue3.x、typescript 项目的通用eslint预设插件

109 lines (98 loc) 3.31 kB
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 } } }