Skip to content

fix(plugin-kanban,plugin-detail,app-shell): converge four private copies of the reference-bearing field family, and correct the "fourth and last" claim - #6064

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-5874-expandable-field-family-convergence
Aug 24, 2026
Merged

fix(plugin-kanban,plugin-detail,app-shell): converge four private copies of the reference-bearing field family, and correct the "fourth and last" claim#6064
yinlianghui merged 2 commits into
mainfrom
claude/issue-5874-expandable-field-family-convergence

Conversation

@yinlianghui

@yinlianghuiyinlianghui commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

Fixes#5874
Fixes#5875

Folded per the PM ruling on #5874: #5875's false claim is about the very copies#5874 converges, so landing the convergence alone would leave paramToField.ts asserting a count the same PR had just made wrong again — in the file the next consolidation reads first.

Verified at 011293ac6 (the final commit; the gate union below was re-run on that tree).

What changed

@object-ui/core's EXPANDABLE_FIELD_TYPES is the published reference-bearing field family. Four faces restated it inline, none deriving from it and none pinned against it. Each now reads it and carries an identity pin — a spy on its has — so a member-identical private copy fails rather than quietly re-forking the table. No face copies the set.

filewasnow
plugin-kanban/src/ObjectKanban.tsx:345lookup || master_detail || referenceisExpandableFieldType(def)
plugin-detail/src/RecordDetailDrawer.tsx:227lookup || master_detail || referenceisExpandableFieldType(def)
plugin-detail/src/HeaderHighlight.tsx:147reference || lookup || master_detail, inside isWideEXPANDABLE_FIELD_TYPES.has(resolvedType), the other three disjuncts untouched
app-shell/src/utils/resolveActionParams.ts:489lookup || referenceEXPANDABLE_FIELD_TYPES.has(resolveParamWidgetType(resolvedType))

Line-reference delta vs the card: none. All four anchors were re-derived on the merge-base (b65fe911d) and each is repo-wide unique — asserted before writing, over 3648 source files, because four of these five restatements are near-identical disjunctions. ObjectKanban.tsx lands at 345 rather than the card's 346 only because the card cited the line carrying the reference term inside a two-line statement.

The per-face judgement on user / tree — restoration on all four

The card explicitly did not pre-empt this. Decided per face, with the read site as the evidence:

  • RecordDetailDrawer — the guard forces a field read-only, and the file's own stated reason is "we don't yet wire a relation picker inside the drawer's inline editor — showing them as plain text inputs would let users overwrite the relation with a free-form string." That applies to user / tree verbatim: same foreign-key storage. Restoration.
  • HeaderHighlight — the guard grants the wide layout basis because "an editor (select / date / lookup) needs more room than a KPI number." The component's own dataSource prop doc already names lookup / user together as "the reference (lookup / user) editors". Restoration.
  • resolveActionParams — the guard populates the picker config paramToField forwards to the lookup-field widget. Without it a param reaches the dialog with no referenceTo and degrades to a plain record-id text input. Restoration.
  • ObjectKanban — no widening is possible; see the finding below.

None of the four would be widened, so nothing was stopped and reported under that rule.

resolveActionParams is the odd one — treated as its own judgement

It diverged on three members, not two: it also lacked master_detail, so a field-backed master_detail action param inherited no picker config at all and degraded to the unexplained "paste a UUID" box #3405 exists to prevent.

And it is the one face where reference does not drop, which is a measurement rather than an omission. reference is refused by the spec's ActionParamSchema too (pinned with lookup / master_detail / user / tree accepted as live controls and retired owner plus a nonsense spelling refused as dead ones) — but the dialog still accepts it from params already authored with it, via the PARAM_TYPE_ALIASES legacy dialect in paramToField.ts, which folds it to lookup. Dropping the branch outright would have silently degraded such a param to a text input.

So this face asks the shared family over the widget key that one alias table produces — read, not re-copied. That is deliberately the same expressionparamToField() evaluates one step later: this half populates a param's picker config and that half forwards it, so the two can no longer disagree. Measured over the entire spec FieldType vocabulary plus every alias key, exactly five inputs land in the family — lookup, master_detail, tree, user, reference — so nothing else widened.

HeaderHighlight's wider isWide disjunction — measured first, and pinned

isWide is two independent rules OR'd together. Only the reference-bearing one moved; email / url / textarea are this surface's own list (they widen because the value doesn't fit, not because of a picker) and are preserved verbatim. Three tests pin that they are still wide and that they are still not family members, so a later sweep cannot quietly absorb them.

The reference drop — measured, with live and dead controls

Against @objectstack/spec's closed FieldType (49 options): lookup / master_detail / user / tree present, reference absent, retired owner and a nonsense spelling absent. On HeaderHighlight it is unreachable from the authored side too — HighlightField['type'] is a closed TS union without it. Kept as an executable pin in each test file, so the day the spec adds the spelling these go red and the membership question reopens instead of the drop staying correct-by-accident.

The #5875 half — prose only, no new number

paramToField.ts said "This face held the fourth and last private copy"; paramToField.test.ts said "This module held the FOURTH and last hand-maintained answer." Both now say fourth converted, and neither states a replacement count — writing "the seventh and last" would re-create the defect with a bigger integer. Both point at the census and its falsification in the family's canonical home (packages/core/src/utils/expand-fields.ts), which is untouched here — it is read-only, already corrected by #5692.

Verification — the identity pin is the deliverable

Three new test files, 44 assertions. Ablation direction was predicted before running: replace a converged face with a member-identical private copy (new Set(['lookup', 'master_detail', 'tree', 'user'])) and its identity pin goes red while the member-set assertion stays green. Each file carries that contrast as an executable test, since it is the whole reason the pin is on identity.

Observed, per face — mutation proven on disk both ways (injected text present and removed text absent) before each read, restore under a trap … EXIT INT TERM with a cwd-independent command, all four confirmed byte-identical to their pre-ablation copies afterwards and git diff HEAD --stat empty:

faceidentity pinseverything else
resolveActionParams2 failed10 passed
RecordDetailDrawer2 failed23 passed
HeaderHighlight2 failed23 passed
ObjectKanban2 failed5 passed

One of these pins did not work at first, and the ablation is what caught it. The kanban pin, written as a bare vi.spyOn(EXPANDABLE_FIELD_TYPES, 'has').mock.calls check, passed its own ablation 6/6 greenObjectKanban.tsx also imports buildExpandFields, which consults the same shared object once per schema field on every render, so "some call happened" was satisfied by a face that never converged. The pin now filters recorded calls by the calling stack frame (measured: 3 calls from buildExpandFields, 1 from resolveDisplay) and fails as designed. The file keeps the un-attributed version as a green-either-way test documenting why the filter is there.

Counter-probes. (a) The restoration half is behaviourally checked on three faces and must be able to fail: user / tree fields are now read-only in the drawer, user / tree chips now get the wide basis, and master_detail / user / tree params now inherit all nine picker keys. (b) A type genuinely outside the family is still not reference-bearing — text / select stay editable, a select chip stays narrow, select / text params carry no picker config — so "converge" is not satisfiable by treating everything as a relation.

Out of scope, filed

#6063ObjectKanban's resolveDisplay guard is unreachable: if (isLookup && isOpaqueId(raw)) return undefined; is immediately followed by if (isOpaqueId(raw)) return undefined;, which subsumes it for every input. So no membership delta on that face is observable in either direction, and its test file records that absence rather than writing a counter-probe that cannot fail. That is a redundant guard, not a forked table — a different defect class — and the fix needs a decision (delete the dead branch, or narrow the over-broad line), so it is filed rather than fixed here. Converging the copy stays correct on its own terms: the day the guard is made live it reads the family instead of a stale literal.

ActionParamDialog.tsx:351 was not swept — it is a different rule (degraded-hint, not reference-bearing) and is already #5654.

Gates, by name with exit codes

Re-run at 011293ac6. Dependency closures built first — pnpm --filter with the per-package upstream-closure selector (name followed by caret-ellipsis) then build, exit 0.

gateexit
pnpm check:esm-specifiers0 — "Specifier leg: no un-ledgered package emits an extensionless relative specifier."
type-check@object-ui/plugin-kanban / plugin-detail / app-shell0 / 0 / 0
lint (plain eslint .) — same three packages0 / 0 / 0
vitest packages/plugin-kanban/ packages/plugin-detail/0 — 116 files, 1049 tests passed
vitest packages/app-shell/src/utils/ + the 5 ActionParamDialog / DeclaredActionsBar consumers0 — 30 files, 542 tests passed
vitest — the 19 RecordDetailView / RelatedRecordActionsBridge consumer files0 — 167 tests passed
check:phantom-deps / check:self-import / check:spec-symbols / check:action-forward-parity / check:icon-record-names / check:i18n-keys0 each
check-changeset-presence / check-changeset-no-major / check-changeset-fixed / check-control-bytes / check-lint-coverage / check-type-check-coverage0 each

check:esm-specifiers was missing from the first gate set, and that is the reusable lesson. The set was re-derived by hand from package.json and .github/workflows/ — correct practice here, since this repo has no dispatch-gate deriver — but it was derived against top-level script names, and this gate runs as a step inside the Type Check CI job under a name that does not read like a type check. The second pass enumerated that job's own step list instead, which is what added check:esm-specifiers, check:spec-symbols, check:action-forward-parity, check:icon-record-names and check:i18n-keys above. Rule worth carrying: any PR adding a new relative import to a published package must run check:esm-specifiers, and a hand-derived gate set should be checked against the CI job's step list, not only against top-level script names.

The gate's verdict is repo-wide across all 39 published ESM packages, so it also clears plugin-kanban and plugin-detail. Confirmed independently: the only relative import this branch adds to published source is the one fixed here — every other added import is either a package specifier (@object-ui/core) or lives in the three new test files, which no published build emits.

app-shell vitest was path-filtered, never whole-package (~784 s on the shared lock), and every invocation was the root-form pnpm exec vitest run with explicit paths — no --filter form anywhere. type-check is hyphenated and each run echoed its script name, so none of them was a zero-match silent pass. Every exit code was captured before any pipe.

Changeset: .changeset/5874-expandable-field-family-convergence.mdpatch on all three packages, since each face's accepted field set changes observably.

⛔ Draft on purpose — the PM lands this. Not marked ready, not enqueued, no auto-merge.


Generated by Claude Code

…ies of the reference-bearing field family
Four faces restated `@object-ui/core`'s `EXPANDABLE_FIELD_TYPES` inline, none
deriving from it and none pinned against it, and every one diverged from it in
BOTH directions: all four lacked `user` and `tree`, and all four carried a
fifth spelling `reference` that no producer can emit. Each now reads the
published family and carries an identity pin (a spy on its `has`) so a
member-identical private copy fails rather than quietly re-forking the table.
`resolveActionParams` also lacked `master_detail`, so a field-backed
`master_detail` action param inherited no picker config and degraded to the
"paste a record id" text input #3405 exists to prevent. It keeps answering for
`reference` through the one alias table in `paramToField`, which the dialog
still accepts from params already authored with it — the same expression
`paramToField` evaluates one step later, so the half that populates a param's
picker config and the half that forwards it can no longer disagree.
Also corrects the two now-false "fourth and last private copy" claims in
`paramToField.ts` / `paramToField.test.ts`, pointing at the census in the
family's canonical home rather than restating a count locally.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3219.9 KB3990.2 KB
Main entry chunk (gzip)153.6 KB350 KB
Entry fileindex-tfJ2D4w2.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)10.38KB3.90KB
app-shell (runtime-config.js)18.10KB6.51KB
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)505.15KB114.53KB
core (index.js)4.92KB1.97KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)165.30KB45.79KB
fields (index.js)238.40KB59.89KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)7.77KB3.13KB
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.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.44KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)244.04KB61.85KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.63KB30.64KB
plugin-gantt (index.js)164.15KB39.88KB
plugin-grid (index.js)200.79KB54.26KB
plugin-kanban (index.js)52.89KB14.59KB
plugin-list (index.js)111.86KB27.22KB
plugin-map (index.js)20.11KB6.64KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.57KB20.74KB
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)52.40KB17.45KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
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)7.54KB2.63KB
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)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.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.49KB2.14KB
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

…nsion
`check:esm-specifiers` (inside the Type Check CI job) caught the relative
specifier this PR added: Node's ESM resolver does not extension-search relative
specifiers and app-shell's build emits them unchanged, so the published entry
could not be imported under plain Node.
Part of #5874
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3220.9 KB3990.2 KB
Main entry chunk (gzip)153.7 KB350 KB
Entry fileindex-C8YNqNyz.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)10.38KB3.90KB
app-shell (runtime-config.js)18.10KB6.51KB
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)505.15KB114.53KB
core (index.js)4.92KB1.97KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)166.86KB46.08KB
fields (index.js)238.40KB59.89KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)7.77KB3.13KB
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.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.44KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)244.04KB61.85KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.63KB30.64KB
plugin-gantt (index.js)164.15KB39.88KB
plugin-grid (index.js)200.79KB54.26KB
plugin-kanban (index.js)52.89KB14.59KB
plugin-list (index.js)111.86KB27.22KB
plugin-map (index.js)20.11KB6.64KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.57KB20.74KB
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)52.40KB17.45KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
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)7.54KB2.63KB
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)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.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.49KB2.14KB
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