Skip to content

fix(types): close two validating-face gaps — the ObjectQL union arms and the DrillDownConfig mirror (objectui#7363, objectui#7352) - #7701

Merged
os-sam merged 6 commits into
mainfrom
claude/issue-7363-validating-face-gaps
Sep 5, 2026
Merged

fix(types): close two validating-face gaps — the ObjectQL union arms and the DrillDownConfig mirror (objectui#7363, objectui#7352)#7701
os-sam merged 6 commits into
mainfrom
claude/issue-7363-validating-face-gaps

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Fixes #7363
Fixes #7352

Family dispatch, two members with one shape: a thing the TypeScript face declares that the validating face cannot see. One worktree, one commit per member, one changeset per member.

Member 1 — objectui#7363: the two objectui#6576 schemas become arms of the ObjectQL union

Commit 28094b1dd. ObjectGallerySchema and ObjectDataTableSchema were minted beside the other Object*Schema members and deliberately left out of ObjectQLComponentSchema, so AnyComponentSchema had no arm for an object-gallery or object-data-table node: validateSchema / safeValidateSchema / objectui validate refused such a document as matching no arm, exactly as before the schemas existed. Both unions gain the two members, in the same order, on both faces.

Acceptance criterion (named, per the card): a minimal object-gallery / object-data-table document validates, and a wrong-typed DECLARED key on such a node is refused BY NAME. The by-name half is the load-bearing one — the documents were refused before too, for the wrong reason. Pinned in packages/types/src/__tests__/objectql-union-arms-7363.test.ts (9 assertions).

Member 2 — objectui#7352: DrillDownConfig gets its zod mirror

Commits f7a428fbd (a PM rescue WIP, see below) and 11834ce87. DrillDownConfigSchema now mirrors DrillDownConfig key for key, and both declarations that carry drillDown reference it — ChartSchema and ObjectDataTableSchema. Until now no mirror knew the key, so under BaseSchema's .passthrough() a drillDown: { enabled: 'yes' } parsed green and rode through to a widget that reads enabled as truthy.

Acceptance criterion (named, per the card): a malformed drillDown value is refused, by name, on both declaring nodes; every value the declaration invites still validates. Pinned in packages/types/src/__tests__/drill-down-config-mirror-7352.test.ts (60 assertions).

Deliberately NOT @objectstack/spec/ui's ChartDrillDownSchema: that object models the chart-only subset strictly and refuses mode and report by name, and both are live keys on the table / pivot / metric widgets that share DrillDownConfig. Referencing it would make the published validator refuse what the published TypeScript declares — this defect class, in the other direction.

What the rescue WIP commit was missing

f7a428fbd was committed by the PM seat after the previous dev was terminated mid-task by an account session limit. It had never been run through a gate. Three things were wrong or absent, each measured rather than assumed:

  1. The parity ledger did not know the new export. zod-mirror-parity.test.ts's population census was red (New zod export(s) in packages/types/src/zod/ that this guard does not cover: data-display.zod.ts#DrillDownConfigSchema), and tsc -p tsconfig.test.json was red on the staleness ratchet (error TS2322 ... '"data-display.zod.ts#ChartSchema" | "objectql.zod.ts#ObjectDataTableSchema"' is not assignable to type 'never') — both drillDown rows in UnmirroredDeclared went stale the moment the mirror wired in. The pair is now registered in MIRRORS / Declared against the LOCAL DrillDownConfig (the ObjectMapConfigSchema precedent), both rows are retired with the movement recorded in place, and every count the change moves is updated: 160 to 161 pairs, UnmirroredDeclared 15 / 96 to 13 / 94 (LOCAL 12 / 83 to 11 / 82), the "no entry in either" population 144 to 147. This is the ledger's second and third shrink by REPAIR — the objectui#6639 route, and the first time one change closes two entries. The stale "143 of the 160" beside assertionRatchetAcceptsCleanPair, already wrong before this branch, reads 147 / 161 with the rest.
  2. One assertion in the new pin was wrong about the DECLARATION, not about the mirror. It expected report: { name, columns } — an inline report missing objectName — to be refused. DrillDownConfig's second arm is { name: string }, which is not an exact type, so TypeScript accepts that value and the excess-property check passes because columns belongs to the other arm. Refusing it would make the mirror NARROWER than the declaration, which is the drift class this ledger exists to stop. The case moved to the accepted table, annotated DrillDownConfig so tsc -p tsconfig.test.json is the standing witness: if the declaration ever refuses it, that line stops compiling.
  3. widget-schema-anchors-6576.test.ts still listed drillDown as a ledgered unmirrored read. The mirror declares it now, so the exception is retired — a stale one widens declared for a key nothing checks any more.

f7a428fbd is left in the branch history rather than rewritten: this seat does not force-push. Its message states plainly that it was unreviewed.

Evidence

Gate union re-run after the final commit, on 11834ce87 (git rev-parse --short HEAD from that run), everything through the shared verify lock:

gate verdict
pnpm exec vitest run packages/types/ exit 0 — 107 files, 1810 tests passed
pnpm --filter @object-ui/types type-check (three tsc runs, tsconfig.test.json included) exit 0
pnpm --filter @object-ui/types build exit 0 — 120 emitted files, dist carries the new export
pnpm --filter @object-ui/types lint exit 0 — 0 errors, 269 pre-existing warnings
pnpm exec vitest run packages/cli/ examples/schema-catalog/ exit 0 — 44 files, 2321 tests passed
pnpm check:control-bytes exit 0 — 6269 tracked text files scanned
pnpm check:spec-symbols exit 0
node scripts/check-changeset-presence.mjs 8 source files of 1 released package changed, 2 changesets declared
pnpm check:readme-exports NOT MEASURED, prerequisite not met — 408 self-imports unjudged because 34 packages are unbuilt in this container. Zero findings name @object-ui/types, which IS built here. CI builds first.

The two-leg gap proof. With the implementation committed first, the four source files (objectql.ts, zod/objectql.zod.ts, zod/data-display.zod.ts, zod/index.zod.ts) were checked out from origin/main while both instruments stayed at their branch state. The mutation was confirmed on disk before the run, not inferred from an exit code: the DrillDownConfigSchema marker went 3 to 0 in objectql.zod.ts, 3 to 0 in data-display.zod.ts, 1 to 0 in index.zod.ts, and ObjectGallerySchema 3 to 1 in objectql.ts, with git diff HEAD --stat showing 102 deletions across the four.

  • Ablated leg (gap present): 2 test files failed, 56 failed / 13 passed (69). The 13 that pass without the fix are the assertions that were already true — the chart values that ride through .passthrough() and the control asserting a plain data-table still has no drillDown arm.
  • Restored leg: every one of the four files restored via git checkout HEAD -- path under a trap, each verified by comparing git hash-object against the HEAD blob hash (four exact matches) with git diff HEAD empty — then 69 passed (69) on the same two files.

Blast radius of the union change (measured three ways, corrected at review). AnyComponentSchema resolves to 105 distinct root type literals at this branch's head and 103 at its merge-base 6e8863093 — the two this PR adds, and nothing else. Three derivations, all reading source through the vitest alias rather than dist: a structural walk of _zod.def.options (104 / 102, one lower at both revisions, reconciling to the single action arm the walk does not descend into); the error-tree walk restricted to issues reported at ['type'] (105 / 103); and the module's own explainUnionIssue(...).totalArmNames (105 / 103). An earlier revision of this section said 116 — that came from an unrestricted error-tree walk that also swept eleven literals reported under other keys (the eight chartType values, plus create / edit / view), and it is corrected here and on the card below.

The consumers that read the unions are packages/cli (the validate command and its arm diagnostics) and examples/schema-catalog (the objectui#6318 safeValidateSchema corpus and the objectui#7004 arm-selection pins) — all 2321 of their tests pass against the widened union. packages/plugin-charts and packages/plugin-editor name the unions only in comments.

Clause-② — this PR parks

Both repairs move a published validator's accept set, in OPPOSITE directions — which is why this paragraph is spelled out rather than summarised:

  • objectui#7363 WIDENS. An object-gallery / object-data-table document was refused before this branch, not accepted: it matched no arm. That is the card's own point, and the pin says so where it explains why .success === false is not the load-bearing assertion (objectql-union-arms-7363.test.ts, the two-leg note: "Before the arms existed the same documents were refused too — for the wrong reason, with no arm naming the key"). After this, a well-formed one validates, and a malformed one is refused BY NAME instead of as "no arm matches" — a widening plus a diagnosis, not a narrowing.
  • objectui#7352 NARROWS. A malformed drillDown was refused by nothing and rode through .passthrough(); now it is refused by name on both declaring nodes.

Both changesets state their own movement in these terms; this paragraph previously described objectui#7363 as a narrowing, which contradicted its changeset and its pin. Either direction is a published accept-set change, so Clause-② holds for the PR as a whole.

So this stays a draft carrying needs:contract-review. Not flipped to ready, not enqueued, no auto-merge — contract review happens at tier, on another account, and is a recorded debt rather than a skipped step (see the dispatch note on objectui#7363).

Out of scope, filed not fixed

Two stale measured counts in packages/cli/src/utils/union-arm-diagnostics.ts, filed as #7702 and not repaired here: the arm-name figure ("108 leaf arms and 108 DISTINCT type literals", repeated in six places plus two test comments) OVERCOUNTS — the tree reads 103 at this branch's merge-base and 105 at its head; and the alignment sentence at lines 34-35 says the union has 14 members when it has 13. Nothing mechanically reads either number, which is why the CLI suite stays green. A stale measured count is a different defect class from either member here, and the file is outside this dispatch's surface, so the card carries the three derivations and this PR changes nothing there.

Patch round after contract review (head e46a218c9)

Review returned PASS with three corrections; none was a contract defect. All three are in, plus one optional item taken up.

  1. The parity ledger's absolute counts were wrong, and this branch made them worse. Re-derived by two independent methods that agree — a TypeScript AST walk over the MIRRORS initializer and each ledger interface, and a line-oriented parse of the same blocks: 155 pairs (the prose said 161), 141 pairs clean in both unmirrored ledgers (said 147), 155 − 40 = 115 (said 121), and "141 of the 155" where the clean-pair note said "147 of the 161". The three ledger figures this card actually moved were already right and are unchanged: KnownDrift 40 / 56, UnmirroredDeclared 13 / 94, RuntimeOnlyDeclared 7 / 24, union 14. Running the same walk over this file at three revisions shows how it drifted — 4ca30d044 wrote "160" while MIRRORS held 163, d88e20f55 (objectui#7432) took the registry to 154 without touching the sentence, and this branch added its 1 to that stale baseline. The running chain of per-card deltas under the population bullet was arithmetic on the wrong base and is not re-derivable from the file, so it is replaced by the measurement and a note saying so. RuntimeOnlyDeclared's docblock restated the same debt as "97" (stale before this branch too, the ledger then held 96) and now reads 94. Comment-only: no MIRRORS entry, ledger row or type moved, and the ratchet is green.
  2. The out-of-scope card was wrong in magnitude and in direction and is rewritten with the three derivations above; see the section below.
  3. The Clause-② paragraph misdescribed objectui#7363 as a narrowing when the node was refused before, for the wrong reason. Rewritten to match the changeset and the pin.

Optional item, taken because it is measurable: the accepted-table comment claimed the reference arm accepts a value "whatever else it carries". It does not — the acceptance is shape-specific, and the arm STRIPS what it does not declare, so { name, columns: [] } parses to { name } while the inline arm keeps extras through .catchall. The comment now states both halves and the changeset records the parsed-output difference, since consumers read report after parsing. The schema itself is unchanged: it is the declaration verbatim, and restructuring it would need a ruling.

main had moved again (8ad218d58), so it was merged in before the union was run — and it mattered for exactly the reason this file warns about, since CI reads the PR's merge rather than its head. objectui#7104 landed a second key on overlay.zod.ts#AlertDialogSchema's KnownDrift entry, taking that ledger from 40 / 56 to 40 / 57; its own commit updated that bullet, the two edits merged cleanly, and the re-derivation was re-run on the merged tree. The entry COUNT did not move, so nothing this round corrected changes: 155 pairs, 141 clean, 155 − 40 = 115, UnmirroredDeclared 13 / 94, RuntimeOnlyDeclared 7 / 24, union 14. Every numeric claim in the file was then checked against the derivation by pattern — 25 claims, 0 mismatches.

Gate union re-run at e46a218c9 (the merge): pnpm exec vitest run packages/types/ packages/cli/ examples/schema-catalog/ exit 0 — 153 files / 4174 tests; pnpm --filter @object-ui/types type-check exit 0 (three tsc runs, tsconfig.test.json included — the one carrying the compile-time ratchet); pnpm --filter @object-ui/types lint exit 0 (0 errors, 269 pre-existing warnings); check:control-bytes exit 0 (6275 files); changeset presence 2 for 8 source files.

Still a draft, still carrying needs:contract-review, still not enqueued and with no auto-merge armed.


Generated by Claude Code

… ObjectQL union on both faces (objectui#7363)

PR #7355 (objectui#6576) minted both schemas and deliberately left
`ObjectQLComponentSchema` alone, so `AnyComponentSchema` had no arm for an
`object-gallery` or `object-data-table` node: `validateSchema` /
`safeValidateSchema` / `objectui validate` refused such a document as matching
no arm, exactly as before the schemas existed, and a wrong-typed declared key
on it could never be diagnosed by name.

Both unions gain the two members, in the same order. The pin
(`objectql-union-arms-7363.test.ts`) is two-legged per node type: a minimal
document validates, and a wrong-typed DECLARED key is refused BY NAME — the
by-name half is the load-bearing one, since the documents were refused before
too, for the wrong reason. Measured on the ten-arm tree first: 9 of its
assertions red (`data` and `className` probes dropped because a sibling arm
already named them there).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
…IEWED

Rescue commit made by the PM seat after the dispatched dev was terminated
mid-task by an account session limit (HTTP 429, resets 2026-09-05T06:40Z).
Committed so the work survives container reclaim; it is NOT a claim that the
change is correct or finished.

Observed state at rescue time, and nothing beyond it:
  M packages/types/src/zod/data-display.zod.ts
  M packages/types/src/zod/index.zod.ts
  M packages/types/src/zod/objectql.zod.ts
  ?? packages/types/src/__tests__/drill-down-config-mirror-7352.test.ts

The dev's last recorded status was that the instrument was written and the
gap-proof run on BASE (both files, expected red) had not yet been executed.
No gate was run against this content.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
…aring mirrors (objectui#7352)

Completes the rescued WIP commit f7a428f, which carried the mirror, the barrel
export and the behaviour pin, and had never been run through a gate. What that
content was missing, measured rather than assumed:

  - `zod-mirror-parity.test.ts` did not know the new export. Its population census
    was RED ("New zod export(s) in packages/types/src/zod/ that this guard does not
    cover: data-display.zod.ts#DrillDownConfigSchema"), and `tsc -p tsconfig.test.json`
    was RED on the staleness ratchet at line 1478 — both `drillDown` rows in
    `UnmirroredDeclared` had become stale the moment the mirror wired in. The pair
    is now registered in MIRRORS / Declared against the LOCAL `DrillDownConfig`
    (the `ObjectMapConfigSchema` precedent), both rows are retired with the movement
    recorded, and every count the change moves is updated: 160 → 161 pairs,
    UnmirroredDeclared 15 / 96 → 13 / 94 (LOCAL 12 / 83 → 11 / 82), the
    "no entry in either" population 144 → 147. The stale "143 of the 160" beside
    `assertionRatchetAcceptsCleanPair` — already wrong before this change — reads
    147 / 161 with the rest.
  - One assertion in the pin was wrong about the DECLARATION, not about the mirror:
    it expected `report: { name, columns }` (an inline report missing `objectName`)
    to be refused. `DrillDownConfig`'s second arm is `{ name: string }`, which is
    not exact, so TypeScript accepts that value — refusing it would make the mirror
    NARROWER than the declaration, the drift class this ledger exists to stop. It
    moved to the accepted table, annotated `DrillDownConfig` so
    `tsc -p tsconfig.test.json` is the standing witness.
  - `widget-schema-anchors-6576.test.ts` listed `drillDown` as a ledgered
    unmirrored read. The mirror declares it now, so the exception is retired; a
    stale one widens `declared` for a key nothing checks any more.

Changeset added: the new `/zod` export and the accept-set narrowing are published.

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

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3184.6 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DqfOPdx0.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.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
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.43KB
plugin-dashboard (index.js) 132.86KB 34.68KB
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.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.57KB 11.96KB
plugin-timeline (index.js) 30.84KB 8.85KB
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 (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

…s, not 161 (objectui#7352)

Comment-only. Contract review on PR #7701 caught that the pair count this card
moved was stale before it: I added 1 to a number that had been wrong twice, and
rewrote one wrong derived figure into a different wrong one.

Re-derived by two independent methods that agree, rather than by stepping a delta:
a TypeScript AST walk counting `PropertyAssignment` nodes in the `MIRRORS`
initializer and `PropertySignature` members in each ledger interface, and a
line-oriented parse of the same blocks.

  MIRRORS pairs                      155   (prose said 161)
  KnownDrift                     40 / 56   (unchanged, and correct)
  UnmirroredDeclared             13 / 94   (unchanged, and correct)
  RuntimeOnlyDeclared             7 / 24   (unchanged, and correct)
  union of the two unmirrored ledgers 14   (unchanged, and correct)
  clean population                   141   (prose said 147)
  pairs with no KnownDrift entry     115   (prose said 121)

The same walk run over this file at three revisions confirms how it drifted, so
the correction is recorded rather than just applied: `4ca30d044` wrote "160" when
`MIRRORS` held 163; `d88e20f55` (objectui#7432) took the registry to 154 without
touching the sentence; this branch then added its 1 to the stale baseline.

Two consequences beyond the numbers:

  - The running chain of per-card deltas under the population bullet (141 -> 142
    -> 143 -> 144 -> 147) was arithmetic on the wrong base and is not
    re-derivable from this file. It is replaced by the measurement plus a note
    saying so, with an explicit instruction to subtract the union from the
    registry count rather than restart the chain.
  - `RuntimeOnlyDeclared`'s docblock restated the same debt as "97"; it was stale
    before this branch too (the ledger held 96) and now reads 94, with the
    equation balanced the way the other ledger states it.

Also in this commit, from the same review, both optional and both measured:

  - The accepted-table comment in `drill-down-config-mirror-7352.test.ts` said a
    string `name` satisfies the reference arm "whatever else it carries". That
    overstates it: the acceptance is shape-specific, and — measured —
    `{ name, columns: [] }` PARSES TO `{ name }`, because the reference arm is a
    plain object that strips what it does not declare, while the inline arm keeps
    extras through `.catchall`. The comment now says both halves.
  - The changeset gains that parsed-output difference, since consumers read
    `report` after parsing.

Ratchet unaffected: no MIRRORS entry, ledger row or type moved in this commit.

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

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3184.6 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DqfOPdx0.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.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
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.43KB
plugin-dashboard (index.js) 132.86KB 34.68KB
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.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.57KB 11.96KB
plugin-timeline (index.js) 30.84KB 8.85KB
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 (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

1 similar comment
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3184.6 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DqfOPdx0.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.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
fields (index.js) 242.27KB 61.22KB
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.43KB
plugin-dashboard (index.js) 132.86KB 34.68KB
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.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.57KB 11.96KB
plugin-timeline (index.js) 30.84KB 8.85KB
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 (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

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