如何为eslint-plugin-boundaries编写满足AND条件的Glob模式
解决eslint-plugin-boundaries的路径匹配问题
原有配置的问题
你写的模式是两个路径的逻辑或关系,只要路径匹配其中任意一个就会被选中。src/features/project/index.ts会命中第二个src/features/*/*.ts规则,完全不检查该目录下是否存在ui/model/lib文件夹,所以出现误匹配。
正确配置方案
eslint-plugin-boundaries提供了require选项,可以用来强制要求目标路径所在的目录必须存在指定的文件/目录,刚好能解决你的“同时存在index.ts和指定子目录”的需求。
方案一:合并配置
{ "pattern": "src/features/*/{index.ts,lib/**,model/**,ui/**}", "require": [ "src/features/*/(lib|model|ui)" ] }
pattern:匹配src/features/[任意文件夹]下的index.ts,以及lib/model/ui三个文件夹下的所有文件。require:强制要求对应的features子目录下,必须存在lib/model/ui中的至少一个目录,直接过滤掉只有index.ts的目录。
方案二:拆分更清晰的规则
如果想更明确区分两种路径(index.ts和子目录文件),可以拆成两个规则:
{ "patterns": [ { "pattern": "src/features/*/index.ts", "require": "src/features/*/(lib|model|ui)" }, { "pattern": "src/features/*/(lib|model|ui)/**" } ] }
- 第一个规则:仅匹配
features子目录下的index.ts,但要求该目录必须有lib/model/ui中的一个。 - 第二个规则:直接匹配
lib/model/ui下的所有文件,这类路径本身就满足“存在指定子目录”的条件,无需额外约束。
为什么不用纯Glob?
纯Glob语法只能匹配路径字符串本身,无法检查目录下是否存在其他文件/目录。比如你没法写一个Glob来表示“某个目录下既有index.ts又有ui文件夹”,因为Glob不具备遍历目录结构做存在性校验的能力,所以用插件自带的require选项是最可靠的方式。
内容的提问来源于stack exchange,提问作者qweezz
相关产品推荐
相关产品推荐

