Skip to content

Commit

Permalink
feat: sync v8.47.0
Browse files Browse the repository at this point in the history
  • Loading branch information
kecrily committed Dec 23, 2023
1 parent 9d49b2f commit 886a925
Show file tree
Hide file tree
Showing 10 changed files with 77 additions and 49 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> Simplified Chinese website
The synchronization frequency is the same as the ESLint release frequency (the last sync was [v8.46.0](https://github.com/eslint/eslint/tree/v8.46.0))
The synchronization frequency is the same as the ESLint release frequency (the last sync was [v8.47.0](https://github.com/eslint/eslint/tree/v8.47.0))

## Contribute

Expand Down
24 changes: 21 additions & 3 deletions src/extend/custom-parsers.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ ESLint 自定义解析器用于扩展 ESLint,以支持检查代码中新的非

## 创建自定义解析器

### 自定义解析器中的方法

自定义解析器是一个 JavaScript 对象,带有 `parse``parseForESLint` 方法。`parse` 方法只返回 AST,而 `parseForESLint` 方法还会返回附加属性,让解析器能更多地自定义 ESLint 的行为。

这两种方法的第一个参数都是源代码,第二个参数是可选的配置对象,配置对象在配置文件中以 [`parserOptions`](../use/configure/language-options#指定解析器选项) 的形式提供。
Expand All @@ -32,11 +34,11 @@ function parse(code, options) {
module.exports = { parse };
```

## `parse` 返回对象
### `parse` 返回对象

`parse` 方法应该简单地返回 [AST](#ast-规范) 对象。

## `parseForESLint` 返回对象
### `parseForESLint` 返回对象

`parseForESLint` 方法应该返回一个包括所需的 `ast` 属性和可选的 `services``scopeManager``visitorKeys` 属性。

Expand All @@ -47,6 +49,22 @@ module.exports = { parse };
* `visitorKeys` 可以是自定义 AST 遍历的对象。该对象的键是 AST 节点的类型。每个值是一个应该被遍历的属性名称的数组。默认为 [`eslint-visitor-keys` 的键](https://github.com/eslint/eslint-visitor-keys#evkkeys)
* 在 ESLint v4.14.0 中加入了对 `visitorKeys` 的支持。支持 `visitorKeys` 的 ESLint 版本将在 `parserOptions` 中提供 `eslintVisitorKeys: true` 属性,它可以用作特征检测。

### 自定义解析器中的元数据

为了更容易调试和更有效地缓存自定义解析器,建议在自定义解析器的根提供包含名称和版本的 `meta` 对象,如下所示:

```js
// preferred location of name and version
module.exports = {
meta: {
name: "eslint-parser-custom",
version: "1.2.3"
}
};
```

`meta.name` 属性应与你的自定义解析器的 npm 包名称匹配,而 `meta.version` 属性应与你的自定义解析器的 npm 包版本匹配。最简单的方法是从你的 `package.json` 中读取这些信息。

## AST 规范

自定义解析器创建的 AST 需要基于 [ESTree](https://github.com/estree/estree)。AST 还需要包括一些关于源码细节信息的额外属性。
Expand All @@ -55,7 +73,7 @@ module.exports = { parse };

所有节点必须要有 `range` 属性。

* `range``number[]`)是一个由两个数字组成的数组。这两个数字都是基于 0 的索引,是源代码字符数组中的位置。第一个是节点的起始位置,第二个是节点的结束位置。`code.slice(node.range[0], node.range[1])` 必须是该节点的文本。这个范围不包括节点周围的空格/括号。
* `range``number[]`)是一个由两个数字组成的数组。这两个数字都是基于 0 的索引,表示源代码字符数组中的位置。第一个是节点的起始位置,第二个是节点的结束位置。`code.slice(node.range[0], node.range[1])` 必须是该节点的文本。这个范围不包括节点周围的空格/括号。
* `loc` (`SourceLocation`) 不能是 `null`[ESTree](https://github.com/estree/estree/blob/25834f7247d44d3156030f8e8a2d07644d771fdb/es5.md#node-objects)`loc` 属性定义为 nullable,但 ESLint 需要这个属性。另一方面 `SourceLocation#source` 属性也可以是 `undefined`。ESLint 不使用 `SourceLocation#source` 属性。

所有节点的 `parent` 属性必须可覆写。ESLint 在遍历时会在任何规则访问 AST 前,将每个节点的 `parent` 属性设置为其父节点。
Expand Down
8 changes: 7 additions & 1 deletion src/extend/custom-processors.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ eleventyNavigation:
```js
module.exports = {
processors: {
meta: {
name: "eslint-processor-name",
version: "1.2.3"
},
"processor-name": {
// takes text of the file and filename
preprocess: function(text, filename) {
Expand Down Expand Up @@ -44,12 +48,14 @@ module.exports = {
};
```

**`preprocess` 方法**将文件内容和文件名作为参数,并返回一个代码块的数组以进行提示。这些代码块将被单独检查,但仍被注册到文件名上。
**`preprocess` 方法*使用文件内容和文件名作为参数,并返回一个代码块的数组以进行提示。这些代码块将被单独检查,但仍被注册到文件名上。

一个代码块有两个属性 `text``filename``text` 属性是代码块的内容,`filename` 属性是代码块的名称。块的名称可以是任何东西,但应包括文件扩展名,这将告诉检查器如何处理当前块。检查器将检查 [`--ext` CLI 选项](../use/command-line-interface#--ext),看当前块是否应该被检查,并解决 `overrides` 配置,检查如何处理当前块。

由插件决定它是否需要只返回非 JavaScript 文件的一部分或多个片段的。例如在处理 `.html` 文件的情况下,你可能想通过合并所有的脚本只返回数组中的一个项目。像是 `.md` 文件,因为每个 JavaScript 块都可能是独立的,就可以返回多个项目。

**`meta` 对象** 有助于 ESLint 缓存处理器并提供更友好的调试消息。`meta.name` 属性应与处理器名称匹配,而 `meta.version` 属性应与你的处理器的 npm 包版本匹配。最简单的方法是从你的 `package.json` 中读取这些信息。

**`postprocess` 方法**接收一个二维数组,该数组包括检查器消息和文件名。输入数组中的每一项都对应于从 `preprocess` 方法返回的部分。`postprocess` 方法必须调整所有错误的位置,使其与原始的、未处理的代码中的位置相对应,并将其汇总为一个平面数组并返回。

每个检查消息中报告的问题都要有以下位置信息:
Expand Down
56 changes: 28 additions & 28 deletions src/extend/plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,6 @@ ESLint 插件是给 ESLint 添加额外的规则和插件选项的扩展。插

要想创建一个插件的最简单方法是使用 [Yeoman 生成器](https://www.npmjs.com/package/generator-eslint)。该生成器将引导你创建插件骨架。

### 插件的元数据

为了更容易进行调试和更有效地缓存插件,建议在插件的根文件中提供 `meta` 对象,包括名称和版本,如下所示:

```js
// preferred location of name and version
module.exports = {
meta: {
name: "eslint-plugin-custom",
version: "1.2.3"
}
};
```

`meta.name` 属性应该与插件的 npm 包名称匹配,而 `meta.version` 属性应该与你的插件的 npm 包版本匹配。最简单的方法是从你的 `package.json` 中读取这些信息。

作为替代方法,你还可以在你的插件的根文件下暴露 `name``version` 属性,例如:

```js
// alternate location of name and version
module.exports = {
name: "eslint-plugin-custom",
version: "1.2.3"
};
```

虽然使用 `meta` 对象是提供插件名称和版本的首选方式,但这种格式也是可以接受的,并向后兼容。

### 插件中的规则

插件可以为 ESLint 提供自定义的规则。要做到这一点,插件必须输出 `rules` 对象,其中包含一个规则 ID 到规则的键值映射。规则 ID 不需要遵循任何命名惯例(比如可以是 `dollar-sign`)。了解更多关于在插件中创建自定义规则的信息,请参见[自定义规则](custom-rules)
Expand Down Expand Up @@ -163,6 +135,34 @@ module.exports = {

```

### 插件的元数据

为了更容易进行调试和更有效地缓存插件,建议在插件的根文件中提供 `meta` 对象,包括名称和版本,如下所示:

```js
// preferred location of name and version
module.exports = {
meta: {
name: "eslint-plugin-custom",
version: "1.2.3"
}
};
```

`meta.name` 属性应该与插件的 npm 包名称匹配,而 `meta.version` 属性应该与你的插件的 npm 包版本匹配。最简单的方法是从你的 `package.json` 中读取这些信息。

作为替代方法,你还可以在你的插件的根文件下暴露 `name``version` 属性,例如:

```js
// alternate location of name and version
module.exports = {
name: "eslint-plugin-custom",
version: "1.2.3"
};
```

虽然使用 `meta` 对象是提供插件名称和版本的首选方式,但这种格式也是可以接受的,并向后兼容。

### 对等依赖

为了明确该插件需要 ESLint 才能正常工作,你必须在你插件的 `package.json``peerDependencies` 字段中提及并声明 ESLint 是插件的对等依赖。
Expand Down
8 changes: 4 additions & 4 deletions src/integrate/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ eleventyNavigation:
order: 3
---

次教程旨在帮助那些希望通过使用 ESLint API 将 ESLint 的功能集成到其他应用程序中的人。
此教程旨在帮助那些希望通过使用 ESLint API 将 ESLint 的功能集成到其他应用程序中的人。

在集成 ESLint 前,建议:

* 你要了解 JavaScript,因为 ESLint 是用 JavaScript 编写的。
* 你要对 Node.js 有一定了解,因为 ESLint 在其上运行。
* 要了解 JavaScript,因为 ESLint 是用 JavaScript 编写的。
* 要对 Node.js 有一定了解,因为 ESLint 在其上运行。

如果这听起来适合你,那么请继续阅读以开始。
如果这对你来说没问题,那么请继续阅读以开始。

## [集成 Node.js API 教程](integration-tutorial)

Expand Down
13 changes: 7 additions & 6 deletions src/rules/require-unicode-regexp.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
---
title: require-unicode-regexp
rule_type: suggestion
further_reading:
- https://github.com/tc39/proposal-regexp-v-flag
- https://v8.dev/features/regexp-v-flag
---

正则 `u` 标志有两个作用。

1. **使正则表达式正确处理 UTF-16 代用对**
1. **使正则表达式正确处理 UTF-16 代用对(surrogate pairs)**

特别是,字符范围语法得到正确的行为。

Expand All @@ -16,7 +19,7 @@ rule_type: suggestion

2. **使正则表达式尽早抛出语法错误,因为禁用[附件 B 扩展](https://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns)**

由于历史原因,JavaScript 正则表达式对语法错误是宽容的。例如`/\w{1, 2/` 是一个语法错误,但是 JavaScript 并没有抛出这个错误。它匹配的是诸如 `"a{1, 2"` 这样的字符串。这样的恢复逻辑在附件 B 中进行了定义。
由于历史原因,JavaScript 正则表达式对语法错误非常宽容。例如 `/\w{1, 2/` 是语法错误,但 JavaScript 并不会抛出这个错误。它会匹配诸如 `"a{1, 2"` 这样的字符串。这样的恢复逻辑在附件 B 中进行了定义。

`u` 标志禁用了附件 B 定义的恢复逻辑。因此,你可以提前发现错误。这类似于[严格模式](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)

Expand Down Expand Up @@ -48,13 +51,11 @@ rule_type: suggestion
re.test('\u2028'); // → false
```

请查看 <https://github.com/tc39/proposal-regexp-v-flag><https://v8.dev/features/regexp-v-flag> 以获取更多详细信息。

因此,`u``v` 标志让我们更好地处理正则表达式。

## 规则细节

这条规则的目的是在正则表达式上强制使用 `u` 标志。
这条规则的目的是在正则表达式上强制使用 `u` `v` 标志。

使用此规则的**错误**示例:

Expand Down Expand Up @@ -98,4 +99,4 @@ function f(flags) {

## 何时不用

如果你不想通知没有 `u` 标志的正则表达式,你可以安全地禁用此规则
如果你不想警告存在没有 `u` `v` 标志的正则表达式,那么可以安全地禁用此规则
6 changes: 5 additions & 1 deletion src/use/configure/configuration-files-new.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ module.exports = (async () => {
})();
```

::: warning
ESLint 仅自动查找名为 `eslint.config.js` 的配置文件,不会查找 `eslint.config.cjs``eslint.config.mjs`。如果你想指定不同于默认的配置文件名称,请使用 `--config` 命令行选项。
:::

## 配置对象

每个配置对象都包括了 ESLint 检查一组文件所需的所有信息。配置对象由以下属性组成:
Expand Down Expand Up @@ -645,7 +649,7 @@ export default [
你可以通过通过将设置 `ESLINT_USE_FLAT_CONFIG` 环境变量设置为 `true`,并在命令行中使用 `-c``--config` 选项来指定替代的配置文件,以避免检索 `eslint.config.js`。例如

```shell
ESLINT_USE_FLAT_CONFIG=true npx eslint -c some-other-file.js **/*.js
ESLINT_USE_FLAT_CONFIG=true npx eslint --config some-other-file.js **/*.js
```

在这种情况下,ESLint 将不会检索 `eslint.config.js`,而会直接使用 `some-other-file.js`
3 changes: 2 additions & 1 deletion src/use/configure/language-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,8 @@ And in YAML:
ESLint 允许你指定你想要支持的 JavaScript 语言选项。默认情况下,ESLint 希望使用 ECMAScript 5 语法。你可以通过使用解析器选项来覆盖这一设置,以实现对其他 ECMAScript 版本以及 JSX 的支持。

请注意,支持 JSX 语法并不等同于支持 React。React 对 JSX 语法应用了特定的语义,而 ESLint 并不能识别。如果你使用 React 并且使用 React 语法,我们建议使用 [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react)
同样地,支持 ES6 语法不等于支持新的 ES6 全局变量(例如,新的类型,如 `Set`)。使用 `{ "parserOptions": { "ecmaVersion": 6 } }` 启用 ES6 语法;使用 `{ "env": { "es6": true } }` 启用新的 ES6 全局变量,设置 `{ "env": { "es6": true }}` 会自动启用 ES6 语法,但 `{ "parserOptions": { "ecmaVersion": 6 } }` 则不会自动启用 ES6 全局变量。

同样地,支持 ES6 语法不等于支持新的 ES6 全局变量(例如,新的类型,如 `Set`)。使用 `{ "parserOptions": { "ecmaVersion": 6 } }` 启用 ES6 语法;使用 `{ "env": { "es6": true } }` 启用新的 ES6 全局变量,设置 `{ "env": { "es6": true }}` 会自动启用 ES6 语法,但 `{ "parserOptions": { "ecmaVersion": 6 } }` 则不会自动启用 ES6 全局变量。总之,要仅支持 ES6 语法,请使用 `{ "parserOptions": { "ecmaVersion": 6 } }`,要同时支持 ES6 语法和新的 ES6 全局变量,如 `Set` 等,请使用 `{ "env": { "es6": true } }`

可以在 `.eslintrc.*` 文件中通过使用 `parserOptions` 属性设置解析器选项。可用选项有:

Expand Down
4 changes: 1 addition & 3 deletions src/use/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,14 @@ eleventyNavigation:
order: 1
---

本指南针对想要使用 ESLint 的终端用户。如果你正在寻找扩展 ESLint 或使用 ESLint 源码的方式,请查看[扩展 ESLint 文档](../extend/)
本指南针对想要直接使用 ESLint 用户。如果你正在寻找扩展 ESLint 或使用 ESLint 源码的方式,请查看[扩展 ESLint 文档](../extend/)

## [入门](getting-started)

想要跳过前期准备直接开始使用 ESLint?本章节对安装、设置和配置项进行了高水平概述。

## [核心概念](core-concepts)

Understand the main components of ESLint and how to use them in your project.

理解 ESLint 中的主要组件并指导如何在自己对项目中使用它们。

## [配置 ESLint](configure/)
Expand Down
2 changes: 1 addition & 1 deletion src/use/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ eleventyNavigation:

此页面包括了与 ESLint 集成的社区项目。列在此页的项目并不由 ESLint 所维护。

如果你想要推荐项目将其加入此也,请[提交拉去请求](../contribute/pull-requests).
如果你想要推荐项目将其加入此也,请[提交拉取请求](../contribute/pull-requests).

## 编辑器

Expand Down

0 comments on commit 886a925

Please sign in to comment.