Skip to content

fix(editor,markdown): complete the vite alias tables so the per-package test task resolves - #4218

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-4194-plugin-editor-alias
Aug 11, 2026
Merged

fix(editor,markdown): complete the vite alias tables so the per-package test task resolves#4218
yinlianghui merged 1 commit into
mainfrom
claude/issue-4194-plugin-editor-alias

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#4194

Premise check (first, before any edit)

Reproduced on the branch tip off origin/main @ 433ff9fd3 — the premise holds, unchanged after 8+ hours:

$ pnpm turbo run test --filter=@object-ui/plugin-editor --force
FAIL src/index.test.ts [ src/index.test.ts ]
Error: Failed to resolve import "@object-ui/providers" from "../fields/src/widgets/FileField.tsx". Does the file exist?
Plugin: vite:import-analysis
File: /home/user/objectui-issue-4194/packages/fields/src/widgets/FileField.tsx:3:26
Test Files 1 failed (1)
Tests no tests

Mechanism

Both configs alias @object-ui/fields (and friends) to source, but not the workspace packages those sources in turn import. test.setupFiles pulls in the root vitest.setup.tsx, which imports the components / fields / plugin-dashboard / plugin-grid barrels, so the setup graph reaches @object-ui/providers from packages/fields/src/widgets/FileField.tsx. With no alias entry the specifier falls through to the workspace package's exports (i.e. dist) — and providers is not in either package's ^build closure, so nothing ever creates that dist.

Masked in day-to-day CI because ci.yml runs the canonical root Vitest (sharded), not per-package turbo run test.

Fix — the alias table completed, not the reachable graph trimmed

Per #3240's ruled direction applied by analogy. The card asked for all gaps, not just providers, so the reachable set was measured rather than guessed: every @object-ui/* specifier imported by the src trees the aliases already point at.

Six entries added to each config, in the root vitest.config.mts ordering:

AddedReached fromWas
providersfields/src/widgets/FileField.tsx, ImageField.tsxhard red — no dist
mobileplugin-grid/src/ObjectGrid.tsxlatent red — no dist
permissionsplugin-grid/src/ObjectGrid.tsxlatent red — no dist
i18ncomponents/src/custom/navigation-overlay.tsxsilent divergence — resolved to dist
sdui-parsercomponents/src/renderers/layout/page.tsxsilent divergence — resolved to dist
data-objectstackreact/src/context/AppShellContext.tsxsilent divergence — resolved to dist

The three "silent divergence" rows were green only because those packages happen to sit in the ^build closure, so the per-package path was testing dist where the canonical root run tests src — the two-verdicts-for-one-file shape #3240 documents. @object-ui/types/zod was deliberately not added: the root table needs it ahead of @object-ui/types because of Vite's prefix matching, but nothing in the reach set imports it, and the runs are green without it.

Sweep: plugin-markdown has the same gap

The card asked to check it; it was red too, on the same signature, all 4 files:

$ pnpm turbo run test --filter=@object-ui/plugin-markdown --force # BEFORE, unmodified config
Error: Failed to resolve import "@object-ui/providers" from "../fields/src/widgets/FileField.tsx"
Test Files 4 failed (4)
Tests no tests

Same fix applied, in this PR, with its own evidence below.

Evidence

Red-before / green-after of the same command, per package:

$ pnpm turbo run test --filter=@object-ui/plugin-editor --force # AFTER
✓ src/index.test.ts (7 tests) 8ms
Test Files 1 passed (1)
Tests 7 passed (7)
$ pnpm turbo run test --filter=@object-ui/plugin-markdown --force # AFTER
✓ src/index.test.ts (5 tests) ✓ src/metadata-fence.test.ts (6 tests)
✓ src/markdown-render.test.tsx (12 tests) ✓ src/toc.test.ts (6 tests)
Test Files 4 passed (4)
Tests 29 passed (29)

Note the before/after is not merely red-to-green: it was 0 test / no tests (the suite could not load at all), and it is now 7 and 29 tests actually executing.

Canonical CI path unregressed, and the two paths now agree on the count (7 + 29 = 36):

$ pnpm exec vitest run packages/plugin-editor/ packages/plugin-markdown/
Test Files 5 passed (5)
Tests 36 passed (36)

Reverse verification

Predicted direction RED (the ordinary one — the resolve failure returns), with its precondition recorded first, since a providers/dist created by some unrelated build would have made the revert falsely green:

providers/dist present: no
$ git checkout origin/main -- packages/plugin-editor/vite.config.ts
$ pnpm turbo run test --filter=@object-ui/plugin-editor --force
Error: Failed to resolve import "@object-ui/providers" from "../fields/src/widgets/FileField.tsx"
Test Files 1 failed (1)

Confirmed, then restored.

Changeset

Let the gate arbitrate rather than guessing, as the card directed. Verdict — none owed, and no skip-changeset label (#3724):

$ node scripts/check-changeset-presence.mjs
Compared the working tree with 433ff9fd3 (merge-base with origin/main): 2 file(s) changed,
0 of them under the src/ of a package the release covers, 0 under a package changesets ignores,
0 changeset(s) added.
✅ No source of a released package changed in this range, so no changeset is owed.

Other gates: node scripts/check-control-bytes.mjs OK (3920 files); eslint on both changed files exits 0.

Relationship to #3240's own execution

This is the targeted un-redding of two packages, not a move away from #3240's ruling. That ruling (Direction A — delete the 17 per-package vitest configs, root config becomes the single entry) is explicitly deferred to a dedicated quiet-window batch, and neither package here is among those 17: both carry a vite.config.ts with a test block, not a vitest.config.ts. When A executes, both of these tables disappear along with the divergence they are patching.


Generated by Claude Code

…ge test task resolves
`packages/plugin-editor/vite.config.ts` and `packages/plugin-markdown/vite.config.ts`
alias `@object-ui/fields` (and friends) to source, but not the workspace packages
those sources in turn import. Both packages' `test.setupFiles` pull in the root
`vitest.setup.tsx`, which imports the components / fields / plugin-dashboard /
plugin-grid barrels, so the setup graph reaches `@object-ui/providers` from
`packages/fields/src/widgets/FileField.tsx`. With no alias entry that specifier
falls through to the workspace package's `exports` (`dist`), and `providers` is
not in either package's `^build` closure, so `turbo run test` failed with
`Failed to resolve import "@object-ui/providers"`.
Completes both tables with every `@object-ui/*` specifier the aliased-to-source
trees reach, in the root `vitest.config.mts` ordering: i18n, sdui-parser,
providers, data-objectstack, mobile, permissions.
Fixes#4194
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 11, 2026 3:24am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.3 KB350 KB
Entry fileindex-6hlGbM-2.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.88KB3.25KB
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.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
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.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
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)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.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)486.47KB107.53KB
core (index.js)3.04KB1.15KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)143.81KB37.39KB
fields (index.js)228.33KB56.58KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.87KB10.80KB
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)6.96KB1.98KB
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)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
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)45.23KB12.45KB
plugin-charts (index.js)61.52KB17.49KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)118.52KB30.68KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)237.80KB59.48KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.58KB27.68KB
plugin-gantt (index.js)164.14KB39.98KB
plugin-grid (index.js)187.97KB49.90KB
plugin-kanban (index.js)48.60KB13.41KB
plugin-list (index.js)110.18KB26.70KB
plugin-map (index.js)17.00KB5.32KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)26.21KB7.52KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)23.71KB7.95KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.23KB0.66KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
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)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-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
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 (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
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

@yinlianghui
yinlianghui marked this pull request as ready for review August 11, 2026 03:36
@yinlianghui
yinlianghui added this pull request to the merge queueAug 11, 2026
Merged via the queue into main with commit a9a67ecAug 11, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-4194-plugin-editor-alias branch August 11, 2026 03:37
yinlianghui pushed a commit that referenced this pull request Aug 11, 2026
Picks up the rc.6 spec bump (#4169) and the vite alias completion (#4218) so this
branch is verified against the same @objectstack/spec CI resolves.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
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.

plugin-editor test task red on main: vite.config.ts alias table missing @object-ui/providers

2 participants

@yinlianghui@claude