Skip to content

packages/spec/scripts/** 在任何 tsconfig 的 include 之外:9 个 vitest 测试文件 + 全部构建/gate 脚本无类型检查覆盖 #5475

Description

@os-zhuang

#5286(spec 测试层进 tsc)的实施中发现,记录备查,未认领。基线 origin/main @ 01c0baef9

事实

packages/spec/tsconfig.jsoninclude["src/**/*"]tsconfig.test.json#5286 新增)同样只到 src。于是整个 packages/spec/scripts/** 不在该包任何 tsconfig 的 program 里——既不是「被 exclude 排除」,而是压根没被 include 选进来,所以连 check:type-check-coverageTESTS_COVERED 都数不到它(该不变式只统计 include 根之下的测试文件)。

这批文件不是死代码:

  • vitest.config.tsincludescripts/**/*.test.ts,共 9 个测试文件pnpm test 里真的跑;
  • 其余是 gen:schema / gen:openapi / check:liveness / check:strictness-ledger 等 20 多个 CI gate 脚本本体。

也就是说:这些脚本决定 spec 的生成物和多条 gate 的判定,却没有任何类型检查器读过它们。这正是 #4311 的缺陷类别,只是下沉了一层(#4311 关心「包级 tsc 覆盖」,#5286 关心「测试层被 exclude」,本单是第三种形态:根本不在 include 里)。

实测

scripts/**/* 并进 #5286tsconfig.test.json(需同时把继承来的 rootDir: "./src" 放宽到 ".",因为 scripts/src/ 之外)后:

16 个文件 / 33 条错误

分层:

数量 说明
config-tier TS5097 x13 .mts 后缀 import,需要 allowImportingTsExtensions
config-tier TS2593/TS2304 x2 scripts/build-schemas-check-mode.test.ts 用了全局 beforeEach/afterEach,需 vitest 类型
config-tier TS7016 x1 check-generated.ts import 仓库根的 .mjs 无声明文件
code-tier TS2339 x5 + TS7006 x1 scripts/build-schemas.ts:1208-1228 —— 一串 Property 'keys'/'rev' does not exist on type 'never',某个值被推成 never 后仍在被取属性
noise TS6133 x7 未使用的局部/导入(build-docs.ts x4、build-openapi.tsgenerate-sbom.ts
code-tier? TS7006 x1 check-liveness.mts:618 隐式 any 参数

按 AGENTS.md 已写下的纪律:先修 config 层再读残差,build-schemas.ts 那堆 never 才是真正要看的东西——而 build-schemas.tsgen:schema 的本体,spec 全部 JSON Schema 由它产出。

#5286 的边界

#5286 的 PR 明确把这块排除在外并在 tsconfig.test.json 的注释里写明了理由(不夹带 riders)。同时确认:scripts/**没有任何 @ts-expect-error,所以 #5286 新增的 PINS_CHECKED 不变式不受影响——这里藏的不是幽灵 pin,是没被检查的生成器。

建议方向(未定,交 triage)

  1. scripts/**/* 并入 tsconfig.test.jsonrootDir 放宽 + allowImportingTsExtensions + types 补 vitest),把 config-tier 一次修掉,code-tier 的 6 条按 @ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 的每文件台账 packages/spec/test-typecheck-debt.json 收口或直接修完;或
  2. scripts/ 单开一份 tsconfig,由 typecheck 脚本链一并指名(@ts-expect-error 退役 pin 在 packages/spec 里是幽灵检查:tsconfig 把 **/*.test.ts 排除出唯一的 tsc --noEmit #5286 改造后的 TESTS_COVERED 已经支持 sibling 配置被指名即算覆盖)。

两条路都会让 check:type-check-coverage 继续通过;差别只在 program 边界怎么切。

关联:#5286#4311、AGENTS.md「Build & Test」段的 typecheck 覆盖纪律。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions