Uh oh!
There was an error while loading. Please reload this page.
docs(plugin-gantt): README 按真实导出面重写虚构的手动注册与 GanttSchema 类型 - #5059
Merged
Conversation
`packages/plugin-gantt/README.md` 两处教了包里不存在的标识符,一处教了与真 类型不符的形状。三处都按包的真实导出面重写(导出名集合取自构建产物 `dist/index.d.ts`,示例逐块对同一构建产物编译验证)。 - `ganttComponents`:全包零命中,所谓「手动注册」是 `Object.entries(undefined)`,照抄第一行即 TypeError。注册只是 import 入口的 副作用。改教真实机制:两个 register 调用认领的 schema 类型 (`object-gantt` / `gantt`,各带命名空间键与裸 type 回落)、包的真实导出面, 以及原片段真正想做的事 —— 把导出的 `ObjectGanttRenderer` 注册到自定义键。 - `GanttSchema`:纯虚构(本包与 `@object-ui/types` 加词边界后都零命中;裸 grep 的命中全是 `ObjectGanttSchema` 的子串)。真身存在,故按真身重写而非删 节:`@object-ui/types` 的 `ObjectGanttSchema`,记录驱动,不携带 tasks 数组。 - `GanttTask`:三者中唯一的真名,但文档形状已漂移 —— 标签字段是 `title` 非 `name`,`start`/`end` 是 `Date` 非 ISO 字符串,`color` 是 CSS 颜色非 Tailwind 类名。参考块与示例双双对齐,并在探针里双向钉住,后续漂移会转红而不是作为 无关的本地声明静默编译通过。 ⛔ 未新增任何导出或类型来把 README 变真。 Fixes#5012 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
commented
Aug 17, 2026
CollaboratorAuthor
PM 验收:ACCEPT(session 实物核验:merge-base 验收要点:
派生物分诊(本评论即记录):#5057(README 整片 schema 键面渲染器一个不读,照抄任一示例得空图 —— 比本单更重的文档真值缺陷)与 #5058(onTaskUpdate 可选性断言错误)均 → 转 ready 并挂 auto-merge(squash)。 Generated by Claude Code |
yinlianghui
marked this pull request as ready for review
August 17, 2026 21:43
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 17, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#5012
基线
origin/main@f331f5a8bdb728039519ace070f6433f597e0dd4(worktree 显式建在该 sha 上)。方法学照抄同族 #5002 → PR #5021 的减法形,以及今日已落地的 #5010 → PR #5046、#5016 → PR #5053。判定表(虚构 vs 改名 vs 真名)
卡面列了两处,名集合核对与示例编译又在同一段里揪出第三处 —— 同为「README 对本包某个标识符的断言不成立」,一并修,单列如下。
:108import { ganttComponents }+:112Object.entries(ganttComponents).forEach(…):407import type { GanttSchema }、:418const gantt: GanttSchema@object-ui/types皆零命中;裸 grep 的 6 处命中全是ObjectGanttSchema的子串(卡面复核命令写的是裸 grep,故复测时特意补了词边界)ObjectGanttSchemafrom@object-ui/types:138-147interface GanttTask { name; start: string; … }src/GanttView.tsx:139:title非name、Date非 ISO 字符串、color是 CSS 颜色(GanttView.tsx:4319直接塞内联backgroundColor)非 Tailwind 类名:407GanttTask(导入本身)第三处不是夹带:
:407的示例const task: GanttTask = { name: …, start: '2024-01-01' }用的正是这个真类型,不改它示例就编译不过;而只改示例、留着 14 行外的参考块继续教假形状,同一个 README 会自相矛盾。⛔ 未新增任何导出或类型来把 README 变真(契约扩张需另立卡)。
删掉的每一节,删因一行
### Manual Registration整节(改前:105-115) —— 它教的ganttComponents不存在,Object.entries(undefined)在读者复制的第一行就抛 TypeError;而它想表达的「注册」根本不需要手动做,是 import 入口的副作用。替换为三节真话:两个register调用认领的 schema 类型表(object-gantt→plugin-gantt:object-gantt、gantt→view:gantt,各带裸type回落 —— 见packages/core/src/registry/Registry.ts:195,226)、包的真实导出面、以及原片段真正想做的事(把导出的ObjectGanttRenderer注册到自定义键)。const gantt: GanttSchema = { type: 'gantt', viewMode, tasks }(改前:418-422) —— 类型名虚构,且形状也不成立:真身ObjectGanttSchema是记录驱动的(type: 'object-gantt'+objectName+*Field),从不携带 tasks 数组。GanttTask参考块的assignee?: string(改前:145) —— 真身上没有这个字段。名集合核对读数
导出名集合取自构建产物
packages/plugin-gantt/dist/index.d.ts,走 TS compiler API 的checker.getExportsOfModule(不是对 src 做正则)。README 侧不用正则抓 import:先抽 fenced 代码块,每块ts.createSourceFile,再走ImportDeclaration的 AST。这样 #5043 记的两个坑在结构上不可能发生 —— 多行块本就是一个
ImportDeclaration节点(fence/散文吃不进 import clause);行尾//注释对 parser 是 trivia(不可能贡献名字);A as B的 AST 直接给出propertyName = A(导出名)与name = B(别名),判 A。第一版确实照卡面规格写了跨行正则,在本包上直接报 5 个假名(
weeks/title/selection/target/dataSource)而真正的两个虚构名一个没报:副作用导入import '@object-ui/plugin-gantt';无from,懒惰量词从它一路吃到 20 行之后的下一个from '@object-ui/plugin-gantt',把中间整段 markdown 当成了 import clause。已把这条读数与 AST 版规格写在 #5043 上(不另立卡)。改后 39 个绑定逐个 OK,覆盖新增的两个多行 import 块全部 35 个导出名。
编译探针读数
README 的 ts/tsx 块抄进 scratch,对同一构建产物
dist/index.d.ts编译(strict: true,没有为让块通过而放松任何选项)。每块独立成文件并补一行export {};—— 多个块各自声明const schema都是全局 script,会撞重复标识符;补这一行只改作用域,不影响块内检查。余下这两条不是本 PR 的漏修:block07 是 "Interactive Gantt" 示例里
onTaskClick: (task) => …写在无类型标注的const schema = { … }里,属那一族虚构 schema 键的一部分,已立 #5057。按纪律不在本卡里顺手改。跳过的两块(输出里列明,不静默丢):
:191-199裸{ type, tasks: …, … }形状速写、:449-454裸dependencies: [ … ]片段 —— 都是故意不合法的 TS。GanttTask参考块额外双向钉在真身上,否则它绿得没有意义(独立的interface GanttTask { … }只是个与真类型无关的本地声明,内容再假也编译通过):散文里唯一一条探针覆盖不到的断言(「
gantt块挂在ListViewSchema上、类型是GanttConfig」)另写了一个小探针单独验:rc=0。反向验证(两条,预判先写)
(a) 名集合核对自证。 预判:往多行 import 块里 planted 四处,
MISSING COUNT0 → 2,恰为{ganttThings, GanttSchema};还原后回 0。四条全符 ——// ganttComponents was never real)ganttThings as ThingsganttThings而非别名ganttThings@:143GanttTask→GanttTask as TaskGanttSchema:156MISSING COUNT: 2,还原读数0。变异全做在 README 的 scratch 副本上(检查器加了一个--readme参数指向该副本),工作树一次都没被改过 —— 不存在「临时改动误入 commit」的窗口。(b) 示例编译自证。 预判:把改前 README 回填,tsc 必须转红,且错误一一对应所改各处。同一套探针机器直接跑改前 README(harness/skip 按内容签名分类而非块序号,所以两个版本共用一套机器)。转红,
rc=2,对应关系:ganttComponentsblock02(1,10): TS2305 … has no exported member 'ganttComponents'GanttSchemablock14(1,15): TS2305 … has no exported member 'GanttSchema'GanttTask形状(real → doc)block04(13,14): TS2741 Property 'name' is missing in type '…GanttTask' but required in type 'GanttTask'GanttTask形状(doc → real)block04(15,14): TS2741 Property 'title' is missing in type 'GanttTask' but required in type '…GanttTask'block14(6,3)/block14(7,3): TS2322 Type 'string' is not assignable to type 'Date'block06(4,17)/block06(8,18)(改后为 block07)预判不符的一处,如实记:我同时预判改前的
const task: GanttTask = { name: …, start: '…' }会在name/title上报错,实测那一块只报了两条日期TS2322—— present 属性的类型不符会抢在 missing-property 详述之前短路。也就是说name/title这个事实只由 (b) 表里的 pin 块承载,typed-example 那一侧靠不住。这正是双向 pin 值得写下来的理由;若只抽 typed example 不做 pin,键名重命名这一整类会整体漏掉。此点已一并记在 #5043。另有一处探针 harness 的诚实修正:
:66-73的< GanttView onTaskUpdate >块,harness 初版把save声明成要求必填Date,块就红了两条。但真实签名第二参是Partial包Pick,start/end本就是Date | undefined—— 那两条红测的是我的假设,不是这个块。harness 已改为中性(Partial),块随之转绿;README 那条「start/end are JS Date objects」的注释确实与签名和运行时都不符(GanttView.tsx:1335的进度拖拽提交纯{ progress },照抄会把日期写空),但那是散文断言的缺陷,应当由它自己的证据立卡,不该借探针红来主张 —— 已立 #5058。验证
pnpm exec turbo run type-check --concurrency=2→ 81 successful, 81 total(重活经flock串行 +--max-old-space-size=4096)。node scripts/check-doc-links.mjs→Links are valid across 13 scan roots.node scripts/check-control-bytes.mjs→OK (scanned 4505 tracked text file(s));改动两文件另做grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]'自扫,零命中。pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-gantt...' build→ rc=0(探针所依赖的构建产物)。docs-only 的 CI 形状:
ci.yml/lint.yml把**/*.md与.changeset/**列进paths-ignore,所以 Test / Type Check 各 job 的实质步骤会被 path-filter 短路成 skipped 而 job 报 success。按纪律计绿,但类型证据是上面的本地仓根读数,不是 CI 的(#5046 / #5053 先例)。顺手立的卡(均未认领,不夹带进本 PR)
同文件、不同性质,各自需要独立定级:
tasks/viewMode/object/nameField/startField/endField/fields全零命中;getDataConfig只读data/staticData/objectName)。照抄任一示例得空图。名集合核对看不见(这些块里没有 import),抽块编译也看不见(无类型标注的字面量)。:66-73的onTaskUpdate示例在进度拖拽时写入undefined日期;注释断言start/end必为Date,而签名是Partial、GanttView.tsx:1335提交纯{ progress }。名字与键全真,错的是可选性。changeset
.changeset/plugin-gantt-readme-truth-5012.md,@object-ui/plugin-gantt: patch,口径同 #5046 / #5053:无代码/类型/运行时改动,声明 patch 是因为README.md在包的files里,随下次发布到 npm。