SuperAPI AI 工具集

eslint-plugin

编程与开发

查看项目

更新于 10-16 05:24

技能介绍

用途

该技能用于以测试驱动开发(TDD)方式编写自定义 ESLint 规则,涵盖规则创建、测试与插件打包。适用场景包括:强制项目特定的编码规范;创建带自动修复或建议的规则;使用类型信息构建 TypeScript 感知规则;从已弃用规则迁移。

工作流程

技能建议按以下进度推进:明确转换目标(提供修改前/后示例);询问边界情况问题;检测项目设置(配置格式、测试运行器);先编写失败的测试;实现规则使测试通过;补充边界情况测试;为规则编写文档。

边界情况发现

技能强调在编写代码之前先询问边界情况。通用问题包括:规则应适用于所有文件类型还是特定扩展名;规则应可自动修复、提供建议还是仅报告;是否存在豁免模式(测试文件、生成代码)。按规则类型还有细分问题:标识符(变量、函数、类还是全部?是否解构?是否重命名导入?)、导入(是否再导出?动态导入?仅类型导入?副作用导入?)、函数(箭头函数还是声明?方法还是独立函数?异步?生成器?)、JSX(JSX 与 createElement?片段?自闭合?展开属性?)、TypeScript(是否需要类型信息?处理 any?泛型?类型断言?)。

项目设置检测

配置格式:存在 eslint.config.js/mjs/cjs/ts 时为扁平配置(ESLint 9+);存在 .eslintrc.* 或 package.json 中的 eslintConfig 时为旧版格式。测试运行器:检查 package.json 的 devDependencies,Bun 对应 bun:test 或 bun,Vitest 对应 vitest,Jest 对应 jest。

规则模板

规则文件位于 src/rules/rule-name.ts,使用 @typescript-eslint/utils 的 ESLintUtils.RuleCreator 创建规则。meta 中可设置 type(problem、suggestion、layout)、docs.description、fixable(仅当可自动修复)、hasSuggestions(仅当有建议)、messages、schema,以及 defaultOptions。create 函数返回 AST 选择器映射,通过 context.report 报告问题,可在 fix 中使用 fixer 替换文本。

测试模板

测试文件位于 src/rules/tests/rule-name.test.ts,从 bun:test 或 vitest 导入 afterAll、describe、it,从 @typescript-eslint/rule-tester 导入 RuleTester。需在创建实例之前配置 RuleTester.afterAll、describe、it、itOnly。创建 RuleTester 时设置 languageOptions.parserOptions(ecmaVersion、sourceType)。通过 ruleTester.run 定义 valid 和 invalid 用例,invalid 用例可包含 output 和 errors。

类型感知规则

对于需要 TypeScript 类型信息的规则,使用 ESLintUtils.getParserServices(context) 获取服务,通过 services.getTypeAtLocation(node) 获取类型(v6+ 简化 API 为直接调用)。测试配置需引入 @typescript-eslint/parser,并在 parserOptions 中设置 projectService(allowDefaultProject)和 tsconfigRootDir。

插件结构(扁平配置)

插件入口位于 src/index.ts,使用 eslint/config 的 defineConfig。插件对象包含 meta(name、version)、configs、rules。通过 Object.assign 添加 recommended 配置,其中 plugins 注册插件,rules 启用规则。旧版和双格式插件结构参见参考资料。

必需的测试覆盖

包括:主用例(核心转换)、无操作(无关代码不变)、幂等性(已修复代码保持修复)、边界情况(规格变体)、选项(不同配置)。

快速参考

规则类型:problem(导致错误的代码)、suggestion(风格改进)、layout(空白/格式)。修复方法:fixer.replaceText、insertTextBefore、insertTextAfter、remove、replaceTextRange。常用选择器:CallExpression[callee.name='target']、MemberExpression[property.name='prop']、ImportDeclaration[source.value='pkg']、Identifier[name='forbidden']、:not(CallExpression)、FunctionDeclaration:exit。

参考资料与外部工具

参考资料包括代码模式(AST 选择器、修复器 API、报告、上下文 API)、测试模式(Bun/Vitest/Jest 的 RuleTester 设置、测试用例)、插件模板(扁平配置、旧版、双格式结构)、故障排除(常见问题、调试技巧)。外部工具包括 AST Explorer(https://astexplorer.net,选择 @typescript-eslint/parser)和 ast-grep(sg --lang ts -p 'pattern' 用于结构化搜索)。