Skip to content

fix(plugin-form): warn on an unresolvable top-level fields member (route 1) - #8859

Merged
os-warren merged 2 commits into
mainfrom
claude/issue-8738-fields-warn-route1
Sep 9, 2026
Merged

os-warren merged 2 commits into
mainfrom
claude/issue-8738-fields-warn-route1

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Fixes #8738
Refs #8847

What

Route 1 of #8738 (ruled at issuecomment-5603577602, after route 2 landed as #8846): a top-level fields member that resolves to no name now fires a named console.warn instead of vanishing in total silence.

  • sectionFields.ts: new exported warnUnresolvedTopLevelField(entry, objectName), right beside its existing sibling warnOnMixedVocabulary — same voice, same once-per-occurrence dedupe discipline (a module-level Set keyed by object + skipped shape). It only warns; it never resolves a name from entry — no ?? f.field fallback, per the card's own standing prohibition.
  • Wired into both read paths named in the ruling:
    • ObjectForm.tsx's SimpleObjectForm fieldsToShow loop.
    • flatFields.ts's buildFlatFields (the drawer/modal path, identical shape).
  • Message names the skipped shape ({ field: 'note' }) and the vocabulary difference (sections[].fields accepts the spec FormFieldSchema object, identity key field; top-level fields takes bare names only).

#8847 — measured, not assumed

Re-derived on this branch's base (42df92809, post-#8846):

:232  object-form                { name: 'fields', ..., description: '...' }      ← described (#8846)
:292  form / view:form           { name: 'fields', type: 'array' }                ← bare (fixed here)
:430  object-master-detail-form  { name: 'fields', ..., description: '...' }      ← described but doesn't mention the trap (extended here)

(Note: the claim comment's :346 for object-master-detail-form was stale on this tree — line 346 is embeddable-form's fields, not master-detail's. Re-derived directly against index.tsx on origin/main; see the report's out_of_scope_findings for that third surface.)

Coverage measured, both surfaces inherit route 1 for free:

  • form / view:form is registered on the exact same ObjectFormRenderer component as object-form — same code path by construction, not merely similar.
  • object-master-detail-form's parent fields (no sections) is passed straight through MasterDetailForm's parentSchema into <ObjectForm>; every sectioned branch in ObjectForm.tsx's formType routing guards on schema.sections?.length, so a fields-only parent always falls through to SimpleObjectForm regardless of formType. New pin: __tests__/topLevelFieldsWarnCoverage-8847.test.tsx, rendering MasterDetailForm directly and asserting the warning fires (and does not fire for a legal bare name — the firing control).

⇒ #8847's remaining work was documentation-only for both surfaces, closed here by extending/adding their registration description. Left as Refs (not Fixes) since the closing decision belongs to whoever reviews the measurement, but from this seat both halves are closed.

Existing probe (objectFormFieldsMembers-8071.test.tsx) — ran first, one assertion moved, on purpose

Ran unmodified against the new source change before touching the test file:

Test Files  1 failed (1)
     Tests  1 failed | 5 passed (6)

The only failure was row 4's expect(warn).not.toHaveBeenCalled() — which encoded the PRE-route-1 silence for the exact { field: 'note' } input the ruling requires to warn on. Rows 1/2/3/5/6 (all render-output assertions) were untouched. This is not "changed behaviour beyond a warning" — the render outcome in row 4 (toEqual([])) is byte-for-bit identical; only the "no warning happened" assumption is falsified, along exactly the axis the ruling changed on purpose.

Resolution: updated row 4 to assert the warning fires with the expected content (kept the render assertion), updated its title/comment and the file's top docblock (which also said "no console warning"), and added a new pin below row 6 with route 1's required firing control (fires for an unresolvable member, does not fire for a legal bare name) — mirrored in flatFields.test.ts for the drawer/modal path.

Re-ran after the test-file edit:

Test Files  1 passed (1)
     Tests  8 passed (8)

Tests

  • pnpm exec vitest run packages/plugin-form/src/__tests__/objectFormFieldsMembers-8071.test.tsx — EXIT=0, 8 passed (8) (was 6; +2 new pin), correct worktree path in output.
  • pnpm exec vitest run packages/plugin-form/src/__tests__/topLevelFieldsWarnCoverage-8847.test.tsx — EXIT=0, 2 passed (2).
  • pnpm --filter @object-ui/plugin-form test — EXIT=0, 89 files / 883 passed, 1 skipped (884) (was 88/877+1skip before this change).
  • pnpm --filter '@object-ui/plugin-form^...' build then pnpm --filter @object-ui/plugin-form run type-check — both EXIT=0 clean.
  • pnpm --filter '@object-ui/console^...' build (dependency closure, 35/47 projects) then pnpm --filter @object-ui/plugin-form build — EXIT=0.
  • pnpm --filter @object-ui/console run type-check — EXIT=0 clean.
  • pnpm exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.ts — EXIT=0, 198 passed (198). Its object-form.fields MEMBER_PINS entry quoted the pre-route-1 "dropped in SILENCE (no throw, no warning)" text — updated for accuracy (the entry's mechanical check only verifies the pin file exists/is collected/names the block+key, so this was documentation staleness, not a behavior-check break).
  • pnpm --filter @object-ui/console test (full sweep, required by dispatch) — run to completion; see the report comment on finding(plugin-form): object-form carries TWO surfaces spelled fields with different member vocabularies — the spec FormFieldSchema object is silently dropped by the top-level one #8738 for the captured count.

Ledger hazard (objectui#8614) — check-doc-example-types.mjs

UNGATED_EXAMPLES cited packages/plugin-form/src/ObjectForm.tsx:123 ObjectForm. This diff's one new import line (for warnUnresolvedTopLevelField) shifted the @example JSDoc block from :123 to :124 — confirmed by grepping @example before/after. Updated the ledger key to :124 in the same commit. pnpm check:doc-examples itself requires a full turbo run build across ~24 packages (farm-scale, not a targeted gate) so it was not run locally; the line-shift fix is evidence-based (direct before/after grep), not a guess.

Scope note (Clause-②: no)

No accept set, key, shape, or arm moves. No schema touched.

Changeset

.changeset/8738-fields-warn-route1.md — @object-ui/plugin-form patch (new runtime output on a published package).


Generated by Claude Code

…` member

Route 1 of objectui#8738 (ruled after route 2 landed as PR #8846): top-level
`fields` on `object-form` (and its shared read path — `form` / `view:form`,
and `object-master-detail-form`'s parent `fields`) reads only bare
field-name strings (`{ name }` tolerated). The spec `FormFieldSchema` object
that IS legal in `sections[].fields` (identity key `field`, e.g.
`{ field: 'note', colSpan: 2 }`) resolves to no name here and used to vanish
with no throw, no warning, no empty-state.

`warnUnresolvedTopLevelField` (new export in `sectionFields.ts`, beside its
existing `warnOnMixedVocabulary` sibling — same voice, same
once-per-occurrence dedupe discipline) now names the skipped shape and the
vocabulary difference. Wired into both read sites that resolve `fieldsToShow`
this way: `SimpleObjectForm`'s loop in `ObjectForm.tsx`, and `buildFlatFields`
in `flatFields.ts` (the drawer/modal path). The render outcome is unchanged
-- the member is still dropped, not resolved; this is diagnostic-only, not a
lenient `?? f.field` fallback (AGENTS.md #0.1 forbids exactly that).

Measured, not assumed (objectui#8847): `form`/`view:form` is the identical
`ObjectFormRenderer` component, and `object-master-detail-form`'s parent
`fields` (no `sections`) falls through to the same `SimpleObjectForm` branch
regardless of its own `formType` -- both inherit the warning for free, pinned
by a new test rendering `MasterDetailForm` directly. Both registrations'
`description` in `index.tsx` now also state the vocabulary, closing #8847's
remaining documentation half.

Test changes to the existing `objectFormFieldsMembers-8071.test.tsx` probe:
row 4's `expect(warn).not.toHaveBeenCalled()` documented the PRE-route-1
silence and is now the opposite of the ruled behavior for that exact input,
so it is updated to assert the warning fires with the expected content (the
render assertion -- still an empty result -- is unchanged, and rows 1/2/3/5/6
are byte-for-bit unchanged). A new pin below row 6 (and a matching one in
`flatFields.test.ts`) asserts route 1's required firing control: fires for an
unresolvable member, does not fire for a legal bare name.

`scripts/check-doc-example-types.mjs`'s `UNGATED_EXAMPLES` ledger cited
`ObjectForm.tsx:123 ObjectForm` (objectui#8614 hazard) -- the new import line
shifted its `@example` block to :124; the ledger key is updated to match.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
`registry-inputs-spec-parity.test.ts`'s `MEMBER_PINS['object-form.fields']`
quoted the pre-route-1 behavior verbatim ("dropped in SILENCE (no throw, no
warning)"), which objectui#8738 route 1 makes false for that exact input.
The mechanical check on this map (`memberPinProblem`) only verifies the pin
file exists, is collected by the runner, and names the block + key -- it
does not diff this prose against the file's content -- so this was
documentation staleness, not a behavior-check break. Corrected for accuracy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
@github-actions github-actions Bot added the apps label Sep 9, 2026
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3486.4 KB 3512.7 KB
Main entry chunk (gzip) 144.1 KB 350 KB
Entry file index-DUWBatDu.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 500.00KB 114.54KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 26.68KB 8.94KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 246.94KB 62.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.03KB 13.93KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.54KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 252.45KB 65.33KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.26KB 34.13KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 210.86KB 57.28KB
plugin-kanban (index.js) 57.03KB 16.26KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.55KB 3.32KB
plugin-view (index.js) 84.54KB 20.84KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.27KB 5.47KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

1 similar comment
@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3486.4 KB 3512.7 KB
Main entry chunk (gzip) 144.1 KB 350 KB
Entry file index-DUWBatDu.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 500.00KB 114.54KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 26.68KB 8.94KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 246.94KB 62.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.03KB 13.93KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.54KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 252.45KB 65.33KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.26KB 34.13KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 210.86KB 57.28KB
plugin-kanban (index.js) 57.03KB 16.26KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.55KB 3.32KB
plugin-view (index.js) 84.54KB 20.84KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.27KB 5.47KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-warren
os-warren marked this pull request as ready for review September 9, 2026 15:59
@os-warren
os-warren added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 8fda009 Sep 9, 2026
35 checks passed
@os-warren
os-warren deleted the claude/issue-8738-fields-warn-route1 branch September 9, 2026 16:17
os-warren pushed a commit that referenced this pull request Sep 9, 2026
…(objectui#8847)

`embeddable-form`'s top-level `fields` registration input had no description,
leaving the same trap #8738/#8846 already closed for `object-form`: an author
writing the spec `FormFieldSchema` object (`{ field: 'note' }`, legal in
`sections[].fields`) into this key resolves to no name and is silently
skipped. Add the description, modelled on `object-form` and `form`'s.

`EmbeddableForm` passes `config.fields` straight into `<ObjectForm>` with no
`sections`, so it renders through the same `SimpleObjectForm` read site —
measured with a throwaway render probe (not committed) that it already
inherits route 1's `console.warn` (objectui#8738/#8859): fires once for
`fields: [{ field: 'note' }]`, does not fire for `fields: ['note']`.

No behaviour change. Description text only.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 17, 2026
…(objectui#8847) (objectstack-ai#8869)

`embeddable-form`'s top-level `fields` registration input had no description,
leaving the same trap objectstack-ai#8738/objectstack-ai#8846 already closed for `object-form`: an author
writing the spec `FormFieldSchema` object (`{ field: 'note' }`, legal in
`sections[].fields`) into this key resolves to no name and is silently
skipped. Add the description, modelled on `object-form` and `form`'s.

`EmbeddableForm` passes `config.fields` straight into `<ObjectForm>` with no
`sections`, so it renders through the same `SimpleObjectForm` read site —
measured with a throwaway render probe (not committed) that it already
inherits route 1's `console.warn` (objectui#8738/objectstack-ai#8859): fires once for
`fields: [{ field: 'note' }]`, does not fire for `fields: ['note']`.

No behaviour change. Description text only.


Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants