Skip to content

fix(plugin-form): a line-items grid does not offer a cell the caller may read but not edit (objectui#10163) - #10233

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-10163-line-items-field-write-gate
Sep 24, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-10163-line-items-field-write-gate

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #10163 — this lands the record:line_items half (LineItemsPanel). The master-detail form's own child grid (MasterDetailForm, object-master-detail-form) carries the same gap, measured below, and could not be reached here without editing MasterDetailForm.tsx, which this dispatch fences (objectui#9909's branch edits that file). So the card stays open for that half.

Clause-②: no — measured on this diff, not asserted: @object-ui/plugin-form publishes . only, from index.tsx, which does not re-export fieldWriteGate.ts. After a build on this head, dist/index.d.ts answers applyColumnPermissions 0 hits and fieldWriteGate 0 hits, with the positive control LineItemsPanel 2 hits in the same file — so the zeros are measured absences. LineItemsPanel's props are unchanged, no authored key changes meaning, no accept set is relaxed, and the fail-open-with-no-provider posture objectui#10161 kept is unchanged.

Step 1 — what reproduced on main, with the lit control

Run on unmodified origin/main at 62597c58, before any source change, with the card's sibling setup: a reporter principal whose permission set marks kpi_entry_line.score readable: true, editable: false (plus reviewer_note readable: false), and an object-level grant that allows editing everything else on the child object.

surface refused column score lit control actual_value / indicator_name (same grid, same rows)
record:line_items panel (LineItemsPanel) every cell a live, enabled input — reproduces enabled
master-detail form child grid (MasterDetailForm) enabled — reproduces (one-off probe, not committed) enabled

The pin file added here, run against that unmodified tree: 2 failed / 4 passed. The two reds are the refused-column row (expected false to be true on the score cells' disabled) and the unreadable-column row (3 Reviewer note cells rendered where 0 are expected). The four greens are the controls: add/remove lines, an unrestricted caller, no permission provider, and a readonly panel. So the finding is a difference inside one grid, not an absence.

⚠️ Two dispatch assumptions measured: the panel is not the only line-items grid in plugin-form/src — MasterDetailForm renders the same LineItemsField and consults no permission either (it does not read schema.readonly at all). And there was no cell-level adapter in fieldWriteGate.ts: handing the grid applyFieldPermissions' output would drop unreadable columns and lock nothing, because a grid column does not read disabled / readOnly.

The route — the one pass, reused

  • fieldWriteGate.ts: the loop applyFieldPermissions carried is now gateByPermission, the ONE pass that asks checkField(object, field, 'read' | 'write') and decides omit / keep / mark. applyFieldPermissions calls it with the form's mark (readOnly + disabled, plus the optional description), so ObjectForm, ModalForm and DrawerForm render exactly what they rendered before. The new applyColumnPermissions calls the SAME pass with the grid's mark. ⛔ No verdict is re-derived.
  • The grid's mark is readonlyWhen: 'true'. A GridColumn has exactly one per-cell lock channel, readonlyWhen, which the grid evaluates per row and renders as a disabled control; a field-level refusal does not depend on the row, so the predicate that expresses it is the constant one. A refused column that declared its own narrower readonlyWhen is locked on every row regardless (pinned).
  • LineItemsPanel.tsx: usePermissions() plus one call, applyColumnPermissions(schema.columns, { perms, objectName: schema.childObject }), inside the existing gridField memo. allow_add / allow_delete stay on schema.readonly, untouched.

What changes, observably

  • A column the caller may read but not edit renders its cells disabled, on loaded rows and on the entry row. Permitted columns in the same grid stay editable.
  • A column the caller may not read is omitted, as the form containers already omit such a field. That is the reused pass's other half; it is pinned, not incidental.
  • Adding and removing lines are unchanged.
  • No permission provider mounted: byte-for-byte the grid it was — every column, every cell editable (pinned).

Ablation — committed first, mutated, restored

Mutation through ablation-replace.mjs (wrap mode, restore armed on exit and signals), on the committed head f87c020e: the gate wiring columns: applyColumnPermissions(schema.columns, { perms, objectName: schema.childObject }), replaced by columns: schema.columns, in LineItemsPanel.tsx.

  • Landed on disk: anchor x1 to x0, replacement x0 to x1, blob 44b47677f220 to 7b8ee94590f9.
  • Result: 3 failed / 4 passed. The three reds are exactly the refusal rows — the refused column, the refused column under a narrower authored lock, the unreadable column — each failing on its refusal assertion; in the two lock rows the lit-control assertion above it in the same test had already passed. The four controls stayed green.
  • Restore: blob after restore 44b47677f220 equals the HEAD blob, and git diff HEAD is empty.
  • Direction observed: turn-red, as expected. No dist/ is involved: the pins import ./LineItemsPanel by relative path, and the root vitest config aliases every @object-ui/* specifier to src.

Checks on this head (f87c020e)

  • pnpm exec vitest run packages/plugin-form/ from the repo root, through the shared verify lock: 109 files, 1051 passed, 1 skipped, exit 0.
  • pnpm --filter @object-ui/plugin-form type-check: exit 0, after building the dependency closure (turbo run build --filter=@object-ui/plugin-form^...). The script runs tsc -p tsconfig.test.json as well, and --listFiles shows the new test file in it.
  • eslint . in packages/plugin-form: exit 0, 0 errors across 142 files.
  • Gates, each exit 0: check:control-bytes, check:new-line-citations (0 new citations), node scripts/check-changeset-presence.mjs, check-changeset-no-major, check:changeset-claims, check:pending-changeset-literals, check:test-path-roots, check:vi-mock-override-shape, check:unreferenced-sources, check:phantom-deps, check-lint-coverage; check-governed-queue-guard --test on the four paths answers NOT GOVERNED.

Acceptance notes

  • The outbound half is not touched, and no 403 is claimed. The card grades this as an affordance defect. Three grid paths can still put a refused column on a child op, none measured against a server here: duplicating a line copies its values into a create; a lookup cell's autofill copies matching fields into sibling columns (it skips computed columns, not locked ones); and the entry row is materialised with every column set to null. Updates are already narrowed to dirty cells by objectui#10154.
  • A cleaner lock exists but is fenced here. A static per-column lock read by the grid itself would avoid spelling a row-independent verdict as a constant predicate. It needs an edit under packages/fields/src/widgets/ (fenced for this dispatch, objectui#10225) and a new member on the published GridColumn type. Owner of that file: none named.
  • fieldWriteGate.ts gains two no-explicit-any warnings, from the same Record constraint the existing applyFieldPermissions signature already carries.
  • The commit carries a model-named Co-Authored-By trailer; noted here rather than rewritten (history is not rewritten on this repository).
  • The remaining half of finding(plugin-form): the master-detail line-items grid consults no field-level permission — an FLS editable:false column renders as a live editable cell, one container outside objectui#10120's fix #10163: route MasterDetailForm's LineItemsField columns through applyColumnPermissions (the child object name is already on each detail entry): a usePermissions() read plus one call, once that file is free.

Dispatched by the domain:ui seat; this session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC.


Generated by Claude Code

…may read but not edit

The `record:line_items` panel read only `schema.readonly`, so a column the
caller's permission set marks `editable: false` rendered as a live editable
cell on the same page where the record form already disables that field.

Route the panel's columns through the ONE render pass the form containers
share (`fieldWriteGate.ts`), adapted to the grid's single per-cell lock
channel: refused columns lock on every row, unreadable columns are omitted,
permitted columns are untouched. Adding/removing lines stay on
`schema.readonly`; with no permission provider the grid is unchanged
(fail-open, as before).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3035.7 KB 3104.5 KB
Main entry chunk (gzip) 147.5 KB 350 KB
Entry file index-3srE3ROP.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.68KB 6.20KB
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) 546.84KB 130.95KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 222.47KB 61.83KB
fields (index.js) 252.81KB 63.78KB
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) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 33.36KB 10.88KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.02KB 11.00KB
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) 5.52KB 2.10KB
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) 51.44KB 14.62KB
plugin-charts (index.js) 71.73KB 20.08KB
plugin-chatbot (index.js) 198.20KB 47.14KB
plugin-dashboard (index.js) 132.96KB 35.17KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 257.23KB 66.93KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 144.17KB 36.88KB
plugin-gantt (index.js) 167.99KB 41.37KB
plugin-grid (index.js) 214.64KB 58.59KB
plugin-kanban (index.js) 48.71KB 15.17KB
plugin-list (index.js) 113.53KB 27.99KB
plugin-map (index.js) 21.74KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.49KB 11.97KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.18KB 21.05KB
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) 106.60KB 35.16KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.38KB 1.98KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.74KB 2.54KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 15.71KB 5.30KB
types (ai.js) 4.11KB 2.06KB
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) 5.00KB 2.39KB
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) 17.15KB 6.32KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: f87c020e

Rendered by an isolated review subagent spawned by this seat and fed only the card, the PR, PR objectui#10161's landed diff and the two trees. Its transcript stamp, verbatim: 「You are powered by the model named Fable 5.1. The exact model ID is claude-fable-5-1.」 Adopted by this seat.

① Derived judgments

  • The public surface is unchanged. exports is . only; packages/plugin-form/src/index.tsx is byte-identical to origin/main and re-exports nothing from ./fieldWriteGate. applyColumnPermissions is a module-level export that cannot be reached from the entry, and gateByPermission is not exported at all. LineItemsPanel's props and LineItemsPanelSchema are untouched. RIGHT.
  • The applyFieldPermissions refactor is output-identical: same signature, same branch order, the same markDenied shape, same-reference early returns, and the three form call sites are untouched. RIGHT.
  • Fail-open is unchanged: with no provider, or a provider still loading, schema.columns comes back by reference (pinned). RIGHT.
  • The grid lock is correct: readonlyWhen is GridColumn's only per-cell lock channel. The literal 'true' evaluates to locked for text, number, select, lookup and file cells, and the entry row shares the renderer. An authored, narrower readonlyWhen is replaced, which is observably equivalent for a row-independent refusal and strictly safer, since an authored parent.* predicate would fault open with no contextRecord. Unreadable columns are omitted by the same branch the forms use. allow_add / allow_delete still follow schema.readonly only. RIGHT.

② Semver level

'@object-ui/plugin-form': patch — RIGHT (an affordance fix, no published change; same as the objectui#10161 precedent). Every sentence was checked against the diff and is TRUE. The 「Not here.」 paragraph states plainly that the master-detail form's own grid is not changed, so the entry does not imply it is fixed. Nothing to quote.

③ Boundary flags

  • Part of #10163 rather than Fixes is correct: MasterDetailForm.tsx has an empty diff, and the fence is real (objectui#9909's branch edits it).
  • Clause-②: no is TRUE, measured.
  • The Acceptance notes check out. The model-named trailer on f87c020e is declared, not hidden.
  • Check-runs on f87c020e: 43, all terminal — 42 green or skipped; 1 red = Spec Main Shape Gate on the three untouched test files ⇒ the objectui#10229 drift, ⛔ not this PR's.

Implemented-by: claude/issue-10163-line-items-field-write-gate
Reviewed-by: session_01BA3nKVUwKQJf8DBxrSVtNC

VERDICT: PASS

Landing: draft until Spec Main Shape Gate is green (objectui#10229). Then: ready → auto-merge.


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3035.7 KB 3104.5 KB
Main entry chunk (gzip) 147.5 KB 350 KB
Entry file index-3srE3ROP.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.68KB 6.20KB
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) 546.84KB 130.95KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 222.47KB 61.83KB
fields (index.js) 252.81KB 63.78KB
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) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 33.36KB 10.88KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.02KB 11.00KB
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) 5.52KB 2.10KB
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) 51.44KB 14.62KB
plugin-charts (index.js) 71.73KB 20.08KB
plugin-chatbot (index.js) 198.20KB 47.14KB
plugin-dashboard (index.js) 132.96KB 35.17KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 257.23KB 66.93KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 144.17KB 36.88KB
plugin-gantt (index.js) 167.99KB 41.37KB
plugin-grid (index.js) 214.64KB 58.59KB
plugin-kanban (index.js) 48.71KB 15.17KB
plugin-list (index.js) 113.53KB 27.99KB
plugin-map (index.js) 21.74KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.49KB 11.97KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.18KB 21.05KB
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) 106.60KB 35.16KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.38KB 1.98KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.74KB 2.54KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 15.71KB 5.30KB
types (ai.js) 4.11KB 2.06KB
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) 5.00KB 2.39KB
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) 17.15KB 6.32KB
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

Sign up for free to 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.

1 participant