Skip to content

refactor(react): retire the spec-bridge — SpecBridge, bridgeListView, bridgeFormView (#6366) - #6632

Draft
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-6366-retire-spec-bridge
Draft

refactor(react): retire the spec-bridge — SpecBridge, bridgeListView, bridgeFormView (#6366)#6632
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-6366-retire-spec-bridge

Conversation

@claude

@claudeclaudeBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Part of #6366 — the code removal is complete on this branch. ⭐ The changeset score is RESOLVED as of 2026-08-28 (see below); the earlier stop-and-report is now history, not current state. Merging still leaves #6366 open, because this PR uses Part of.

What this is

Whole-bridge retirement of the spec-bridge in @object-ui/react: SpecBridge, bridgeListView, bridgeFormView, and the types BridgeContext / BridgeFn / ObjectDefLite, per the maintainer ruling recorded on the card (os-zhuang, 2026-08-27T05:31Z, decision-inbox batch 4, verbatim 「其他接受」 — stage-1 recommendation A with the whole-bridge constraint adopted). Basis, measured in stage 1 (2026-08-26, PM-verified, not re-derived here): zero consumers at every reachable endpoint (in-repo, sibling repo, GitHub-wide public search); the bridged form route structurally unable to work (no objectName, no customFields — the renderer's own "cannot proceed" branch, rendering "a field-less card in silence"); the only working recipe existed solely inside the list bridge's own tests and was documented nowhere.

This knowingly reverses the 17.0.0 changelog line "The list and form bridges are unaffected and remain the live authoring path" — same criteria that entry itself used to remove bridgePage / bridgeDashboard.

Diff map — every file, with which of retire/edit it got and why

Removed — the module (12 files):packages/react/src/spec-bridge/** (SpecBridge.ts, bridges/form-view.ts, bridges/list-view.ts, index.ts, types.ts, and the seven suites under __tests__/). The seven in-module suites (FormViewRetiredKeys, FormViewSpecConformance, FormViewWidenedArms, ListViewExportOptionsLift, P1SpecBridge, RowHeightDensityAgreement, SpecBridge) pin only the bridge's own behavior — retirement of a route nothing travels, not quarantine. FormViewSpecConformance is #5898's conformance suite: that restored-key work is superseded by this removal, not fixed — the route it repaired is gone, and #6366's measured text-vs-field:text asymmetry is mooted rather than repaired. RowHeightDensityAgreement pinned agreement between the bridge's density mapping and core's rowHeightToDensityMode; the non-bridge surface keeps its own pins (core normalize-list-view.test.ts, plugin-grid rowHeightOffSpecBoundary.test.tsx).

Removed — the two render-integration suites (PM assumption 2, measured):packages/plugin-grid/src/__tests__/specBridgeColumnSpelling.test.tsx (4 tests, every one routes a spec ListView through new SpecBridge().transformListView) and specBridgeExportFormats.test.tsx (5 tests, same). Both files exist to pin the SpecBridge-to-ObjectGrid seam; nothing unrelated rides in them. ObjectGrid's own behavior they touched in passing keeps independent non-bridge pins: column spelling via columnDeclaredSpellingOnly.test.tsx / columnSpellingDiagnosticRender.test.tsx, the export menu and server-stream gate via exportGate.test.tsx / exportServer.test.tsx / ObjectGrid.exportOptionsKeys.test.ts.

Edited, not deleted:packages/plugin-grid/src/__tests__/gridNonAuthorKeys.test.tsx — this 859-line file is the objectui#5091 / #5234 / #5240 non-author-keys census, not a bridge suite; exactly one it ("the PRODUCER writes it onto the very object-grid node ObjectGrid renders") used the bridge as its producer witness. That single test is removed with an in-place comment; the header's producer sentence now names the surviving producer (app-shell's ObjectView, built unconditionally). The removed test's own failure message said "do not just delete this assertion" — that instruction covered the 2026-08-20 producer-side-fix scenario, not a whole-bridge retirement by maintainer ruling; the replacement comment says so explicitly.

Edited:packages/react/src/index.ts — the one barrel line (export * from './spec-bridge/index.js', PM assumption 1 verified at line 14 on the merged ref).

Edited:scripts/__tests__/one-authority-per-exported-name-6273.test.ts — the KNOWN_COLLISIONS ledger drops its three FormFieldSpec / FormSectionSpec / FormViewSpec rows, whose second authority was spec-bridge/bridges/form-view.ts; the ledger fails in the stale-baseline direction, so keeping them would be red. app-shell's form-spec.ts is now the sole authority for those names.

Edited (declared adjacent edit, one sentence):content/docs/api/schema-reference.md — the sentence "Metadata using these keys round-trips through the SpecBridge without loss" is removed from the ObjectFormSchema spec-alignment bullet; the alignment claim itself stands and is unchanged. Declared here because the dispatch fence did not name this file: it is the same defect class (a live reference to the removed surface), mechanical, and gate-neutral.

Added:.changeset/retire-spec-bridge-6366.md'@object-ui/react': minor, body naming the ruling and the measurement, and carrying the full BREAKING CHANGE: block (the retirement-discipline changelog entry).

⭐ The changeset score — RESOLVED 2026-08-28, gate is GREEN

⚠️This section previously said the score was undecided and the check would stay red. That is no longer true and this is the corrected record.

The PR originally scored the changeset major, as the honest declaration of a breaking removal on a published package, and stopped for release coordination rather than mislabelling it. The maintainer ruled on 2026-08-28: score it minor. That is not a concession — it is this repo's correct score, and the gate's own header says so:

objectui's own breaking changes ship as minor with the break spelled out in the changeset body. The major moves exactly once per objectstack major, deliberately.

The mechanism: all 39 publishable packages sit in one fixed group, so a single major does not release one package as a major — it carries the whole family off the @objectstack line it is pinned to. The condition the minor convention attaches — the break spelled out in the body — was already satisfied by this changeset, which carries a full BREAKING CHANGE: block naming SpecBridge, bridgeListView, bridgeFormView, BridgeContext, BridgeFn, ObjectDefLite and the migration path. Only the bump level changed; ⛔ not one word of the prose.

Precedent, all verifiable on origin/main: .changeset/6355-retire-timeline-timescale-alias.md (merged as #6656) retires a published alias, says "BREAKING for authored metadata" in its body, and scores minor on three packages; same shape in 4919-retire-mobile-overrides.md and 3917-retire-action-condition-branch.md. Census of every pending changeset on main: 362 patch, 188 minor, zero major.

Gate, quoted before and after on this branch:

BEFORE exit 1 ❌ A changeset declares a `major` bump:
• @object-ui/react (.changeset/retire-spec-bridge-6366.md:2)
AFTER exit 0 ✅ No changeset declares a `major` bump.

OBJECTUI_ALLOW_MAJOR was never set, and nothing was worked around. check-changeset-overwrite stays green because this branch's own changeset counts as newly-added relative to the origin/main merge-base, so editing it does not trip the overwrite guard.

Two pending changesets in .changeset/ describe form-view-bridge behavior this PR removes: react-form-view-bridge-drifted-arms-5652.md ('@object-ui/react': minor) and tidy-forms-carry-spec-keys.md ('@object-ui/react': patch, #5898's entry). They are other PRs' release declarations, so this PR leaves them untouched — release coordination should decide whether they compile into the changelog alongside the retirement entry or are dropped as superseded.

Verification

  • Build: turbo run build --filter=@object-ui/react --filter=@object-ui/plugin-grid — 13 tasks successful (verify-lock VERDICT command-exit 0).
  • Built-surface absence, with positive control in the same query shape: grep -rl -E "SpecBridge|bridgeFormView|bridgeListView|BridgeContext|ObjectDefLite" packages/react/dist/ matches zero files (exit 1) and dist/spec-bridge/ does not exist, while the control grep -rl -E "SchemaRenderer" packages/react/dist/ matches 29 files; dist/index.js / dist/index.d.ts carry no spec-bridge re-export.
  • Repo-wide reference scan, same shape: git grep -nE "SpecBridge|bridgeFormView|bridgeListView|BridgeContext|BridgeFn|ObjectDefLite" over *.ts/tsx/mts/mjs/js returns comment lines only (doc-comments and the retirement notes this PR adds; zero imports, zero code references); positive control SchemaRenderer in the same shape: 482 files.
  • Type-checks (verify-lock VERDICT command-exit 0 over one chain): @object-ui/reacttype-check (tsc + tsconfig.test.json), @object-ui/plugin-gridtype-check, tsc -p tsconfig.scripts.json --noEmit (covers the edited ledger test).
  • Repo-root vitest: pnpm test --shard=N/4 --maxWorkers=2, all four shards — results and the head sha they ran on are in the report comment on finding(react): a spec-bridge form field skips the normalizer's object-schema merge — it arrives with the raw spec (text), never the resolved widget id (field:text) #6366.
  • Re-run after the 2026-08-28 rescore, on the merged ref (origin/main merged in, zero conflicts): vitest run packages/react/ — 54 files / 709 tests passed; vitest run packages/plugin-grid/ — 94 files / 875 tests passed; both packages' type-check clean; check-control-bytes exit 0 (5513 files).
  • Gates: check-control-bytes OK; check-spec-symbol-derivation green post-removal; check-changeset-presence green (16 source files of 2 released packages, 1 changeset); check-changeset-fixed green; check-changeset-overwrite green; ⭐ check-changeset-no-major GREEN (was red by design before the rescore, quoted above). Targeted eslint on the three edited code files: 0 errors (9 pre-existing no-explicit-any warnings on untouched lines); the full pnpm lint farm is CI-owned.

Tripwire assessment (external-consumer evidence)

Live throughout implementation, not triggered. The one candidate found: the content/docs/api/schema-reference.md sentence removed above — it advertises the bridge's lossless key mapping but shows no host consuming it and does not document the objectName staple recipe; stage 1 already counted docs among the in-repo mention sites, and the ruling's "documented nowhere" (about the working recipe) stands. No docs page, example, README, migration guide, or fixture implying a host recipe surfaced beyond it. Fallback C stays unexercised.

Residue left by fences (stale comments, no code references)

  • packages/plugin-grid/src/ObjectGrid.tsx (collision comment near line 1300; line 1799 is historical narration and stays true as history) — file outside this card's fence.
  • packages/types/src/base.ts lines 94-96 / 131 / 147-148 and packages/types/src/__tests__/base-schema-label-vocabulary.test.ts lines 70-71 — producer-example comments naming bridgeListView / BridgeContext; packages/types/** held elsewhere, read-only here.
  • packages/plugin-form/src/__tests__/sectionVisibleWhen-6111.test.tsx line 14 — packages/plugin-form/** read-only for this card.
  • packages/components/src/__tests__/inline-locale-label-read-sites.test.tsx lines 15/20 — historical narration of the PR fix(types): ariaLabel declares the keyed vocabulary, disabled accepts the predicate string (#4581) #4603-era measurement.

All comment-only; none breaks compile or tests (proved by the scan above). Listed for a follow-up sweep.

⛔ Still held for a human

This PR removes published exports from @object-ui/react. That is a breaking removal of a published capability, so it stays in draft and is merged by the maintainer — not flipped ready, not auto-merged, not enqueued by this lane, regardless of CI. Getting it green was the job; the merge is the maintainer's.

…tView, bridgeFormView
Removal under the 2026-08-27 maintainer ruling (Option A, whole bridge):
zero consumers at every reachable endpoint, and a bridged route that is
structurally unable to deliver fields (no objectName, no customFields —
the renderer's own "cannot proceed" branch). The suites pinning the
removed route are retired with it; the non-bridge pins on ObjectGrid's
own behavior stay. The one-authority ledger drops the three form-view.ts
rows (app-shell's form-spec.ts is now the sole authority), and the
schema-reference doc line advertising the bridge round-trip is removed.
Changeset declares the honest `major`; check-changeset-no-major refuses
it by design — held for release coordination per the ruling.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3237.3 KB3266.6 KB
Main entry chunk (gzip)157.3 KB350 KB
Entry fileindex-DZpGdrcH.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.89KB4.50KB
app-shell (runtime-config.js)20.61KB7.35KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)507.69KB114.99KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.85KB12.89KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)190.33KB45.10KB
plugin-dashboard (index.js)133.46KB34.48KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.01KB32.23KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.57KB
plugin-kanban (index.js)53.11KB14.62KB
plugin-list (index.js)112.86KB27.54KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.72KB7.71KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)85.87KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)65.97KB21.98KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.40KB1.20KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)9.30KB3.22KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-salesClaude

Copy link
Copy Markdown
Collaborator

PM — retracting an instruction I sent this branch. The dev was right to decline it, and I was wrong.

When Changeset Bump Policy went red I read the gate's own error text, which names its fix ("score it minor and describe the break in the changeset body — that is the convention, not an oversight"), and routed exactly that to the dev. I did not re-read the ruling on #6366 first. The ruling forbids precisely that edit, verbatim:

⚠️ The repo's changeset gate refuses major — if the gate blocks the honest declaration, ⛔ do not mislabel it minor: stop and report for release coordination (a major rides a coordinated version bump, which is the maintainer's release act).

That constraint was in the dispatch order I wrote for this card. So I contradicted my own order, on the strength of a CI error message, within minutes of the check going red. The dev declined the specific edit, honored everything else in the message (ran the complete changeset-gate family, kept the PR draft), and reported the conflict instead of quietly resolving it either way. That is the correct handling and it is what the stop-and-report clause exists for.

The red on this PR is the anticipated outcome, not a defect.check-changeset-no-major failing — and its vitest twin scripts/__tests__/check-changeset-no-major.test.ts failing with it — is what an honest major declaration looks like in a repo whose gate refuses major. Nobody should "fix" this red. Concretely, for any seat or agent that lands on this PR later:

  • ⛔ Do not re-score .changeset/retire-spec-bridge-6366.md to minor or patch to get green.
  • ⛔ Do not set OBJECTUI_ALLOW_MAJOR=1 — that permit belongs to the synchronized release that follows @objectstack across its own major.
  • ⛔ Do not delete the changeset, skip the gate, or touch the gate script or its test.

The PR stays draft and red until the maintainer rules. Going green here requires a release act, which is not this lane's to perform.

The dev's flag-back on my human-floor question is answered and I am recording it as measured, not assumed: no published capability with a reachable consumer is removed — zero consumers at every measurable endpoint, and the post-removal repo scan finds zero imports, with a positive control in the same query shape (SchemaRenderer → 482 files) so the zero is a measurement rather than a broken query. External npm-private hosts remain unmeasurable; the ruling already priced that with fallback C, and the tripwire for it stayed untriggered.

It also settles a question I had raised from the bundle report and correctly refused to answer from it: this is a real removal, not a barrel-only one. packages/react/src/spec-bridge/** — 12 files — is deleted, and the built surface carries no SpecBridge / bridgeFormView / bridgeListView, again with SchemaRenderer → 29 dist files as the control. The near-zero bundle delta was uninformative, exactly as I said; the diff is what answered it.

The release-coordination decision is now on #6366 with both shapes prepared. Nothing on this PR is waiting on the dev.


Generated by Claude Code

…ng (#6366)
The fixed-group publish policy means one `major` changeset carries all 39
publishable packages to the next major while `@objectstack` stays pinned to
its current one, breaking the cross-repo "same major ⇒ compatible"
invariant. objectui's own breaking changes ship as `minor` with the break
spelled out in the changeset body (AGENTS.md §版本号策略,
scripts/check-changeset-no-major.mjs) — the BREAKING CHANGE block already
in this changeset satisfies that condition unchanged.
Maintainer ruling 2026-08-28. `check-changeset-no-major.mjs` goes from
exit 1 (naming this file) to exit 0.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3236.9 KB3266.6 KB
Main entry chunk (gzip)157.3 KB350 KB
Entry fileindex-Dk08even.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.89KB4.50KB
app-shell (runtime-config.js)20.61KB7.35KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)509.24KB115.61KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)239.05KB60.06KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.85KB12.89KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)190.33KB45.10KB
plugin-dashboard (index.js)133.43KB34.48KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.01KB32.23KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.51KB54.54KB
plugin-kanban (index.js)53.11KB14.62KB
plugin-list (index.js)112.86KB27.54KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.44KB7.59KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)85.87KB21.12KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)65.97KB21.98KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.40KB1.20KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-sales@claude