@a11ign/toolchain

中文文档
0.15.0发布于 2026/10/30Apache-2.0TypeScriptES Module零依赖构建来源已验证近 30 天下载 4万

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

中文使用文档
文档目录12 节
  1. 测试配置
  2. Rslib 预设
  3. 这个 .mjs 鼠标
  4. 版式检查
  5. 边界检查
  6. JS-TS转换
  7. 依赖性更新
  8. 补丁、小和动作更新核准并排队(A11-254)
  9. 类型脚本基础
  10. 叶相助者( 二 ./lib/<stem> (中文(简体) )
  11. 构建和检查此套件
  12. 许可证

@a11ign/toolchain

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

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

测试配置

// 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 预设

// 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 命令已经运行,所以没有触及工作流程文件 :

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.

{ "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从来没有过:

- 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数字 :

- 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以生态系统为指针 仅供存放处单独拥有 任何其它的密钥都会被拒绝, 因此任何寄存器都无法选择退出日程, 组或冻结 :

{
  "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只有在这样才算数时,才会有预期权限 .

类型脚本基础

{ "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 buildrslib build页:1 .mjs 和一个 .d.ts 百分比 exports 键入 dist。其配置进口 ./src/rslib-presets.ts 由相对路径, 从来没有自己的 dist,所以它从一个新的克隆.
pnpm run typechecktsc --noEmit (单位:千美元)tsconfig.json超过每个 .ts 包含测试; 声明 Rslib 发送来自 tsconfig.build.json,将测试排除在外(首先构建:存储器本身) rstest.config.ts 导入已建套件.
pnpm run lintESLint,"清洁码"限制.
pnpm testrstest 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 共发布 30 个版本,首次发布于 2026/10/05;过去 12 个月发布了 30 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.15.0latest2026/10/308 天前
0.14.02026/10/2810 天前
0.13.02026/10/2513 天前
0.12.02026/10/2513 天前
0.11.02026/10/2513 天前
0.10.22026/10/1623 天前

其他发布通道:reserved → 0.0.0-reserved.0。

关于 @a11ign/toolchain 的常见问题

@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 和提交记录判断。