Skip to content

fix(runner): 删掉 vite 别名表里指向不存在包目录的 data-objectql 条目 - #3747

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3593-dead-objectql-alias
Aug 8, 2026
Merged

fix(runner): 删掉 vite 别名表里指向不存在包目录的 data-objectql 条目#3747
yinlianghui merged 1 commit into
mainfrom
claude/issue-3593-dead-objectql-alias

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #3593

前提复核(在 origin/main 上,按内容锚定而非行号)

fetch 点 8ad6070fb。前提成立且完整:

事实 实测
表里有该条目 packages/runner/vite.config.ts:76(分诊时记的 :76,未漂移)
包目录不存在 git ls-tree origin/main packages/data-objectql → 空;packages/ 下 39 个包无此项(现存的是 data-objectstack)
全仓唯一引用 grep -rnI data-objectql(去 node_modules/.git)→ 2 处,均在本文件::76 条目本身 + :69 #3575 那条点名本单的注释
runner 未声明依赖 package.json dependencies 六个工作区包,无它
零 importer 无任何源文件 import,故 vite 别名永不被匹配

逐条核对表内 15 个条目的目标目录,恰好一条死的:

OK   packages/components/src        OK   packages/plugin-charts/src
OK   packages/core/src              OK   packages/plugin-detail/src
DEAD packages/data-objectql/src     OK   packages/plugin-kanban/src
OK   packages/data-objectstack/src  OK   packages/providers/src
OK   packages/fields/src            OK   packages/react/src
OK   packages/i18n/src              OK   packages/react-runtime/src
OK   packages/permissions/src       OK   packages/sdui-parser/src
                                    OK   packages/types/src

改动(单文件,两处)

  1. 删掉死条目。按分诊席裁定走「删除是唯一读法」:条目指向空无,无论 data-objectql 是否被 data-objectstack 取代,删除都成立;该包若回归,加回一行别名是一件小事。
  2. packages/runner 按 runner.mdx 的「From Source」步骤起不来:vite 别名表漏了 5 个源码实际 import 的工作区包 #3575 那条推导命令的 2>/dev/null 绕过换成不变量的显式检查——这是本单真正的技术债所在。

第 2 点的方向选择值得写明:issue 正文建议的是「换成显式的目录存在性过滤」,但那个建议原本挂在「保留条目」的分支下。既然条目被删,过滤就是错的方向——它会静默跳过死条目,恰好复刻本单反对的那种「不变量看起来是软的」。因此改为失败即响:

  • 移除 2>/dev/null,并在注释里写明 stderr 不再被吞的理由——内层 grep -r 走的正是本表点名的目录,所以它报 No such file or directory 不是噪音,而是「表里有条目指向不存在目录」的告警;应当改表,不是消音。
  • 另补一条可单独跑的死条目检查(逐个 [ -d ]),表干净时无输出,与第一条命令「跑到不打印东西为止」的用法同构。

于是这张表的两个方向现在都有机械检查:缺别名(#3575 修的方向)由 comm -13 报,死条目(本单方向)由新增检查报。

验证 —— 方向在跑之前先定

1. 不变量:表 = 闭包(两个方向都干净)

改后,从仓根跑新注释里的两条命令:

### 推导命令(按新注释,已无 2>/dev/null) ###
[输出 0 字节 —— stdout 无缺口,stderr 也不再有 No such file or directory]

### 死条目检查 ###
[无输出 = 表干净]

2. 反向验证 —— 三个方向,预测在前

把文件恢复成 origin/main 版本(死条目回到表里)后:

方向 预测 实测
推导命令(无绕过) grep: packages/data-objectql/src: No such file or directory
新增死条目检查 dead table entry: packages/data-objectql/src
dev 模块图 不变(非红) 完全一致

第三行是诚实的方向,不是模板预设的红:这条别名从来没被匹配过(零 importer),所以它对运行时的贡献本就是零,删除它在模块图上必然看不出差别。这正是本单判为「休眠」的依据,这里把它从推断变成了实测——data-objectql 在两次爬取里都是 0 次出现。真正会动的是诊断,而诊断按预测两条全红。

3. dev server 冒烟 + 整张模块图(install-only,不 build)

干净 worktree 只跑 pnpm install,自选空闲端口 --strictPort,从 /src/main.tsx 沿 vite 改写后的 import URL 爬全图。改后(:5237):

crawled 2380 modules from /src/main.tsx
workspace packages served FROM SRC (13): components, core, fields, i18n, permissions,
  plugin-charts, plugin-detail, plugin-kanban, providers, react, react-runtime, sdui-parser, types
served from dist / node_modules/@object-ui (0): (none)
NON-200 responses: 0
data-objectql anywhere in graph: 0
vite 日志里 could not be resolved / Failed to run dependency scan / Failed to resolve import:0 次

改前(同一棵树、origin/main 版本的 config,:5238):以上数字逐项相同(2380 / 13 / 0 / 0 / 0)。

#3599 记的 2381 差 1,是其后 #3651#3676App.tsx / main.tsx 带来的,不是本次改动——因为改前基线是在同一棵树上重测的,两侧都是 2380。13 而非 14 仍是类型级的 data-objectstack(esbuild 抹除,本就不进模块图),与 #3599 的分析自洽。

4. 静态检查

  • pnpm --filter @object-ui/runner lint:23 problems(0 errors,23 warnings),与 fix(runner): 把 vite 别名表补成工作区 import 的完整传递闭包 #3599 记录的既有基线一字不差,本文件零告警。
  • node scripts/check-control-bytes.mjs:OK (scanned 3691 tracked text file(s));另对改动文件做了越过该 gate 的自扫 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' → 无命中,file 判为 Unicode text, UTF-8
  • type-check 对本文件不构成证据,故未跑:runner 的 tsconfig.jsoninclude: ["src"],vite.config.ts 不在其 program 里(fix(runner): 把 vite 别名表补成工作区 import 的完整传递闭包 #3599 的正文已点明这一点)。为它去 build 一串上游依赖换不到任何关于本改动的信号,按资源纪律略过——真正的验收证据是上面第 1/2/3 节。

测试:为什么没有新增测试

改动是删掉一条永不被匹配的构建期别名 + 改注释里的一条 shell 命令。没有产品代码路径可断言;能钉住的不变量已由注释里那两条可复跑命令承担(第 1、2 节即是它们的实测)。packages/runner 现有 13 个测试从仓根跑全绿:

$ pnpm exec vitest run --maxWorkers=2 packages/runner/src
 Test Files  3 passed (3)
      Tests  13 passed (13)

⚠️ 注意 pnpm --filter @object-ui/runner test(包级入口)在干净 origin/main 上就是 4 红(window is not defined),与本改动无关——已在 origin/main 版本上跑同一命令复现同样的 4 failed | 9 passed 确认,并另开 #3746 记录。

changeset:无(与 #3599 的判据一致,结论相反)

#3599 补了 patch changeset,是因为它真的改了发布产物(资产数 10 → 1776、modulePreload 关掉、首屏载荷 -86%)。本次删掉的是一条匹配不到任何 import 的别名条目:rollup/vite 对未命中的 alias 不产生任何输出差异,dist 逐字节不变;另按 AGENTS.md「功能改进需 changeset,纯 bug 修复不需要」,本次是后者。故不加。

坦白一句:没有跑两次完整 vite build 去做 dist 字节比对——那是约 1776 个产物的两轮重构建,而「未命中的别名不影响产物」由构造即可确立,再加上第 3 节改前/改后模块图逐项相同,已足够;在共享容器里为此烧两轮重建不符合资源纪律。

越界发现


Generated by Claude Code

`packages/runner/vite.config.ts` 的别名表里有一条
`"@object-ui/data-objectql" -> packages/data-objectql/src`,但该目录在仓库里
并不存在(`git ls-tree origin/main packages/data-objectql` 为空),该 specifier
全仓仅此一处出现,runner 的 package.json 也没有列它,零源文件 import 它。
这是 #3575 修的那张表**另一个方向**的破缺:表里有条目、对应的包却没了。

条目当前不可达(vite 的 resolve.alias 不校验 replacement 路径是否存在,不匹配
就不解析),所以删除它不改变任何运行时行为——但它有一个实际代价:#3575 在表旁
留的「重导闭包」命令必须用 `2>/dev/null` 才能压掉这条死条目产生的
`grep: packages/data-objectql/src: No such file or directory`,而那是绕过、不是
修复:一个长期存在的假条目让「表 = 闭包」这条不变量看起来是软的。

一并把该绕过换成不变量的**另一个方向**的显式检查:
- 移除 `2>/dev/null`,并在注释里写明 stderr 不再被吞的原因——内层 `grep -r`
  走的正是本表点名的目录,所以它报 `No such file or directory` 不是噪音,而是
  「表里有条目指向不存在的目录」的告警,应当改表而不是消音;
- 补一条可单独跑的死条目检查(逐个 `[ -d ]`),表干净时无输出。
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 8, 2026 11:22am

Request Review

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-BEAgjw06.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 480.72KB 105.64KB
core (index.js) 2.96KB 1.13KB
create-plugin (index.js) 9.84KB 3.18KB
data-objectstack (index.js) 137.51KB 35.11KB
fields (index.js) 230.90KB 56.84KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
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.74KB
mobile (index.js) 1.50KB 0.62KB
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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 61.04KB 17.31KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 115.50KB 29.96KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 232.79KB 57.42KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.10KB 27.10KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 186.61KB 49.34KB
plugin-kanban (index.js) 48.30KB 13.28KB
plugin-list (index.js) 105.12KB 25.48KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 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-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
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 (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
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

@yinlianghui
yinlianghui marked this pull request as ready for review August 8, 2026 11:33
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 5a297c3 Aug 8, 2026
18 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3593-dead-objectql-alias branch August 8, 2026 11:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

packages/runner/vite.config.ts 的 @object-ui/data-objectql 别名指向不存在的包目录(全仓唯一引用)

1 participant