Skip to content

The spec's dataSource element binding is read by nine blocks and declared by none — the html tier reports the one working saved-view spelling as unknown-prop #6678

Description

@claude

Measured while re-anchoring objectui#6598 on origin/main @ ece68882. Filing, not claiming.

The finding

PageComponentSchema.dataSource{ object, view?, filter?, sort?, limit? }, the spec's per-element data binding — is the one spelling that resolves a saved view for an object-bound block on the html tier. It works. It also draws a diagnostic saying it does not exist.

Measured through the live path (registry-built manifest, the exact page.tsx html-kind construction, SchemaRenderer, the real plugin-list registration):

page source compile diagnostics columns that reach the grid
list-view with objectName + dataSource={{object:'opportunity', view:'all'}} warning unknown-prop: list-view has no prop "dataSource" ['name','amount'] — resolved from the saved view ✅
list-view with objectName + viewName="all" warning unknown-prop: list-view has no prop "viewName" none
list-view with objectName + view="all" warning unknown-prop: list-view has no prop "view" none

So the working spelling and the two non-working ones are reported identically, and the tier's only signal points away from the one that works.

Mechanism

validateTree skips BASE_PROPS (the BaseSchema mirror: type, id, className, style, visible, visibleOn, disabled, disabledOn, children) and otherwise looks the prop up in the component's declared inputs. dataSource is in neither: git grep "name: 'dataSource'" packages/ returns zero registrations, and it is not a base prop.

But it is read — by ElementDataSourceGate in @object-ui/react, on behalf of every object-bound block that wraps itself in it (plugin-list, plugin-form, plugin-calendar, plugin-detail, plugin-charts, plugin-gantt, plugin-kanban, plugin-map, plugin-dashboard). It is a cross-block key of the same kind as style, published by the spec and consumed by the runtime, that the manifest has no way to describe.

Why this is not just noise

It is the objectstack#4413 shape inverted. That one was declared and unread; this one is read and undeclared — and the cost lands on the tier meant to accept AI-authored pages, where the diagnostic IS the contract. The objectui#6598 reporter tried viewName and view and gave up; the key that would have worked was the one the tier would also have told them does not exist.

The decision this needs

Two shapes, and picking between them is a declaration-surface call rather than a mechanical fix, which is why this is a card and not a PR:

  • A — add dataSource to BASE_PROPS in packages/sdui-parser/src/validate.ts. One edit; but that set is documented as mirroring BaseSchema, and dataSource belongs to PageComponentSchema, so it would also silence the key on blocks that do not read it (flex, card).
  • B — declare it on the inputs of each registration that wraps ElementDataSourceGate. Truthful per block and it reaches codegen and the designer; spans nine packages, and every one of them then owes the framework's spec/registry parity gate an answer.

Related: objectui#6598, objectui#5905 (manifest serializer keys with no reader), objectui#6150 (schema keys renderers read that no shipped type declares).


Generated by Claude Code

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatchedpriority:p1

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions