Skip to content

test(i18n,app-shell): discover the createSafeTranslation defaults tables instead of hand-listing three (objectui#7884) - #7902

Merged
os-sam merged 1 commit into
mainfrom
claude/issue-7884-defaults-maps-mirror-discovery
Sep 6, 2026
Merged

test(i18n,app-shell): discover the createSafeTranslation defaults tables instead of hand-listing three (objectui#7884)#7902
os-sam merged 1 commit into
mainfrom
claude/issue-7884-defaults-maps-mirror-discovery

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Fixes #7884

Blocked-by: #7887satisfied: #7887 merged at 2026-09-06T01:55:20Z as d9580f464, and this branch is rebased onto it. The line is kept for the record because it explains the ordering: while those five rows were still on main, the gate below could only land red.

What this changes, and what it deliberately does not

This is not a new rule. defaults-maps-mirror-en-pack.test.tsx (#4401) already had the one rule in this repo that rejects a createSafeTranslation defaults row whose key no locale pack defines: every row names a key the en pack actually defines. It did not miss #7874's five dead timeline.relative.* rows because it was wrong — it never saw them. Its MAPS was a hand-written list of three IMPORTED maps, and TIMELINE_DEFAULT_TRANSLATIONS was not on it.

A correct rule held outside the door by a hand-written list — the same family as #7448 / #7528 / #7548 / #7825 / #7853.

The census, measured before deciding anything

Run over the AST-discovered population on the merged tree (d9580f464 + this commit):

table ENTRIES discovered   : 35        (34 unique — see the dedupe note)
  factory call sites       : 32        (of which 11 are ANONYMOUS INLINE tables)
  hand-rolled registry     : 3
rows RAW                   : 1072
rows UNIQUE (file:line+key): 1056
source files walked        : 1590
BLIND SPOT (unreadable)    : 0
HITS (key the en pack does not define) : 0

The result, stated positively

With #7874's five rows retired, this defect class is empty repo-wide: 0 offending rows across 34 unique tables and 1056 rows. That is a measured zero, not an absence of looking — and the number that makes it a real zero is the one beside it: blind spot 0. Every discovered table resolved to an object literal and every row to a static string, so there is no bucket of "rows I could not read" hiding behind the 0. That is also what ruled out the "the instrument is not trustworthy" branch by measurement rather than by opinion.

Why the old list said 3 and the walk says 32 — the card's real justification

The existing gate's 3 were hand-listed exported, importable maps, because that file reaches its tables by import { X_DEFAULT_TRANSLATIONS }. The walk instead resolves every factory call site's first argument, and 11 of today's 32 factory call sites pass an anonymous inline object literal that is exported under no name at all.

So the hand list was not merely incomplete — it was structurally incompletable by its own mechanism. No amount of diligence in maintaining a list of imports could ever have reached those 11. Coverage before this change: 400 of 1056 rows, 37.9%; the rule was held outside 62% of its own population.

Dedupe, on file:line + key

TIMELINE_DEFAULT_TRANSLATIONS is discovered twice — once as the factory call in useTimelineTranslation.ts and once through #3512's hand-rolled registry, which keeps it so the registry mirrors its needle-file set. Its rows are therefore scanned twice, which is why five real rows read as ten raw hits during the census. The landed gate de-duplicates on the row's own location plus its key (not the table label — the two discoveries carry different labels), so it can never report inflated numbers.

The discovery mechanism was MOVED, not copied

The AST walk already existed, module-private inside packages/i18n/src/__tests__/fallback-placeholder-spelling-3512.test.ts (#3512). Writing a second one would have been two definitions of the population that drift apart — the very disease this card treats. So it moved, whole, into @object-ui/test-support (private: true, never published), and both gates now discover the same tables from the same code.

Home chosen per the PM ruling: the two callers live in different packages, and a deep relative import into another package's src/__tests__/ is the shape #4325 ruled out. @object-ui/test-support exists precisely for modules two suites share.

It is reached by a DECLARED subpath, not from the package index

@object-ui/test-support/defaults-table-scan. The index is otherwise that package's whole surface, and this is the one shape the index physically cannot carry: the module reads the workspace from disk (node:fs, node:path, node:module), so it only type-checks in a program that has Node's ambient types — and a barrel re-export puts a module into the program of every consumer that imports the index for anything at all.

That is measured, not predicted. The first revision of this PR did re-export it from the index, and the repo-wide type-check went red:

@object-ui/data-objectstack:type-check   > tsc --noEmit
../test-support/src/defaults-table-scan.ts(65,31): error TS2591: Cannot find name 'node:module'.
../test-support/src/defaults-table-scan.ts(66,65): error TS2591: Cannot find name 'node:fs'.
../test-support/src/defaults-table-scan.ts(67,18): error TS2591: Cannot find name 'node:path'.

The chain, read off tsc -p packages/data-objectstack/tsconfig.json --listFiles rather than inferred from the message: that package's include is src/**/*, which takes in its tests; src/metadata-client.overlayScope.test.ts:41 imports { enumOptions } from the index; the index re-exported the scanner; so all nine of test-support's modules landed in data-objectstack's program, which carries no node types. After the change to a subpath the same command reports 0 occurrences of defaults-table-scan in that program, and the other eight modules stay — the package's normal surface is untouched.

./zod-wrapper-keys is the same escape hatch for the mirror case (bare-node consumers the TypeScript index cannot serve), so the precedent is the package's own. #4325's lesson is untouched too: the hazard there was an undeclared deep path that resolved only through the vitest alias and was TS2882 for tsc; this one is declared in exports, and with moduleResolution: bundler it resolves exactly as . does. The reasoning is written at the index, where the next person will look.

⚠️ For the reviewer: this is the one point where I amended a convention sentence written inside the package (A package's surface is its index — including this one). It is narrowed rather than overturned, with the measurement recorded beside it — say the word if you would rather have the module relocated instead.

The move is proven behaviour-preserving, not merely called mechanical

The #3512 gate measured on ONE tree, its own private walk versus the shared module:

reading before (private walk) after (shared module) identical
table entries 35 35 yes
rows 1072 1072 yes
unreadable 0 0 yes
source files walked 1590 1590 yes
needle files 4 4 yes
sha256 over every row f7910279e114cd6e1bf1d2b9... f7910279e114cd6e1bf1d2b9... yes

Full digest both sides: f7910279e114cd6e1bf1d2b97bf7164661283cd9fbb5eef88286f2f75bea8065. Its floors (at least 34 tables / at least 700 rows) are not the evidence here — the real counts are, because a floor still passing proves only that nothing fell below it.

One spelling had to change, and it is a finding in itself

The walk skips __tests__ directories. That is why #3512 could hold the literal needle as a single string while living in one. A normal src/ module cannot: with the needle spelled verbatim, the scanner matched its own source and reported itself as a fifth interpolator, turning #3512's completeness case red. Measured exactly that way during this move. The constant is assembled from fragments now, with the runtime value byte-identical, and the reason is written at the constant so the next person does not "tidy" it back.

Positive control — the real defect, both directions, on this tree

Not a fabricated fixture: #7874's five rows, put back exactly as d9580f464 deleted them.

  • Injected. Disk proof first: blob c02661e28d... moved to 67ff9746..., relative_rows=5, 1 file changed, 5 insertions(+). The widened gate then fails, naming TIMELINE_DEFAULT_TRANSLATIONS and all five rows — and exactly five, not ten, so the dedupe holds:
    packages/plugin-timeline/src/useTimelineTranslation.ts:26  timeline.relative.today —
      row of TIMELINE_DEFAULT_TRANSLATIONS (…/useTimelineTranslation.ts),
      absent from the en pack — FINDING, file it
    
  • Restored. Proven by state, never by an exit code: git diff HEAD is 0 lines, the blob is back to the HEAD blob c02661e28d..., relative_rows=0. Gate green, 15/15.

Not a duplicate of #7567 — please do not read it as one

#7567 / #7870 (factory-default-drift, landed as 6ea524f32) compares factory-table rows' VALUES against the en pack, and deliberately abstains when en defines no value, because with no en value there is nothing to compare against. That abstention is correct and must not be turned into a comparison.

This gate asks the other question: does the key exist at all. Different question, different rule — and the two are complements, since #7567's abstention bucket is exactly this gate's finding bucket.

Surface

  • packages/test-support/src/defaults-table-scan.ts — new, the moved walk
  • packages/test-support/src/index.ts — re-export
  • packages/i18n/src/__tests__/fallback-placeholder-spelling-3512.test.ts — delete-plus-import (−300 lines)
  • packages/app-shell/src/__tests__/defaults-maps-mirror-en-pack.test.tsx — the widened rule
  • packages/i18n/package.json, packages/test-support/package.json — devDep lines

One adjunct beyond the authorised list, flagged rather than slipped in: packages/test-support/tsconfig.json needed "types": ["node", "vitest/globals"] plus an @types/node devDep, because this new module is the first in that package to touch node:fs / node:path / node:module; without it pnpm --filter @object-ui/test-support type-check is TS2591. Naming the types replaces the auto-included set, hence vitest/globals alongside.

Verification

Repo-wide pnpm turbo run type-check (no --filter) on the pushed SHA c76fa9718, with git diff HEAD empty: Tasks: 81 successful, 81 total, exit 0, zero TS diagnostics — including all five packages the earlier failure touched (data-objectstack, types, core, i18n, collaboration). The same command reproduced the failure before the fix (Failed: @object-ui/data-objectstack#type-check), so it is verified by the instrument that caught it, not by a narrowed one.

The three pre-landing inputs were re-run after the fix and are unchanged: census still 0 hits / blind spot 0 across 34 unique tables and 1056 rows; the #3512 gate still byte-identical either side of the move (35 / 1072 / 0 / 4 needle files, digest f7910279e114…); the positive control still fires naming TIMELINE_DEFAULT_TRANSLATIONS with 5 rows, not 10.

Gate union, with git diff HEAD empty — all exit 0:

vitest (both suites, 33 passed) · type-check for test-support / i18n / app-shell · lint for test-support / i18n / app-shell (0 errors) · check:readme-exports (after turbo run build, which it requires) · check:unreferenced-sources · check:phantom-deps · check:self-import · check:control-bytes · check:type-check-coverage · check:vi-mock-specifiers · check:vi-mock-inherit · check:pre-install-import-graph · check:esm-specifiers · check:lint-coverage · check:i18n-keys · check:i18n-dead-keys · check-changeset-no-major.

Type-check greens proven non-vacuous by --listFiles: defaults-table-scan.ts is in the test-support program (1 hit, and 82 @types/node files), defaults-maps-mirror-en-pack.test.tsx is in app-shell's tsconfig.test.json program (1 hit).

Changeset verdict, verbatim from node scripts/check-changeset-presence.mjs:

Compared the working tree with d9580f464 (merge-base with origin/main): 9 file(s) changed,
2 of them published source of a package the release covers, 0 of them a manifest whose
published contract moved, 2 under a package changesets ignores, 1 changeset(s) added.
✅  2 source file(s) of 2 released package(s) changed, and this change declares 1
    changeset(s): .changeset/defaults-maps-mirror-discovery-7884.md.
    Every one of them has an EMPTY frontmatter — declared as releasing nothing, which
    is the explicit exemption and a complete answer to this gate.

Authored by the os-dev seat, session https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages success
Check console performance budget skipped

See the workflow run for details.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 15.67KB 5.75KB
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) 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) 510.60KB 116.20KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.08KB 50.62KB
fields (index.js) 242.44KB 61.25KB
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) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
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) 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) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.76KB 27.75KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.63KB 8.80KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 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) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.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.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (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

…les instead of hand-listing three (objectui#7884)

The rule "every row names a key the en pack actually defines" is the one rule in
this repo that rejects a defaults row whose key no locale pack defines. It did
not miss objectui#7874's five dead `timeline.relative.*` rows because it was
wrong -- it never saw them: its `MAPS` was a hand-written list of three IMPORTED
maps, and `TIMELINE_DEFAULT_TRANSLATIONS` was not on it.

Measured: the three-map list judged 400 of 1056 rows (37.9%). It was also
structurally incompletable by its own mechanism -- 11 of the 32 factory call
sites pass an anonymous inline object literal exported under no name at all, so
no list of imports could ever reach them.

The AST walk that discovers these tables already existed, module-private inside
`fallback-placeholder-spelling-3512.test.ts`. It is MOVED, not copied, into
`@object-ui/test-support`, so both gates ask their different questions of one
definition of the population instead of two that drift apart.

Behaviour of the objectui#3512 gate is preserved, verified on one tree either
side of the move: 35 discovery entries, 1072 rows, 0 unreadable, the same 4
needle files, and an identical sha256 over every row
(f7910279e114cd6e1bf1d2b97bf7164661283cd9fbb5eef88286f2f75bea8065).

The scanner is reached as a DECLARED subpath, `@object-ui/test-support/
defaults-table-scan`, and NOT from the package index. It reads the workspace
from disk, so it only type-checks where Node's ambient types are present, and a
barrel re-export puts a module into the program of every consumer that imports
the index for anything at all. Measured with it on the index: `data-objectstack`
imports `{ enumOptions }` from that index in one test, so `tsc -p
packages/data-objectstack/tsconfig.json --listFiles` pulled this file into that
package's program and the repo-wide type-check failed with three TS2591s in a
file that package never asked for. `./zod-wrapper-keys` is the same escape hatch
for the mirror case, and objectui#4325's lesson is untouched: the hazard there
was an UNDECLARED deep path, TS2882 for `tsc`; this one is in `exports`.

One spelling also had to change. The walk skips `__tests__` directories, which is
why the needle could be a single literal while it lived in one; in a normal
`src/` module a verbatim spelling makes the scanner match its own source and
report itself as a fifth interpolator. It is assembled from fragments now, with
the runtime value unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3
@os-sam
os-sam force-pushed the claude/issue-7884-defaults-maps-mirror-discovery branch from 52c8b37 to c76fa97 Compare September 6, 2026 02:58
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3187.2 KB 3191.4 KB
Main entry chunk (gzip) 143.4 KB 350 KB
Entry file index-BdGb1UvH.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) 15.67KB 5.75KB
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) 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) 510.60KB 116.20KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.08KB 50.62KB
fields (index.js) 242.44KB 61.25KB
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) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.98KB 10.98KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
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) 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) 4.83KB 2.27KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.88KB 34.69KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.76KB 27.75KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.40KB 8.76KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 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) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.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.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

@os-sam
os-sam marked this pull request as ready for review September 6, 2026 03:15
@os-sam
os-sam added this pull request to the merge queue Sep 6, 2026
Merged via the queue into main with commit 23b4073 Sep 6, 2026
34 checks passed
@os-sam
os-sam deleted the claude/issue-7884-defaults-maps-mirror-discovery branch September 6, 2026 03:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants