Skip to content

finding(types): three more type names are declared twice with disagreeing shapes — FormField, MarkdownSchema, KanbanSchema — and one doc asserts FormField is declared once #6172

Description

@yinlianghui-tw

Filed unassigned out of #6086 round 3. #6155 records KanbanCard / KanbanColumn as declared four times with disagreeing published copies and is left for triage. That card has a population it never measured; this is what the #6086 sweep turned up alongside it, so triage can size the class rather than the instance.

Three further collisions, each measured

1. FormField — 23 keys vs 29, and the doc claims it is declared once

declarationkeys
@object-ui/types (packages/types/src/form.ts:906)23 — id, name, label, description, type, inputType, required, disabled, placeholder, options, validation, condition, widget, dependsOn, visibleOn, hidden, readonly, visibleWhen, readonlyWhen, requiredWhen, field, colSpan, span
@objectstack/spec (json-schema/ui/FormField.json)29 — field, type, options, reference, publicPicker, maxLength, minLength, min, max, precision, scale, multiple, label, placeholder, helpText, readonly, immutable, required, hidden, colSpan, span, widget, language, keyField, dependsOn, visibleWhen, visibleOn, disclosure, fields

Only 14 keys are common. id, name, description, inputType, validation, condition, readonlyWhen, requiredWhen, disabled exist only in the types copy; reference, publicPicker, maxLength, helpText, immutable, disclosure, fields and six more only in the spec copy.

⚠️content/docs/plugins/plugin-form.mdx:51 asserts the opposite: "FormField is declared once, in @object-ui/types (packages/types/src/form.ts) — this page does not redeclare it…". Under the closure rule adopted on #6086, "declared once" is a closure claim, and it is false. (The page's own 21-row table restates the types copy exactly, 0 unmatched — so the table is right and only the sentence about uniqueness is wrong.)

2. MarkdownSchema — required vs optional, and two keys apart

declarationshape
@object-ui/types (packages/types/src/data-display.ts:797)contentrequired, plus sanitize, components
@object-ui/plugin-markdown (packages/plugin-markdown/src/types.ts:15)contentoptional, plus className, and no sanitize / components

PR #6168 had to qualify the docs naming to the plugin's copy because of exactly this.

3. KanbanSchema — two shapes with almost nothing in common

declarationown keys
@object-ui/types (packages/types/src/complex.ts:100)columns, draggable, onCardMove, onCardClick, onColumnAdd, onCardAdd
@object-ui/plugin-kanban (packages/plugin-kanban/src/types.ts:61)objectName, groupBy, swimlaneField, cardTitle, cardFields, data, …

Also relevant to #6155: three of the four KanbanCard declarations are inside @object-ui/plugin-kanban itself (KanbanImpl.tsx:51, KanbanEnhanced.tsx:36, types.ts:15), so a package qualifier does not disambiguate the name either — which was why #6086 could not name that page's tables.

Why it is worth a card

#6086 measured the consequence: a tool keyed on a type name returns a confident wrong answer instead of abstaining, and so does a reader. The docs cannot route around it — plugin-markdown.mdx now carries a sentence whose only job is to say which of two same-named types it means, which is a workaround for the collision rather than a fix.

Whether the answer is renaming, re-exporting one copy from the other, or a check: that forbids a second declaration of an exported schema name, is a contract decision. Recording the population so it is made once rather than per page.

Reproduce

grep -rn 'interface FormField' packages/types/src/form.ts
python3 -c "import json;print(sorted(json.load(open('node_modules/@objectstack/spec/json-schema/ui/FormField.json'))['properties']))"
grep -rn 'interface MarkdownSchema\|interface KanbanSchema\|interface KanbanCard\|interface KanbanColumn' packages/*/src --include=*.ts --include=*.tsx
sed -n '49,54p' content/docs/plugins/plugin-form.mdx

Refs: #6155 (the instance already carded) · #6086 (where these were measured) · PR #6168.

Metadata

Metadata

Assignees

No one assigned

    Labels

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

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions