Skip to content

@object-ui/fields 与 plugin-editor 的 build 程序把测试文件一起编译,73 个 *.test.d.ts 落进已发布的 dist/ #4006

Description

@yinlianghui

发现于 #3968 的实现(PR #4004,把 type-check 覆盖率判据换成"解析后的 tsconfig 程序读了哪些文件"时,顺手看到哪些包的 build 程序包含测试),不在该 PR 处理 —— 那张单子的范围是门的两个盲区 + examples/schema-catalog 接线。

事实

这两个包的 build tsconfig 里 include["src"],而没有任何测试排除:

  • packages/fields/tsconfig.json —— "include": ["src"],无 exclude;build 是 tsc && vite build
  • packages/plugin-editor/tsconfig.json —— "include": ["src"],无 exclude;build 是 vite build(dts 由插件产出,读同一个 include)

于是测试文件进了 emit 程序,声明文件被写进 dist/。本地一次 pnpm --filter ... build 之后实测:

$ find packages/fields/dist packages/plugin-editor/dist -name '*.test.d.ts' | wc -l
73

例如 packages/fields/dist/__tests__/DateCellRenderer.test.d.tspackages/fields/dist/standard-widgets.test.d.tspackages/plugin-editor/dist/index.test.d.ts。两个包都是 private=false,files 都含 dist —— 也就是说这 73 个文件是随包发布的。

为什么标 finding 而不是 pm:queue(诚实标注)

按"今天有没有用户面影响"判,几乎没有:没人 import dist/__tests__/*.d.ts,类型上也不造成错误。而且 @object-ui/fieldsfiles 本来就含 src,测试源码已经在发布内容里了 —— 所以这 73 个 .d.ts 只是增量,不是新暴露。所以我先打 finding

同时说明两点,分诊时请一并考虑:

  1. 这两个包在 scripts/check-type-check-coverage.mjs 里之所以算"测试已被编译",正是因为 build 程序读了测试。这个判定是真的(tsc --noEmit 确实检查了这些测试文件),只是它同时带来了没人想要的 emit —— 也就是"覆盖率对了,是靠一个副作用对的"。修法要小心:直接给 build 配置加 exclude: ["**/*.test.ts", "**/*.test.tsx"](其余 20 多个包的写法)会让这两个包失去 test type-check 覆盖,必须同时补 tsconfig.test.json 并从 type-check 串起来,否则门会立刻(正确地)报 5c。这是一次"两侧一起动"的改动,不是一行 exclude。
  2. 顺带记一笔,不确定是否有意:packages/fields/tsconfig.jsoncompilerOptions.rootDir".."(不是 "src"),这跟同组其它包不一致,我没有查它的来历,也没有动它。

复现

pnpm --filter @object-ui/fields build
find packages/fields/dist -name '*.test.d.ts' | wc -l     # 72
pnpm --filter @object-ui/plugin-editor build
find packages/plugin-editor/dist -name '*.test.d.ts'      # dist/index.test.d.ts

关联:#3968 / PR #4004(发现于此)、objectstack#4118(TEST_DEBT 总账)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions