自定义处理器
您还可以创建自定义处理器,告诉 ESLint 如何处理标准 JavaScript 以外的文件。例如,您可以编写一个自定义处理器来从 Markdown 文件中提取和处理 JavaScript(@eslint/markdown 包含为此目的的自定义处理器)。
自定义处理器规范
为了创建自定义处理器,从您的模块导出的对象必须符合以下接口
const plugin = {
meta: {
name: "eslint-plugin-example",
version: "1.2.3"
},
processors: {
"processor-name": {
meta: {
name: "eslint-processor-name",
version: "1.2.3"
},
// takes text of the file and filename
preprocess(text, filename) {
// here, you can strip out any non-JS content
// and split into multiple strings to lint
return [ // return an array of code blocks to lint
{ text: code1, filename: "0.js" },
{ text: code2, filename: "1.js" },
];
},
// takes a Message[][] and filename
postprocess(messages, filename) {
// `messages` argument contains two-dimensional array of Message objects
// where each top-level array item contains array of lint messages related
// to the text that was returned in array from preprocess() method
// you need to return a one-dimensional array of the messages you want to keep
return [].concat(...messages);
},
supportsAutofix: true // (optional, defaults to false)
}
}
};
// for ESM
export default plugin;
// OR for CommonJS
module.exports = plugin;
preprocess
方法采用文件内容和文件名作为参数,并返回一个要进行代码检查的代码块数组。这些代码块将分别进行代码检查,但仍将注册到文件名中。
代码块具有两个属性 text
和 filename
。text
属性是块的内容,filename
属性是块的名称。块的名称可以是任何内容,但应包含文件扩展名,该扩展名告诉 ESLint 如何处理当前块。ESLint 检查项目配置中匹配的 files
条目以确定是否应检查代码块。
插件需要决定是否需要返回非 JavaScript 文件的一部分或多个部分。例如,在处理 .html
文件的情况下,您可能希望通过组合所有脚本仅返回数组中的一个项目。但是,对于 .md
文件,您可以返回多个项目,因为每个 JavaScript 块都可能是独立的。
postprocess
方法采用 lint 消息的二维数组和文件名作为参数。输入数组中的每个项目都对应于从 preprocess
方法返回的部分。postprocess
方法必须调整所有错误的位置以对应于原始未处理代码中的位置,并将它们聚合到单个扁平数组中并返回它。
报告的问题在每个 lint 消息中都具有以下位置信息
type LintMessage = {
/// The 1-based line number where the message occurs.
line?: number;
/// The 1-based column number where the message occurs.
column?: number;
/// The 1-based line number of the end location.
endLine?: number;
/// The 1-based column number of the end location.
endColumn?: number;
/// If `true`, this is a fatal error.
fatal?: boolean;
/// Information for an autofix.
fix: Fix;
/// The error message.
message: string;
/// The ID of the rule which generated the message, or `null` if not applicable.
ruleId: string | null;
/// The severity of the message.
severity: 0 | 1 | 2;
/// Information for suggestions.
suggestions?: Suggestion[];
};
type Fix = {
range: [number, number];
text: string;
}
type Suggestion = {
desc?: string;
messageId?: string;
fix: Fix;
}
默认情况下,即使在命令行上启用了 --fix
标志,ESLint 在使用自定义处理器时也不会执行自动修复。要允许 ESLint 在使用您的处理器时自动修复代码,您应该采取以下其他步骤
-
更新
postprocess
方法以另外转换报告问题的fix
属性。所有可自动修复的问题都具有一个fix
属性,该属性是一个具有以下架构的对象{ range: [number, number], text: string }
range
属性包含代码中的两个索引,指的是将被替换的文本连续部分的起始和结束位置。text
属性指的是将替换给定范围的文本。在初始问题列表中,
fix
属性将引用已处理 JavaScript 中的修复。postprocess
方法应转换该对象以引用原始未处理文件中的修复。 -
在处理器中添加
supportsAutofix: true
属性。
您可以在单个插件中同时使用规则和自定义处理器。您还可以在一个插件中拥有多个处理器。要支持多个扩展名,请将每个扩展名添加到 processors
元素中,并将它们指向同一个对象。
元对象的使用方式
meta
对象帮助 ESLint 缓存使用处理器的配置并提供更友好的调试消息。
插件元对象
该 插件元对象 提供有关插件本身的信息。当使用字符串格式 plugin-name/processor-name
指定处理器时,ESLint 会自动使用插件元对象为处理器生成名称。这是处理器最常见的情况。
示例
// eslint.config.js
import example from "eslint-plugin-example";
export default [
{
plugins: {
example
},
processor: "example/processor-name"
},
// ... other configs
];
在此示例中,处理器名称为 "example/processor-name"
,并且该值将用于配置的序列化。
处理器元对象
每个处理器还可以指定自己的 meta
对象。此信息在将处理器对象直接传递到配置中的 processor
时使用。在这种情况下,ESLint 不知道处理器属于哪个插件。meta.name
属性应与处理器名称匹配,meta.version
属性应与处理器的 npm 包版本匹配。最简单的方法是从您的 package.json
中读取此信息。
示例
// eslint.config.js
import example from "eslint-plugin-example";
export default [
{
processor: example.processors["processor-name"]
},
// ... other configs
];
在此示例中,直接指定 example.processors["processor-name"]
使用处理器自己的 meta
对象,该对象必须定义以确保在处理器未通过插件名称引用时正确处理。
为什么需要这两个元对象
建议插件和每个处理器都提供各自的元对象。这确保了依赖于元对象的特性(如 --print-config
和 --cache
)在配置中无论如何指定处理器都能正常工作。
在配置文件中指定处理器
为了在配置文件中使用来自插件的处理器,请导入插件并将其包含在 plugins
密钥中,指定一个命名空间。然后,使用该命名空间在 processor
配置中引用处理器,如下所示
// eslint.config.js
import example from "eslint-plugin-example";
export default [
{
plugins: {
example
},
processor: "example/processor-name"
}
];
有关更多详细信息,请参阅插件配置文档中的 指定处理器。