Skip to content

feat(types)!: retire ThemeSwitcherSchema / ThemePreviewSchema and ThemeUnionSchema - #5823

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-5647-retire-theme-switcher-preview
Aug 23, 2026
Merged

feat(types)!: retire ThemeSwitcherSchema / ThemePreviewSchema and ThemeUnionSchema#5823
os-zhuang merged 1 commit into
mainfrom
claude/issue-5647-retire-theme-switcher-preview

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes#5647

Retires the two remaining dead theme component kinds — ThemeSwitcherSchema (type: 'theme-switcher') and ThemePreviewSchema (type: 'theme-preview') — together with ThemeUnionSchema, which after #5489 held only these two members. The authority is inherited, not fresh: the 2026-08-21 maintainer ruling (option B) on the parent case, extended to these siblings on identical evidence per the standing same-family default (triage comment 5380592857 on the issue). This PR does not re-adjudicate; it re-measures.

Evidence re-measured on current main (ad404e0)

The card's sweep, repeated with its positive controls on the same pipelines:

  • Registry: grep -rhoE "ComponentRegistry\.(register|registerLazy)\(\s*'[a-z0-9-]+'" packages/*/src → 202 registered keys; theme-switcher → 0, theme-preview → 0, control tooltip → 1.
  • Placeholders: neither literal in PROTOCOL_COMPONENTS / PALETTE_PLACEHOLDER_BLOCKS (packages/components/src/renderers/placeholders.tsx).
  • Fixtures: "type": "theme-switcher" → 0, "type": "theme-preview" → 0, control "type": "form" → 81.
  • Identifier consumers: ThemeSwitcherSchema|ThemePreviewSchema|ThemeUnionSchema outside packages/types → 0 hits repo-wide (code, docs, scripts, skills). AnyComponentSchema importers outside packages/types → 0.

Bound on the claim: in-repo consumers are measurable and are zero; consumers of the published @object-ui/types outside this org are not measurable from here. This is a breaking narrowing for any external consumer of the removed names, declared in the changeset.

What changed (worked example: PR #5650)

Out of scope, untouched: ThemeEngine, ThemeContext/ThemeProvider and their tests (explicitly retained by the ruling); content/docs (zero doc references existed to remove — the theme-schema page rewrite landed separately in #5809).

Verification (all at 96ebb73, the head of this PR)

  • Build: pnpm --filter @object-ui/types build — green (the package has no internal deps; deps closure is external only).
  • Type-check: pnpm --filter @object-ui/types type-check (all three tsconfigs incl. tests) — green.
  • Tests from repo root: pnpm exec vitest run packages/types/ — 46 files / 514 tests passed, including the parity pin against the tombstone module.
  • Consumer compile (downstream direction): the four packages that import @object-ui/types/zod@object-ui/cli, @object-ui/plugin-view, @object-ui/plugin-map, @object-ui/plugin-list — type-checked green via turbo run type-check (19/19 tasks, building their 15-package dependency closure first, incl. @object-ui/core, @object-ui/components, @object-ui/react). The remaining ~35 dependents of @object-ui/types are compiled by CI; the identifier sweep above (zero external references to the removed names, zero AnyComponentSchema importers) is the measured basis for that narrowing.
  • Reverse verification, dist-level (fix committed first): a probe importing the three removed names from the rebuilt dist → red with TS2724/TS2305 on exactly those three; control probe importing retained Theme / ThemeMode / validateSchema → green (exit 0). Probe deleted.
  • Reverse verification, pin-level (ablation with restore trap): re-added a minimal type: 'theme-switcher' member to AnyComponentSchema in src — mutation confirmed on disk (MUTATION5647 marker grep → 1); no build leg needed and none run, because the test imports ../zod/index.zod source-relative; run → exactly the retirement pin red (1 failed / 29 passed), direction as predicted; restored via git checkout from the committed branch, confirmed marker grep → 0; re-run green (30/30).
  • Gates: check-changeset-presence ✅ ("5 source file(s) of 1 released package(s) changed... declares 1 changeset(s)"), check-changeset-no-major ✅ ("No changeset declares a major bump."), check-control-bytes ✅ ("OK (scanned 4844 tracked text file(s))"), check-doc-component-types ✅ ("Every documented component type is registered." — against the shrunk declared set).
  • Declared narrowing: check-doc-snippet-types was NOT run locally — it refuses without built dist for 8 further packages (incl. app-shell) and belongs to CI's fully built tree. Basis: its population is the content/ snippet corpus; removed names in content/ → 0 and kind literals → 0 (control: AppComponentSchema → 2 files), and this diff touches nothing under content/, so no untouched snippet's verdict can move except via the removed names, which zero snippets reference.
  • Lint: package-level eslint for @object-ui/types exit 0 (0 errors). The edited test file carries 9 pre-existing unused-import warnings; the baseline on main carries 10 (this diff removes one, adds none).

Concurrency note

Two sibling cards are in packages/types in flight (data-display.ts; objectql.ts + zod/objectql.zod.ts). No file overlap with this diff except the two barrels, which this card alone touches per dispatch; overlap resolution if any conflict appears: keep each card's own hunks.


Generated by Claude Code

…meUnionSchema (#5647)
Retire the two remaining theme component kinds no renderer implemented —
`type: 'theme-switcher'` / `type: 'theme-preview'` — and `ThemeUnionSchema`,
which after objectui#5489 held only these two members. Inherited 2026-08-21
maintainer ruling (option B) on objectstack#10485, extended per the
same-family default on identical evidence: zero ComponentRegistry
registrations (202 keys enumerated, control `tooltip` -> 1), zero placeholder
entries, zero fixtures (control `"type": "form"` -> 81).
- packages/types/src/theme.ts: both interfaces removed, tombstone extended
- packages/types/src/zod/theme.zod.ts: now an export-less tombstone module
(kept importable for the spec-subschema-parity retired-names pin)
- barrels: names removed from index.ts / zod/index.zod.ts;
AnyComponentSchema no longer carries a theme member
- phase2-schemas.test.ts: acceptance test converted to refusal pins for all
three retired kinds, with a live-kind positive control on the same pipeline
The theme SYSTEM (Theme document, ThemeEngine, ThemeProvider) is retained
and untouched, as the same rulings require.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EuPCi56cnGyykygi3z9w4m
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3226.9 KB3990.2 KB
Main entry chunk (gzip)152.7 KB350 KB
Entry fileindex-CNH3rpLv.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.04KB3.72KB
app-shell (runtime-config.js)12.80KB4.47KB
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)37.99KB9.84KB
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)503.96KB113.94KB
core (index.js)4.92KB1.97KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)164.55KB45.67KB
fields (index.js)238.40KB59.89KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)7.77KB3.13KB
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)186.86KB44.21KB
plugin-dashboard (index.js)128.44KB32.96KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)242.34KB60.99KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.63KB30.64KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)200.79KB54.26KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.80KB27.20KB
plugin-map (index.js)20.06KB6.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)8.50KB2.88KB
plugin-view (index.js)84.61KB20.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)3.77KB1.33KB
react (SchemaRenderer.js)44.39KB14.99KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.33KB0.69KB
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)0.20KB0.18KB
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 (index.js)3.88KB1.85KB
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-zhuang
os-zhuang marked this pull request as ready for review August 23, 2026 13:41
@os-zhuang
os-zhuang added this pull request to the merge queueAug 23, 2026
Merged via the queue into main with commit b7543a9Aug 23, 2026
23 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5647-retire-theme-switcher-preview branch August 23, 2026 13:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@os-zhuang@claude