Skip to content

fix(#4570): reference 页的 import 示例改由真实导出面生成,并加只减不增的棘轮兜底 - #4595

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-4570-docs-import-surface
Aug 2, 2026
Merged

fix(#4570): reference 页的 import 示例改由真实导出面生成,并加只减不增的棘轮兜底#4595
os-zhuang merged 2 commits into
mainfrom
claude/issue-4570-docs-import-surface

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4570

问题

packages/spec/scripts/build-docs.ts 生成每页 "TypeScript Usage" 时,两行 import 都是从 JSON Schema 文件名机械拼出来的:值导入原样照抄,import type 那行剥掉 Schema 后缀。没有任何东西验证这两个名字真的存在,而 check:docs 结构上也验证不了——它比对的是「生成器现在的输出」和「已提交的文档」,生成器自己编出来的名字永远和自己一致。

把已提交文档里的 import type 行抽出来,对着 packages/spec/src 编译一遍:

old-types.ts(1,15): error TS2724: has no exported member named 'AIModelConfig'. Did you mean 'ModelConfig'?
old-types.ts(7,15): error TS2305: has no exported member 'CodeContent'
old-types.ts(78,176): error TS2724: has no exported member named 'GetAnalyticsMetaRequest'. Did you mean 'GetAnalyticsMetaRequestSchema'?
…

1694 个名字里 150 个编译不过。 同时值导入那行也一直是错的:import { Object } from '@objectstack/spec/data' —— ./data 根本没有名为 Object 的导出,真正的导出是 ObjectSchema;紧跟着的 const result = Object.parse(data) 自然也调不动。这两行正是 AI 写元数据应用时最常整段复制的行。

改法(两半都做)

一、从真实导出面生成

新增 scripts/lib/docs-import-surface.ts,以 api-surface.json(每个入口 name (kind) 的已提交记录,由 check:api-surface 看着)为准解析两行名字。这里有一处不对称,决定了两侧规则不同:

  • 类型侧可判定build-api-surface.tskindOf 先测 TypeAlias/Interface 再测 Variable,所以带类型的名字永远不会被记成 consttype/interface/class/enum 即证明 import type { N } 成立,const 即证明它不成立。
  • 值侧不可判定。同一个顺序会盖掉合并声明的值那一半:export const FieldType = z.enum(…)export type FieldType = … 只会被记成 type。所以值侧不能看 kind,只能看存在性——而这足够了,因为 build-schemas.ts 的 schema 名本就是从该入口某个真实运行时导出键剥 Schema 后缀得来的,所以 schema N 背后的常量非 NSchemaN,入口导出了哪个就是哪个。

解析不到的名字不写进页面(文档不再宣传一个编不过的 import),空掉的那行整行省略。

二、棘轮兜底

只把生成改对是不够的:类型别名被删之后,名字会安静地从 import 行消失——输出仍然正确,回归却没人看见。所以每个解析不到的名字都记进新的 packages/spec/docs-import-surface.baseline.json,只减不增:

基线不接任何 gen: 脚本,只有手跑 --update-import-baseline 才会重写——和 dual-source 基线同一个理由(#4446):一个能重写账本的 fix 命令,会让新债务靠条件反射而不是靠决策被接纳。

证据

  • 负控(单测):scripts/docs-import-surface.test.ts 13 项。Gadget 有 schema 无别名 → 必须不出现在 import type 行;删掉 Widget 的别名 → evaluateBaseline 报 fresh(红);删掉一条已修复的基线行 → 报 stale(红)。
  • 负控(端到端):临时从 api-surface.json 删掉 FieldMappingTransform (type)(即 [#4535·B] 跨形态同名三条:ShareRecipientType(type≠const)、TransformType(const≠type)、suggestFieldType(双实现 function) #4539 的动作),check:docs✗ 1 reference page import example(s) name an export that '@objectstack/spec' no longer has: shared/FieldMappingTransform — no type export,退出码 1。
  • 改前:committed 文档的 1694 个 import type 名 → 150 个编译错误。改后:1544 个名 → tsc 干净通过。
  • 值侧运行时验证:把 258 个页面里 1690 个值导入名逐个 in 对应入口模块 → 全部命中;.parse 例子的常量全部可调用。

回归产物

225 个 reference 页的 import 行被更正(这正是本 PR 的意义:此前它们在宣传编不过的 import)。content/docs/releases/ 一个字没动。

154 条已接受缺口:150 条是「schema 有、export type 没有」(已开 #4593 请维护者定夺补哪些),4 条是 build-schemas.tsreplace('Schema','') 只替换首次出现、把名字前缀里的 Schema 剥掉造成的(已开 #4592)。

验证

pnpm --filter @objectstack/spec build                # ✓
pnpm --filter @objectstack/spec check:generated      # ✓ 8/8
pnpm --filter @objectstack/spec test                 # ✓ 288 files / 7283 tests
pnpm --filter @objectstack/spec typecheck            # ✓
pnpm exec eslint <改动文件>                           # ✓

已合入当时的 origin/main(#4581 改了 ./api 的 webhook 导出);生成文件的冲突一律取 main 侧后整体重跑生成器,未手工合并。

🤖 Generated with Claude Code


Generated by Claude Code

claude added 2 commits August 2, 2026 09:23
…surface

`build-docs.ts` derived each page's "TypeScript Usage" block from the JSON
Schema file name — the value import verbatim, the `import type` line with a
`Schema` suffix stripped — on the assumption that both names exist. Nothing
verified it, and `check:docs` structurally could not: it diffs the generator's
output against the committed docs, so a name the generator invents stays "in
sync" with itself forever.

Compiling the committed `import type` lines against `packages/spec/src` gives
150 `has no exported member` errors, and every `.parse()` example called a type
rather than the schema const.

Both lines are now resolved against `api-surface.json`, the committed record of
every `name (kind)` per public entry point:

  - value import: `<Name>Schema` when the entry exports it, else `<Name>` (a
    merged `export const Foo = z.enum(…)` + `export type Foo` is reported as
    `type` by kindOf, so presence — not kind — is the sound signal there);
  - type import: `<Name>` only when the entry exports it with a type-bearing
    kind, which kindOf's TypeAlias-before-Variable ordering makes decidable;
  - the example parses with the resolved const.

A name that resolves to nothing is dropped from the page AND recorded in the new
`docs-import-surface.baseline.json` — a shrink-only ratchet, so #4539's scenario
(deleting a zero-consumer type alias while its schema keeps its reference page)
now turns `check:docs` red instead of silently publishing a dead import. The
baseline is regenerated only by an explicit `--update-import-baseline`, never by
a `gen:` script, for the same reason the dual-source baseline is (#4446).

225 reference pages regenerate with corrected imports. The 154 accepted gaps
are 150 schemas with no exported type alias (#4593) and 4 whose names are
mangled by a first-occurrence `replace('Schema','')` in build-schemas.ts (#4592).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
…s-import-surface

# Conflicts:
#	content/docs/references/api/connector.mdx
#	content/docs/references/api/rest-server.mdx
@vercel

vercel Bot commented Aug 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 2, 2026 9:30am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling labels Aug 2, 2026
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added the size/m label Aug 2, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 2, 2026 09:31
@os-zhuang
os-zhuang enabled auto-merge August 2, 2026 09:32
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 2, 2026
Merged via the queue into main with commit 60ae58e Aug 2, 2026
21 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4570-docs-import-surface branch August 2, 2026 09:51
os-zhuang pushed a commit that referenced this pull request Aug 2, 2026
…rface gate (#4595)

The merge brought in build-docs' new import-surface ratchet. This PR's
MetadataBulkRegisterRequest type alias on ./api closes the gap the fresh
baseline had accepted, so its line is deleted (shrink-only ratchet).
os-zhuang pushed a commit that referenced this pull request Aug 2, 2026
Conflict was in `content/docs/references/data/datasource.mdx` — a GENERATED
file, conflicting because both sides regenerated it: main's #4595 taught the
generator to spell import examples from the real export surface, while this
branch removed `DatasourceCapabilities` from that surface.

Resolved by regenerating rather than hand-merging. The result is exactly what
the two changes imply together — #4595's corrected spelling minus the removed
export:

  import { DatasourceSchema, DriverDefinitionSchema, DriverType,
           ExternalDatasourceSettingsSchema } from '@objectstack/spec/data';

#4595 also added an import-surface baseline, which listed
`data/DatasourceCapabilities — no type export` as a known gap. This removal
closes that gap, and the baseline is shrink-only, so the stale line is deleted
(--update-import-baseline) — a stale exemption would otherwise stay available
to excuse the NEXT missing export.

The three auto-merged baseline JSONs (authorable-surface, api-surface,
json-schema.manifest) were not trusted as merged text: `gen:schema` rewrites
them wholesale once its vanished-key gate passes, and the full build confirms
no residue of either side's removals.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E5CYr5SDwe85gH2Jr5KSgu
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

build-docs.ts 用「剥掉 Schema 后缀」推导 import type 示例,类型别名不存在时生成的文档引用无法编译

2 participants