Skip to content

refactor(i18n): retire the dead appDesigner.fieldDesigner.formula key - #6411

Merged
os-support-ai merged 2 commits into
mainfrom
claude/issue-6310-dead-designer-formula-key
Aug 25, 2026
Merged

refactor(i18n): retire the dead appDesigner.fieldDesigner.formula key#6411
os-support-ai merged 2 commits into
mainfrom
claude/issue-6310-dead-designer-formula-key

Conversation

@os-support-ai

@os-support-ai os-support-ai commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Fixes #6310

One key, eleven lines, zero readers: the appDesigner > fieldDesigner > formula leaf of all
ten locale packs plus its DESIGNER_DEFAULT_TRANSLATIONS row — and, since the PM's ruling
below, a pin so it cannot come back unnoticed.

Premise re-derived on this branch, not inherited from the card

objectui#6043 retired the Field Designer's formula-expression textarea, which held the key's
only call site (the { name: 'formula', label: t('appDesigner.fieldDesigner.formula') } field
descriptor in FieldDesigner.tsx). Re-measured at merge-base 062943f86:

check result
t()/tt() call sites for the dotted key 0 (grep -rn 'appDesigner\.fieldDesigner\.formula' → 1 hit, the defaults-map row itself)
dynamic template head that could reach it none — t(`appDesigner.fieldDesigner.typeCategory.${cat}`) is the namespace's only one, and formula is not under it
concatenation-built spelling ('…fieldDesigner.' + 'formula') 0
test / snapshot / fixture referencing the key 0 — grep -rln fieldDesigner --include='*.test.ts*' --include='*.snap' returns nothing
present in all ten packs yes, one row each

So the key's sole textual occurrence anywhere in the repo was the defaults-map row this PR
removes with it. That is why the reverse sweep tiered it NEEDS-REVIEW rather than CONFIRMED —
the footprint it found was the other half of the same deletion.

The card's fence held

designer.field.formula ('Formula (CEL)', packages/app-shell/src/views/metadata-admin/i18n.ts)
is a different, live key belonging to metadata-admin's ObjectFieldInspector — the surface
that still authors formula expressions. It is untouched; app-shell is not in this diff at all.
Every grep in this PR was run on the full dotted path, never the formula leaf. The pin's
failure message points a future reader at that key by name, so the next person to meet the two
spellings meets them together.

Map and packs move together

defaults-maps-mirror-en-pack fails a map row whose key the en pack lacks ("not an exception,
a finding"), and all-locales-key-parity fails a pack left behind. One commit moves all eleven,
so neither can go red — verified below rather than asserted.

The retirement pin — asked for, then ruled on

This PR originally shipped without a test, because the dispatch order held that a deletion
adds no behaviour to pin and that inventing an assertion would be theatre. That conflicted with
a four-instance convention in this repo, so the conflict was reported rather than silently
resolved either way. The PM ruled the dispatch clause wrong for this case and asked for the
pin
, and the reasoning is worth keeping next to the code: every i18n gate here runs call
site → key
, so a dead key coming back into the packs is invisible to all of them. That is an
unguarded direction, not a ritual.

packages/i18n/src/__tests__/appDesigner-fieldDesigner-formula-retired-6310.test.ts is the
fifth in the series (objectui#4145, objectui#4392, objectui#4730, objectui#5504) and matches
their shape: the retired leaf absent from all ten packs, plus surviving-sibling assertions so a
green cannot be bought by deleting the neighbourhood.

⚠️ The surviving list is not "the rows next to it". The row that immediately followed the
retired one — options — is deliberately excluded, along with addOption, addRule,
noFields, searchPlaceholder, systemBadge, ungrouped and validationRules: all eight are
NEEDS-REVIEW candidates of the same reverse sweep, with the same defaults-map-only footprint the
retired key had, and none has been individually confirmed either way. Pinning "these survive"
against keys that may themselves be dead would bake an unverified claim into the guard. Every
key the list does name was confirmed live by call site in FieldDesigner.tsx. A fourth case
pins the typeCategory.* family, whose members are reached only by substitution and are
therefore exactly what a future literal-argument sweep would mistake for dead.

Reverse-verified, direction predicted before running. Reviving the row in all ten packs
(mutation proven on disk first: 10 revived rows, 10 files changed, 10 insertions(+)):

× no pack defines the retired formula label
  expected [ …(10) ] to deeply equal []
  + [ "en :: appDesigner.fieldDesigner.formula", "zh :: …", "ja :: …", "ko :: …", "de :: …",
      "fr :: …", "es :: …", "pt :: …", "ru :: …", "ar :: …" ]

Test Files  1 failed | 2 passed (3)
     Tests  1 failed | 47 passed (48)

Exactly one case red, naming each pack; all-locales-key-parity and
defaults-maps-mirror-en-pack both stayed green through the revival — which is the whole
argument for the pin, demonstrated instead of claimed. Restore was proven by bytes, not by an
exit code: all ten packs hash-equal to their HEAD blobs, git diff HEAD empty for the locales
directory, and every measurement quoted below ran after that restore.

Before / after, and a positive control on the measuring tool

node scripts/check-i18n-dead-keys.mjs --strict:

before: Pack keys (en …): 2848 … 390 candidate(s) … across 55 namespace(s):
        150 CONFIRMED, 240 NEEDS-REVIEW
        appDesigner.fieldDesigner (0 confirmed, 9 needs-review):
          [needs-review]  appDesigner.fieldDesigner.formula
            → textual hit: packages/plugin-designer/src/hooks/useDesignerTranslation.ts

after:  Pack keys (en …): 2847 … 389 candidate(s) … across 55 namespace(s):
        150 CONFIRMED, 239 NEEDS-REVIEW
        appDesigner.fieldDesigner (0 confirmed, 8 needs-review):
          (formula absent)

Exactly one key left the pack and one candidate left the report; the CONFIRMED tier and every
other namespace are unchanged, and re-running it at the final commit confirms the new test file
adds no textual footprint that would move another key's tier. ⚠️ --strict exits 1 both
before and after
— that exit code is about the 150 CONFIRMED keys of the standing backlog
(#4730), not about this change. It is quoted here so nobody later reads a 1 as a regression
this PR introduced.

Positive control — the tool still names a key I know is live, when asked. Ablation on
appDesigner.fieldDesigner.allTypes (live: one call site at FieldDesigner.tsx:402, one
defaults-map row, absent from the report at HEAD), each leg proven on disk by occurrence count
before reading any output:

baseline                     call sites 1 · defaults-map rows 1 · absent from report
leg A  remove the call site  call sites 0 → [needs-review] appDesigner.fieldDesigner.allTypes
                                             textual hit: useDesignerTranslation.ts
leg B  also remove the row   map rows 0   → [confirmed]    appDesigner.fieldDesigner.allTypes
restore                      FieldDesigner.tsx         f857c299103d0e8694280dd055ad885f019061f6 == HEAD blob
                             useDesignerTranslation.ts f540bc504e4328fee3e9e9e5e855af5d536d01ed == HEAD blob
                             git diff HEAD for both paths: empty

Leg A reproduces, on a key that was live thirty seconds earlier, the exact report signature
formula carried before this PR — NEEDS-REVIEW whose only footprint is the defaults map. Leg B
shows the tier promoting to CONFIRMED once that last footprint goes. The tool is measuring, not
idling.

The backlog this key came from is NOT swept here

The dispatch asked for the size before landing a large deletion. Measured:

389 candidate(s) with no call site this pass can see, across 55 namespace(s):
150 CONFIRMED, 239 NEEDS-REVIEW

That is a hundred-key sweep across 55 namespaces — a different review from this card, and it is
already tracked, open and unassigned, by #4730 ("Reverse i18n sweep: ~384 confirmed-dead locale
keys across 58 namespaces"). Sweeping it inside this PR would take a queued card's scope without
a claim, so this PR is the one key #6310 names. The backlog has shrunk since that card was
filed: 626/384/58 there, 389/150/55 today.

Verification — all at ccacdc43b, the final commit

pnpm exec vitest run packages/app-shell/src/__tests__/defaults-maps-mirror-en-pack.test.tsx packages/i18n/
  Test Files  57 passed (57)          ← 56 i18n test files + the mirror gate; counted, not assumed
       Tests  926 passed (926)

pnpm exec vitest run packages/plugin-designer/          (at b1cf72cca; unchanged by the pin commit)
  Test Files  13 passed (13)
       Tests  89 passed (89)

pnpm exec turbo run type-check --filter=@object-ui/i18n --filter=@object-ui/plugin-designer
  Tasks:    17 successful, 17 total
  (each package's task runs `tsc --noEmit && tsc -p tsconfig.test.json`, so the new test file is
   inside the measurement rather than excluded from it)

node scripts/check-i18n-call-site-keys.mjs        → exit 0
  "Every in-scope call-site key resolves against the en pack (2847 keys) …"
node scripts/check-i18n-en-drift.mjs              → exit 0
  "0 en value(s) changed (0 key(s) added, 1 removed — those are all-locales-key-parity's)"
node scripts/check-designer-field-key-parity.mjs  → "designer-field-key-parity: OK"
node scripts/check-control-bytes.mjs              → "OK (scanned 5304 tracked text file(s))"
node scripts/check-changeset-presence.mjs         → "11 source file(s) of 2 released package(s)
                                                     changed, and this change declares 1 changeset(s)"
node scripts/check-changeset-fixed.mjs            → exit 0
node scripts/check-changeset-no-major.mjs         → "No changeset declares a `major` bump."

Lint was narrowed, and the narrowing is measured rather than assumed. eslint --no-inline-config
over the changed .ts files: 11 files for the deletion commit and 1 for the pin, counts read
from --format json rather than from my own list, 0 errors, 0 warnings, exit 0 both times. The
narrowing excludes nothing: the flat config's base block matches **/*.{ts,tsx} and every changed
file resolved into the result set (none ignored), and eslint.config.js extends
tseslint.configs.recommended with no parserOptions.project or projectService — no
type-aware rules exist, so a change inside these files cannot move a verdict on a file it does not
touch. The repo-wide pnpm lint farm is CI's run, as always.

CI convergence is not waited on here — this report is delivered at draft-PR time by the dispatch
contract. Draft on purpose: the PM lands this, it is not self-merged and not marked ready.

Changeset: patch for @object-ui/i18n and @object-ui/plugin-designer, the two packages whose
published source changed.


Generated by Claude Code


Generated by Claude Code

objectui#6043 retired the Field Designer's formula-expression textarea, the
key's only call site. The value outlived it in eleven places: the ten locale
packs and `DESIGNER_DEFAULT_TRANSLATIONS`.

Re-measured on this branch rather than inherited from the card: zero `t()`/
`tt()` call sites, no dynamic template head that could reach it
(`appDesigner.fieldDesigner.typeCategory.` is the namespace's only one), and
its sole textual occurrence anywhere in the repo was the defaults-map row
removed here with it.

Map and packs move in one commit so `defaults-maps-mirror-en-pack` stays
green — that gate fails a map row whose key the `en` pack lacks, and
`all-locales-key-parity` fails a pack left behind.

`designer.field.formula` ('Formula (CEL)') is untouched: a different, live key
belonging to metadata-admin's `ObjectFieldInspector`.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3230.7 KB 3266.6 KB
Main entry chunk (gzip) 156.1 KB 350 KB
Entry file index-C3ph0GsW.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) 11.30KB 4.28KB
app-shell (runtime-config.js) 18.10KB 6.51KB
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) 5.13KB 2.35KB
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) 505.84KB 114.57KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.18KB 47.97KB
fields (index.js) 238.89KB 60.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
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.55KB 0.62KB
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 (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.66KB 12.84KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 188.60KB 44.82KB
plugin-dashboard (index.js) 133.46KB 34.48KB
plugin-designer (index.js) 211.90KB 42.74KB
plugin-detail (index.js) 245.10KB 62.31KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 131.78KB 32.19KB
plugin-gantt (index.js) 164.14KB 39.87KB
plugin-grid (index.js) 201.79KB 54.60KB
plugin-kanban (index.js) 52.87KB 14.57KB
plugin-list (index.js) 112.63KB 27.45KB
plugin-map (index.js) 20.09KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.49KB 11.93KB
plugin-timeline (index.js) 26.70KB 7.69KB
plugin-tree (index.js) 9.26KB 3.13KB
plugin-view (index.js) 84.55KB 20.74KB
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) 54.84KB 18.43KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.35KB 0.70KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 12.13KB 3.65KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 7.54KB 2.63KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
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.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
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.72KB 2.24KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
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 (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 3.40KB 1.71KB
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

Fifth in the retirement-pin series (objectui#4145, objectui#4392,
objectui#4730, objectui#5504), same shape: the retired leaf asserted absent
from all ten packs, plus surviving-sibling assertions so a green cannot be
bought by deleting the neighbourhood.

Every i18n gate in this repo runs call site -> key, so none of them can see a
dead key come BACK into the packs: the reverse sweep that found this one is
report-only by design, `all-locales-key-parity` is fully satisfied by ten packs
agreeing on a dead key, and `check:i18n-drift` only fires when a value changes.

Reverse-verified rather than asserted: reviving the row in all ten packs turns
exactly the one case red, naming each pack, while `all-locales-key-parity` and
`defaults-maps-mirror-en-pack` stay green — which is the whole reason the pin
exists.

The surviving list deliberately excludes the eight `appDesigner.fieldDesigner.*`
keys the reverse sweep still lists as NEEDS-REVIEW (`options`, `addOption`,
`addRule`, `noFields`, `searchPlaceholder`, `systemBadge`, `ungrouped`,
`validationRules`) — pinning "these survive" against keys that may themselves be
dead would bake an unverified claim into the guard. Every key it does list was
confirmed live by call site in `FieldDesigner.tsx`.
@github-actions github-actions Bot added the tests label Aug 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3230.7 KB 3266.6 KB
Main entry chunk (gzip) 156.1 KB 350 KB
Entry file index-C3ph0GsW.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) 11.30KB 4.28KB
app-shell (runtime-config.js) 18.10KB 6.51KB
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) 5.13KB 2.35KB
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) 505.84KB 114.57KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.18KB 47.97KB
fields (index.js) 238.89KB 60.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
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.55KB 0.62KB
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 (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.66KB 12.84KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 188.60KB 44.82KB
plugin-dashboard (index.js) 133.46KB 34.48KB
plugin-designer (index.js) 211.90KB 42.74KB
plugin-detail (index.js) 245.10KB 62.31KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 131.78KB 32.19KB
plugin-gantt (index.js) 164.14KB 39.87KB
plugin-grid (index.js) 201.79KB 54.60KB
plugin-kanban (index.js) 52.87KB 14.57KB
plugin-list (index.js) 112.63KB 27.45KB
plugin-map (index.js) 20.09KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.49KB 11.93KB
plugin-timeline (index.js) 26.70KB 7.69KB
plugin-tree (index.js) 9.26KB 3.13KB
plugin-view (index.js) 84.55KB 20.74KB
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) 54.84KB 18.43KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.35KB 0.70KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 12.13KB 3.65KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 7.54KB 2.63KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
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.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
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.72KB 2.24KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
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 (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 3.40KB 1.71KB
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.

finding(i18n): appDesigner.fieldDesigner.formula is now a dead key — 10 locale packs plus the designer defaults map, zero call sites

2 participants