Skip to content

fix(types): StackSchema ships its declared members instead of collapsing under BaseSchema's index signature - #6267

Merged
os-litant merged 2 commits into
mainfrom
claude/issue-6151-stackschema-omit-collapse
Aug 25, 2026
Merged

fix(types): StackSchema ships its declared members instead of collapsing under BaseSchema's index signature#6267
os-litant merged 2 commits into
mainfrom
claude/issue-6151-stackschema-omit-collapse

Conversation

@yinlianghui

@yinlianghuiyinlianghui commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Fixes#6151

⚠️ Generic parameters are written spaced (Omit< T, K >) throughout. GitHub's body
sanitizer eats a fragment that opens with an identifier in angle brackets — it parses as an
HTML tag — which is what mangled the original card and forced its rewrite. The spaced and
elided spellings survive. (Proven again on this very body: the first revision used one
unspaced Omit<FlexSchema, 'type'> in the last bullet, and GitHub silently truncated it to
Omit. Every generic here is spaced for that reason.) The exact spellings below were
re-derived from the repo, not from the card's prose.

The defect, reproduced on today's main

packages/types/src/layout.ts:226 declared:

export interface StackSchema extends Omit< FlexSchema, 'type' > {
type: 'stack';
}

Measured against the built dist/layout.d.ts at ef2a3bd8d, through the TypeScript checker:

FlexSchema -> 25 declared properties: align ariaLabel body children className data
description direction disabled disabledOn gap hidden hiddenOn id justify
label name placeholder style testId type visible visibleOn visibleWhen wrap
StackSchema -> 1 declared property: type

checker.getPropertyOfType(StackSchema, 'gap') returned false; likewise children,
align, justify, direction, wrap, className. The card's measurement reproduces
exactly.

The cause is confirmed to be the index signature

Omit< T, K > is Pick< T, Exclude< keyof T, K > >, and keyof T on a type carrying a
string index signature is string | number — the literal member names are absorbed. So
excluding 'type' still leaves string | number, and the Pick rebuilds a type holding
the index signature and none of the named members.

Isolated to that one variable, with everything else held constant:

interface WithIndex { type: string; gap?: number; [key: string]: any; }
interface NoIndex { type: string; gap?: number; }
FromWithIndex extends Omit< WithIndex, 'type' > -> 1 declared property: type
FromNoIndex extends Omit< NoIndex, 'type' > -> 2 declared properties: gap type

The index signature is BaseSchema's [key: string]: any (#5155), inherited by
FlexSchema. That is the whole cause.

Which members are supposed to survive

All 25 — the six flex members (direction, justify, align, gap, wrap, children)
plus BaseSchema's 19 others, plus type narrowed to 'stack'. StackSchema is
documented and rendered as "a Flex that defaults to column": stack.tsx reads
schema.direction, schema.justify, schema.align, schema.gap and schema.wrap
directly, and the Zod mirror StackSchema in zod/layout.zod.ts already declares all six.

The fix — at the mechanism

The six shared members move into a new exported interface, FlexLayoutProps, which does
not inherit BaseSchema. FlexSchema and StackSchema each extend
BaseSchema, FlexLayoutProps. No Omit crosses the index signature any more, and the
members are declared once rather than duplicated — the index signature is lifted out of the
inheritance path the derivation crossed.

Extending FlexSchema directly was measured unavailable, resolving the open question in
the card: an interface may narrow an inherited property only to a subtype, and 'stack' is
not a subtype of FlexSchema's type: 'flex'

error TS2430: Interface 'StackSchemaA' incorrectly extends interface 'FlexSchema'.
Types of property 'type' are incompatible.
Type '"stack"' is not assignable to type '"flex"'.

After the fix, measured on the rebuilt dist/layout.d.ts: StackSchema -> 25 declared properties, the identical set to FlexSchema.

FlexSchema is unchanged. Its six member declarations moved byte-identically (diff
of the extracted block against ef2a3bd8d, exit 0), and its emitted member set is the same
25 names before and after. The only declaration whose shape changes is StackSchema.

The pin, and what survives a revert

packages/types/src/__tests__/stack-schema-emitted-members.test.ts — 13 assertions.

⚠️ It reads the emitted declaration, never the source. A source-level assertion passes
on the broken code: the index signature answers for the missing key with any, and any
satisfies everything. That gap is the bug, so a guard that never opens the .d.ts cannot
see it.

It also does not read dist/. This repo's per-PR test job runs pnpm test with no
build step
(turbo's test task only dependsOn: ["^build"] — the dependency closure,
never the package's own build), and packages/types has no workspace dependencies, so
nothing builds it. A guard reading dist/layout.d.ts would be absent-or-stale on a cold CI
cache — vacuous exactly where it is needed. The same trap is recorded in
package-exports-manifest.test.ts's header. So the guard runs the package's own tsconfig
through the compiler API, emits declarations to a scratch dir under node_modules/, and
measures that.

Ablation — the fix reverted on disk (mutation proven both ways by grep: the Omit
declaration back at 1 occurrence, the FlexLayoutProps heritage clause at 0), restored under
a trap … EXIT INT TERM with a cwd-independent command, git diff HEAD --stat empty after.
Predicted 9 red / 4 green before running; observed exactly that:

assertionreverted
StackSchema declares EXACTLY what FlexSchema declaresRED
declares gap / children / align / justify / direction / wrap / className (7)RED
no LayoutSchema member loses BaseSchema's membersRED
emit is readable; FlexSchema carries its six membersgreen (non-vacuity)
BaseSchema member set is plausiblegreen (non-vacuity)
type is still the 'stack' literalgreen — correctly insensitive
union has a plausible member countgreen (non-vacuity)

The four survivors are the ones that should survive: three are the non-vacuity guards that
exist to prove the population was read at all, and the fourth pins union discrimination,
which the defect never broke. The tripwire named the damage itself:

member erasure in the emitted declaration: [{"name":"StackSchema","missing":
["ariaLabel","body","children","className","data","description","disabled","disabledOn",
"hidden","hiddenOn","id","label","name","placeholder","style","testId","visible",
"visibleOn","visibleWhen"]}]

That third assertion is the class guard: every LayoutSchema member extends BaseSchema,
so any future heritage clause that collapses under the index signature reds here — not
only this one interface. Sixteen union members satisfy it today; StackSchema was the one
that did not.

Scope check — the rest of the Omit population

Every Omit in packages/types/src was measured against the built dist, since the card
asks for the bound rather than asserting it:

  • Heritage clauses. Three others exist (DashboardWidgetSchema, ActionParam,
    NavigationArea) and all three are healthy — they Omit over @objectstack/spec
    types, which carry no index signature (25, 17 and 5 declared properties respectively).
    StackSchema was the only collapsed heritage clause, so this PR closes the class the card
    scopes.
  • Pick with literal keys is not affected — it never computes keyof T. The
    packages/plugin-grid and plugin-dashboard sites are DOM types anyway.
  • Two property-position Omits DO collapse, same mechanism, different surface:
    objectql.ts:1480table?: Partial< Omit< ObjectGridSchema, … > > and :1486
    form?: Partial< Omit< ObjectFormSchema, … > > both measure 0 declared properties
    (ObjectGridSchema alone has 61). Not fixed here — unlike StackSchema the correct
    replacement shape is a design question rather than a mechanical move, so it is filed
    separately rather than smuggled into this PR.
  • data-protocol.ts:933 (BaseValidation) is healthy — ScriptValidation has no index
    signature (16 of 18 members survive, exactly as written).

Verification

Run at 7fe11e01a, the final commit.

  • pnpm --filter @object-ui/types build — exit 0
  • pnpm --filter @object-ui/types type-check — exit 0 (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json)
  • pnpm test packages/types/ from the repo rootTest Files 59 passed (59),
    Tests 645 passed (645). Root-only, per the objectui#3378 guard: the
    pnpm --filter … exec vitest and cd packages/x && pnpm exec vitest forms either refuse
    loudly or silently run apps/console's files and report a meaningless green.
  • pnpm --filter @object-ui/types lint — exit 0, 0 errors (240 pre-existing warnings, none
    in the touched files).
  • Gates: check-control-bytes, check-type-check-coverage, check-changeset-presence,
    check-changeset-no-major, check-vi-mock-specifiers, check-package-self-import — all
    exit 0.

Downstream. This is a tightening — keys that the index signature used to answer as any
are now typed — so consumers were checked rather than assumed. The sweep was narrowed with
evidence
, not by guess: FlexSchema's emitted member set is identical before and after
and its members moved byte-identically, so the only declaration whose shape changed is
StackSchema, and only code naming it can be affected. Enumerating that population by grep
over all packages/*/src, apps/*/src and examples/ gives three packages, and all three
type-check green unchanged, with the script name echoed in each run (guarding the
zero-match---filter-exits-0 trap):

packages/core type-check$ tsc --noEmit && tsc -p tsconfig.test.json Done
packages/components type-check$ tsc --noEmit && tsc -p tsconfig.test.json Done
examples/schema-catalog type-check$ tsc --noEmit && tsc -p tsconfig.test.json Done

packages/components' two stack/layout test files also pass (10 tests). layout.ts is
types-only and emits an empty .js, so there is no runtime surface to change.

check-readme-exports exits 1 locally, and it is not this change: all 53 findings are
type entry ./dist/index.d.ts is not on disk — run pnpm build first for packages outside
the closure I built (app-shell, auth, cli, collaboration, plugin-ai,
plugin-designer). Zero mention packages/types, and zero are of the fabricated-or-
wrong-path kind the gate exists to catch. CI builds everything.

Changeset

minor, never major. It ships as minor rather than patch because it can newly error a
consumer: gap: 'large' on a stack node used to type-check through the index signature and
is now a tsc error. Every value it newly rejects is one the renderer never honoured —
stack.tsx feeds gap to a Tailwind numeric scale — so this reports a defect that already
existed rather than removing a capability. Downgrade to patch if you read that as a fix
rather than a break; nothing else in the change depends on it.

Notes for review

  • FlexLayoutProps is exported from layout.ts and added to the root index.ts export
    list, matching how StyleProps / EventHandlers / ComponentConfig are surfaced from
    base.ts. It is not a spec-owned name (checked against @objectstack/spec) and collides
    with nothing in-repo.
  • The Zod mirror pair layout.zod.ts#StackSchema carries no ledger entry in
    zod-mirror-parity.test.ts and passed before this change vacuously — every mirror key
    compared against any. It now compares against real declared types and still passes,
    which is a strengthening of an existing guard rather than a new one.
  • ⚠️packages/components/src/__tests__/stack-spacing-alias-removed.test.tsx:12 carries a
    prose comment reading StackSchema extends Omit< FlexSchema, 'type' > (spaced here so it
    survives the sanitizer), now stale. Left untouched — packages/components is another
    agent's collision bound in this batch. Worth a follow-up.

Generated by Claude Code

…ing under BaseSchema's index signature
`StackSchema` was declared `extends Omit<FlexSchema, 'type'>` and shipped a
declaration carrying exactly one property, `type`. `Omit<T, K>` is
`Pick<T, Exclude<keyof T, K>>`, and `keyof T` on a type with a string index
signature is `string | number` — the literal member names are absorbed.
`FlexSchema` inherits `BaseSchema`'s `[key: string]: any` (#5155), so the `Pick`
rebuilt a type with the index signature and none of the 25 named members.
Nothing errored, because the index signature answers every absent key with
`any`. The cost fell on the tools that read the declaration: editor completion
on a stack node offered `type` alone, and #6143's docs sweep read `stack.mdx`'s
`gap`/`children`/`className` as documenting keys that do not exist.
Fixed at the mechanism: the six flex/stack members move to a new exported
interface `FlexLayoutProps`, which does not inherit `BaseSchema`. `FlexSchema`
and `StackSchema` each extend `BaseSchema, FlexLayoutProps`, so no `Omit`
crosses the index signature and the members are declared once. Extending
`FlexSchema` directly is unavailable — `'stack'` is not a subtype of
`type: 'flex'` (TS2430, measured).
`FlexSchema` is unchanged: its member declarations moved byte-identically and
its emitted member set is the same 25 names.
Guarded by a pin that reads the EMITTED declaration, not the source — a
source-level assertion passes on the broken code because the index signature
answers with `any`, and that gap is the defect.
Part of #6151
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3223.0 KB3266.6 KB
Main entry chunk (gzip)153.8 KB350 KB
Entry fileindex-KpDPTf2A.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)10.38KB3.90KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)505.63KB114.68KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)171.74KB47.48KB
fields (index.js)238.40KB59.89KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.45KB
plugin-designer (index.js)212.33KB42.81KB
plugin-detail (index.js)244.74KB62.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)126.39KB30.80KB
plugin-gantt (index.js)164.17KB39.89KB
plugin-grid (index.js)201.14KB54.40KB
plugin-kanban (index.js)52.89KB14.59KB
plugin-list (index.js)111.94KB27.24KB
plugin-map (index.js)20.11KB6.64KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.74KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)54.84KB18.43KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.49KB2.14KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3222.7 KB3266.6 KB
Main entry chunk (gzip)154.1 KB350 KB
Entry fileindex-BiWtLRaE.js
StatusPASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)10.96KB4.16KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)505.63KB114.68KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)171.74KB47.48KB
fields (index.js)238.40KB59.89KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.45KB
plugin-designer (index.js)212.33KB42.81KB
plugin-detail (index.js)244.74KB62.20KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)126.42KB30.80KB
plugin-gantt (index.js)164.17KB39.89KB
plugin-grid (index.js)201.14KB54.40KB
plugin-kanban (index.js)52.83KB14.55KB
plugin-list (index.js)111.94KB27.24KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.74KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)54.84KB18.43KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.49KB2.14KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-litant
os-litant marked this pull request as ready for review August 25, 2026 10:26
@os-litant
os-litant added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit db3a600Aug 25, 2026
28 checks passed
@os-litant
os-litant deleted the claude/issue-6151-stackschema-omit-collapse branch August 25, 2026 10:38
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

3 participants

@yinlianghui@os-litant@claude