版本

Node.js API 参考

虽然 ESLint 旨在通过命令行运行,但也可以通过 Node.js API 以编程方式使用 ESLint。Node.js API 的目的是允许插件和工具作者直接使用 ESLint 功能,而无需通过命令行界面。

注意: 使用 API 中未记录的部分风险自负。只有本文档中明确提及的部分才被批准使用,并将保持稳定和可靠。任何未记录的内容都是不稳定的,可能会在任何时候更改或删除。

ESLint 类

ESLint 类是在 Node.js 应用程序中使用的主要类。

此类依赖于 Node.js fs 模块和文件系统,因此您不能在浏览器中使用它。如果您想在浏览器上检查代码,请改用 Linter 类。

这是一个使用 ESLint 类的简单示例

const { ESLint } = require("eslint");

(async function main() {
    // 1. Create an instance.
    const eslint = new ESLint();

    // 2. Lint files.
    const results = await eslint.lintFiles(["lib/**/*.js"]);

    // 3. Format the results.
    const formatter = await eslint.loadFormatter("stylish");
    const resultText = formatter.format(results);

    // 4. Output it.
    console.log(resultText);
})().catch((error) => {
    process.exitCode = 1;
    console.error(error);
});

这是一个自动修复检查问题的示例

const { ESLint } = require("eslint");

(async function main() {
    // 1. Create an instance with the `fix` option.
    const eslint = new ESLint({ fix: true });

    // 2. Lint files. This doesn't modify target files.
    const results = await eslint.lintFiles(["lib/**/*.js"]);

    // 3. Modify the files with the fixed code.
    await ESLint.outputFixes(results);

    // 4. Format the results.
    const formatter = await eslint.loadFormatter("stylish");
    const resultText = formatter.format(results);

    // 5. Output it.
    console.log(resultText);
})().catch((error) => {
    process.exitCode = 1;
    console.error(error);
});

这是一个使用带有 lintText API 的 ESLint 类的示例

const { ESLint } = require("eslint");

const testCode = `
  const name = "eslint";
  if(true) {
    console.log("constant condition warning")
  };
`;

(async function main() {
    // 1. Create an instance
    const eslint = new ESLint({
        overrideConfigFile: true,
        overrideConfig: {
            languageOptions: {
                ecmaVersion: 2018,
                sourceType: "commonjs"
            }
        },
    });

    // 2. Lint text.
    const results = await eslint.lintText(testCode);

    // 3. Format the results.
    const formatter = await eslint.loadFormatter("stylish");
    const resultText = formatter.format(results);

    // 4. Output it.
    console.log(resultText);
})().catch((error) => {
    process.exitCode = 1;
    console.error(error);
});

◆ new ESLint(options)

const eslint = new ESLint(options);

创建一个新的 ESLint 实例。

参数

ESLint 构造函数接受一个 options 对象。如果您省略 options 对象,则它对所有选项使用默认值。options 对象具有以下属性。

文件枚举
  • options.cwd (string)
    默认为 process.cwd()。工作目录。这必须是绝对路径。
  • options.errorOnUnmatchedPattern (boolean)
    默认为 true。除非设置为 false,否则当找不到目标文件时,eslint.lintFiles() 方法将抛出错误。
  • options.globInputPaths (boolean)
    默认为 true。如果存在 false,则 eslint.lintFiles() 方法不解释 glob 模式。
  • options.ignore (boolean)
    默认为 true。如果存在 false,则 eslint.lintFiles() 方法不遵守配置中的 ignorePatterns
  • options.ignorePatterns (string[] | null)
    默认为 null。除了配置忽略之外,还要使用的忽略文件模式。这些模式相对于 cwd
  • options.passOnNoPatterns (boolean)
    默认为 false。当设置为 true 时,缺少模式会导致 lint 操作短路,并且不报告任何失败。
  • options.warnIgnored (boolean)
    默认为 true。当文件列表包含被忽略的文件时显示警告。
代码检查
  • options.allowInlineConfig (boolean)
    默认为 true。如果存在 false,ESLint 将抑制源代码中的指令注释。如果此选项为 false,它将覆盖配置中的 noInlineConfig 设置。
  • options.baseConfig (ConfigData | ConfigData[] | null)
    默认为 null配置对象,由此实例使用的所有配置扩展。您可以使用此选项来定义默认设置,如果您的配置文件未配置,则将使用这些默认设置。
  • options.overrideConfig (ConfigData | ConfigData[] | null)
    默认为 null配置对象,在任何现有配置之后添加,因此在配置文件(如果使用)中包含的内容之后应用。
  • options.overrideConfigFile (null | true | string)
    默认为 null。默认情况下,ESLint 搜索配置文件。当此选项设置为 true 时,ESLint 不搜索配置文件。当此选项设置为 string 值时,ESLint 不搜索配置文件,并将提供的值用作配置文件的路径。
  • options.plugins (Record<string, Plugin> | null)
    默认为 null。ESLint 用于配置的 plugins 设置的插件实现。这是一个类似 Map 的对象。这些键是插件 ID,每个值都是实现。
  • options.ruleFilter (({ruleId: string, severity: number}) => boolean)
    默认为 () => true。一个谓词函数,用于过滤要运行的规则。此函数使用包含 ruleIdseverity 的对象调用,如果应运行该规则,则返回 true
  • options.stats (boolean)
    默认为 false。当设置为 true 时,其他统计信息将添加到 lint 结果中(请参阅 Stats 类型)。
自动修复
  • options.fix (boolean | (message: LintMessage) => boolean)
    默认为 false。如果存在 true,则 eslint.lintFiles()eslint.lintText() 方法在自动修复模式下工作。如果存在谓词函数,则这些方法将每个 lint 消息传递给该函数,然后仅使用该函数返回 true 的 lint 消息。
  • options.fixTypes (("directive" | "problem" | "suggestion" | "layout")[] | null)
    默认为 nulleslint.lintFiles()eslint.lintText() 方法用于自动修复的规则类型。
  • options.cache (boolean)
    默认为 false。如果存在 true,则 eslint.lintFiles() 方法缓存 lint 结果,并在每个目标文件未更改时使用它。请注意,当您升级 ESLint 插件时,ESLint 不会清除缓存。在这种情况下,您必须手动删除缓存文件。eslint.lintText() 方法即使您将 options.filePath 传递给该方法,也不会使用缓存。
  • options.cacheLocation (string)
    默认为 .eslintcacheeslint.lintFiles() 方法将缓存写入此文件。
  • options.cacheStrategy (string)
    默认为 "metadata"。用于检测更改文件的缓存策略。可以是 "metadata""content"
其他选项
  • options.flags (string[])
    默认为 []。为此实例启用的功能标志。

◆ eslint.lintFiles(patterns)

const results = await eslint.lintFiles(patterns);

此方法检查与 glob 模式匹配的文件,然后返回结果。

参数

  • patterns (string | string[])
    lint 目标文件。这可以包含任何文件路径、目录路径和 glob 模式。

返回值

  • (Promise<LintResult[]>)
    将使用 LintResult 对象数组实现的 Promise。

◆ eslint.lintText(code, options)

const results = await eslint.lintText(code, options);

此方法检查给定的源代码文本,然后返回结果。

默认情况下,此方法使用适用于当前工作目录(cwd 构造函数选项)中的文件的配置。如果您想使用不同的配置,请传递 options.filePath,ESLint 将加载与 eslint.lintFiles() 用于 options.filePath 处的文件相同的配置。

如果 options.filePath 值配置为被忽略,则此方法返回一个空数组。如果 options.warnIgnored 选项与 options.filePath 选项一起设置,则此方法返回一个 LintResult 对象。在这种情况下,结果可能包含指示文件被忽略的警告。

参数

第二个参数 options 是可省略的。

  • code (string)
    要检查的源代码文本。
  • options.filePath (string)
    可选。源代码文本的文件路径。如果省略,则 result.filePath 变为字符串 "<text>"
  • options.warnIgnored (boolean)
    可选,默认为传递给构造函数的 options.warnIgnored。如果存在 true 并且 options.filePath 是 ESLint 应该忽略的文件,则此方法返回包含警告消息的 lint 结果。

返回值

  • (Promise<LintResult[]>)
    将使用 LintResult 对象数组实现的 Promise。这是一个数组(尽管只有一个 lint 结果),以便保持此方法与 eslint.lintFiles() 方法之间的接口相似。

◆ eslint.getRulesMetaForResults(results)

const results = await eslint.lintFiles(patterns);
const rulesMeta = eslint.getRulesMetaForResults(results);

此方法返回一个对象,其中包含给定 results 中触发 lint 错误的每个规则的元信息。

参数

  • results (LintResult[])
    从调用 ESLint#lintFiles()ESLint#lintText() 返回的 LintResult 对象数组。

返回值

  • (Object)
    一个对象,其属性名称来自 results 的规则 ID,其属性值是规则的元信息(如果可用)。

◆ eslint.calculateConfigForFile(filePath)

const config = await eslint.calculateConfigForFile(filePath);

此方法计算给定文件的配置,这对于调试目的可能很有用。

参数

  • filePath (string)
    您要计算其配置的文件的路径。禁止目录路径,因为 ESLint 无法处理 overrides 设置。

返回值

  • (Promise<Object>)
    将使用配置对象实现的 Promise。

◆ eslint.isPathIgnored(filePath)

const isPathIgnored = await eslint.isPathIgnored(filePath);

此方法检查给定文件是否被您的配置忽略。

参数

  • filePath (string)
    您要检查的文件路径。

返回值

  • (Promise<boolean>)
    将使用文件是否被忽略实现的 Promise。如果文件被忽略,则它将返回 true

◆ eslint.loadFormatter(nameOrPath)

const formatter = await eslint.loadFormatter(nameOrPath);

此方法加载格式化器。格式化器将 lint 结果转换为人类或机器可读的字符串。

参数

  • nameOrPath (string | undefined)
    您要检查的文件路径。允许以下值
    • undefined。在这种情况下,加载 "stylish" 内置格式化器。
    • 内置格式化器的名称。
    • 第三方格式化器的名称。例如
      • "foo" 将加载 eslint-formatter-foo
      • "@foo" 将加载 @foo/eslint-formatter
      • "@foo/bar" 将加载 @foo/eslint-formatter-bar
    • 定义格式化器的文件的路径。路径必须包含一个或多个路径分隔符 (/),以便区分它是路径还是名称。例如,以 ./ 开头。

返回值

  • (Promise<LoadedFormatter>)
    将使用 LoadedFormatter 对象实现的 Promise。

◆ eslint.hasFlag(flagName)

此方法用于确定是否设置了给定的功能标志,如本例所示

if (eslint.hasFlag("x_feature")) {
    // handle flag
}

参数

  • flagName (string)
    要检查的标志。

返回值

  • (boolean)
    如果标志已启用,则为 True。

◆ ESLint.version

const version = ESLint.version;

ESLint 的版本字符串。例如 "7.0.0"

这是一个静态属性。

◆ ESLint.defaultConfig

const defaultConfig = ESLint.defaultConfig;

ESLint 内部使用的默认配置。这为想要使用与 ESLint 相同的默认值计算配置的工具提供。请记住,默认配置可能会因版本而异,因此您不应依赖于任何特定的键或值存在。

这是一个静态属性。

◆ ESLint.outputFixes(results)

await ESLint.outputFixes(results);

此方法将 ESLint 的自动修复功能修改的代码写入其各自的文件中。如果任何修改后的文件不存在,则此方法不执行任何操作。

这是一个静态方法。

参数

  • results (LintResult[])
    要写入的 LintResult 对象。

返回值

  • (Promise<void>)
    将在所有文件写入后实现的 Promise。

◆ ESLint.getErrorResults(results)

const filteredResults = ESLint.getErrorResults(results);

此方法复制给定的结果并删除警告。返回的值仅包含错误。

这是一个静态方法。

参数

  • results (LintResult[])
    要过滤的 LintResult 对象。

返回值

◆ LintResult 类型

LintResult 值是每个文件的 lint 结果的信息。eslint.lintFiles()eslint.lintText() 方法返回它。它具有以下属性

  • filePath (string)
    此结果文件的绝对路径。如果文件路径未知(当您没有将 options.filePath 选项传递给 eslint.lintText() 方法时),则这是字符串 "<text>"
  • messages (LintMessage[])
    LintMessage 对象的数组。
  • suppressedMessages (SuppressedLintMessage[])
    SuppressedLintMessage 对象的数组。
  • fixableErrorCount (number)
    可以通过 fix 构造函数选项自动修复的错误数。
  • fixableWarningCount (number)
    可以通过 fix 构造函数选项自动修复的警告数。
  • errorCount (number)
    错误数。这包括可修复的错误和致命错误。
  • fatalErrorCount (number)
    致命错误数。
  • warningCount (number)
    警告数。这包括可修复的警告。
  • output (string | undefined)
    修改后的源代码文本。如果任何可修复的消息不存在,则此属性未定义。
  • source (string | undefined)
    原始源代码文本。如果任何消息不存在或 output 属性存在,则此属性未定义。
  • stats (Stats | undefined)
    Stats 对象。这包含使用 stats 选项收集的 lint 性能统计信息。
  • usedDeprecatedRules ({ ruleId: string; replacedBy: string[]; info: DeprecatedInfo | undefined }[])
    有关用于检查此文件的已弃用规则的信息。如果规则使用新的 deprecated 属性,则 info 属性设置为 rule.meta.deprecated

◆ LintMessage 类型

LintMessage 值是每个 lint 错误的信息。LintResult 类型的 messages 属性包含它。它具有以下属性

  • ruleId (string | null)
    生成此 lint 消息的规则名称。如果此消息是由 ESLint 核心而不是规则生成的,则为 null
  • severity (1 | 2)
    此消息的严重程度。1 表示警告,2 表示错误。
  • fatal (boolean | undefined)
    如果这是与规则无关的致命错误,例如解析错误,则为 true
  • message (string)
    错误消息。
  • messageId (string | undefined)
    lint 错误的 message ID。如果规则不使用 message ID,则此属性未定义。
  • line (number | undefined)
    此消息的起始点的从 1 开始的行号。
  • column (number | undefined)
    此消息的起始点的从 1 开始的列号。
  • endLine (number | undefined)
    此消息的结束点的从 1 开始的行号。如果此消息不是范围,则此属性未定义。
  • endColumn (number | undefined)
    此消息的结束点的从 1 开始的列号。如果此消息不是范围,则此属性未定义。
  • fix (EditInfo | undefined)
    自动修复的 EditInfo 对象。如果此消息不可修复,则此属性未定义。
  • suggestions ({ desc: string; fix: EditInfo; messageId?: string; data?: object }[] | undefined)
    建议列表。每个建议都是描述和 EditInfo 对象的对,用于修复代码。编辑器集成等 API 用户可以选择其中一个来修复此消息的问题。如果此消息没有任何建议,则此属性未定义。

◆ SuppressedLintMessage 类型

SuppressedLintMessage 值是每个被抑制的 lint 错误的信息。LintResult 类型的 suppressedMessages 属性包含它。它具有以下属性

  • ruleId (string | null)
    LintMessage 类型中的 ruleId 相同。
  • severity (1 | 2)
    LintMessage 类型中的 severity 相同。
  • fatal (boolean | undefined)
    LintMessage 类型中的 fatal 相同。
  • message (string)
    LintMessage 类型中的 message 相同。
  • messageId (string | undefined)
    LintMessage 类型中的 messageId 相同。
  • line (number | undefined)
    LintMessage 类型中的 line 相同。
  • column (number | undefined)
    LintMessage 类型中的 column 相同。
  • endLine (number | undefined)
    LintMessage 类型中的 endLine 相同。
  • endColumn (number | undefined)
    LintMessage 类型中的 endColumn 相同。
  • fix (EditInfo | undefined)
    LintMessage 类型中的 fix 相同。
  • suggestions ({ desc: string; fix: EditInfo; messageId?: string; data?: object }[] | undefined)
    LintMessage 类型中的 suggestions 相同。
  • suppressions ({ kind: string; justification: string}[])
    抑制列表。每个抑制都是一种类型和一个理由的对。

◆ EditInfo 类型

EditInfo 值是编辑文本的信息。LintMessage 类型的 fixsuggestions 属性包含它。它具有以下属性

  • range ([number, number])
    源代码文本中要删除的从 0 开始的索引对。
  • text (string)
    要添加的文本。

此编辑信息表示用 text 属性值替换 range 属性的范围。它就像 sourceCodeText.slice(0, edit.range[0]) + edit.text + sourceCodeText.slice(edit.range[1])。因此,如果 range[0]range[1] 属性值相同,则它是添加;如果 text 属性值为空字符串,则它是删除。

◆ LoadedFormatter 类型

LoadedFormatter 值是将 LintResult 对象转换为文本的对象。eslint.loadFormatter() 方法返回它。它具有以下方法

  • format ((results: LintResult[], resultsMeta?: ResultsMeta) => string | Promise<string>)
    LintResult 对象转换为文本的方法。resultsMeta 是一个可选参数,主要供 ESLint CLI 使用,并且只能包含一个 maxWarningsExceeded 属性,该属性将通过 context 对象传递,当此方法调用底层格式化函数时。请注意,ESLint 会自动生成 context 对象的 cwdrulesMeta 属性,因此在调用此方法时通常不需要传入第二个参数。

loadESLint()

loadESLint() 函数用于希望同时支持当前配置系统(扁平配置)和旧配置系统 (eslintrc) 的集成。此函数根据提供的参数返回正确的 ESLint 类实现

const { loadESLint } = require("eslint");

// loads the default ESLint that the CLI would use based on process.cwd()
const DefaultESLint = await loadESLint();

// loads the flat config version specifically
const FlatESLint = await loadESLint({ useFlatConfig: true });

// loads the legacy version specifically
const LegacyESLint = await loadESLint({ useFlatConfig: false });

然后,您可以像这样使用返回的构造函数来实例化新的 ESLint 实例

// loads the default ESLint that the CLI would use based on process.cwd()
const DefaultESLint = await loadESLint();
const eslint = new DefaultESLint();

如果您不确定返回的构造函数使用哪种配置系统,请检查 configType 属性,该属性为 "flat""eslintrc"

// loads the default ESLint that the CLI would use based on process.cwd()
const DefaultESLint = await loadESLint();

if (DefaultESLint.configType === "flat") {
    // do something specific to flat config
}

如果您不需要同时支持旧的和新的配置系统,那么建议直接使用 ESLint 构造函数。


SourceCode

SourceCode 类型表示 ESLint 在其上执行的解析后的源代码。它在 ESLint 内部使用,也可用于使用已解析的代码。您可以通过传入表示代码的文本字符串和 ESTree 格式的抽象语法树 (AST)(包括位置信息、范围信息、注释和标记)来创建 SourceCode 的新实例

const SourceCode = require("eslint").SourceCode;

const code = new SourceCode("var foo = bar;", ast);

如果 AST 缺少任何必需的信息,则 SourceCode 构造函数会抛出错误。

SourceCode 构造函数会剥离 Unicode BOM。请注意,AST 也应该从剥离的文本中解析。

const SourceCode = require("eslint").SourceCode;

const code = new SourceCode("\uFEFFvar foo = bar;", ast);

assert(code.hasBOM === true);
assert(code.text === "var foo = bar;");

SourceCode#splitLines()

这是 SourceCode 上的一个静态函数,用于将源代码文本拆分为行数组。

const SourceCode = require("eslint").SourceCode;

const code = "var a = 1;\nvar b = 2;"

// split code into an array
const codeLines = SourceCode.splitLines(code);

/*
    Value of codeLines will be
    [
        "var a = 1;",
        "var b = 2;"
    ]
 */

Linter

Linter 对象执行 JavaScript 代码的实际评估。它不执行任何文件系统操作,它只是解析代码并报告代码。特别是,Linter 对象不处理配置文件。除非您在浏览器中工作,否则您可能需要改用 ESLint 类

Linter 是一个构造函数,您可以通过传入要使用的选项来创建新的实例。可用选项为

  • cwd - 应被视作当前工作目录的目录路径。规则可以从 context.cwd 访问它,或者通过调用 context.getCwd() (请参阅 上下文对象)。如果 cwdundefined,如果定义了全局 process 对象(例如,在 Node.js 运行时中),则它将被规范化为 process.cwd(),否则为 undefined

例如

const Linter = require("eslint").Linter;
const linter1 = new Linter({ cwd: 'path/to/project' });
const linter2 = new Linter();

在此示例中,在 linter1 上运行的规则将从 context.cwd 或调用 context.getCwd() 时获取 path/to/project。在 linter2 上运行的规则将在定义了全局 process 对象时获取 process.cwd(),否则获取 undefined(例如,在浏览器 https://eslint.org.cn/demo 上)。

Linter#verify

Linter 上最重要的方法是 verify(),它启动给定文本的检查。此方法接受三个参数

  • code - 要检查的源代码(字符串或 SourceCode 实例)。
  • config - 配置对象或配置对象数组。
  • options - (可选)此运行的附加选项。
    • filename - (可选)与源代码关联的文件名。
    • preprocess - (可选)插件中的处理器 文档描述为 preprocess 方法的函数。
    • postprocess - (可选)插件中的处理器 文档描述为 postprocess 方法的函数。
    • filterCodeBlock - (可选)决定 linter 应采用哪些代码块的函数。该函数接收两个参数。第一个参数是代码块的虚拟文件名。第二个参数是代码块的文本。如果函数返回 true,则 linter 采用该代码块。如果省略了该函数,则 linter 仅采用 *.js 代码块。如果您提供了 filterCodeBlock 函数,它将覆盖此默认行为,因此 linter 不会自动采用 *.js 代码块。
    • disableFixes - (可选)设置为 true 时,linter 不会生成 lint 结果的 fixsuggestions 属性。
    • allowInlineConfig - (可选)设置为 false 以禁用内联注释更改 ESLint 规则。
    • reportUnusedDisableDirectives - (可选)设置为 true 时,当在禁用区域中不会报告任何问题时,为未使用的 eslint-disableeslint-enable 指令添加报告的错误。
    • ruleFilter - (可选)决定应运行哪些规则的函数谓词。它接收一个包含 ruleIdseverity 的对象,如果应运行该规则,则返回 true

如果第三个参数是字符串,则将其解释为 filename

您可以像这样调用 verify()

const Linter = require("eslint").Linter;
const linter = new Linter();

const messages = linter.verify("var foo;", {
    rules: {
        semi: 2
    }
}, { filename: "foo.js" });

// or using SourceCode

const Linter = require("eslint").Linter,
    linter = new Linter(),
    SourceCode = require("eslint").SourceCode;

const code = new SourceCode("var foo = bar;", ast);

const messages = linter.verify(code, {
    rules: {
        semi: 2
    }
}, { filename: "foo.js" });

verify() 方法返回一个对象数组,其中包含有关检查警告和错误的信息。这是一个示例

[
    {
        fatal: false,
        ruleId: "semi",
        severity: 2,
        line: 1,
        column: 23,
        message: "Expected a semicolon.",
        fix: {
            range: [1, 15],
            text: ";"
        }
    }
]

每个检查消息可用的信息是

  • column - 发生错误的列。
  • fatal - 通常省略,但如果存在解析错误(与规则无关),则设置为 true。
  • line - 发生错误的行。
  • message - 应输出的消息。
  • messageId - 用于生成消息的消息 ID(如果规则不使用消息 ID,则省略此属性)。
  • nodeType - (已弃用: 此属性将在未来版本的 ESLint 中移除。) 报告问题的节点或 token 类型。
  • ruleId - 触发消息的规则 ID (如果 fatal 为 true,则为 null)。
  • severity - 1 或 2,取决于您的配置。
  • endColumn - 发生错误的范围的结束列 (如果不是范围,则省略此属性)。
  • endLine - 发生错误的范围的结束行 (如果不是范围,则省略此属性)。
  • fix - 描述问题修复的对象 (如果没有可用的修复,则省略此属性)。
  • suggestions - 一个对象数组,描述了编辑器可以编程方式启用的可能的 lint 修复 (详情请参阅 Working with Rules 文档)。

您可以通过 getSuppressedMessages() 方法获取上一次运行中被抑制的消息。 如果没有上一次运行,getSuppressedMessage() 将返回一个空列表。

const Linter = require("eslint").Linter;
const linter = new Linter();

const messages = linter.verify("var foo = bar; // eslint-disable-line -- Need to suppress", {
    rules: {
        semi: ["error", "never"]
    }
}, { filename: "foo.js" });
const suppressedMessages = linter.getSuppressedMessages();

console.log(suppressedMessages[0].suppressions); // [{ "kind": "directive", "justification": "Need to suppress" }]

您还可以使用 getSourceCode() 方法获取在 linter 内部使用的 SourceCode 对象的实例。

const Linter = require("eslint").Linter;
const linter = new Linter();

const messages = linter.verify("var foo = bar;", {
    rules: {
        semi: 2
    }
}, { filename: "foo.js" });

const code = linter.getSourceCode();

console.log(code.text);     // "var foo = bar;"

通过这种方式,您可以检索用于上次 linter.verify() 运行的文本和 AST。

Linter#verifyAndFix()

此方法类似于 verify,不同之处在于它还运行自动修复逻辑,类似于命令行中的 --fix 标志。 结果对象将包含自动修复后的代码,以及代码中未被自动修复的任何剩余 lint 消息。

const Linter = require("eslint").Linter;
const linter = new Linter();

const messages = linter.verifyAndFix("var foo", {
    rules: {
        semi: 2
    }
});

此方法的输出对象

{
    fixed: true,
    output: "var foo;",
    messages: []
}

可用的信息是

  • fixed - 如果代码已修复,则为 True。
  • output - 修复后的代码文本 (如果没有应用修复,则可能与输入相同)。
  • messages - 给定代码的所有消息的集合 (它具有与上面在 verify 块下解释的相同信息)。

Linter#version/Linter.version

Linter 的每个实例都有一个 version 属性,其中包含该 Linter 实例来自的 ESLint 的语义版本号。

const Linter = require("eslint").Linter;
const linter = new Linter();

linter.version; // => '9.0.0'

还有一个 Linter.version 属性,您可以在不实例化 Linter 的情况下读取它。

const Linter = require("eslint").Linter;

Linter.version; // => '9.0.0'

Linter#getTimes()

此方法用于获取在文件上花费的时间 (解析、修复、lint)。 请参阅 Stats 对象的 times 属性。

Linter#getFixPassCount()

此方法用于获取自动修复的次数。 请参阅 Stats 对象的 fixPasses 属性。

Linter#hasFlag()

此方法用于确定是否设置了给定的功能标志,如本例所示

const Linter = require("eslint").Linter;
const linter = new Linter({ flags: ["x_feature"] });

console.log(linter.hasFlag("x_feature")); // true

RuleTester

eslint.RuleTester 是一个用于为 ESLint 规则编写测试的实用程序。 它在内部用于 ESLint 附带的捆绑规则,插件也可以使用它。

用法示例

"use strict";

const rule = require("../../../lib/rules/my-rule"),
    RuleTester = require("eslint").RuleTester;

const ruleTester = new RuleTester();

ruleTester.run("my-rule", rule, {
    valid: [
        {
            code: "var foo = true",
            options: [{ allowFoo: true }]
        }
    ],

    invalid: [
        {
            code: "var invalidVariable = true",
            errors: [{ message: "Unexpected invalid variable." }]
        },
        {
            code: "var invalidVariable = true",
            errors: [{ message: /^Unexpected.+variable/ }]
        }
    ]
});

RuleTester 构造函数接受一个可选的对象参数,该参数可用于为您的测试用例指定默认值。 例如,如果您的所有测试用例都使用 ES2015,您可以将其设置为默认值。

const ruleTester = new RuleTester({ languageOptions: { ecmaVersion: 2015 } });

RuleTester#run() 方法用于运行测试。 它应该传递以下参数

  • 规则的名称 (字符串)。
  • 规则对象本身 (请参阅 “working with rules”)。
  • 一个包含 validinvalid 属性的对象,每个属性都是一个包含测试用例的数组。

测试用例是一个具有以下属性的对象

  • name (字符串,可选):用于测试用例的名称,以便更容易找到。
  • code (字符串,必需):规则应在其上运行的源代码。
  • options (数组,可选):传递给规则的选项。 规则严重程度不应包含在此列表中。
  • before (函数,可选):在测试用例之前执行的函数。
  • after (函数,可选):在测试用例之后执行的函数,无论其结果如何。
  • filename (字符串,可选):给定用例的文件名 (对于对文件名进行断言的规则很有用)。
  • only (布尔值,可选):在受支持的测试框架中专门运行此用例以进行调试。

除了上述属性外,无效的测试用例还可以具有以下属性

  • errors (数字或数组,必需):断言规则在运行此代码时预期产生的错误的一些属性。 如果这是一个数字,则断言产生的错误数。 否则,这应该是一个对象列表,每个对象都包含有关单个报告错误的信息。 以下属性可用于错误 (除非另有说明,否则所有属性都是可选的)

    • message (字符串/正则表达式):错误的 message。 必须提供此项或 messageId
    • messageId (字符串):错误的 ID。 必须提供此项或 message。 有关详细信息,请参阅 testing errors with messageId
    • data (对象):占位符数据,可以与 messageId 结合使用。
    • type (字符串):(已弃用: 此属性将在未来版本的 ESLint 中移除。) 报告的 AST 节点的类型。
    • line (数字):报告位置的从 1 开始的行号。
    • column (数字):报告位置的从 1 开始的列号。
    • endLine (数字):报告位置结束位置的从 1 开始的行号。
    • endColumn (数字):报告位置结束位置的从 1 开始的列号。
    • suggestions (数组):一个对象数组,其中包含要检查的建议详细信息。 如果规则产生建议,则为必需。 有关详细信息,请参阅 Testing Suggestions

    如果提供字符串作为错误而不是对象,则该字符串用于断言错误的 message

  • output (字符串,如果规则修复代码则为必需):断言在对自动修复进行单次传递 (例如,使用 --fix 命令行标志) 时将产生的输出。 如果此项为 null 或省略,则断言报告的问题均未建议自动修复。

测试用例的任何其他属性都将作为配置选项直接传递给 linter。 例如,测试用例可以具有 languageOptions 属性来配置解析器行为。

{
    code: "let foo;",
    languageOptions: { ecmaVersion: 2015 }
}

如果有效的测试用例仅使用 code 属性,则可以选择将其作为包含代码的字符串提供,而不是作为具有 code 键的对象提供。

使用 messageId 测试错误

如果被测规则使用 messageId,您可以使用测试用例中的 messageId 属性来断言报告错误的 messageId 而不是其 message

{
    code: "let foo;",
    errors: [{ messageId: "unexpected" }]
}

对于带有占位符的消息,测试用例还可以使用 data 属性来额外断言报告错误的 message

{
    code: "let foo;",
    errors: [{ messageId: "unexpected", data: { name: "foo" } }]
}

请注意,测试用例中的 data 不会断言传递给 context.reportdata。 相反,它用于形成预期的消息文本,然后将其与接收到的 message 进行比较。

测试修复

可以通过使用无效测试用例的 output 属性来测试应用修复的结果。 仅当您希望将修复应用于指定的 code 时才应使用 output 属性; 如果代码预计不会发生任何更改,则可以安全地省略 output。 这是一个例子

ruleTester.run("my-rule-for-no-foo", rule, {
    valid: [],
    invalid: [{
        code: "var foo;",
        output: "var bar;",
        errors: [{
            messageId: "shouldBeBar",
            line: 1,
            column: 5
        }]
    }]
})

在此无效测试用例的末尾,RuleTester 期望应用一个修复,该修复导致代码从 var foo; 更改为 var bar;。 如果应用修复后的输出不匹配,则测试失败。

测试建议

可以通过在 errors 对象上定义 suggestions 键来测试建议。 如果这是一个数字,则断言为错误提供的建议数。 否则,这应该是一个对象数组,每个对象都包含有关单个提供的建议的信息。 可以使用以下属性

  • desc (字符串):建议的 desc 值。 必须提供此项或 messageId
  • messageId (字符串):对于使用 messageId 的建议,建议的 messageId 值。 必须提供此项或 desc
  • data (对象):占位符数据,可以与 messageId 结合使用。
  • output (字符串,必需):一个代码字符串,表示将建议修复应用于输入代码的结果。

示例

ruleTester.run("my-rule-for-no-foo", rule, {
    valid: [],
    invalid: [{
        code: "var foo;",
        errors: [{
            suggestions: [{
                desc: "Rename identifier 'foo' to 'bar'",
                output: "var bar;"
            }]
        }]
    }]
})

建议测试对象中的 messageIddata 属性的工作方式与错误测试对象中的相同。 有关详细信息,请参阅 testing errors with messageId

ruleTester.run("my-rule-for-no-foo", rule, {
    valid: [],
    invalid: [{
        code: "var foo;",
        errors: [{
            suggestions: [{
                messageId: "renameFoo",
                data: { newName: "bar" },
                output: "var bar;"
            }]
        }]
    }]
})

自定义 RuleTester

RuleTester 依赖于两个函数来运行测试:describeit。 这些函数可以来自不同的位置

  1. 如果 RuleTester.describeRuleTester.it 已设置为函数值,则 RuleTester 将使用 RuleTester.describeRuleTester.it 来运行测试。 您可以使用此功能自定义 RuleTester 的行为,以匹配您正在使用的测试框架。

    如果 RuleTester.itOnly 已设置为函数值,则 RuleTester 将调用 RuleTester.itOnly 而不是 RuleTester.it 来运行 only: true 的用例。 如果未设置 RuleTester.itOnly,但 RuleTester.it 具有 only 函数属性,则 RuleTester 将回退到 RuleTester.it.only

  2. 否则,如果 describeit 作为全局变量存在,则 RuleTester 将使用 globalThis.describeglobalThis.it 来运行测试,并使用 globalThis.it.only 来运行 only: true 的用例。 这允许 RuleTester 在使用 Mocha 等框架时无需任何其他配置即可工作。

  3. 否则,RuleTester#run 将简单地按顺序执行所有测试,如果其中一个测试失败,则会抛出错误。 这意味着您可以使用 Node.js 简单地执行调用 RuleTester.run 的测试文件,而无需测试框架。

RuleTester#run 使用两个参数调用 describe 函数:描述规则的字符串和一个回调函数。 回调使用描述测试用例的字符串和一个测试函数调用 it 函数。 如果测试通过,则测试函数将成功返回;如果测试失败,则会抛出错误。 only 的签名与 it 相同。 即使某些用例具有 only: trueRuleTester 也会为每个用例调用 itonly,并且测试框架负责实现测试用例的排他性。 (请注意,这是在使用 Mocha 等框架时测试套件的标准行为;如果您计划自定义 RuleTester.describeRuleTester.itRuleTester.itOnly,则此信息才相关。)

自定义 RuleTester 的示例

"use strict";

const RuleTester = require("eslint").RuleTester,
    test = require("my-test-runner"),
    myRule = require("../../../lib/rules/my-rule");

RuleTester.describe = function(text, method) {
    RuleTester.it.title = text;
    return method.call(this);
};

RuleTester.it = function(text, method) {
    test(RuleTester.it.title + ": " + text, method);
};

// then use RuleTester as documented

const ruleTester = new RuleTester();

ruleTester.run("my-rule", myRule, {
    valid: [
        // valid test cases
    ],
    invalid: [
        // invalid test cases
    ]
})
更改语言