Repository navigation
fix(app-shell,types): the page designer writes element:repeater's query into dataSource, and the repeater arm takes the spec gate's object waiver (objectui#12056) - #12064
Conversation
…ery into dataSource (objectui#12056) The repeater row of PAGE_BLOCK_FIELDS moves as the element:number row did in objectui#11880: the Object picker and the Limit box are homed in the node-level dataSource binding (at: 'dataSource'), and the Title field and Fields pickers read their object from dataSource. They wrote properties.object / properties.limit, the flat keys objectstack v18 retires (objectstack#11509). New pin PageBlockInspector.repeaterDataSource-12056.test.tsx drives the real inspector; the objectui#11880 suite drops its control that pinned the repeater's old flat write. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
Replaces an `as any` with the patch shape the inspector hands the editor, so the new pin adds no no-explicit-any warning. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…de dataSource.object (objectui#12056) ElementRepeaterBlockSchema now mirrors the spec props gate's waiver the way ElementNumberBlockSchema does: the bag is ComponentPropsMap's element:repeater row with `object` alone made optional, and a node refinement on the shared dataSourceSuppliesObject restores the requirement (ELEMENT_REPEATER_OBJECT_REQUIRED) wherever no binding names the object. Without it, objectui validate refused the node the page designer writes once its Object picker homes in dataSource. The repeater arm pins move with it (the old "binding does not stand in" row inverts; the bag is pinned member by member against the row), the mirror ledger prose follows, and data-source.md's paragraph and example stop teaching properties.object for a bound repeater. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…bjectui#12056) Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Inputs: card #12056 (body, 5 comments: triage ① Derived judgmentsA. Designer write surface ( B. Accept-set widening, both zod faces ( C. Refusal retained, with a new issue shape. A bag without D. Type face. E. Test realignments. The objectui#11880 inspector pin loses only its "repeater still writes F. Docs. G. Not changed, correctly. The repeater renderer and its ② Semver levelTwo changesets: Clause-②: yes ③ Boundary flags
Implemented-by: VERDICT: PASS |
Fixes #12056
Clause-②: yes
What changes
The page-block inspector's
element:repeaterrow (@object-ui/app-shell, patch). The row ofPAGE_BLOCK_FIELDSnow matches theelement:numberrow from objectui#11880. The Object picker writesdataSource.objectand the Limit box writesdataSource.limit, both throughat: 'dataSource'. The Title field and Fields pickers read their object withobjectFrom: 'dataSource'. The labels keep their existing keys, and no language-pack key is added.The repeater's zod arm (
@object-ui/types, minor).ElementRepeaterBlockSchemanow applies the spec props gate'sobjectwaiver, the same wayElementNumberBlockSchemadoes:ComponentPropsMap['element:repeater']withobjectalone made optional (.partial({ object: true }));dataSourceSuppliesObjectputs the requirement back (ELEMENT_REPEATER_OBJECT_REQUIRED, atproperties.object) wherever nodataSource.objectnames the object.The arm's
dataSourcedescription no longer says thatproperties.objectstays required. Without this half,objectui validaterefused the node the moved designer writes (properties: {}besidedataSource.object), which is the stop reported on the card. The seat's claim amendment on the card is the scope for this half.Docs. In
content/docs/guide/data-source.md, the repeater paragraph now states the waiver and that the Studio designer writes the binding, and its JSON example dropsproperties.object. The waiver sentence inpackages/types/src/zod/README.mdnow names both arms.Governing text. objectstack ruling
6051498447(objectstack-ai/objectstack#11509, sub-question 2): "objectui first (the repeater takesdataSource,record_pickerandnumberlose their??fallbacks, the designer writes the node-leveldataSource, the docs follow), and the spec retirement ships with the pin bump that carries it."Clause-② yes (widening). Two faces widen to the spec gate's rule:
StrictAnyComponentSchema(objectui validate/objectui check) andsafeValidateSchemanow accept a repeater whose bag omitsobjectbeside a non-emptydataSource.object;ElementRepeaterBlockSchematype, andPublicBlockNodeOfforelement:repeater, typeproperties.objectas optional.No export is added or removed. The changesets are
@object-ui/typesminor and@object-ui/app-shellpatch. No changeset declaresmajor.Measured at the public door
The CLI was built from this branch (
d59d2c8b2; the only later commit is a README sentence). I rannode packages/cli/dist/cli.js validate FILE:47454d363, arm unchanged)properties: {}+dataSource: { object: contact }(what the designer writes)properties → object,invalid_typeproperties: {}, no bindingproperties → object,customproperties: { object: contact }element:numbercontrol, binding onlyelement:number,properties: { aggregate: count }, no bindingproperties → object,customTests
All of these ran through
os-verify-lockondb0ed76e1(git rev-parse --short HEAD) unless a different commit is named.pnpm exec vitest run --maxWorkers=2 packages/types/ …app-shell previews/__tests__/ …inspectors/PageBlockInspector …inspectors/__tests__/page-block-path.test.tsplus the four CLI strict-face tests,objectname-binding-required-11605anddata-list.elementDataSource-11880: Test Files 400 passed (400) · Tests 10478 passed (10478), VERDICT command-exit 0. The full app-shell suite was not run, by the dispatch's instruction; CI runs it.pnpm --filter @object-ui/types type-checkandpnpm --filter @object-ui/app-shell type-check: VERDICT command-exit 0 ond59d2c8b2, afterturbo run build --filter=@object-ui/cli... --filter=@object-ui/app-shell^....pnpm check:doc-snippets: "784 of 784 block(s) judged, 0 failed", exit 0, after the gate's own--build-filterbuild. Also exit 0:check:doc-examples,check:doc-fences,check:doc-example-ids,check:doc-example-readers,check:doc-types,check:readme-exports,check:control-bytes,check:test-path-roots,check:changeset-claims,check:pending-changeset-literals,check:new-line-citations(0 new), the threecheck:vi-mock-*gates,check:designer-field-key-parity,check:spec-symbols,check-changeset-presenceandcheck-changeset-no-major.as anyon a line of the objectui#11880 pin this PR does not change.New and changed pins:
PageBlockInspector.repeaterDataSource-12056.test.tsxdrives the real inspector. Object and Limit land underdataSource, a display control still writesproperties, both pickers list the bound object's fields, and stored flat keys stay visible under Advanced.element-repeater-data-source-11880.test.ts, the old "a binding does not stand in" row is inverted:ELEMENT_REPEATER_OBJECT_REQUIRED;objectstays the row's refusal;PublicBlockNodeOfliteral withoutproperties.objectcompiles.held-public-block-arms-10872,public-block-arms-10872,public-block-responsive-styles-10872andzod-mirror-paritychange only where they asserted or described the old requiredness or bag identity.Reverse verification (ablation, predictions written first)
All legs ran through
ablation-replace.mjsin WRAP mode, with the anchor count and blob change checked on disk. Every restore was proven: blob equal to HEAD, andgit diff HEADempty.e4206e077: predicted 4 failed / 5 passed; observed Tests 4 failed, 5 passed (9).objectFrom: 'page'): predicted 1 failed / 8 passed; observed 1 failed, 8 passed (9). The red came at the DOM roster assertion, so the picker pin's DOM half is not vacuous..partial), ond59d2c8b2: predicted 7 failed, by name; observed Tests 7 failed, 254 passed (261), the same 7.tsc -p tsconfig.test.json: predicted one error, at the typed binding-only literal; observed exactly one,TS2741 Property 'object' is missing.Acceptance notes
properties.object/properties.limit. The curated controls show the binding's values, and a stored flat key stays editable under Advanced. The v18 retirement ([Direction · v18] Retire the flatobject/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) objectstack#11509) owns that.packages/componentsstill declares itsobjectinputrequired: true, while the arm now waives it beside a binding (element:number's registration declares norequiredonobject). This is noted, not filed. Carrier: whoever next touches that registration, or the v18 pin bump that retires the flat key.objectbesidedataSource.objectfor every component type (suppliedByDataSource, read on objectstackmain). This arm now agrees with it.mainat1f1c4b526(objectui#6349 batch 6) before the arm change.Session:
https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8(dispatched dev under thedomain:uiseat 3 claim on objectui#12056).Generated by Claude Code