Skip to content

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

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/reactdependencies 已含 @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 里顺手做,单独记在这里。

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions