Skip to content

fix(openapi): pass custom schema annotations - #7340

Draft
astahmer wants to merge 1 commit into
Effect-TS:mainfrom
astahmer:codex/openapi-annotation-extensions
Draft

fix(openapi): pass custom schema annotations#7340
astahmer wants to merge 1 commit into
Effect-TS:mainfrom
astahmer:codex/openapi-annotation-extensions

Conversation

@astahmer

Copy link
Copy Markdown

Summary

Schema.toJsonSchemaDocument already supports includeAnnotationKey, which is the opt-in mechanism for carrying custom JSON Schema annotation keys such as vendor extensions. OpenApi.fromApi did not pass that option to the same converter, so those annotations were silently dropped from generated OpenAPI schemas.

This is separate from #7192 and #7203, which concern annotations being lost while schemas are lowered across encoding links. This change fixes the missing OpenAPI pass-through.

Change

  • Add an optional FromApiOptions parameter to OpenApi.fromApi.
  • Forward includeAnnotationKey to the existing JSON Schema compiler.
  • Keep the existing cached path unchanged when no schema options are supplied.
  • Avoid caching option-dependent output so different predicates cannot share a result.

The reproduction and test use only generic names:

const Value = Schema.String.annotate({
  identifier: "Value",
  "x-test-brand": "Value"
})

OpenApi.fromApi(Api, {
  includeAnnotationKey: (key) => key === "x-test-brand"
})

Before this change, the generated component was { type: "string" }. With the change, it is { type: "string", "x-test-brand": "Value" }.

Verification

  • pnpm vitest run packages/effect/test/schema/toJsonSchemaDocument.test.ts packages/effect/test/unstable/httpapi/OpenApi.test.ts --project effect
  • pnpm check
  • pnpm lint

The bug was found and fixed in this patch by Codex, OpenAI's coding agent, while investigating a generated OpenAPI schema integration. The reproduction deliberately contains no application-specific identifiers.

@changeset-bot

changeset-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7816fb0

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 30 packages
Name Type
effect Patch
@effect/ai-anthropic Patch
@effect/ai-openai Patch
@effect/ai-openai-compat Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch
@effect/opentelemetry Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node Patch
@effect/platform-node-shared Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/vitest Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@effect-slopcop effect-slopcop Bot added bug Something isn't working 4.0 labels Aug 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
basic.ts 6.96 KB 6.96 KB 0.00 KB (0.00%)
batching.ts 9.76 KB 9.76 KB 0.00 KB (0.00%)
brand.ts 6.55 KB 6.55 KB 0.00 KB (0.00%)
cache.ts 10.67 KB 10.67 KB 0.00 KB (0.00%)
config.ts 21.10 KB 21.10 KB 0.00 KB (0.00%)
differ.ts 20.04 KB 20.04 KB 0.00 KB (0.00%)
http-client.ts 21.64 KB 21.64 KB 0.00 KB (0.00%)
logger.ts 10.91 KB 10.91 KB 0.00 KB (0.00%)
metric.ts 8.89 KB 8.89 KB 0.00 KB (0.00%)
optic.ts 6.71 KB 6.71 KB 0.00 KB (0.00%)
pubsub.ts 14.94 KB 14.94 KB 0.00 KB (0.00%)
queue.ts 11.61 KB 11.61 KB 0.00 KB (0.00%)
schedule.ts 10.77 KB 10.77 KB 0.00 KB (0.00%)
schema-class.ts 19.66 KB 19.66 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 29.86 KB 29.86 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 25.85 KB 25.85 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.53 KB 13.53 KB 0.00 KB (0.00%)
schema-string.ts 11.03 KB 11.03 KB 0.00 KB (0.00%)
schema-template-literal.ts 15.33 KB 15.33 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 21.78 KB 21.78 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.23 KB 24.23 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 19.00 KB 19.00 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 18.82 KB 18.82 KB 0.00 KB (0.00%)
schema-toFormatter.ts 18.69 KB 18.69 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 23.18 KB 23.18 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.33 KB 19.33 KB 0.00 KB (0.00%)
schema.ts 18.91 KB 18.91 KB 0.00 KB (0.00%)
stm.ts 12.69 KB 12.69 KB 0.00 KB (0.00%)
stream.ts 9.71 KB 9.71 KB 0.00 KB (0.00%)

@gcanti gcanti removed the bug Something isn't working label Aug 19, 2026
@effect-slopcop effect-slopcop Bot added the bug Something isn't working label Aug 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4.0 bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants