Skip to content

下次 spec pin 升级会打断 AppContextSelector 的漂移守卫 —— framework#4509 移除了 includeAll / placement #3208

Description

@os-zhuang

提前记录,现在不用做。@objectstack/spec 的下一个 rc 发布、objectui 抬 pin 的时候才会触发。

背景

framework#4509 在 17.0.0 窗口里退役了 AppContextSelector 的两个键:

  • includeAll —— 不是没人读,是被故意无视。context selector 是 mandatory-scope 语义,一个 "All" 行会解除作用域;对 Studio 的 package 选择器来说,那等于把平台自己的 system/cloud 内核包列给一个明明已经限定到自己包的开发者看。ContextSelectors.tsx:244 的注释就是这么写的,而渲染器从来没渲染过 All 行 —— 所以 includeAll: false 没加固任何东西,includeAll: true 也没解锁任何东西。
  • placement —— 没有任何渲染器读它,'topbar' 什么也没往 topbar 放。

两个键都带 schema 默认值,所以活性 lint 结构上无法对它们告警(默认值在 parse 时物化,分不清作者写的和 schema 填的)。移除是唯一能让作者听见的通道,这也是它为什么必须赶在 17.0.0 而不是等一个弃用周期。

objectui 这边会怎么断

packages/types/src/zod/app.zod.tsAppContextSelectorSchema按引用派生的:

export const AppContextSelectorSchema = SpecAppContextSelectorSchema.extend({ label: ... })

这正是设计意图 —— spec 增删键不会在这里悄悄分叉。所以 spec 一旦少了这两个键,派生 schema 也就少了,然后 packages/types/src/__tests__/report-chart-query-spec-parity.test.ts 里这两行会失败:

expect(parsed.includeAll).toBe(true);     // :76
expect(parsed.placement).toBe('sidebar_header');  // :77

同一个文件的 adds no local key of its own 那条不会失败(localKeys 派生自 specKeys,一起收缩)。

抬 pin 时要做的

  1. 删掉 parity 测试里那两行断言(valueKey/labelKey/persist 三条保留 —— 它们仍然是活的默认值)。
  2. packages/app-shell/src/layout/ContextSelectors.tsx:41,44 的手写 ContextSelectorDef interface 里删掉 includeAll?: booleanplacement?: ...。这个 interface 不是派生的,所以不会编译报错 —— 它只会静静地留下两个永远 undefined 的可选字段。顺手把 :244 那条解释「为什么无视 includeAll」的注释改写成「这两个键已经不存在了」。

两处都是机械改动,加起来几行。

为什么现在只是记录

objectui 目前 pin 的是 ^17.0.0-rc.0(走 npm,不是 workspace),所以在新的 rc 发布之前什么都不会断。等抬 pin 的那个 PR 一并处理最省事 —— 现在改反而会让 objectui 对着一个还没发布的 spec 形状写代码。

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions