Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

toPredicateInput 仍有两份实现(core canonical / react 渲染器侧),应让 react 直接 re-export core #3367

Closed

Description

@yinlianghui

Filed unassigned,来自 #3314 实现期间的收尾观察。只记录发现。

现状

#3314 把 canonical 的谓词归一化落在 packages/core/src/evaluator/predicateInput.ts
(@object-ui/core 是引擎侧与渲染器侧的共同依赖;packages/core 声明 "Zero React
dependencies",不能反向依赖 packages/react),ActionEngine.getActionsForLocation
已改为复用它。

packages/react/src/hooks/useExpression.ts 里同名的 toPredicateInput 仍是一份
独立实现,语义逐项相同。#3314 的 PR 用
packages/react/src/hooks/__tests__/actionPredicate.parity.test.tsx 的归一化 parity 表
(14 种输入形态)把两者钉在一起。

为什么是 observation-class

今天没有用户可见的差异 —— parity 表覆盖了全部输入形态,任何一侧单独改动都会立刻红。
但这仍然是「两处归一化」,而 #3314 的教训恰恰是两处归一化会漂移:parity 表是护栏,
不是单一事实源。

建议(未验证,留给认领者判断)

把 useExpression.ts 里的实现体换成 re-export:

export { toPredicateInput } from '@object-ui/core';

依赖方向允许(@object-ui/react 的 dependencies 已含 @object-ui/core)。
之后归一化 parity 表可以退化成一条「react 导出的就是 core 那一个」的断言,
判决 parity(引擎路径 vs 渲染器路径)保留。

核对过一处容易踩的坑:packages/react/src/index.ts 目前不做
export * from '@object-ui/core',仓内也没有同时 star-re-export core 与 react 的
上层包,所以两个同名导出当下不会产生 ambiguous star-export(那会让名字在 ESM 里
被静默剔除)。真要改前建议再核一遍这一点。

备注

#3314 的派发面把 useExpression.ts 定为只读(渲染器路径本身是对的,#2661 已修好),
所以没有在那个 PR 里顺手做,单独记在这里。

Activity

  1. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    ContributorAuthor

    发现分诊轮(持有):前提 live(react 侧仍是全量实现非 re-export),但 14 形状 parity 测试守着漂移、今天无人踩;机械小改留待顺路。(objectui 分片 PM,会话 session_01GTRjn8xBqp75dk7kFupVRt)


    Generated by Claude Code

  2. self-assigned this
    on Aug 7, 2026
  3. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    ContributorAuthor

    认领(PM 分诊晋级,解除上一轮"留待顺路"的持有 —— 没有顺路单出现,单独做)— 会话 session_01GTRjn8xBqp75dk7kFupVRt,分支 claude/issue-3367-predicate-reexport。

    分诊结论:照 issue 建议办 —— packages/react/src/hooks/useExpression.ts 的 toPredicateInput 实现体换成 export { toPredicateInput } from '@object-ui/core';归一化 parity 表(14 形状)退化为一条"react 导出的就是 core 那一个"的同一性断言,判决 parity(引擎路径 vs 渲染器路径)保留。动手前按 issue 备注复核 star-export 坑(packages/react/src/index.ts 不做 export * from core 的前提仍成立)。

    文件面:packages/react/src/hooks/useExpression.ts、packages/react/src/hooks/__tests__/actionPredicate.parity.test.tsx。越界即停。


    Generated by Claude Code

  4. yinlianghui commented on Aug 7, 2026

    @yinlianghui
    ContributorAuthor

    验收:ACCEPT — PR #3511(实现 + rider 注释同步)。

    核过 GitHub 实物。裁定要点:

    1. re-export 落点正确:react 侧实现体换成 export { toPredicateInput } from '@object-ui/core',公开表面逐字节不变(不新增导出名、签名不弱化、dist 里是干净 re-export 无 any 泄漏),3 处 as any 顺带归零。
    2. 测试形状按裁定收敛:14 形状归一化表退化为同一性断言(toBe core 实现),判决 parity(引擎 vs 渲染器路径)9 例保留;逆向验证是常规红方向且实跑命中 —— 恢复旧实现,恰同一性断言 1 红、其余 10 绿,失败信息 "Compared values have no visual difference" 本身就是本单要消除的漂移面的写照。
    3. 消费半径全数点名:13+ 调用点逐一处置(barrel 链路不需改动,mock 工厂与符号来源无关),star-export 前提复核为全仓零命中。
    4. Rider(PM 放宽围栏的 core docblock 同步):comment-only 用 grep 管道机械证明,预告"无可翻方向"而非编造红绿故事;PR 正文的自相矛盾段落(曾说需 rebase)已同步清理 —— 记录不留谎。
    5. 18/18 检查全绿,Type Check 经 merge-ref 自动吃到 fix(scripts): 删除 check-doc-links 测试中已失效的 @ts-expect-error(修复净 main 上的 TS2578) #3505,无需 update-branch。

    PR 转 ready + auto-merge(配额恢复后执行)。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions