Skip to content

docs-gen: build-docs.ts 的路由解析规则没有能转红的单测 —— 唯一把关者是 CI 的 lychee #6539

Description

@os-project-manager

在实施 #6484(同目录裸路径)时顺带量出,非本单范围,按 Prime Directive #10 独立记录。⛔ 未自我认领、未打 pm:queue —— 观察类,今天没有用户会撞上。

观察

packages/spec/scripts/build-docs.ts 是一 import 就执行的顶层脚本(读 SCHEMA_DIR、写 content/docs/references/**process.exit)。因此它自己的函数无法被单测 import,packages/spec/scripts/*.test.ts 里没有一个文件测它。

这在 #6484 里被实测出来了,不是推断。该单给 sourcePathToDocsRoute() 补上了它文档里一直声明、实现却没做的一半 —— 「分类为真 ≠ 页面存在」。反向验证时把那一行判据删掉:

pnpm --filter @objectstack/spec test → Tests 57 passed (57) ← 全绿
pnpm --filter @objectstack/spec gen:docs → 产物里多出 4 条死链
identity/identity.mdx -> /docs/references/identity/auth
system/security-context.mdx -> /docs/references/system/audit
system/security-context.mdx -> /docs/references/system/compliance
system/security-context.mdx -> /docs/references/system/masking

即:删掉一条真判据,整个 pnpm test 一条都不红。#6484 的单测里有对应的 stand-in 用例,但那是在 lib/file-description.ts 那道缝上钉的,它自带一个模拟页面清单 —— 钉住的是「解析器返回 null 时回退成代码段」这条规则,不是build-docs.ts 里那份实现。

真正把关的是 CI 的 Check Documentation Links(lychee,--offline --root-dir content --fallback-extensions mdx,md,覆盖整个 content/**)。它确实会红,而且覆盖面比任何单测都宽 —— 所以这不是「没人管」,是「管的人离得远」:一条死链要等到全仓 MDX 链接检查那一步才报,而不是在改动那个函数的单测里。

为什么记为观察类而不是缺陷

若要处理,方向是现成的

仓库对这个问题已经有一条走过三次的路:把纯逻辑从生成器里抽成可 import 的一面,再对它写单测 ——

同样的手法适用于 sourcePathToDocsRoute / groupSchemasByPage / sourcePathFor 这组路由与归页逻辑:它们都是纯函数,依赖只有 CATEGORIESschemaIndex 和页面清单三样,注入即可。

⚠️不建议的做法:在 file-description.test.ts 里加一条「扫 content/docs/references/** 断言无死链」。那既与 lychee 重复,又会把单测绑到生成产物上;而如果 stand-in 的页面集合本身就取自那棵产物树,断言还会变成循环的。

未做的事

未自我认领,未打 pm:queue,不阻塞任何在飞项。是否值得排期留给分诊裁定 —— 按「创业期核心能力优先」的取向,这更像是等到下一次真的要动 build-docs.ts 的路由逻辑时顺手做的事,而不是独立立项的理由。


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions