Uh oh!
There was an error while loading. Please reload this page.
docs(plugin-form): README 按真实导出面重写虚构的手动注册与两个协议类型的导入路径 - #5079
Merged
Conversation
`packages/plugin-form/README.md` 有三处对本包导出面的断言不成立,导出名集合取自
构建产物 `dist/index.d.ts`(走 TS compiler API 的 checker.getExportsOfModule,
不是对 src 做正则),README 的每个 TypeScript 块对同一批构建产物 strict 编译验证。
- `:41` `formComponents`:纯虚构,且**改不成同族真名** —— 本包 51 个导出里没有任何
聚合组件表,所以 "Manual Registration" 整节描述的是一个不存在的机制,照抄拿到
`undefined`,`Object.entries(undefined)` 当场抛 TypeError。删该节,改教真实机制:
注册是 import 入口的副作用,六个 `ComponentRegistry.register(...)` 调用 claim 的是
`plugin-form:object-form` / `view:form` / `plugin-form:embeddable-form` /
`plugin-form:form-analytics` / `plugin-form:object-master-detail-form` /
`record:line_items`,其中两个 `skipFallback: true` 正是裸 `form` 与裸 `line_items`
没有被本包接管的原因;另列真实导出面,以及原片段真正想做的事(把已导出的组件注册
到自定义键)。
- `:408` `FormSchema` / `FormField`:名字是真的、包错了。两者都是协议类型,声明在
`@object-ui/types`(`src/form.ts:1055` / `:898`),本包只 import 不 re-export,
照 README 的路径导入是两条 TS2305。只改导入路径 —— ⛔ 未加 re-export,扩张公开面
是契约变更而非文档修正。
- `:156` `isRuntimeDefault`「(re-exported here)」:该谓词只由 `src/schemaDefaults.ts`
为包内自用而 re-export,从不出现在入口上,且本包只发布 `"."` 一个 export,所以
`import { isRuntimeDefault } from '@object-ui/plugin-form'` 同样是 TS2305。括注改成
re-export 的真实位置。
无代码/类型/运行时改动,diff 只有一个 README 与 changeset;声明 patch 是因为
`README.md` 在包的 `files` 里,随下次发布到 npm。
Fixes#5011
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 验收要点:
派生物分诊(本评论即记录):#5075(form README 键面:validation 静默失效 + 转 ready 并挂 auto-merge(squash)。 Generated by Claude Code |
yinlianghui
marked this pull request as ready for review
August 17, 2026 22:45
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 17, 2026
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#5011
基线
origin/main@e6cd3c26c9ee3c64d76b5e18ab8b41a4aaa09c97(worktree 显式建在该 sha 上)。方法学照抄同族已落地的四单:#5010 → PR #5046、#5016 → PR #5053、#5012 → PR #5059、#5015 → PR #5069。前提验证:卡面两条读数自己复测,都成立
卡面的复核命令写的是裸 grep,按 #5012 的教训补词边界重测,并按 #5010 的教训对零命中做邻近词反查:
formComponents全包零命中git grep -nw formComponents -- packages/plugin-form/src→ exit 1,无输出git grep -lnw ObjectForm -- packages/plugin-form/src→ 20 个文件FormSchema/FormField真身在@object-ui/typespackages/types/src/form.ts:1055/:898声明,src/index.ts:163/:156导出;本包只 import 不 re-exportpremise_still_valid: true。顺带记一个假信号来源,与 #5015 的DashboardSchema同形:裸 grepFormSchema还会命中packages/types/src/zod/form.zod.ts:452的 zod 同名 const,以及types/src/index.ts:1154的FormField as SpecFormField(spec 侧同名类型的别名再导出)。按导出面查而不是按名字查,这两个都不会误导判定。判定表
卡面列了两处,名集合核对与散文复核在同一节里揪出第三处 —— 同为「README 断言某标识符在本包导出面上」,一并修,单列如下。
:41import { formComponents }+:45Object.entries(formComponents).forEach(…):408import type { FormSchema, FormField }from 本包@object-ui/types;本包只 import 不 re-export:156散文「isRuntimeDefault…(re-exported here)」src/schemaDefaults.ts:78为包内自用 re-export;package.json的exports只有".",无深路径可绕第三处不是夹带:本 PR 新增的 "Public exports" 一节是权威的导出面清单,
isRuntimeDefault不在其中;留着「(re-exported here)」会让同一个 README 在相隔 90 行处自相矛盾(#5012 的同款理由)。⛔ 未新增任何导出或 re-export来把 README 变真 —— 扩张公开面是契约变更,需另立卡。⛔ 同包 src 一行未碰(#5049 在飞)。
删掉的每一节,删因一行
### Manual Registration整节(改前:38-48) —— 它教的formComponents不存在,读者复制的第一行就拿到undefined,Object.entries(undefined)当场抛 TypeError;而它想表达的「注册」根本不需要手动做,是 import 入口的副作用,没有可遍历的组件表。所以这一节不是「写错了」而是「描述了一个不存在的机制」,无法就地改对,只能删。ComponentRegistry.register(...)调用真正 claim 的 schema type 表,键从调用现场抄(src/index.tsx:100/159/211/232/276/356),并写明两个skipFallback: true正是裸form与裸line_items没被本包接管的原因(packages/core/src/registry/Registry.ts:194,224);② 真实导出面(51 个名字全列);③ 原片段真正想做的事 —— 把已导出的组件注册到自定义键,并如实注明本包自己注册的是内部 wrapper 而非这些导出组件(wrapper 先从SchemaRendererContext取dataSource,因为SchemaRenderer.tsx:617给注册组件传schema及其自身 props,从不传dataSource)。除此之外没有删任何一节。
名集合核对读数
导出名集合取自构建产物
dist/index.d.ts,走 TS compiler API 的checker.getExportsOfModule。README 侧不用正则抓 import:先抽 fenced 块,每块ts.createSourceFile,再走ImportDeclaration的 AST,A as B判propertyName(导出名)而非本地别名。#5043 记的两个坑因此在结构上不可能发生。改后 56 个绑定逐个 OK,其中 51 个覆盖新增的两个多行 import 块的全部导出名。
编译探针读数
README 的 ts/tsx 块抄进 scratch,对同一批构建产物编译(
strict: true,没有为让块通过而放松任何选项);块按内容签名分类而非块序号,所以改前改后共用一套机器。每块独立成文件并补一行export {};—— 多个块各自声明const schema都是全局 script,会撞重复标识符;补这一行只改作用域,不影响块内检查。三条 TS2305 全部消失;新增的两块(公共导出面、自定义键注册)编译 0 error。可编译块 8 → 9 是因为删了 1 块、加了 2 块。
跳过的五块(输出里列明,不静默丢):
Schema API的形状速写(fields: FormField[]是类型语法落在值位置)、两个remind_at: Field.datetime({ … }),的对象属性片段、以及fieldTabs/fieldPanes两块里defaultFieldTab?: 'basics'这种对象字面量里的可选属性语法 —— 都是故意不合法的 TS。散文断言另做小探针(不靠外推):
import { isRuntimeDefault } from '@object-ui/plugin-form'→error TS2305: … has no exported member 'isRuntimeDefault',这就是第三处判定的依据。反向验证(两条,预判先写)
(a) 名集合核对自证。 预判:往多行块里 planted,
MISSING COUNT0 → 2,恰为{formComponents, FormThings};别名判导出名;行尾注释里的非导出词不得报。四条全符 ——formComponentsformComponents@:82FormThings as ThingsFormThings而非别名ThingsFormThings@:114LineItemsPanel→LineItemsPanel as Panel// formComponentsMap was never realMISSING COUNT: 2,还原读数0。变异全做在 README 的 scratch 副本上(检查器的--readme指向副本),git status --porcelain全程只有本卡那一个M—— 不存在「临时改动误入 commit」的窗口。附带一提,committed 版本第 97 行本身带一条// deprecated alias of ObjectFormComponentProps行尾注释,是一条常驻的假阳性哨兵。(b) 改前 README 回填探针。 预判:回填后必须转红,且错误与所改三处一一对应,既有红原样携带。同一套机器直接跑
git show $BASE:packages/plugin-form/README.md的副本,转红rc=2:formComponentsblock02(1,10): TS2305 … has no exported member 'formComponents'FormSchemablock13(1,15): TS2305 … has no exported member 'FormSchema'FormFieldblock13(1,27): TS2305 … has no exported member 'FormField'isRuntimeDefault(散文,探针看不到)p1.ts(2,10): TS2305 … has no exported member 'isRuntimeDefault'ValidationRule与三条 TS7006预判与实测无出入,方向就是通常的「改前红 / 改后绿」。这里不存在反转或「诊断变多」的情形:判定的是导入名是否存在于导出面,不是
??链的取值判决,也不喂任何计数门 —— 删掉的那一节整节消失,不留一个仍被读取的空壳。按「先写预判再跑」的纪律,这一条是预判即成立,不是事后追认。(c) 键面漂移为什么留给 #5075 而不是顺手改 —— 改后仍在的
TS2304: Cannot find name 'ValidationRule'来自 "Schema API → Form Field" 那个本地interface FormField声明。裸声明永远编译通过,所以对真身做了双向 pin,两个方向都红(type必填 vs 可选、validation数组 vsFieldValidationRules对象)。这属键面/形状而非导入面,且与两个示例块里的validation: [ … ]连体 —— 只改参考块会让 README 自相矛盾。已立 #5075,先例同族(#5045 / #5057 / #5066)。验证
pnpm exec turbo run type-check --concurrency=2→81 successful, 81 total,exit 0(4m8s;重活经flock -w 3600 /tmp/os-heavy-verify.lock串行 +--max-old-space-size=4096)。node scripts/check-doc-links.mjs→Links are valid across 13 scan roots.(新增的#public-exports锚点在内)node scripts/check-control-bytes.mjs→OK (scanned 4517 tracked text file(s); skipped 85 binary);改动两文件另做grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]'自扫,exit 1 零命中;file README.md报 UTF-8 text(未被当成 binary)。pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-form...' build→ rc=0(探针与名集合核对所依赖的构建产物)。docs-only 的 CI 形状:
**/*.md与.changeset/**在paths-ignore里,Test / Type Check 各 job 的实质步骤会被 path-filter 短路成 skipped 而 job 报 success。按纪律计绿,但类型证据是上面的本地仓根读数,不是 CI 的(#5046 / #5053 / #5059 / #5069 先例)。顺手立的卡(均未认领,不夹带进本 PR)
validation数组拼法让校验静默失效、multi-step-form全仓未注册、FormField参考块五处漂移 #5075 — 同文件的键面漂移,三组:①validation:写成数组 —— 真身FieldValidationRules是按规则名开键的对象,而唯一读点packages/components/src/renderers/form/form.tsx:1652是{ ...validation },把数组展开成{ '0': …, '1': … },于是 README 教出来的校验规则一条都不跑且不报错(静默失效,可能高于文档级);②type: 'multi-step-form'全仓未注册,照抄即未知组件红框;③FormField参考块五处漂移 +ValidationRule这个类型名全仓不存在(就是改后探针剩下的那一条)。*Components手动注册 #5076 — 文档站上还有一份未修的 plugin-map README teaches an API the package does not implement — every snippet in it renders an empty map #5002 家族镜像:content/docs/plugins/plugin-{form,grid,view}.mdx复制了同一段虚构的*Components手动注册(dashboard 的那份名字是真的、键的词汇表错,已在 plugin-dashboard 的dashboardComponents用组件类名作键(全仓唯一一个),README 教的手动注册循环因此注册 11 个没人写的 type、8 个真 type 一个没注册 #5064)。家族七个 PR 每个都只改 README + changeset,没人碰到content/docs;本单的派发边界同样是「只动包内 README」,故分离立卡。changeset
.changeset/plugin-form-readme-truth-5011.md,@object-ui/plugin-form: patch,口径同 #5046 / #5053 / #5059 / #5069:无代码/类型/运行时改动,声明 patch 是因为README.md在包的files里,随下次发布到 npm。Generated by Claude Code