Skip to content

build-schemas.ts 用 replace('Schema','') 剥后缀,前缀含 Schema 的 4 个 schema 名被截断($id / 文档页名 / import 全错) #4592

Description

@os-zhuang

现象

packages/spec/scripts/build-schemas.ts:200 把导出常量名转成 JSON Schema 名时用的是字符串 replace,不是后缀正则:

const schemaName = key.endsWith('Schema') ? key.replace('Schema', '') : key;

String.prototype.replace(string, …) 只替换第一处出现。常量名里 Schema 出现在前缀或中间时,被剥掉的就不是后缀,而是名字里面的那一段。目前受影响的 4 个:

导出常量 实际生成的 schema 名 正确的名字
SchemaModeSchema (src/data/datasource.zod.ts:440) data/ModeSchema data/SchemaMode
SchemaChangeSchema (src/system/deploy-bundle.zod.ts:46) system/ChangeSchema system/SchemaChange
SchemaLevelIsolationStrategySchema (src/system/tenant.zod.ts:376) system/LevelIsolationStrategySchema system/SchemaLevelIsolationStrategy
DocumentSchemaValidationSchema (src/data/driver-nosql.zod.ts:119) data/DocumentValidationSchema data/DocumentSchemaValidation

影响面

这个名字不是内部细节,它同时是三处对外表面:

  1. $id:https://schema.objectstack.io/v17/data/ModeSchema.json —— 一个并不存在的类型名,IDE 自动补全和外部引用都会拿到它;
  2. json-schema.manifest.json 的棘轮条目(已记录了这 4 个错名);
  3. content/docs/references/ 的页面小节标题与 import 示例 —— 在 build-docs.ts 用「剥掉 Schema 后缀」推导 import type 示例,类型别名不存在时生成的文档引用无法编译 #4570 的修复之后,这 4 个名字在真实导出面里查无此名,于是被从 import 行里剔除,并作为 4 条 no schema const export 记进 packages/spec/docs-import-surface.baseline.json。也就是说这 4 个 schema 现在有文档页、但页面给不出任何 import 示例。

建议

改成 key.replace(/Schema$/, ''),然后 gen:schema + gen:docs + gen:api-surface 重跑,并把 json-schema.manifest.json 里 4 条旧键换成新键(属于 #2978 说的「有意退役」范畴,要在 PR 里说明),同时把 docs-import-surface.baseline.json 里对应的 4 条 no schema const export 删掉(该 baseline 是只减不增的棘轮,修好后必须删行,否则 check:docs 会因为陈旧条目变红)。

发现于 #4570

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions