Filed unassigned from #6128 / PR #6248,那里为了让新增的 visibility-bare-identifier 闸门真能触发,把这条遍历实测了一遍。本单只记录发现,不含修法承诺。
事实
ViewSchema 是一个视图容器,自有键只有 name / label / object / list / form / listViews / formViews(packages/spec/src/ui/view.zod.ts:1890-1903,严格错误映射里把这句话原文写了出来:「The container's own keys are list, form, listViews, formViews」)。表单的 sections 属于 FormViewSchema(view.zod.ts:1623-1624),在容器下一层。
os build 跑 examples/app-showcase,产物里唯一一条 view 表单谓词落在:
views[0].formViews.edit.sections[0].fields[6].visibleWhen
views[0] 自身的键是 list,listViews,formViews —— 既没有 name,也没有 sections。
实测:validateFormLayout 只在被读的那一种形状上触发
同一份有缺陷的表单(引用了对象上不存在的字段),摆在三个位置:
const objects = [{ name: 'task', fields: { title: { type: 'text' } } }];
const bad = { sections: [{ fields: [{ field: 'no_such_field' }] }] };
validateFormLayout({ objects, views: [{ name:'v', data:{object:'task'}, ...bad }] })
// => ['form-field-unknown']
validateFormLayout({ objects, views: [{ name:'v', formViews: { edit: { data:{object:'task'}, ...bad } } }] })
// => [] ← 真实 app 形状
validateFormLayout({ objects, views: [{ name:'v', form: { data:{object:'task'}, ...bad } }] })
// => [] ← 容器默认表单
也就是说 form-field-unknown / form-colspan-absolute 两条规则,在真实 app 产出的形状上基本不可达。packages/lint/src/validate-form-layout.ts:96-108 直接读 stack.views[i].sections,if (!sections) continue。
同族的 validateVisibilityPredicates(ADR-0089 D3b 的两条 advisory)此前有完全相同的洞;PR #6248 已在该文件内把遍历补成容器的 form + 每个 formViews 具名项,并附了实测依据。本单是同一洞在另一个规则文件里的实例 —— 补丁没有外溢到 validate-form-layout.ts,因为那超出了 #6128 的范围。
建议顺带核查的邻居
按「读 views[].sections」这一模式全包搜一遍即可,不要逐个凭印象判断。validate-translatable-sections.ts 的 collectViewSites 已经把正确的阶梯写对了(sections / form.sections / listViews.*.sections / formViews.*.sections),可以直接作为参照实现。
这一族的判据在 #4984 / #5009 已经写过:一条键在真实/合法 stack 上永不出现的分支,不是保守,是幽灵检查 —— 它一直报绿,而绿是因为什么都没读到。
Refs:#6128 / PR #6248(发现处与已修的同族实例)、#4984 / #5009(幽灵检查一族)、ADR-0089 D3b。
Filed unassigned from #6128 / PR #6248,那里为了让新增的
visibility-bare-identifier闸门真能触发,把这条遍历实测了一遍。本单只记录发现,不含修法承诺。事实
ViewSchema是一个视图容器,自有键只有name/label/object/list/form/listViews/formViews(packages/spec/src/ui/view.zod.ts:1890-1903,严格错误映射里把这句话原文写了出来:「The container's own keys arelist,form,listViews,formViews」)。表单的sections属于FormViewSchema(view.zod.ts:1623-1624),在容器下一层。os build跑examples/app-showcase,产物里唯一一条 view 表单谓词落在:views[0]自身的键是list,listViews,formViews—— 既没有name,也没有sections。实测:
validateFormLayout只在被读的那一种形状上触发同一份有缺陷的表单(引用了对象上不存在的字段),摆在三个位置:
也就是说
form-field-unknown/form-colspan-absolute两条规则,在真实 app 产出的形状上基本不可达。packages/lint/src/validate-form-layout.ts:96-108直接读stack.views[i].sections,if (!sections) continue。同族的
validateVisibilityPredicates(ADR-0089 D3b 的两条 advisory)此前有完全相同的洞;PR #6248 已在该文件内把遍历补成容器的form+ 每个formViews具名项,并附了实测依据。本单是同一洞在另一个规则文件里的实例 —— 补丁没有外溢到validate-form-layout.ts,因为那超出了 #6128 的范围。建议顺带核查的邻居
按「读
views[].sections」这一模式全包搜一遍即可,不要逐个凭印象判断。validate-translatable-sections.ts的collectViewSites已经把正确的阶梯写对了(sections/form.sections/listViews.*.sections/formViews.*.sections),可以直接作为参照实现。这一族的判据在 #4984 / #5009 已经写过:一条键在真实/合法 stack 上永不出现的分支,不是保守,是幽灵检查 —— 它一直报绿,而绿是因为什么都没读到。
Refs:#6128 / PR #6248(发现处与已修的同族实例)、#4984 / #5009(幽灵检查一族)、ADR-0089 D3b。