feat(spec): drillDown.target 补上 'navigate' —— 渲染器已兑现的第三个 arm (#5435) - #5556
Draft
os-zhuang wants to merge 1 commit into
Draft
feat(spec): drillDown.target 补上 'navigate' —— 渲染器已兑现的第三个 arm (#5435)#5556os-zhuang wants to merge 1 commit into
drillDown.target 补上 'navigate' —— 渲染器已兑现的第三个 arm (#5435)#5556os-zhuang wants to merge 1 commit into
Conversation
ChartDrillDownSchema.target 从 'drawer' | 'dialog' 扩成 'drawer' | 'dialog' | 'navigate',additive(minor),之前能解析的一律照旧。 #5022 当初排除 'navigate' 依据的是一条**测量**而非设计偏好:当时 ObjectChart 自绘抽屉只分支 'dialog','navigate' 静默落进 Sheet,声明它等于用协议承诺一次 永不发生的跳转。objectui#3382 把这条测量改掉了 —— ObjectChart 现在真正兑现 'navigate',语义对齐 DrillDownDrawer.navigateOnly(table / pivot / metric 三个 widget 在共享 DrillDownConfig 上一直以来的行为)。测量失效,联合随之跟上。 顺序不可颠倒:先有渲染器兑现,协议才声明。 - target 的 JSDoc 写明兑现条件与回退:'navigate' 是唯一带 host 前提的 arm, 宿主须提供 drill navigation(objectui 侧 DrillNavigationContext.openRecordList), 缺失时文档化回落 'drawer'(既定行为,非故障)。 - 删除 z.enum 上那条只为 'navigate' 定制的 error 回调 —— 它的判词 (「chart 不实现该 arm」)现在是假的,留着就是一条对下一个作者撒谎的死枝。 - 生成物一律走生成器(gen:react-blocks / gen:schema / gen:docs): react-blocks 类型串、contract.json、references/react-blocks.md、chart.mdx。 测试(先证红):改 schema 前先在 validate-react-page-props 写下「'navigate' 应被接受」,跑出红(闸门带着 #5022 的判词拒绝),再改 schema 转绿。 反向验证方向先判后跑:把联合改回两成员,chart.test.ts 恰好 3 例红 (accepts 行、接受用例、三 arm 命名断言),不多不少。 spec 8011 例、lint 1282 例全绿;两包 typecheck 通过。 Fixes #5435 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 2 package(s): 109 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5435
三项前提逐条复核,全部成立
以
origin/main(5acb93add)为准核过,没有一项过期:ChartDrillDownSchema是 strict 的,target联合恰为两成员 ——packages/spec/src/ui/chart.zod.ts:471原文z.enum(['drawer', 'dialog'], {…}),且带一条专为'navigate'定制的 error 回调(判词:「不被 chart 支持…… 它渲染抽屉 regardless」)。这条回调 issue 正文没提,是本 PR 必须一并处理的死枝。packages/lint/src/validate-react-page-props.ts:288ChartDrillDownSchema.safeParse(raw),所以作者写的drillDown={{…}}字面量确实过这道发布闸门。改了什么
target从'drawer' | 'dialog'扩成'drawer' | 'dialog' | 'navigate',additive,之前能解析的一律照旧解析。#5022 当初排除
'navigate'的依据是一条测量而不是设计偏好:当时 ObjectChart 自绘抽屉只分支'dialog','navigate'静默落进 Sheet —— 声明一个渲染器不兑现的值,等于用协议承诺一次永远不会发生的跳转。objectui#3382 把这条测量改掉了,语义对齐DrillDownDrawer.navigateOnly(table / pivot / metric 三个 widget 在共享DrillDownConfig上一直以来的行为)。测量失效,联合随之跟上。顺序不可颠倒:先有渲染器兑现,协议才声明。JSDoc 写明兑现条件与回退:
'navigate'是唯一带 host 前提的 arm,宿主须提供 drill navigation(objectui 侧DrillNavigationContext.openRecordList),缺失时文档化回落'drawer'—— 既定行为而非故障。另注明 "Open in list" escape hatch 与本键无关,'navigate'的意义是把跳转变成默认点击行为。顺手清掉的死枝
那条定制 error 回调整条删除。它的判词现在是假的(chart 已经实现该 arm),留着就是一条对下一个作者撒谎的死枝 —— 而且它只在
'navigate'被拒时才触发,一旦'navigate'合法就永不执行。删掉后target回落 zod 自己的 enum 报错,仍然按值拒绝。生成物:一律走生成器
gen:react-blocks/gen:schema/gen:docs,无一手改:react-blocks.ts类型串(手写源)、react-blocks.contract.json、references/react-blocks.md、content/docs/references/ui/chart.mdx。逐一 diff 过,每处都只有这条联合的变化。一处不属于本 PR 的生成物移动,已剔除
gen:schema顺带重写了packages/spec/authorable-surface.base.json:baseRev前移,并新增三个与本改动无关的键(system/EmailServiceConfig:appName/defaultTemplateContext/queueDelivery—— 来自已合并的 #5465)。本改动动的是target的值联合,不增删任何 authorable 键(diff 里 chart/drill 相关 0 命中),所以这是 main 上既有的基线漂移搭车。已git checkout还原,不随本 PR 提交。已在 #5358 附上这份现场标本(该 issue 正是描述「任何无关 PR 都能因此静默推进删除门锚点」)。测试
先证红
改 schema 之前先在
validate-react-page-props.test.ts写下「'navigate'应被接受」,跑出红 —— 闸门带着 #5022 的判词拒绝:改 schema 后同一例转绿:
Tests 84 passed (84)。反向验证(方向先判后跑)
预判:把联合改回两成员,
chart.test.ts应恰好 3 例红 —— accepts 表新增行、接受用例、三 arm 命名断言。跑出来:不多不少,方向一致。还原后 75/75 绿。
用例分诊(不是整批重拼)
两条钉着旧结论的用例按「整条替换」处理,而非改断言方向了事:
chart.test.ts的「'navigate'被拒」→ 换成接受用例,并额外断言那条退休判词不复存在(not.toContain('objectui#3354')/not.toContain('not supported by a chart'))—— 防的是 fix(lint): 收敛 validate-expressions / validate-security-posture 的 spec 不声明键??别名读法 (#5017) #5046 那种「断言通过是因为什么都没产生」。target仍按invalid_value被拒,且报错串恰好枚举三个 arm("values":["drawer","dialog","navigate"]),多出第四个成员会立刻红。消费半径清扫
validate-react-page-props的 fixture 面按规则被消费的范围扫,而非按改动包:全仓drillDown字面量在packages/lint与packages/spec之外 0 命中,无 cli/runtime fixture 需要跟改。正向
pnpm --filter @objectstack/spec test⇒ 314 files / 8011 passedpnpm --filter @objectstack/lint test⇒ 59 files / 1282 passed | 4 skippedtypecheck(spec + lint)⇒ 均 Donecheck:react-blocks⇒✅ 2 generated files in sync with packages/speccheck-changeset-no-majorexit 0(本 changeset 为 minor,未被点名);check-changeset-fixed⇒ 同步node scripts/check-nul-bytes.mjs⇒ OK(5501 文件);改动文件另做grep -naP自扫,0 命中Changeset
.changeset/chart-drilldown-navigate-target.md——@objectstack/spec: minor(additive 协议面)。@objectstack/lint未单列:它本体只动了注释与用例,行为变化经由 spec 依赖流入,parse 的是同一个 schema。🤖 Generated with Claude Code
https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
Generated by Claude Code