Skip to content

chore(deps): upgrade @objectstack/* to 17.0.0-rc.0 - #2950

Merged
os-zhuang merged 1 commit into
mainfrom
claude/objectstack-upgrade-17-rc0-1e0ddb
Jul 29, 2026
Merged

chore(deps): upgrade @objectstack/* to 17.0.0-rc.0#2950
os-zhuang merged 1 commit into
mainfrom
claude/objectstack-upgrade-17-rc0-1e0ddb

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

spec / client / formula / lint move from ^16.x to ^17.0.0-rc.0.

Two groups of v17 changes reach this repo, and they pull in opposite directions: the spec pruned surface objectui re-exported, and adopted surface objectui had been carrying locally.

Pruned — dead Theme config (objectstack#3494)

ThemeSchema dropped spacing, breakpoints, logo, density, wcagContrast, rtl, touchTarget and keyboardNavigation — authorable but never enforced, so authoring them was already a silent no-op.

@object-ui/types re-exported those sub-schemas by reference (#2231), so they could not survive the prune without becoming hand-written mirrors — exactly the second de-facto contract AGENTS.md #0.1 forbids. Removed from the public surface:

  • Types:Spacing, Breakpoints, DensityMode, WcagContrastLevel, ThemeLogo, and the deprecated SpacingScale alias
  • Schemas:SpacingSchema, SpacingScaleSchema, BreakpointsSchema, ThemeLogoSchema, plus the SpacingSchemaType / BreakpointsSchemaType helpers
  • Theme fields:spacing, breakpoints, logo

mergeThemes no longer merges the three dropped keys. generateThemeVars is unaffected — it never emitted them, which is why the liveness audit called them dead.

The one real consumer

ThemeProvider set the favicon from theme.logo.favicon. That path is removed: v17 strips the key at parse, so it could never arrive again. The live favicon is unaffected — it comes from operator branding (getFaviconUrl()), applied in the console's index.html, main.tsx, and on route change.

List density is also untouched: useDensityMode / rowHeightToDensityMode use @object-ui/core's own local DensityMode, which never came from the spec.

Adopted — ListColumn (objectui#2231)

ListColumnSchema used to .extend() the spec with two fields, each carrying a note to promote it upstream rather than grow the extension. v17 did exactly that, so the extension collapsed into a plain by-reference re-export:

  • summary → the spec's union([ColumnSummarySchema, ColumnSummaryConfigSchema]), the same enum ∪ { type, field } form useColumnSummary reads
  • prefix → the spec's ColumnPrefixSchema

One behavior change rides along: prefix.type now defaults to 'text' on parse instead of staying undefined, so the cell renderer always gets a value.

Node 22 is now the floor

Every @objectstack package declares engines.node: ">=22.0.0" (objectstack#3825; Node 20 reached EOL 2026-04-30). This repo claimed >=20 and ran CI on Node 20.x — promising and validating a runtime its own core dependency does not support. engines.node is now >=22, CI runs Node 22.x across all 12 workflows, and the CI/deployment docs say so.

Tests keep their teeth

Rather than just deleting assertions, coverage was redirected:

  • The removed ThemeLogoSchema block is replaced by a guard that the pruned keys stay pruned and that objectui does not re-add local mirrors of them.
  • The ListColumn summary check now asserts the shared aggregation vocabulary behaviorally — the spec builds that arm through lazySchema, whose Proxy resolves .shape.type to the inner enum and defeats the old identity check.
  • A new prefix test pins the compound-cell form and the new 'text' default.

Versioning

Stays major 17: per AGENTS.md the objectui major tracks @objectstack's major, which is also 17, and that convention deliberately outranks semver purity — so the removals ship as a minor rather than desyncing the two.

Verification

  • pnpm type-check76/76 green (all 39 packages incl. console, data-objectstack, plugin-charts)
  • pnpm test672/672 files, 7956 tests, 0 failures on a clean run
  • pnpm lint on types/core/react — 0 errors

Also swept the v17 wire-level changes that a type-check cannot catch (ChartInteraction zoom/clickAction, SharingRule groupteam, sharing full, ApiMethod enum, i18n route shapes): no objectui usage. The translationobjects. convergence (objectstack#3778) needs no change — transformSpecTranslations already reads that shape.

🤖 Generated with Claude Code

Move spec/client/formula/lint from ^16.x to ^17.0.0-rc.0. Two groups of v17
changes reach this repo, pulling in opposite directions: the spec pruned
surface objectui re-exported, and adopted surface objectui carried locally.
Pruned — dead Theme config (objectstack#3494). ThemeSchema dropped `spacing`,
`breakpoints`, `logo`, `density`, `wcagContrast`, `rtl`, `touchTarget` and
`keyboardNavigation`: authorable but never enforced, so authoring them was
already a silent no-op. @object-ui/types re-exported those sub-schemas *by
reference* (#2231), so they could not survive the prune without becoming
hand-written mirrors — the second de-facto contract AGENTS.md #0.1 forbids.
Dropped: the `Spacing`/`Breakpoints`/`DensityMode`/`WcagContrastLevel`/
`ThemeLogo` types, the deprecated `SpacingScale` alias, the matching schemas
and `*SchemaType` helpers, and `Theme.spacing`/`.breakpoints`/`.logo`.
`mergeThemes` no longer merges the three dropped keys. `generateThemeVars` is
untouched — it never emitted them, which is why the audit called them dead.
The one real consumer was ThemeProvider setting the favicon from
`theme.logo.favicon`; that path is gone, since v17 strips the key at parse and
it can never arrive again. The live favicon is unaffected: it comes from
operator branding (`getFaviconUrl()`) in the console's index.html, main.tsx,
and on route change. List density is also untouched — `useDensityMode` and
`rowHeightToDensityMode` use @object-ui/core's own local `DensityMode`.
Adopted — ListColumn (objectui#2231). `ListColumnSchema` used to extend the
spec with two fields, each tagged "promote upstream rather than grow this
extension"; v17 did exactly that. `summary` is now the spec's
union([ColumnSummarySchema, ColumnSummaryConfigSchema]) and `prefix` is the
spec's ColumnPrefixSchema, so the extension collapses to a plain re-export.
`prefix.type` now defaults to 'text' on parse instead of staying undefined.
Node 22 is the floor. Every @objectstack package declares engines.node >=22
(objectstack#3825; Node 20 hit EOL 2026-04-30), while this repo claimed >=20
and ran CI on Node 20.x — promising and validating a runtime its own core
dependency does not support. engines.node is now >=22, CI runs Node 22.x, and
the CI/deployment docs follow.
The parity test keeps its teeth: the deleted ThemeLogo assertions are replaced
by a guard that the pruned keys stay pruned and that objectui does not re-add
local mirrors, and the ListColumn summary check now asserts the shared
aggregation vocabulary behaviorally (the spec builds that arm through
lazySchema, whose Proxy defeats the old identity check).
Verified: pnpm type-check 76/76 green; pnpm test 672/672 files, 7956 tests,
0 failures.
Co-Authored-By: Claude <noreply@anthropic.com>
@vercel

vercelBot commented Jul 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredJul 29, 2026 4:14am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)27.9 KB350 KB
Entry fileindex-D54Rb5O8.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.20KB2.97KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.12KB3.41KB
auth (LoginForm.js)17.86KB5.29KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.43KB2.09KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.25KB1.01KB
auth (org-roles.js)6.72KB2.85KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)18.38KB4.49KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)3.65KB1.42KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.25KB0.53KB
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)450.13KB97.92KB
core (index.js)2.16KB0.78KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)129.13KB32.55KB
fields (index.js)220.19KB53.95KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.46KB0.96KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)5.37KB1.72KB
i18n (useObjectLabel.js)25.17KB5.80KB
i18n (useSafeTranslation.js)3.26KB1.44KB
layout (index.js)38.45KB10.67KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.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)4.42KB1.27KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)1.77KB0.77KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)6.84KB2.42KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.90KB12.35KB
plugin-charts (index.js)57.26KB16.24KB
plugin-chatbot (index.js)179.93KB42.67KB
plugin-dashboard (index.js)109.60KB28.33KB
plugin-designer (index.js)210.56KB42.56KB
plugin-detail (index.js)216.93KB53.05KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)103.51KB25.12KB
plugin-gantt (index.js)162.26KB39.53KB
plugin-grid (index.js)179.35KB46.97KB
plugin-kanban (index.js)47.82KB13.18KB
plugin-list (index.js)98.24KB23.19KB
plugin-map (index.js)16.80KB5.24KB
plugin-markdown (index.js)13.65KB4.67KB
plugin-report (index.js)37.07KB9.81KB
plugin-timeline (index.js)25.03KB7.11KB
plugin-tree (index.js)8.36KB2.81KB
plugin-view (index.js)85.47KB20.82KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.55KB0.67KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)3.19KB1.38KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)18.70KB6.09KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.00KB0.55KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)2.16KB0.94KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
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 (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)0.77KB0.41KB
types (disclosure.js)0.20KB0.18KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (index.js)1.86KB0.91KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)0.20KB0.18KB
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.04KB1.93KB
types (system-fields.js)2.39KB1.17KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)0.75KB0.46KB
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 merged commit ce08d55 into mainJul 29, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/objectstack-upgrade-17-rc0-1e0ddb branch July 29, 2026 04:21
os-zhuang added a commit that referenced this pull request Jul 30, 2026
…corrections (#2975)
The audit was run against 16.0.0-rc.0; objectui has since moved to 17.0.0-rc.0
(#2950). Re-extracted every enum: of the 30 named `ui/` exports, **zero changed
values**. `DensityModeSchema`/`WcagContrastLevelSchema` were removed (resolving a
Tier 4 row upstream) and `ChartAggregateFunctionSchema` added.
Three corrections, one of them reversing an attribution:
1. `before`/`after` were listed as objectui-local dialect. They are canonical
`VIEW_FILTER_OPERATORS` members. The real defect is that the spec's view
vocabulary and its AST vocabulary disagree on 8 of 19 members — six masked
only by an adapter alias table that happened to be complete for them.
2. "Cheap while spec 16 is still RC" was wrong twice: there is no version window,
and RC status is not what makes narrowing risky. Narrowing is loud for new
authoring and silent for stored data, and `saveMeta` persists verbatim so the
schema's own normalization never reaches the row.
3. The Tier 1/Tier 2 split missed a third outcome — a filter not applied at all,
returning a superset. Ranks with Tier 1.
Also records that the "objectui resolves two spec versions" finding was a
stale-checkout artifact, not a defect, so nobody re-derives it.
Refs #2901, objectstack#3948
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang