# @a11ign/toolchain 中文文档

规范地址：https://npmcn.com/package/%40a11ign/toolchain/

版本：0\.15\.0
npm 元数据更新时间：2026-10-30T10:33:53.798Z
中文译文更新时间：2026-11-05T19:23:21.302Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40a11ign/toolchain
原文对照：https://npmcn.com/package/%40a11ign/toolchain/?lang=original
项目主页：https://github.com/a11ign/toolchain
源码仓库：https://github.com/a11ign/toolchain

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：393 kB，72 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=22\.15\.0
- 运行依赖：0 个
- peer 依赖：typescript ^6\.0\.3 \|\| ^7\.0\.0，@rslib/core ^1\.0\.3，@rstest/core ^0\.12\.3，@rstest/coverage-v8 ^0\.12\.3
- 首次发布：2026-10-05T07:34:11.989Z
- 最新版本发布：2026-10-30T10:33:53.478Z
- 近 30 天下载量：39684（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：30（近 12 个月 30 个）

## 中文简介

一个测试和构建工具链每个a11ign寄存器共享:rstest config(node:test shim,运行记录,判定行),Rslib预设,以及TypeScript基础.

## 安装

```sh
npm install @a11ign/toolchain
```

也可以使用：`pnpm add @a11ign/toolchain`、`yarn add @a11ign/toolchain`、`bun add @a11ign/toolchain`

## README

# `@a11ign/toolchain`

测试和构建每个 a11ign 存储器共享的工具链([ADR 0043 (英语)](https://github.com/a11ign/a11ign/blob/main/docs/adr/0043-one-toolchain-for-every-repository.md): rstest 配置作为每个寄存器的不同函数 `node:test` 让一个已有套房运行在 rstest 未经编辑的,运行 记录和判断行, Rslib 预设, TypeScript 基础, 以及一个 Deptabibot 配置 。 这是一个软件包,而不是模板,因为配置是八个记录 标题 `src/rstest-config.ts`5份会漂流.

装作一个 `devDependency` 与其同行相邻: `@rstest/core` (单位:千美元)`^0.12.3`),以及 `@rslib/core` (单位:千美元)`^1.0.3`),如果存储库建立. `@rstest/coverage-v8` 是一个可选的对等点,用于 `merge-child-coverage` 只有这个.

## 测试配置

```js
// rstest.config.mjs
import { defineToolchainConfig } from "@a11ign/toolchain/rstest-config";

export default defineToolchainConfig({
  root: import.meta.dirname,
  include: ["src/**/*.test.ts"],
});
```

`root` 财务报告和审定财务报表 `include` 整个都是. `preloads` 添加 `--import <path>` 每一个工人的文件,在这包自己的钩子之后,和 `forceRerunTriggers` 添加扩展a的文件 `rstest run --changed` 整个套房。 其它所有东西`forks` 和孤立的, 仅CI建筑缓存, 当地工人的帽子, 页:1 `json` 运行记录,判决线)在各地都是故意的.

**别名钩由道入.** 一个工人开始 `--import <path to register-node-test-alias.mjs>` 从 `node_modules`因此,每个文件 工人负载 是一个 BUILT `.mjs` 输入 `exports`: 节点拒绝将类型剥离到下面 `node_modules`。这个配置在自己旁边找到它.

## Rslib 预设

```ts
// rslib.config.ts
import { defineConfig } from "@rslib/core";
import { libraryPreset } from "@a11ign/toolchain/rslib-presets";
import pkg from "./package.json" with { type: "json" };

export default defineConfig(libraryPreset(pkg, { dir: import.meta.dirname }));
```

每条 `exports` 键,来自软件包本身 `exports` 地图 `entriesFromExports`,所以一个子路径不能被添加到一个中而被遗忘在另一个中. `entryProblems(pkg, entries)` 是一个测试包运行 证明它,双向。 来源可能是: `.ts` 或者说 `.mjs`; 一个 `exports` 键,没有源投出.

**预设的叶子 `new URL("./x", import.meta.url)` 已写入** (a11ign/a11ign#3735):Rslib的默认解析器将这个形式建为资产并重写到 URL `./static/assets/…`,所以读取自己的目录的软件包会从它的构建中得到错误的答案. 预设集 `parser: { url: false }` 页:1 `.js`编号 :`.mjs`编号 :`.cjs`编号 :`.ts`编号 :`.mts`编号 :`.cts` 源,所以软件包不设置在它自己的 `rslib.config`手写此规则的包件(`screenreader-worker` )可以在升级时删除其副本.

**预设为 `dist` 没有空出** (a11ign/a11ign#3580) (中文(简体) ) `output.cleanDistPath: false`. Rslib 的默认空格 `dist` 在每座建筑之前,还有.. `prepack` 当任何东西都打包时运行一个, 所以另一个进程读取 `dist` (同一套间中的测试文件)发现一个已建文件缺失,因为该建筑的长度:239,434中的5,735个(2.4%)读于一个套间的一个构件中,0个(约70万个)随它关闭(测量为2026-10-06). 软件包没有设置在它自己的 `rslib.config`。一个建筑覆盖,所以一个被删除的条目的旧文件留在本地后面;一个出版物是从一个干净的检出中创建的.

## 这个 `.mjs` 鼠标

计数 `.js`编号 :`.mjs`编号 :`.cjs` 源文件只能下行( ADR 0043: source is `.ts`· ; `.mjs` 为构建输出)。 一个仓库承诺 `mjs-ratchet.baseline.json` 并添加 一个测试它的现有 `test` 命令已经运行,所以没有触及工作流程文件 :

```ts
import { test } from "node:test";
import assert from "node:assert/strict";
import { fileURLToPath } from "node:url";
import { checkMjsRatchet } from "@a11ign/toolchain/mjs-ratchet";

test("the .mjs count only goes down", () => {
  const result = checkMjsRatchet({ from: fileURLToPath(import.meta.url) });
  assert.ok(result.ok, result.message);
});
```

`from` 是测试文件( 或根下的任何目录) : 基线通过走到 `mjs-ratchet.baseline.json`,所以移动测试不会编辑任何内容,并且有一个存储器 `.git` 并且没有基线抛出 而不是借用其父母的.

**构建输出** 是一个常数, `BUILD_OUTPUT_DEFINITION`检查失败时打印:文件结束 `.js`, (中文(简体) ), `.mjs` 或者说 `.cjs` 是源代码,除非其目录部分之一是准确的 `dist`, (中文(简体) ), `build`, (中文(简体) ), `node_modules` 或者说 `generated`。 。 。 . 测试计数(a) `.test.mjs` 源代码); a `.d.ts` 不是一个 `.js`。文件来自 `git ls-files` (有轨电车,加上无轨电车,没有被忽略) `.git`,除此之外,从目录的行走中,有相同的排除,所以 检查在一次结帐和在另一个项目下提出的副本中读取同样内容。 没有文件但基线为RED的树,从不计为0.

```json
{ "files": ["eslint.config.ts", "release.mjs"], "exceptions": [{ "path": ".pnpmfile.cjs", "why": "pnpm reads only this name" }] }
```

-   `files` 是数集 **碱性名称**,所以一个布局动作不会编辑它。 缺少或比列出的更频繁显示的基名失败并命名文件 . **一滴通行证** 并说基线可以降低.
-   `exceptions` 是一个只读取此名的文件。 无条目 `why` 失败, 指定树不再持有的路径的条目也会失败( 因此允许时间不能超过文件 ) 。 例外情况不计算在内.
-   零点, `files` 实值 `[]` 财务报告和审定财务报表 **任意** 此类文件失败:没有长期津贴,但有指定的例外.
-   `writeLoweredBaseline({ from })` 将基线重写为树现在所持有的 **抛出而不是提起** 这个 一个寄存器作为脚本添加,例如. `"mjs-ratchet:lower": "tsx -e \"import { writeLoweredBaseline } from '@a11ign/toolchain/mjs-ratchet'; console.log(writeLoweredBaseline({ from: process.cwd() }))\""`; 此仓库是 `pnpm run mjs-ratchet:lower`。 。 。 .

## 版式检查

一个单包寄存器在ROOT(一个ROEADME,一个 `package.json`,没有工作空间文件;多包寄存器仅当它存在时才存在 **发表** 多个包,每个目录以其包命名(ADR 0043,决定7). 检查失败了 准确的四样东西和指纹 和路径:

| 检查 | 失败 |
| --- | --- |
| `workspace-of-one` | (单位:千美元) `pnpm-workspace.yaml` (或 `workspaces` 字段),其成员为一包,在文件命名时计出根. 一个私人 `*-workspace` root 是一个 shell, 而不是一个软件包, 一个私人成员除了一个已公布的软件包之外, 也不会成为一个多软件包寄存器 |
| `directory-name` | 工作空间成员,其目录在范围之后不是其软件包名称的一部分(`packages/pdf` 持有 `@a11ign/documents`(中文(简体) ) |
| `second-readme` | 根读取器和 `<member>/README.md` 用于一个包(相同名称,或一个贝壳根在单个成员之上)。 在子目录中读取一个文件, 从未读取 |
| `leftover` | (单位:千美元) `lerna.json`,或个人 `*-workspace` 根号 `package.json` 保存的软件包少于两个 |

**消费者的一行 `ci.yml` 运行** (离职) `0` 干净, `1` 排版失败, `2` 无法读取; 空树是 `2`从来没有过:

```yaml
- run: npx --yes --package @a11ign/toolchain layout-check
```

它在没有旗帜的冷 Npm 缓存上解决: `typescript` 是一个可选择的对等方,它承认 `^6.0.3 || ^7.0.0`,因为 `@rslib/core` 同行 `^5 || ^6 || ^7` 和npm采取最新的,所以一个 `^6.0.3` 端点已创建 `npx` 1号出口 `ERESOLVE` 从0.2.0到0.3.0 (中文(简体) )`scripts/npx-one-liner.test.ts` 将两者放在一起。 随着包安装, `pnpm exec layout-check [directory]` 一样 目录默认为工作目录, 并随 `git ls-files` 在工作树上,或者散步, 都忽略了 `node_modules`失败的内容如下:

```
layout-check: FAIL [directory-name] packages/pdf: packages/pdf holds @a11ign/documents, so its directory should be named "documents", not "pdf"
```

从代码, `checkLayout({ root })` 财务报告和审定财务报表 `checkLayoutTree({ "path": "text" })` (树种列表,只包含文字 `package.json`, (中文(简体) ), `pnpm-workspace.yaml` 财务报告和审定财务报表 `lerna.json`返回时 `{ ok, problems: [{ check, path, message }], message, fileCount }`。 。 。 . 它不读 `lerna.json`属于自己的 `packages` 作为工作空间,它尚未将README句读作声明离境的备抵(ADR 0043).

## 边界检查

`@a11ign/toolchain` 每个寄存器消耗的就是它,所以它是一个寄存器学习它能到达 ANORE 寄存器的地方(epic a11ign/a11ign#4425, 第2阶段). **单行** 给消费者的 `ci.yml`数字 :

```yaml
- run: npx --yes --package @a11ign/toolchain boundary-check --root=.
```

它列表, 并且从不失败其列表的构建 : 退出代码是 `0` 无论发现什么 `2` 只有在树或基线无法读取或树为EMPTY时(一棵空树从来不是干净的报告). 它会用文件、行和到达的路径打印出每行一行 `--out=<file>` 还撰写了JSON报告. 三种类型:

| 类型 | 这是什么 |
| --- | --- |
| `cross-repo-import` | 相对导入或 `require` 从寄存器根上爬出,或者在包目录中降落 `package.json` 不声明 |
| `tool-path` | 环境工具目录(包含 `TOOL`+) 加上 (中文(简体) ) `/src/`,或一个 `toolPath`编号 :`toolModule`编号 :`toolUrl`编号 :`toolRoot` 调用 |
| `laid-source` | 将另一个存储器的来源设置为: 一个跟踪 `layers.json` 声明,或 `.gitignore` 输入脚本、工作流程或显示的行复制件或克隆件 |

`--baseline=<json>` (单位:千美元)`[{ "from": "<file>", "to": "<reached path>" }]`标记匹配的交叉 `ACCEPTED` ,并列出一条与无匹配的行 `STALE`因此,基线只能缩小。 从代码, `checkBoundary({ root, baseline })` 财务报告和审定财务报表 `checkBoundaryTree({ "path": "text" }, baseline)` 返回时 `{ readable, crossings: [{ kind, file, line, to, message, status }], stale, message, fileCount }`。 。 。 .

## JS-TS转换

JSDoc源通过脚本成为了TypeScript,而代理只将脚本报告为残片的内容固定下来(ADR 0043). **单行** (从寄存器根运行它;它需要 `typescript` 6.x在存储器中,它从那里加载,因为 `npx` 不安装可选对等点;没有,则退出 `2` 名称 `npm install --save-dev typescript@^6.0.3`:

```
npx --yes --package @a11ign/toolchain js-to-ts [directory] [--exclude <path>]... [--dry-run] [--json]
```

它重命名每个 `.mjs`编号 :`.cjs`编号 :`.js` 外部来源 `node_modules`, (中文(简体) ), `dist` 财务报告和审定财务报表 `build` 改为 `.ts` (单位:千美元)`git mv`,因此历史如下),应用类型脚本 `annotateWithTypeFromJSDoc` 固定每个( 可选) `@param {T} [x]` 变成 `x?: T`),将每个将重新命名的文件命名为新名的路径重写(导入变为 `./x.ts`),运行存储器本身 `tsc --noEmit`并打印 **残留**: 每一个文件仍然失败,有错误代码和计数. 选择结束 `ts-migrate`,写着 `x: any` 对于每个参数,项目类型检查和类型都消失了(在源头中测量了2026-10-09).

-   `--exclude <path>` (可重复;文件或目录) 让它单独列出并列为跳过:通过路径将其用于一个已部署的单位或Ansible任务名的文件.
-   `--dry-run` 写什么 说它会重命名.
-   已编辑的文件 OEDSIDE 转换的集被打印:它们是拉请求的 `Outside-Region:` 线条。 它没有重写一个引用( 一个空名, 可能是另一个文件, 一个模板文字中的路径, a) `CHANGELOG`)为印也.
-   第二次运行不会改变任何东西,报告同样的残留物。 退出 `0` 干净, `1` 残留物, `2` 无法读取任何内容或错误的标记; 空树是 `2`从来没有通过.
-   TypeScript 7没有JavaScript API(a11ign/a11ign#3729),因此在其下命令以该句拒绝. A 类 `@typedef` 或未类型参数不转换;它是残留物(`TS2304`, (中文(简体) ), `TS7006`) (中文(简体) ).

## 依赖性更新

每个仓库的 `.github/dependabot.yml` 是这个软件包的 OUPUT (A11-253, under A11-251) , 所以Deptabot 询问的都是相同的, 文件不能被忽略 .

```
pnpm exec dependabot-config --write [--root <dir>]   # writes <root>/.github/dependabot.yml
pnpm exec dependabot-config --check [--root <dir>]   # exit 0 in step, 1 drift or a missing file (prints the diff and the --write command), 2 unreadable
```

**每个生态系统都得到什么**,而一个寄存器不能更改 : 每周一 UTC凌晨5点23分(不计时,因为小时是 GitHub 队列上每个预定的工作时); One group, `<ecosystem>-minor-and-patch`,对于补丁和小的更新,所以一个主要的匹配无组,也是自己的拉出请求; `commit-message.prefix: deps`· ; `cooldown.default-days: 7`· ; `open-pull-requests-limit: 10`;没有 `labels:`,因此适用 `dependencies` 和生态系统本身的标签`javascript`, (中文(简体) ), `github_actions`, (中文(简体) ), `python`并创造它们。 生态系统从树上读取: `npm` 时间 `/` 当根 `package.json` 已存在, `pip` 用于每个持有 a 的目录 `requirements*.txt` 或者说 `pyproject.toml` (不低于 `fixtures`, (中文(简体) ), `*.fixtures` 或虚拟环境), `github-actions` 时间 `/` 何时 `.github/workflows/` 持有一个文件,加上每个本地复合动作的目录(`.github/actions/<name>/action.yml`)),因为Deptabot读取了本地行动 `uses:` 只有当它的目录被命名时,它们才被命名 `directories:` 一个条目。 文件没有工具链版本,所以一个工具链的放出只有在模板完成时才会改变.

**时间 `ignore` 列表** 实值 `FROZEN` (单位:千美元)`@a11ign/toolchain/dependabot-frozen`:其版本政策被冻结的软件包,每个软件包都有它的理由,然后是工作空间自己的软件包和根的软件包,然后是寄存器的额外软件包. 名字一度出现. 要冻结一个软件包,请添加到 `FROZEN` 并释放:下一个 `--write` 随身携带 当控制测试失败时 `layers.*.package` 联 合 国 `deploy-pins.json` 没有在 `FROZEN`; NVDA 选择(`@guidepup/guidepup`, (中文(简体) ), `@guidepup/setup`)不作为包名写在该表,因此其理由在 `FROZEN` 换句话说.

**额外** 为: `.github/dependabot-extra.json`以生态系统为指针 仅供存放处单独拥有 任何其它的密钥都会被拒绝, 因此任何寄存器都无法选择退出日程, 组或冻结 :

```json
{
  "npm": { "directories": ["/", "/ui"], "versioning-strategy": "increase", "ignore": [{ "name": "serve", "reason": "one line: why this repository must not take it" }] },
  "github-actions": { "ignore": [{ "name": "a11ign/a11ign", "reason": "its pin is written by a generator" }] },
  "pip": { "ignore": [] }
}
```

`directories` 财务报告和审定财务报表 `versioning-strategy` 这是Npm的。 多个目录为 `directories:` 在一个条目中,所以一个组拉请求覆盖它们.

**消费者的经营**: 自己测试中的支票或 `ci.yml`,从它安装的工具链版本。 当发布修改了模板时,工具链凸起会失败检查直到 `--write` 重生文件; 任何其他软件包的普通通接点.

**A11-254和A11-255公约依赖**,导出于 `@a11ign/toolchain/dependabot-config` (单位:千美元)`DEPENDABOT_GROUP_SUFFIX = "-minor-and-patch"`, (中文(简体) ), `DEPENDABOT_COMMIT_PREFIX = "deps"`, (中文(简体) ), `dependabotGroupName(ecosystem)`:

-   来文人 `dependabot[bot]`· ;
-   标题开始 `deps:`。依附bot 将下一个单词写成 `bump` 在一些储存库和 `Bump` 在别的地方,无论情况如何,都要加以配合;
-   组拉请求名称 `<ecosystem>-minor-and-patch` 标题和分支 `dependabot/fetch-metadata` 报告为: `dependency-group`· ;
-   没有团体的拉动请求是主要动作,或非模拟动作sha动作;
-   标签是 Dependabot 的默认: `dependencies` 加上生态系统的.

### 补丁、小和动作更新核准并排队(A11-254)

`--write` 还写 `.github/workflows/dependabot-auto.yml`,以及 `--check` 失败了,当它漂移。 每个寄存器中的文件都是一样的. 拖拉请求已经由 `auto-arm.yml`不过 `merge-queue-main` 想要一个批准审查 却一无所获 所以他们等了一个人 现在它们合并起来的时候 `gate` 绿色的,没有人,也没有代理。 它有三个工作:

-   **`approve`** (单位:千美元)`pull_request_target`;只有在演员和作者是 `dependabot[bot]`,基础是 `main` 头颅在仓库里。 它读到更新与 `dependabot/fetch-metadata`被SHA绑住 它批准,作为Octo STS App,当更新类型是 `semver-patch` 或者说 `semver-minor` (一组中最高的),或更新为无类型(SHA move)的 GitHub Actions ,拉请求上的每个承诺都是由 `dependabot[bot]`,由它或GitHub所犯,并核实。 一个主要, npm 或 Action, 从未被批准: 它说明了为什么在一个 `::notice::`。审查机构携带 `<!-- dependabot-auto:approve -->`它在批准之后再次读出承诺,如果一项不依附人的承诺同时到达,则收回批准。 然后它就派遣 `auto-arm.yml`是因为 `arm-approved`,用于牵引请求(因此) `--check` 失败当 `auto-arm.yml` 没有 `arm-approved` 任务.
-   **`withdraw`** (单位:千美元)`pull_request_target`, (中文(简体) ), `synchronize`除了Depabot以外,任何人的拉拉请求. `main` 所以当对分公司的承诺不取决于是否 工作驳回这个工作流程本身的批准: `octo-sts[bot]` 上面有标记 另一位评论家的检讨从未被触及.
-   **`red`** (单位:千美元)`workflow_run` 联 合 国 `ci`,失败,因为一个Depabot分支 `pull_request` 运行或合并队列条目)。 它会读取每个失败的任务日志,并保留命名失败的行(agent-org's) `ERROR_LINE` 无 `NOT_THE_FAILURE`,最后30个). 每一个被读取为基础设施的失败任务(丢失的跑者、费率限制或网络出错,没有失败的断言) `pull_request` 运行重运行一次( r)`gh run rerun --failed`) (中文(简体) ). 其它任何内容都会被评论到拉出请求:失败的工作,他们的日志链接和他们在被栅栏的块中的错误行,作为数据,在一个标记下(`<!-- dependabot-auto:red <head-sha> <run-id>/<attempt> -->`所以跑步从未被评论过两次。 将一个保持红色或少校的团体变成一票是董事会的(A11-255).

**身份不能通过两面墙来认可.** 保险薄荷只用于 `main`是因为 `dependabot-auto.yml` 开始于 `dependabot[bot]`,工作流程只批准什么 `approve` 决定。 每个寄存器手写两个Octo STS政策,因为 `sub` 携带寄存器不可改变的 id (`gh api repos/a11ign/<repo> --jq .id`; 拥有者是 `320310787`它不在树上. `--check` 既读又失败,指定文件和字段,除非:

-   `.github/chainguard/dependabot-approve.sts.yaml`数字 : `subject: repo:a11ign@320310787/<repo>@<id>:pull_request`· ; `job_workflow_ref: a11ign/<repo>/\.github/workflows/dependabot-auto\.yml@refs/heads/main`· ; `event_name: pull_request_target`· ; `actor_id: "49699333"` (dependabot\[bot\]'s id) 和 (d `actor: dependabot\[bot\]`; 权限 `pull_requests: write`。 。 。 .
-   `.github/chainguard/dependabot-guard.sts.yaml`数字 : `subject_pattern: repo:a11ign@320310787/<repo>@<id>:(pull_request|ref:refs/heads/main)` 联合国 `workflow_run` 呈现 `main` (参见) `job_workflow_ref`· ; `event_name: pull_request_target|workflow_run`; 权限 `pull_requests: write` 财务报告和审定财务报表 `actions: write`。它排队、撤回、重运行和评论,不能审查.
-   并没有任何其他工作流程 `.github/workflows/` 提交批准审查(`--approve`, (中文(简体) ), `APPROVE`, (中文(简体) ), `-a` 打开 `gh pr review`)或薄荷 `dependabot-approve`。 。 。 .

如果批准为: `REVIEW_REQUIRED` 没有 `APPROVED`, App的审查没有根据规则计算: 批准划痕 Depabot 拖拉请求, 读取 `reviewDecision`,并添加 `contents: read` 核准政策 `--check`只有在这样才算数时,才会有预期权限 .

## 类型脚本基础

```json
{ "extends": "@a11ign/toolchain/tsconfig.base.json" }
```

`strict`,节点Next, `declaration`· ; `declarationMap` 财务报告和审定财务报表 `sourceMap` 关闭用于发布软件包;无 `composite`, (中文(简体) ), `outDir` 或者说 `rootDir`。 。 。 .

## 叶相助者( 二`./lib/<stem>`(中文(简体) )

十个没有本地导入的帮助者, 发布后一个寄存器可以在一个声明的版本取取, 而不是复制( pic a11ign/ a11ign# 4425, 第 3阶段): `cli-flags`, (中文(简体) ), `fixture-symbols`, (中文(简体) ), `git-env`, (中文(简体) ), `npm-cli-executable`, (中文(简体) ), `product-home`, (中文(简体) ), `sandbox-exhaustion`, (中文(简体) ), `source-text`, (中文(简体) ), `walk-scope-declaration`, (中文(简体) ), `walk-scope-discovery` 财务报告和审定财务报表 `worktree-resolution`,每个在 `@a11ign/toolchain/lib/<stem>`。它们从a11ign/a11ign移动,而不是重写:代码是 唯一编辑的 是用旧的套件命名一个兄弟的两道进口`walk-scope-declaration` 读取 `./source-text.ts`) (中文(简体) ). 四次试验: `worktree-resolution` 因为他们锻炼出一分一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫一毫去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去不去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去; `source-text`普通文件控件 读取此软件包 `scripts/release-per-merge.ts` 而不是核心的 `verify.ts`。 。 。 . `product-home` 读取其默认寄存器根 安装,所以消费者通行证 `repoRoot`在核心删除其正本之前,有两个来源.

7再导入这10个,并以同样的方式公布(第3阶段,第2行): `changed-files`, (中文(简体) ), `changed-packages`, (中文(简体) ), `git-sandbox`, (中文(简体) ), `local-import-closure`, (中文(简体) ), `test-memory-cap`, (中文(简体) ), `tree-wide-guard` 财务报告和审定财务报表 `walk-scope`,与 `changed-packages`测试。 原始内容 `../../../scripts/`,复制名称 它的兄弟姐妹在 `src/lib/` (单位:千美元)`./cli-flags.ts`, (中文(简体) ), `./npm-cli-executable.ts`, (中文(简体) ), `./git-env.ts`) (中文(简体) ). `changed-packages` 财务报告和审定财务报表 `walk-scope` 读取寄存器根 从他们坐的地方(现在) `../../`,这个软件包的根在源中),所以一个已建文件的消费者从它所安装的根来工作. `walk-scope` 携带自己的小 `knownPackages`因为核心是 `ci-changed` 尚未公布(a11ign/a11ign#4587).

后两作以同样方式(相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相 `isolation-gate` 财务报告和审定财务报表 `ci-changed`。 。 。 . `ci-changed` 名称 `changed-files`, (中文(简体) ), `changed-packages`, (中文(简体) ), `cli-flags`, (中文(简体) ), `git-env` 财务报告和审定财务报表 `isolation-gate` 作为兄弟姐妹 `src/lib/`。 。 。 . `isolation-gate` 读取寄存器根( 现在) `../../`,此软件包的根在源),并查找 `packages/` 在它下面,所以一个消费者 建立的文件运行它与根它 安装在下面. `ci-changed` 除非给出,否则要读取工作目录 `--repo`。 。 。 . `ci-changed`'自己的测试留在了核心:它读取了核心的工作流程.

## 构建和检查此套件

所有东西都来自寄存器根(`pnpm install` (第一编) 软件包是寄存器: 1 `package.json`,一个 README(这个,也是 npm 页面),没有工作空间文件.

| 命令 | 它会做什么 |
| --- | --- |
| `pnpm run build` | `rslib build`页:1 `.mjs` 和一个 `.d.ts` 百分比 `exports` 键入 `dist`。其配置进口 `./src/rslib-presets.ts` 由相对路径, 从来没有自己的 `dist`,所以它从一个新的克隆. |
| `pnpm run typecheck` | `tsc --noEmit` (单位:千美元)`tsconfig.json`超过每个 `.ts` 包含测试; 声明 Rslib 发送来自 `tsconfig.build.json`,将测试排除在外(首先构建:存储器本身) `rstest.config.ts` 导入已建套件. |
| `pnpm run lint` | ESLint,"清洁码"限制. |
| `pnpm test` | `rstest run` 使用此寄存器的配置, 即 `defineToolchainConfig` 从BUILT包. |
| `pnpm run consumer-check` | 将焦油球打包,安装到空项目中, 每件导入 `exports` 指定者,运行一个消费者 `tsc` 与 `skipLibCheck` 虚假,并运行 `rstest run` 测试项目,必须打印 `VERDICT pass`。 。 。 . `pnpm exec tsx scripts/clean-consumer.ts @a11ign/toolchain@<version>` 对已出版的版本也这样做. |

线人需要工作, `gate`,运行全部五并发布 `layout-check` 在这个寄存器的自有树上。 释放是更改器( E)`pnpm exec changeset`页:1 **版本软件包** 拉动请求 `release.yml` 打开 与 npm 信任的出版(OIDC) 和出处合并: 任何地方都无法存储任何符号.

```
src/                  the package: one module per `exports` key, each beside its test
scripts/              release-per-merge.ts (what a push to main means for the release), clean-consumer.ts (the installed-package check)
rstest.config.ts      this repository's own test config, a call into the built package
```

包的历史始于 `a11ign/a11ign` (# 3578);其较早寿命为 `scripts/rstest/` 呆在这里。 问题取消;工作在 `a11ign/a11ign`。 。 。 .

## 许可证

`Apache-2.0`。测试和构建配置,每个仓库的进口都不得将复制左侧条款传给进口商.

## 常见问题

### @a11ign/toolchain 是什么？

一个测试和构建工具链每个a11ign寄存器共享:rstest config\(node:test shim,运行记录,判定行\),Rslib预设,以及TypeScript基础\.

### 如何安装 @a11ign/toolchain？

在项目目录运行 npm install @a11ign/toolchain，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@rstest/core（^0\.12\.3）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。它还提供命令行工具 js-to-ts、layout-check、boundary-check、dependabot-config，可以用 npx js-to-ts 直接运行。

### @a11ign/toolchain 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @a11ign/toolchain 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @a11ign/toolchain 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=22\.15\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @a11ign/toolchain 可以商用吗？

@a11ign/toolchain 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @a11ign/toolchain 的下载量有多少？

根据 npm 官方下载统计，@a11ign/toolchain 在 2026/10/05 – 2026/11/03 这 30 天内被下载 39,684 次，日均约 1,323 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @a11ign/toolchain 还在维护吗？

最新版本 0\.15\.0 发布于 2026/10/30（8 天前）；至今共发布 30 个版本，其中过去 12 个月发布了 30 个；首次发布于 2026/10/05。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

