Skip to content

shared/mapping.zod.ts 的 javascript 变换 describe 推荐 dialect="js",而 ExpressionDialect 只有 cel/cron/template —— 照着写会被拒 #5552

Description

@os-zhuang

发现于 #5515(修 SYNC_ARCHITECTURE.md L3 示例的 transform.type: 'custom')时,给示例挑真实联合成员的过程中量到,不在该 PR 范围内。

事实

packages/spec/src/shared/mapping.zod.tsFieldMappingTransformSchema,javascript 分支:

z.object({
  type: z.literal('javascript'),
  expression: ExpressionInputSchema.describe('JS expression (dialect="js" recommended). e.g. value.toUpperCase()'),
}).describe('Custom JavaScript transformation'),

packages/spec/src/shared/expression.zod.ts:42:

export const ExpressionDialect = z.enum(['cel', 'cron', 'template']);

没有 js'js' 这个方言在 #3278 就退役了(ADR-0058 addendum,同文件 40 行的注释自己写着)。所以 describe 让作者写的那个显式信封 —— expression: { dialect: 'js', source: 'value.toUpperCase()' } —— 会被 ExpressionSchema 的枚举直接拒收。

实测(ConnectorFieldMappingSchema,同一个 FieldMappingTransformSchema):

transform: { type: 'javascript', expression: 'value / 100' }
→ parse 成功,规范化为 { type: 'javascript', expression: { dialect: 'cel', source: 'value / 100' } }

也就是说:唯一走得通的写法是裸字符串简写,而它落到的方言是 cel,不是 JS。describe 里那句 value.toUpperCase() 作为 CEL 表达式也是不成立的(CEL 没有这个方法)。一个成员叫 javascript、describe 说 dialect 用 js、实际只能是 cel —— 三处互相打架,而 describe 是会流进生成文档和 JSON Schema 的那一处。

影响

describe 文本进 content/docs/references/**gen:schema 产物,是 AI 作者最直接读到的一行。这正是 Prime Directive #10 的反面:宣传了一个运行时不兑现的方言名。

未验证 / 需要裁定的部分

FieldMappingTransform 目前在 objectstack 全仓没有任何消费者(grep FieldMappingTransform 只有 mapping.zod.ts 自己的 z.infer 别名一行),即整个变换联合是 declared-but-unenforced,javascript 成员尤其如此 —— 没有任何运行时会去执行这个表达式。所以本单的处置有两条路,需要裁定:

倾向 B 的方向判断,但联合里其余四个成员(constant / cast / lookup / map)的存活状态没量过,先记事实。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions