Skip to content

side-effects 门的 alias 表只认 path.resolve(,15 个 vite.config.ts 的 105 条 @object-ui/* alias 完全不在测量面内 #5158

Description

@yinlianghui

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」宽松正则计数:

门实际读到的 alias 条数(path.resolve):      70
把裸 resolve() 也算上:                      175
完全不可见的 config 数:                      15

逐个(strict=0 全部意味着该 config 在门眼里没有任何 alias):

packages/plugin-ai/vite.config.ts          strict=0 loose=5
packages/plugin-charts/vite.config.ts      strict=0 loose=7
packages/plugin-dashboard/vite.config.ts   strict=0 loose=6
packages/plugin-designer/vite.config.ts    strict=0 loose=9
packages/plugin-detail/vite.config.ts      strict=0 loose=7
packages/plugin-editor/vite.config.ts      strict=0 loose=13
packages/plugin-form/vite.config.ts        strict=0 loose=8
packages/plugin-grid/vite.config.ts        strict=0 loose=8
packages/plugin-kanban/vite.config.ts      strict=0 loose=7
packages/plugin-list/vite.config.ts        strict=0 loose=7
packages/plugin-map/vite.config.ts         strict=0 loose=1
packages/plugin-markdown/vite.config.ts    strict=0 loose=13
packages/plugin-report/vite.config.ts      strict=0 loose=5
packages/plugin-timeline/vite.config.ts    strict=0 loose=8
packages/plugin-tree/vite.config.ts        strict=0 loose=1

被读到的只有 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\. 变成可选来做对照):

const BUNDLER_CONFIG_RE = /^vite\.config\.(ts|mts|cts|js|mjs|cjs)$/;
const STRICT = /'(@object-ui\/[^']+)':\s*path\.resolve\(\s*(?:import\.meta\.dirname|__dirname)\s*,\s*'([^']+)'\s*\)/g;
const LOOSE  = /'(@object-ui\/[^']+)':\s*(?:path\.)?resolve\(\s*(?:import\.meta\.dirname|__dirname)\s*,\s*'([^']+)'\s*\)/g;

对 packages/*、apps/*、examples/* 逐目录 readdir + 上面两条正则计数,即得 70 / 175。

可能的处置方向(未实现,供分诊参考)

  1. 把 entry 正则里的 path\. 放宽成 (?:path\.)? —— 一行,立刻把测量面从 70 拉到 175;风险是裸 resolve 也可能来自别处(实测本仓内 '@object-ui/x': resolve( 这个形状只出现在 alias 表里)。
  2. 或者反过来立一道「config 里出现了 @object-ui/* alias 但本门一条都没读到」的自检,让拼写漂移在增加新写法时自己报出来 —— 比放宽正则更抗未来的第三种拼法(如 nodePath.resolve)。

倾向 2 叠加 1:1 补当下的洞,2 防同一个洞以新拼法复发。但这属于门的契约范围,留给分诊/实现席定。

Adjacent but distinct:#3592(28 个 vite/vitest config 里的 __dirname 本身)是这些 config 的写法问题,本条是门读不到它们;#3944 是被读到的那张表里的死条目。

Activity

  1. self-assigned this
    on Aug 18, 2026
  2. yinlianghui commented on Aug 18, 2026

    @yinlianghui
    CollaboratorAuthor

    认领(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

  3. yinlianghui commented on Aug 18, 2026

    @yinlianghui
    CollaboratorAuthor

    复测 + 实现(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, …),自检点名报红,确认它对"未来的第三种拼法"确实有效。

    两个需要分诊席知道的如实分层

    1. 当日判定零变化。新纳入的 alias 全部指向 declaring package 已覆盖的同一个 src barrel,六个 declaring package 的 entry form 集合 ADDED=[]。修的是测量面,不是某条今天红的判定 —— 与本 issue 的定性("不是检查后通过,是根本没看")一致。反向验证 (c) 补了成对证据:植入一条会改判定的 alias,扩面后 4 个测试红(含真实 bundler 探针),退回旧正则后判定测试全绿。

    2. 派发单预设的"扩面有牙 = 死条目让门红"在这道门上不成立,如实记录。反向验证 (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

  4. added a commit that references this issue on Aug 18, 2026
  5. added a commit that references this issue on Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingpm:queue

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions