fix(lint,cli): os lint / os compile 不再放行一个 os validate 会拒绝的 react 页面 (#4340 后续) - #4417
Merged
os-zhuang merged 2 commits intoJul 31, 2026
Merged
Conversation
…4340 后续) `validateReactPageProps` 只手工接在 `os validate` 上,`os lint` 和 `os compile` 从来没跑过它。在 showcase 的 react 页面植入一处 gating 违规 (`<ListView filters={['no_such_col','=',stage]}>` —— 谓词命中不了任何行, SqlDriver 吞掉 "no such column" 后返回 [],列表回空且与「本来就没数据」无法区分) 实测: os lint os compile os validate 修复前 exit 0 放行 exit 0 放行 exit 1 拒绝 修复后 exit 1 拒绝 exit 1 拒绝 exit 1 拒绝 #4340 之后这条规则已经是整个 react 页面表面唯一的字段解析闸门:<ListView> 的 columns/fields/sort/grouping/userFilters、<ObjectForm> 的 fields/initialValues/sections/subforms、record:* 一族(与元数据表面共用同一张 COMPONENT_FIELD_SPECS)、<ObjectChart> 的 aggregate/axes,以及 searchableFields。 所以漏接不是少几条警告 —— 而是这些绑定在 build 路径上完全没人看,包括其中会 gate 的那些。 现接入 REFERENCE_INTEGRITY_RULES,`os validate` 那处手工接线随之删除,三个命令的 答案由构造保证一致。这正是 suite 设立要终结的漂移(#3583 §5 D5),也是 validateReadonlyFlowWrites 在 #4394 里刚走过的同一条路:那次是「一张 map、 两个检查、两套命令集合」,这次是「一次 JSX parse、七个 rule id、一套命令集合」。 按 charter,react-prop-missing-required / react-prop-typo 是 shape 而非解析问题, 本不属于 suite。它们随行的理由与 validateActionBodyWrites 完全相同(其注释已写明): 落在同一次 parse 的同一份 source 上,拆成第二个 member 就要把每个 react 页面 parse 两遍,而改回手工接线正是 suite 要终结的那种漂移。同时更正了那条注释里 "The ONE member here that emits two rule ids" 的说法 —— 现在不止一个。 规则行为零变化:id、严重级、文案都不动;输入也不变(`os validate` 原本就传 result.data,suite 拿到的是同一个)。#4402 的接线守卫会在下次有人想再手工接一条 规则时直接报错——本次删除 validate.ts 的直接 import 也正是被它逼出来的。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012rK2McPogrTJBKdUsThrGs
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 2 package(s): 20 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
本 PR 把 react 页面的字段绑定检查从「只在 os validate」变成「suite 成员,三个命令 都跑」,这份文档有三处随之失真 —— 而 docs-drift 的包级扇出恰好没点到它(它按 @objectstack/cli / @objectstack/lint 列了 20 份,漏了语义上唯一真正耦合的这份)。 - "one gate, two entry points" 表补一行 React page block field bindings(两列都 ✓)。 - 表下那句把 "JSX/React page sources" 整体算作 os validate 独有 —— 现在只有 「源码能否 parse」这个 SHAPE 闸门是独有的,里面的字段绑定属于 reference-integrity, suite 跑到哪它就跑到哪(含 os lint)。改写为分开陈述,并记下这里曾经的漂移与 #4384 的接线守卫。 - 示例 os validate 输出里的 `→ Checking React-source page props (ADR-0081)...` 随手工接线一并删除,已按真实 CLI 输出核对:示例里的每一行 step 现在都能在 showcase 上逐字复现(comm 比对为空)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012rK2McPogrTJBKdUsThrGs
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.
#4340(#4353)后续。
validateReactPageProps只手工接在os validate上,os lint和os compile从来没跑过它:实测
在 showcase 的 react 页面植入一处 gating 违规——
<ListView filters={['no_such_col','=',stage]}>,谓词命中不了任何行,SqlDriver吞掉 "no such column" 后return [],列表回空且与「本来就没数据」无法区分:os lintos compileos validate干净语料上三个命令仍全部 exit 0。
「修复前」是把 suite 那一行 stash 掉、只重建
@objectstack/lint后实测的,不是推断。为什么漏接这一条特别贵
#4340 之后,这条规则已经是整个 react 页面表面唯一的字段解析闸门:
<ListView>的columns/fields/sort/grouping/userFilters/hiddenFields/fieldOrder/filterableFields<ObjectForm>的fields、initialValues键、sections[].fields[]、subformsrecord:*一族 +<Block type="…">(与元数据表面共用同一张COMPONENT_FIELD_SPECS)<ObjectChart>的 aggregate / axes(<ObjectChart>aggregate result-column naming is undefined, so its axis bindings cannot be validated #3701/图表绑定方言统一:ObjectChart 运行时兑现 ChartConfig 后,把 react 契约与 lint 切回 spec 形状(#3701 后续) #3729)、searchableFields(lint:<ListView searchableFields>on a React page is not checked against the object's fields #4329)所以漏接不是少几条警告——而是这些绑定在 build 路径上完全没人看,包括其中会 gate 的那些(缺必需绑定、filter 位置命名不存在的字段)。
改了什么
接入
REFERENCE_INTEGRITY_RULES,validate.ts那处手工接线(import + 约 32 行)随之删除。三个命令的答案由构造保证一致,而不是靠三个人记得——这正是 suite 设立要终结的漂移(#3583 §5 D5),也是validateReadonlyFlowWrites在 #4394 里刚走过的同一条路:那次是「一张config.fieldsmap、两个检查、两套命令集合」,这次是「一次 JSX parse、七个 rule id、一套命令集合」。删掉
validate.ts的直接 import 不是顺手整理,是被 #4402 的接线守卫逼出来的——它断言三个命令都不许直接 import suite 成员,加进 suite 后不删就红。一个 charter 上的诚实交代
按 suite 的 charter,
react-prop-missing-required和react-prop-typo是 shape 而非解析问题,本不属于这里。它们随行的理由与validateActionBodyWrites完全相同(其注释已写明):落在同一次 parse 的同一份 source 上,拆成第二个 member 就要把每个 react 页面 parse 两遍去说同一次遍历的两件事,而改回手工接线正是 suite 要终结的漂移。顺带更正了那条注释里 “The ONE member here that emits two rule ids” 的说法——现在不止一个了。
零行为变化
规则的 id、严重级、文案都不动。输入也不变:
os validate原本就传result.data,suite 拿到的是同一个对象,所以 validate 侧连 finding 集合都完全一致(#4394 需要实测 pre/post-parse 等价,这次不存在这个问题)。惰性约定沿用validateHookBodyWrites/validateActionBodyWrites——只有真的存在kind:'react'页面时才加载 TypeScript 编译器。验证
packages/lint727 通过(suite 测试新增一个 react 页面 fixture + 一条 gating 断言)packages/cli636 通过,含 test(cli): 钉住三个命令都跑 reference-integrity suite(#4384) #4402 的接线守卫typecheck/eslint干净os lint/os validate/os compile全部 exit 0Generated by Claude Code