Commit ea23522
committed
fix(formula,lint): current_user 收进 SCOPE_ROOTS,字段级拒绝改为按面的真规则 (#6290)
`@objectstack/formula` 对同一个根说了两套话。`introspectScope` 把
`current_user` 作为合法命名空间交给作者,`checkRoleCatalog` 的四条
position 成员判定正则也全以它打头 —— 两处都对:ADR-0068 D1 把
`current_user` 定为**规范**拼写,`buildScope` 也确实把同一个 `EvalUser`
挂在它下面。只有 `cel-engine.ts` 的 `SCOPE_ROOTS` 不认,于是严格环境把
这个被祝福的拼写读成**裸字段引用**,而它的两个别名(`user`、`ctx`)
一路放行。
三处改动:
1. `SCOPE_ROOTS` 收下 `current_user`。该表是「永不 fault」的基线,不是
逐面契约,现在它宣告的与本包别处宣告的一致。新增行为钉:
`introspectScope` 报出的每个根都必须能在严格环境里解析。
2. 删掉错误修法提示。旧拒绝是基线遗漏的副产物,作者拿到的是**通用**
裸字段诊断 ——「Write `record.current_user`」。这个形状在平台的任何
一层都不绑定,照做的作者得到的东西比原来更糟,而且照样静默。字段级
判定现在由 `@objectstack/lint` 里一条自己的规则给出,写明真实失败链
(未绑定 ⇒ fault ⇒ 可见性 fallback 为 `true` ⇒ 本想藏起来的字段对所有
人恒可见,#6146),并给出**真实存在**的处方:把谓词移到选项自己的
`visibleWhen`、在权限集上声明字段级安全
(`fields: { '<object>.<field>': { readable: false } }`)、或改写成
`record` 谓词。覆盖共用同一求值器的 `visibleWhen` / `readonlyWhen` /
`requiredWhen`。
3. option 级 `visibleWhen` 首次被校验。`validate-expressions.ts` 走完
字段级条件规则就停了,于是 `SelectOption.visibleWhen` —— 一个客户端
过滤、服务端强制的可授权 CEL 槽 —— 穿过 compile / validate / 运行期
无人校验。裸字段引用、指向不存在字段、语法错误、误用 template 方言
全部静默通过,选项只是从此不再出现。现在按 option value 定位逐条走查,
与宿主字段同为 `record` scope。
两个面**故意**对 `current_user` 给出相反判定,因为求值器不同:字段级走
`evalFieldPredicate`(`record` + `previous` + `parent`,从不绑用户),
option 级走 `resolveCascadingOptions`,对宿主 predicate scope 求值,确实
绑定它(ADR-0068 / objectui#2284)。showcase 的角色门控选项
(`'admin' in current_user.positions`)此前从未撞上本规则,现在作为合法
用法被钉住。
Sweep:option 遍历生效后,三个示例应用(`app-showcase` / `app-crm` /
`app-todo`)的 `objectstack validate` 全部通过 —— 零新增 finding,包括
同时携带 record 级联与角色门控选项的那个 showcase 对象。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Q7oc7ASjh8yxyS3Yz78We1 parent 8e13ca8 commit ea23522
5 files changed
Lines changed: 445 additions & 2 deletions
File tree
- .changeset
- packages
- formula/src
- lint/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
69 | 79 | | |
70 | 80 | | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
71 | 103 | | |
72 | 104 | | |
73 | 105 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
343 | 344 | | |
344 | 345 | | |
345 | 346 | | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
346 | 392 | | |
347 | 393 | | |
348 | 394 | | |
| |||
0 commit comments