Skip to content

lint: 表单类规则只读 views[].sections,而真实 app 形状下 views[] 是视图容器 —— validateFormLayout 两条规则在实测 stack 上不可达 #6251

Description

@hotlong

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 buildexamples/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.tscollectViewSites 已经把正确的阶梯写对了(sections / form.sections / listViews.*.sections / formViews.*.sections),可以直接作为参照实现。

这一族的判据在 #4984 / #5009 已经写过:一条键在真实/合法 stack 上永不出现的分支,不是保守,是幽灵检查 —— 它一直报绿,而绿是因为什么都没读到。

Refs:#6128 / PR #6248(发现处与已修的同族实例)、#4984 / #5009(幽灵检查一族)、ADR-0089 D3b。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions