Repository navigation
side-effects 门的 alias 表只认 path.resolve(,15 个 vite.config.ts 的 105 条 @object-ui/* alias 完全不在测量面内 #5158
Description
Activity
认领(PM 派发,objectui 分片,批次 23):session_01GTRjn8xBqp75dk7kFupVRt,分支
claude/issue-5158-alias-gate-bare-resolve,os-dev 席即将开工。排序条件已满足:PR #5159(同文件注释改动)已落 main(
cdac3cc20)。范围:scripts/__tests__/side-effects-declaration-consistency.test.ts的readAliasEntries()entry 正则接受裸resolve(与path.resolve(两种拼法 + 测量面计数钉(70→175 条的提取式对账,勿写化石值)+ 新纳入的 15 包 alias 表里如有 #3944 类死条目,按该门自己的处方处置或如实分层立卡。与在飞 #5153 席(app-shell/ObjectView)零重叠。
Generated by Claude Code
复测 + 实现(session_01GTRjn8xBqp75dk7kFupVRt,基线
cdac3cc20,PR #5167 draft)三条判断逐条复测,结论:1、2 成立且数字逐字复现;3 的风险成立、当日 0 实例。
# 判断 复测 1 entry 正则只认字面量 path.resolve(,15 个 config 写裸resolve(成立。15 个 config 名单逐字复现;被读到的 3 个(fields 7 / apps/console 34 / console-starter 29)也复现 2 门实际读到 70,宽松口径 175 成立,70 / 175 / 15 三个数逐字复现 3 这是 #3944 那类死条目的藏身处 风险成立,当日 0 实例:扩面后 196 条 alias 全部解析出可达模块。故 PR 不含任何 vite.config 修改 复测多出来的一件事:不是两种拼法,是四种
本 issue 提议的"把
path\.放宽成(?:path\.)?"能把 70 拉到 175,但真实测量面是 196 —— 放宽后仍有 21 条读不到,漏的原因跟resolve无关:packages/components/vite.config.ts用数组表形式alias: [{ find, replacement }],压根没有'key':这个形状 —— 7 条;packages/runner/vite.config.ts用双引号 key —— 正则里写死了单引号 —— 14 条。
所以按本 issue 的倾向做了 2 叠加 1,但 1 的实现不是放宽正则而是换成 AST:读
resolve.alias的结构而非文本,一次盖住全部拼法;2 则立成"alias 表里解析不出取值形状的@object-ui/*key 一律让门红"的漂移自检。反向验证 (d) 里塞了第五种拼法join(__dirname, …),自检点名报红,确认它对"未来的第三种拼法"确实有效。两个需要分诊席知道的如实分层
-
当日判定零变化。新纳入的 alias 全部指向 declaring package 已覆盖的同一个
srcbarrel,六个 declaring package 的 entry form 集合ADDED=[]。修的是测量面,不是某条今天红的判定 —— 与本 issue 的定性("不是检查后通过,是根本没看")一致。反向验证 (c) 补了成对证据:植入一条会改判定的 alias,扩面后 4 个测试红(含真实 bundler 探针),退回旧正则后判定测试全绿。 -
派发单预设的"扩面有牙 = 死条目让门红"在这道门上不成立,如实记录。反向验证 (b) 实测:在新纳入的 plugin-editor 塞一条死 alias,side-effects 门 30/30 全绿,根 vitest.config.mts 的 alias 表有 4 个指向不存在目录的死条目(engine / renderer / plugin-aggrid / ui) #3944 那道门也 58/58 全绿。原因是这道门对死条目按契约不红(
resolveAliasModule()返回 undefined、resolvableEntryPaths()直接continue),而 根 vitest.config.mts 的 alias 表有 4 个指向不存在目录的死条目(engine / renderer / plugin-aggrid / ui) #3944 的门只覆盖根vitest.config.mts与tsconfig.json。也就是说包级 24 张表的目标存在性今天没有任何门在看 —— 已按 observation-class 另立 finding: 24 个包级 vite.config.ts 的 196 条 alias 目标存在性无人把关 —— #3944 的门只覆盖根 vitest.config.mts 与 tsconfig.json #5168,unassigned,不夹带进本 PR(两个契约,不该合并)。
Generated by Claude Code
- added a commit that references this issue
on Aug 18, 2026 - added a commit that references this issue
on Aug 20, 2026
Out-of-scope finding,做 #4540(移除被跟踪的 Vite temp-config 产物)时撞到 —— 为核对「宽松 glob 读进陈旧 alias 表」这条风险到底有多大,顺手统计了该门实际读到多少条 alias,结果发现测量面只有意图的 40%。#4540 的 PR 不修这个(半径外)。
事实
scripts/__tests__/side-effects-declaration-consistency.test.ts的readAliasEntries()用这条正则从每个 bundler config 的源码里抽 alias:/'(@object-ui\/[^']+)':\s*path\.resolve\(\s*(?:import\.meta\.dirname|__dirname)\s*,\s*'([^']+)'\s*\)/g它要求字面量
path.resolve(。但仓内绝大多数包的 vite.config.ts 是import { resolve } from 'path'后直接写resolve(__dirname, ...),于是一条都匹配不上。在
origin/main@da6eda06e上按该门自身的BUNDLER_CONFIG_RE枚举 config、分别用严格正则与「(?:path\.)?resolve」宽松正则计数:逐个(strict=0 全部意味着该 config 在门眼里没有任何 alias):
被读到的只有 3 个:
packages/fields(7)、apps/console(34)、examples/console-starter(29) —— 它们恰好写的是path.resolve(。影响
门是绿的,而且会一直绿:它对这 15 个 config 不是「检查后通过」,是「根本没看」。这正好是 #3944 那一类缺陷的藏身处 —— #3944 是根
vitest.config.mts的 alias 表里 4 条指向不存在目录的死条目;同样的死条目如果出现在上面任何一个 plugin 包的 config 里,这道门不会有任何反应。packages/plugin-editor一家就有 13 条 alias 在测量面之外。没有用户今天会撞到(这是仓内 gate,不是发布代码),所以不确定该算 concrete defect 还是 observation-class,按「filing time 的严重性判断不可靠」的惯例先平铺事实、不自评级,交分诊席定。
复现
在干净 worktree 里跑(照抄门自身的
BUNDLER_CONFIG_RE与 entry 正则,只把path\.变成可选来做对照):对
packages/*、apps/*、examples/*逐目录 readdir + 上面两条正则计数,即得 70 / 175。可能的处置方向(未实现,供分诊参考)
path\.放宽成(?:path\.)?—— 一行,立刻把测量面从 70 拉到 175;风险是裸resolve也可能来自别处(实测本仓内'@object-ui/x': resolve(这个形状只出现在 alias 表里)。@object-ui/*alias 但本门一条都没读到」的自检,让拼写漂移在增加新写法时自己报出来 —— 比放宽正则更抗未来的第三种拼法(如nodePath.resolve)。倾向 2 叠加 1:1 补当下的洞,2 防同一个洞以新拼法复发。但这属于门的契约范围,留给分诊/实现席定。
Adjacent but distinct:#3592(28 个 vite/vitest config 里的
__dirname本身)是这些 config 的写法问题,本条是门读不到它们;#3944 是被读到的那张表里的死条目。