Uh oh!
There was an error while loading. Please reload this page.
fix(plugin-grid): object-grid 的 data 输入按契约声明为 ViewData 对象 - #5108
Conversation
`GRID_QUERY_INPUTS` 把 `data` 声明成 `{ type: 'array', label: 'Static Data',
description: 'Inline rows, …' }`,而契约是 `ObjectGridSchema.data?: ViewData`
—— spec 以 `provider` 辨识的联合,四支全是 strict 对象(object / api / value /
schema),没有数组那一支。也就是说这条声明描述的是 `staticData` 的形状,而
`staticData` 正是 #4648 裁定明确不发布的已弃用别名。
两个方向都会伤到作者:照设计器面板(或生成的 sdui-intrinsics.d.ts)写
`data: [ …行… ]`,渲染能跑但 `tsc` 报 TS2322、spec 解析也不过;而唯一同时满足
两者的 `{ provider: 'value', items: [...] }` 反被本仓自己的保存门禁报
`type-mismatch` —— 因为声明的 `array` 支只接受数组。平台在它唯一合法的写法上
自相矛盾,正是 #4041 的形状换了一个键。
改动只在声明面:type 改为 `object`,label 改为 `Data Source`,description 如实
列出四支 provider 并说明内联行走 `{ provider: 'value', items: [...] }`。
`ObjectGrid.tsx` 的数组容忍支路不动(#5068 家族),它与 `staticData` 同等地位
—— 作为后向兼容被读取,但不作为授权面发布。
钉子取提取式:声明面的支从注册表读出,期望值由 `ViewDataSchema` 自己的判定推导,
两侧任一漂移即红;编译期一半靠 `@ts-expect-error` 钉住 `ViewData` 没有数组支。
Fixes#5090
Co-authored-by: Claude <noreply@anthropic.com>上一提交在 `GRID_QUERY_INPUTS` 前插入了 #5090 的说明段,`const` 与其后三处 `ComponentRegistry.register(` 的行号整体后移 21 行,README 里四处按行号指路的 引用因此失准(145 → 166、181 → 202、193 → 214、216 → 237)。 只改行号,不改任何叙述;`src/index.tsx:80` / `:88` 两处在插入点之前,未动。 Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
commented
Aug 18, 2026
PM 验收:ACCEPT(session_01GTRjn8xBqp75dk7kFupVRt,objectui 分片) 实物核验:merge-base CI 亲读:15/20 终态全绿零失败(Build & E2E、Lint、Live E2E、Bundle Analysis 等全 success);余 4 个 Test shard + Type Check 在跑(started 00:44,无任何失败信号),本地对应面已直接覆盖(plugin-grid 全量 668/668、仓根 type-check 81/81)—— 与 PR #5105 同口径,把尾格终态交给 auto-merge 门(绿才合、红不合),意外转红 PM 下一跳处置。 验收要点:
三件套照常:本评论 → undraft → auto-merge(SQUASH)。 Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#5090
问题
GRID_QUERY_INPUTS(packages/plugin-grid/src/index.tsx)把data声明成{ type: 'array', label: 'Static Data', description: 'Inline rows, …' },而契约是
ObjectGridSchema.data?: ViewData(packages/types/src/objectql.ts:556)。ViewData是 spec 以provider辨识的联合,四支全是 strict 对象(
object/api/value/schema),没有数组那一支。也就是说:这条声明描述的是
staticData(objectql.ts:637,any[],已@deprecated,其 JSDoc 明写 "Use data with provider: 'value' instead")的形状 —— 而
staticData正是 #4648 裁定明确不发布的那批已弃用别名之一 —— 却挂在 canonical 键
data的名下。两个方向都会伤到作者,实测:
data: [ …行… ](照声明面写)data: { provider: 'value', items: [...] }(唯一合法)type-mismatch编译探针(strict,对
packages/types/dist)复现卡面第 4 条:保存门禁那一侧实测(
manifestFromConfigs+validateTree,真实注册表):改前{ provider: 'value', items: [...] }得到type-mismatch: prop "data" expected an array—— 平台在它唯一合法的写法上自相矛盾。这是 #4041 的形状换了一个键:
声明面与实现/契约指向相反的东西。
改法(只动声明面)
type:'array'→'object'。词汇表侦查结论:ComponentInputControlType(
packages/types/src/base.ts:362)的 11 个字面量里'object'就是正确值,无需扩词汇表、无需改生成器,故未触及契约面。
label:Static Data→Data Source(按词面如实 —— 这个键是整个 data 通道,内联行只是四支里的一支)。
description: 如实列出四支 provider,并写明内联行走{ provider: 'value', items: [...] };staticData的提法改为「已弃用的纯数组捷径」,而不是原来的「is the same thing」(二者效果等价但形状不同,这正是本卡的病根)。
data输入类型是array(内联行),而契约类型是ViewData(对象)—— 照设计器写出的元数据 spec 解析不过 #5090 的说明,与既有的 object-grid 的 inputs 声明filters(复数),渲染器只读filter(单数):按已发布词汇写筛选条件静默无效 #4041 / [Decision] spec 17.0.0 GA declares four new authorable object-* blocks and new keys on three existing ones — what does objectui publish as authoring surface? #4648 段同体例。关于
type是否应声明成['object', 'array']不。
ComponentInput.type的数组形(#3832)语义是「任一支接受即放行」,而其文档明确要求「只声明契约接受 AND 渲染器解析的支」。数组这一支渲染器解析、契约拒绝,不满足合取;
声明它等于继续发布一个
tsc与 spec 都拒绝的形状,正是 #4648 carve-out 拒绝的那一步。与 #5068 / #4648 的关系
ObjectGridSchema.columns上容忍未声明的accessorKey/header拼写 —— 声明类型是 strict 的 ListColumn,#3104 的列身份门禁结构上看不见这条支路 #5068(未动):ObjectGrid.tsx:392getDataConfig的Array.isArray(schema.data)容忍支路一行未碰。它继续作为后向兼容工作,原来写数组的作者不会被打断。本 PR 只是
不再把它当作授权面发布 —— 于是数组
data获得与staticData完全相同的地位:被读取,不被广告。这与 [Decision] spec 17.0.0 GA declares four new authorable object-* blocks and new keys on three existing ones — what does objectui publish as authoring surface? #4648 carve-out 的理由是同一条。
的键补进
GRID_QUERY_INPUTS;data补进去了,但类型标注没跟上契约。本 PR 收尾这一格。控制台 parity 门禁判的是键不是支,所以它改前改后都绿 —— 这也是这条缺陷能活到今天的原因。
type: 'grid'落到布局容器,sortable / filterable / onRowClick 等零命中 #5065 已重写)本来就是对的:「give it aViewDatawith thevalueprovider …a bare array is the deprecated
staticDataspelling」。声明面是最后一个没对齐的。content/docs/**一行未动(content/docs/plugins/plugin-grid.mdx 整片示例教type: 'grid'+header/accessorKey列词汇表 —— 落到 CSS Grid 布局容器,列声明被 strict 的 ListColumn 拒绝(#5065 的文档站镜像) #5087 / PR docs(plugin-grid): 文档站示例整片按 object-grid 真实键面重写,TypeScript 导入改指 @object-ui/types #5103 在飞)。钉子(提取式,非化石值)
新增
packages/plugin-grid/src/__tests__/gridDataInputContract.test.ts,两侧都不写死:ViewDataSchema自己的判定推导(每个粗粒度支一个代表值,取 schema 接受的那些)。任一侧漂移即红:spec 若放宽
ViewData接受数组,或声明面长出契约拒绝的支。@ts-expect-error钉住「ViewData没有数组支」;它由本包tsconfig.test.json编译(spec-symbol-parity.test.ts的「编译期」断言从未被编译 —— 整个 tripwire 是哑的 #3181),ViewData一旦放宽,该指令变成未使用 → tsc 红。之所以自建钉子:「声明的支是否匹配契约」本来就没有门禁(#4971 已就此立卡),
现有 parity 门禁只判键名。
验证
pnpm exec vitest run packages/plugin-grid/→ 75 files / 668 tests passed→ 95 passed
turbo run type-check --concurrency=2→ 81 successful, 81 totalnode scripts/check-control-bytes.mjs→ OK反向验证(先书面预判,再跑)
type: 'array'4 failed / 6 passed,expected [ 'array' ] to deeply equal [ 'object' ]{ provider: 'value', … }→expected an array;裸数组 → 无诊断[],比较两侧同时红 → 自证期望值真来自 schemaexpected [] to deeply equal [ 'object' ]与expected [ 'object' ] to deeply equal []rows/data/objectName)是否 parse 时折叠VIEW_FILTER_OPERATOR_ALIASES的 "folded to canonical on parse")safeParse失败。ViewData 的strictObjectaliases 是拒绝时的报错提示机制,不是接受。结论对本 PR 有利 —— description 里教的items/object/schemaId/read四个 canonical 键实测全绿,教任何 alias 都会是错的(c) 这条把预判写反了,按纪律照实报,不修饰成「符合预期」。
Generated by Claude Code