Measured while implementing #4914's ruled gate (the six predicate faces). Filed unassigned, out of that card's ruled scope — recording it rather than widening a 7-package diff.
What is there
@object-ui/core's EXPANDABLE_FIELD_TYPES (packages/core/src/utils/expand-fields.ts) is documented as the reference-bearing field family, with a long docblock recording what happened the last time this table was hand-copied per consumer (#4770 / #4790 / #4815). Two consumers were re-pointed at it and each carries an identity pin (a spy on its .has) so a member-identical private copy fails rather than quietly re-forking.
packages/plugin-dashboard holds two more copies that were never converted, and neither derives from nor pins against the shared set:
packages/plugin-dashboard/src/recordFields.tsx — const LOOKUP_TYPES = new Set([...]), read by isLookupType.packages/plugin-dashboard/src/ObjectDataTable.tsx — an inline const isLookup = (t) => t === 'lookup' || … inside computeLookupExpand.
Both are $expand-driving decisions, which is EXPANDABLE_FIELD_TYPES' own stated job ("buildExpandFields below ("expandable")").
Why it is not merely duplication — the sets genuinely differ
| EXPANDABLE_FIELD_TYPES (core) | LOOKUP_TYPES (recordFields) | inline isLookup (ObjectDataTable) |
|---|
lookup | ✅ | ✅ | ✅ |
master_detail | ✅ | ✅ | ✅ |
user | ✅ | ✅ | ✅ |
tree | ✅ | ❌ | ❌ |
reference | ❌ | ✅ | ✅ |
So they are not in a subset relation in either direction — the exact shape #4790 recorded for the form layer's copy, and the reason a gate could not say so. Today a tree (self-referencing hierarchy) column is $expand-ed by the form/grid road and not by the dashboard table, while a reference column is expanded by the dashboard and is not a member of the family core publishes.
The claim this falsifies
#5312 (closed) states paramToField was "now the LAST private copy of the reference-bearing rule". It was not — these two predate it and were not in that sweep's file surface. Worth recording so the next consolidation does not start from the same false premise.
Not fixed here, deliberately
#4914's ruling scoped a retirement gate ahead of these predicates, not a re-homing of the family they read. Converting them is a behaviour change in both directions (tree gains expansion, reference loses it) and needs its own call on which set is right — most likely EXPANDABLE_FIELD_TYPES gains reference, since two independent consumers reached for it. The gate landed by #4914's PR runs ahead of both predicates and is unaffected by whichever way this goes.
Related: #4770, #4790, #4815, #5312 (the four earlier copies), #4914 (this measurement's origin).
Measured while implementing #4914's ruled gate (the six predicate faces). Filed unassigned, out of that card's ruled scope — recording it rather than widening a 7-package diff.
What is there
@object-ui/core'sEXPANDABLE_FIELD_TYPES(packages/core/src/utils/expand-fields.ts) is documented as the reference-bearing field family, with a long docblock recording what happened the last time this table was hand-copied per consumer (#4770 / #4790 / #4815). Two consumers were re-pointed at it and each carries an identity pin (a spy on its.has) so a member-identical private copy fails rather than quietly re-forking.packages/plugin-dashboardholds two more copies that were never converted, and neither derives from nor pins against the shared set:packages/plugin-dashboard/src/recordFields.tsx—const LOOKUP_TYPES = new Set([...]), read byisLookupType.packages/plugin-dashboard/src/ObjectDataTable.tsx— an inlineconst isLookup = (t) => t === 'lookup' || …insidecomputeLookupExpand.Both are
$expand-driving decisions, which isEXPANDABLE_FIELD_TYPES' own stated job ("buildExpandFieldsbelow ("expandable")").Why it is not merely duplication — the sets genuinely differ
EXPANDABLE_FIELD_TYPES(core)LOOKUP_TYPES(recordFields)isLookup(ObjectDataTable)lookupmaster_detailusertreereferenceSo they are not in a subset relation in either direction — the exact shape #4790 recorded for the form layer's copy, and the reason a gate could not say so. Today a
tree(self-referencing hierarchy) column is$expand-ed by the form/grid road and not by the dashboard table, while areferencecolumn is expanded by the dashboard and is not a member of the family core publishes.The claim this falsifies
#5312 (closed) states
paramToFieldwas "now the LAST private copy of the reference-bearing rule". It was not — these two predate it and were not in that sweep's file surface. Worth recording so the next consolidation does not start from the same false premise.Not fixed here, deliberately
#4914's ruling scoped a retirement gate ahead of these predicates, not a re-homing of the family they read. Converting them is a behaviour change in both directions (
treegains expansion,referenceloses it) and needs its own call on which set is right — most likelyEXPANDABLE_FIELD_TYPESgainsreference, since two independent consumers reached for it. The gate landed by #4914's PR runs ahead of both predicates and is unaffected by whichever way this goes.Related: #4770, #4790, #4815, #5312 (the four earlier copies), #4914 (this measurement's origin).