Skip to content

fix(schema): render finite numbers as Schema.Finite and reference generated aliases directly - #7647

Open
Stanzilla wants to merge 1 commit into
Effect-TS:mainfrom
Stanzilla:openapi-generator-finite-aliases
Open

Stanzilla wants to merge 1 commit into
Effect-TS:mainfrom
Stanzilla:openapi-generator-finite-aliases

Conversation

@Stanzilla

Copy link
Copy Markdown

Closes #7646.

@effect/openapi-generator output triggered two @effect/language-service diagnostics that the generator can avoid by construction.

effect: SchemaRepresentation.toCodeDocument

The JSON Schema importer already attaches effect/schema/isFinite (for type: number) and effect/schema/isInt (for type: integer) checks to number nodes. The renderer now emits such nodes from Schema.Finite instead of Schema.Number, and drops an isFinite check when it carries nothing beyond the defaults of Schema.isFinite() (a custom-annotated, aborted, or branded check is kept on top of the Schema.Finite base). Plain Schema.Number without those checks renders unchanged.

Before / after for { "type": "number" } and { "type": "integer" }:

Schema.Number.check(Schema.isFinite().annotate({ "expected": "a finite number" }))  // before
Schema.Finite                                                                       // after

Schema.Number.check(Schema.isInt().annotate({ "expected": "an integer" }))          // before
Schema.Finite.check(Schema.isInt().annotate({ "expected": "an integer" }))          // after

@effect/openapi-generator: client signatures

Operation signatures referenced typeof X.Type for success, error, and SSE schemas even though the generator emits export type X = ... for the same name in the same file. They now reference X directly (typeof X.Encoded and typeof X.DecodingServices are unchanged, as no alias exists for those).

// before
Effect.Effect<WithOptionalResponse<typeof GetAddon200.Type, Config>, ...>
// after
Effect.Effect<WithOptionalResponse<GetAddon200, Config>, ...>

Verification

  • pnpm vitest run packages/effect/test/schema/representation packages/tools/openapi-generator/test: 25 files, 807 tests passed (new cases cover unannotated, default-annotated, custom-annotated isFinite, isInt, and plain Number).
  • pnpm lint, and pnpm check in both packages: clean.
  • The minimal spec from the issue now renders "downloads": Schema.Finite, "id": Schema.Finite.check(Schema.isInt()...) and WithOptionalResponse<GetAddon200, Config>, with no schemaNumber or unnecessaryTypeofType diagnostics.

Two changesets are included (effect patch, @effect/openapi-generator patch).

…erated aliases directly

The JSON Schema importer already attaches finite and integer checks to numbers, so
SchemaRepresentation.toCodeDocument now renders those nodes from Schema.Finite and
drops a finite check that only repeats its defaults. The OpenAPI generator references
the generated type aliases instead of typeof X.Type in client signatures.

Closes Effect-TS#7646
@changeset-bot

changeset-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: c373b0f

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

This PR includes changesets to release 30 packages
Name Type
@effect/openapi-generator Patch
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node 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/docgen Patch
@effect/doctest 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

@github-actions

github-actions Bot commented Sep 2, 2026

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
arbitrary-combinators.ts 33.92 KB 33.92 KB 0.00 KB (0.00%)
basic.ts 7.05 KB 7.05 KB 0.00 KB (0.00%)
batching.ts 10.28 KB 10.28 KB 0.00 KB (0.00%)
brand.ts 6.59 KB 6.59 KB 0.00 KB (0.00%)
cache.ts 10.91 KB 10.91 KB 0.00 KB (0.00%)
config.ts 21.62 KB 21.62 KB 0.00 KB (0.00%)
differ.ts 20.43 KB 20.43 KB 0.00 KB (0.00%)
http-client.ts 22.02 KB 22.02 KB 0.00 KB (0.00%)
logger.ts 11.00 KB 11.00 KB 0.00 KB (0.00%)
metric.ts 9.14 KB 9.14 KB 0.00 KB (0.00%)
optic.ts 6.77 KB 6.77 KB 0.00 KB (0.00%)
pubsub.ts 15.38 KB 15.38 KB 0.00 KB (0.00%)
queue.ts 11.98 KB 11.98 KB 0.00 KB (0.00%)
schedule.ts 11.10 KB 11.10 KB 0.00 KB (0.00%)
schema-binary.ts 39.58 KB 39.58 KB 0.00 KB (0.00%)
schema-class.ts 20.18 KB 20.18 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 30.28 KB 30.28 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 26.30 KB 26.30 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.79 KB 13.79 KB 0.00 KB (0.00%)
schema-string.ts 11.28 KB 11.28 KB 0.00 KB (0.00%)
schema-template-literal.ts 15.64 KB 15.64 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 33.48 KB 33.48 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.74 KB 24.63 KB +0.11 KB (+0.43%)
schema-toCodecJson.ts 19.39 KB 19.39 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 19.52 KB 19.52 KB 0.00 KB (0.00%)
schema-toFormatter.ts 19.63 KB 19.63 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 23.52 KB 23.52 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.66 KB 19.66 KB 0.00 KB (0.00%)
schema.ts 19.39 KB 19.39 KB 0.00 KB (0.00%)
stm.ts 12.93 KB 12.93 KB 0.00 KB (0.00%)
stream.ts 9.96 KB 9.96 KB 0.00 KB (0.00%)

@gcanti gcanti left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The schemaNumber false positive has been fixed upstream. For the rest, one option is to add comments only to generated files to disable LSP/oxlint, something like // @effect-diagnostics *:off and the oxlint equivalent.

cc @mattiamanzati

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.

@effect/openapi-generator: generated output triggers the language service schemaNumber and unnecessaryTypeofType diagnostics

2 participants