docs(plugin-form): 文档站 Form Field 参考块与校验示例按 FieldValidationRules 真身重写 (#5118) - #5130
Merged
Merged
Conversation
…#5118) `content/docs/plugins/plugin-form.mdx` 带着 `packages/plugin-form/README.md` 在 #5075 修掉之前的同一批缺陷 —— README 半修完、文档站镜像一行未碰。 `### Form Field` 现场重声明了一个本地 `interface FormField`,其 `validation?: ValidationRule[]` 双重错:`ValidationRule` 这个类型名全仓不存在 (声明式 grep 零命中),`validation` 也不是数组,真身是 `FieldValidationRules`(packages/types/src/form.ts:744),按规则名开键的对象。 同一块还把未声明的 `defaultValue` / `className` 列成键(dist 产物复测:FormField 共 23 个声明键 + 一个 `[key: string]: any` 索引签名,必填只有 `name`),并把 `type` / `label` 标成必填 —— 与真身相反。本次不再现场声明本地类型:文档里手写的 `interface` 在任何地方都不参与编译,正是它漂移至此的成因;改为对真身键面的引用, 每一条都对 dist 产物与渲染器读点亲测。 `### Form with Validation` 按那个错的类型把校验写成了数组,而这个拼法是静默失败: 该键唯一读点把值展开进交给 react-hook-form 的规则对象 (`const rules: any = { ...validation }`, packages/components/src/renderers/form/form.tsx:1652),数组展开得到数字键 (`{ '0': …, '1': … }`),RHF 一个都不认,规则全丢且不抛错。真渲染器实测:旧片段在 `minLength: 3` 下提交两字符用户名、无任何提示;改后片段拦住它。示例改带 `FormSchema` 标注,数组拼法从运行期惊喜变成编译错误(实测 TS2559),另附一份 JSON 变体供元数据作者照抄。 三条此前只能靠试出来的事实写进页面:`validation.required` 只供消息、是否必填由字段 的 `required` / `requiredWhen` 决定;不存在 `email` 规则名,邮箱校验是 `pattern`; 手写 schema 的 `pattern.value` 必须是 RegExp —— RHF 只在值 `instanceof RegExp` 时 才应用 pattern(dist 实测),把声明的字符串编译成 RegExp 的是对象元数据那条路 (`buildValidationRules`)。 `scripts/check-doc-component-types.mjs` 里本页的两条 DOC_TYPE_EXEMPTIONS 一并删除: 它们以「ValidationRule discriminant under a field's `validation[]`」为由豁免 `minLength` / `maxLength`,该理由的每一个分句都是本次要清掉的虚构;删掉后数组拼法 一旦回潮,这道门就会红。 Fixes #5118 Co-authored-by: Claude <noreply@anthropic.com>
Collaborator
Author
|
PM 验收:ACCEPT(session_01GTRjn8xBqp75dk7kFupVRt,objectui 分片;批次 22 收官单) 实物核验:merge-base 验收要点:
三件套照常:本评论 → undraft → auto-merge(SQUASH)。#5075 → #5118 → #5131 链至此:README 半、文档站半均落,残余为观察类量词修正。 Generated by Claude Code |
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 free
to 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 #5118
content/docs/plugins/plugin-form.mdx的### Form Field参考块与### Form with Validation示例,是 #5075(README 半,已闭,PR #5100)的文档站镜像:README 侧修完,
content/docs/**的同内容一行未碰。半径严格限于这两块 + 被它们连坐的门表项 + changeset。
前提验证:卡面三条判断逐条复测,全部成立
1.
ValidationRule这个类型名全仓不存在。 声明式 grep 零命中:零命中的邻近词反查只找到
ValidationRuleSchema(spec 的对象级 validations,另一层)、
DesignerValidationRule、ObjectValidationRule、AdvancedValidationRule、ValidationRuleDraft—— 没有一个是FormField.validation的类型。裸名ValidationRule在改前全仓仅两处:本页
:58,以及 PR #5100 changeset 里记录这件事的那句话。真身是
FieldValidationRules(packages/types/src/form.ts:744),按规则名开键的对象。2. 数组拼法正是让校验静默失效的那个写法。 读点复核(行号未漂移):
数组展开进对象字面量得到数字键,而 react-hook-form 的字段校验器只解构固定集合:
真渲染器实测(
ComponentRegistry.get('form')+ testing-library,jsdom):旧片段原样喂进去,
minLength: 3的字段拿到两字符值ab—— 表单提交成功,payload{"username":"ab"},页面上零提示。改后的对象形同一输入被拦住,显示Min 3 characters。3.
defaultValue/className未声明,type/label可选。 对 dist 产物(
packages/types/dist/form.d.ts,pnpm --filter @object-ui/types build后)复测:一处对卡面措辞的实测修正,已写进页面而不是照抄:卡面说这两键「被索引签名吞掉,
永不被读」。渲染器把未解构的剩余键
...fieldProps一路转发给解析出的组件(
form.tsx:2031),实测一个字段级className确实落到内置 input 的 class 上(探针:
… md:text-sm PROBE-CLASS)。所以准确的说法不是「永不被读」,而是「不在契约里」:页面写的是它不是声明键、能不能落到元素上取决于组件是否透传、契约不做承诺。
defaultValue则实测确实不播种(字段级defaultValue: 'Beijing'下输入框值为"",表单级
defaultValues下为"Beijing")—— 控件由 react-hook-form 托管,初值来自表单。改了什么
### Form Field:不再现场声明本地类型。文档里手写的interface在任何地方都不参与编译,永远「编译通过」,这正是它漂移至此的成因(PR docs(plugin-form): README 的 Schema API 与 Examples 按 form 真读的键面重写 #5100 的教训)。改为对真身
FormField的键表引用(23 键,逐条对 dist 与读点亲测),外加一张「不是键」表(
defaultValue/className各自该写什么),以及FieldValidationRules的规则表。### Form with Validation:改成按规则名开键的对象,并带FormSchema类型标注 —— 标注本身是示例的一部分,因为
FormField/FormSchema都有索引签名,不标注的const schema = { … }写什么都过。另附一份 JSON 变体供元数据作者照抄,并写明pattern/validate是 JSON 这条路表达不了的两条(JSON 没有正则字面量和函数)。validation.required只供消息、是否必填由字段的
required/requiredWhen决定(读点delete rules.required在form.tsx:1700);不存在
email规则名,邮箱校验是pattern;手写 schema 的pattern.value必须是RegExp。
scripts/check-doc-component-types.mjs:本页那两条DOC_TYPE_EXEMPTIONS被连坐删除。它们以「ValidationRule discriminant under a field's
validation[]」为由豁免minLength/maxLength—— 这句理由的每个分句都是本次要清掉的虚构。改后页面不再在代码块里拼这两个
type字面量,条目按门自身的规则变stale-exemption(实测先红),删掉后转绿。
scripts/__tests__/check-doc-component-types.test.ts:加一个 content/docs/plugins/plugin-form.mdx 的 Form Field 参考块与「Form with Validation」示例是 #5075 的文档站镜像:validation数组拼法让校验静默失效,ValidationRule全仓不存在 #5118 的 pin(3 条断言),理由见下面的反向验证 (a)。
验证
node scripts/check-doc-component-types.mjs✅ Every documented component type is registered.node scripts/check-doc-links.mjsnode scripts/check-control-bytes.mjsgrep -naP控制字符类,覆盖门不扫的 0x01 一族)pnpm exec turbo run type-check --concurrency=2(仓根,flock 串行)pnpm exec vitest run scripts/__tests__/check-doc-component-types.test.tsnode scripts/check-changeset-presence.mjsno changeset is owed(见下)changeset 自判:门只守 fixed 组包的
PKG/src/**,本 PR 四个文件都不在其中,故不欠。仍然补了一份 —— 这是一页已发布文档的实质重写,与 PR #5109(同形状,补了)
同级;PR #5119 那种 17 行的 import 更正没补,是另一个量级。
改后示例 strict 编译(从 mdx 里按发布原文抽出,
tsc --ignoreConfig --strict --noEmit,解析真实的
@object-ui/typesdist):两个负控都按事先书面预判落地(TS2741 / TS2559),页面里引用的正是 TS2559 这条原文。
名集合核对:页面新引入的每个类型名都对 dist 复核 ——
FormField、FormSchema、FieldValidationRules、FieldCondition、SelectOption、RadioOption、DependsOnInput七个全部 DECLARED,且都在
packages/types/dist/index.d.ts的导出面上;buildValidationRules在packages/fields/src/index.tsx:2246导出;@objectstack/formula是resolveFieldRuleState真正 import 的引擎。探针分层(案头版):
FormField/FormSchema带索引签名 ⇒ 「未声明键」的探针绿不作数,
defaultValue/className的证据是声明成员表 + 读点 + 上面那条 className实测,不是探针;有牙的是必填键(TS2741)与字面量键(门的
unregistered-doc-type)。反向验证(先书面预判,再跑;commit 后变异、跑完还原)
(a) 旧块回填 —— 预判「按门分层」,实测与预判一致,含一条对本仓不利的实话。
两半分开灌:
### Form Field旧参考块(带ValidationRule[]):预判各门全绿,实测
check-doc-component-types/check-doc-links/check-control-bytes全部rc=0。原因是门只扫代码块里带引号的
type:字面量,而type: string;这种伪代码不带引号 —— 这一半在本仓没有任何既有门看得见,虚构可以原样回潮而 CI 全绿。
这就是本 PR 补 pin 测试的唯一理由:a1 之下只有新加的 pin 红(3 条中 2 条)。
### Form with Validation旧数组示例:预判红,实测红 ——content/docs/plugins/plugin-form.mdx:282 / :283 [unregistered-doc-type] type 'minLength' / 'maxLength' (json)。诚实的一半:同一个变异拿 baseline 的门文件(0046d8f,豁免尚在)去跑是绿的。也就是说这一半的牙是本 PR 删豁免新造出来的,
不是既有的。
(b) 塞假名自证:在 JSON 示例里把
type改成form-5118-fake-name,预判红 ——实测
content/docs/plugins/plugin-form.mdx:333 [unregistered-doc-type] type 'form-5118-fake-name' (json),rc=1。证明本文件在门的判定面上是活的,前面的绿不是空绿。(c) 自选方向:改后为真的可运行证据。 把发布后的 JSON 块从 mdx 里读出来、直接喂给
真 form 渲染器(不是手抄的副本):
配套的
pattern方向也实测:string 值 —— 不匹配的值照样提交、零提示;RegExp 值 ——拦住。探针是 scratch(
5118-前缀),已随收尾删除,不在本 PR 里。与相邻卡的关系
validation数组拼法让校验静默失效、multi-step-form全仓未注册、FormField参考块五处漂移 #5075(README 半,已闭)/ PR docs(plugin-form): README 的 Schema API 与 Examples 按 form 真读的键面重写 #5100:同族基准。事实不盲抄 —— 键表与措辞全部对 dist 产物与读点亲测;上面那条
className的措辞就是因此与 README 的括注不同。8378e9954,已在 main):同文件 TypeScript Support 块的 import 更正。本 PR 基线含它,未碰该块。
FieldValidationRules在唯一读点既不校验也不归一:pattern.value写成 string(类型明确允许)被 react-hook-form 静默忽略,未识别的规则名同样静默丢弃 #5099(运行期读点与类型契约,在决策箱):本 PR 只改文档,不动form.tsx:1652的读点、不动
FieldValidationRules的声明。页面写的是今天的真实行为(手写面必须给RegExp),该说法在 手写
FieldValidationRules在唯一读点既不校验也不归一:pattern.value写成 string(类型明确允许)被 react-hook-form 静默忽略,未识别的规则名同样静默丢弃 #5099 选 A 或选 B 之下都不会变假;若 A 落地,只有规则表里pattern那一格的类型串需要跟着收。### Multi-Step Form块由 finding: 教学面 prose(content/docs/**.mdx代码块)没有 catalog 侧 #4616 那样的「不许出现 OBJUI-001」棘轮,同一缺陷已复发三次 #4823 的门 PR 修过并被 pin 住,本 PR 未碰,其 pin 仍绿。Generated by Claude Code