Skip to content

feat(openapi): support UndefinedError in commonSchemas for spec generation#655

Merged
dinwwwh merged 2 commits into
mainfrom
feat/openapi/common-undefined-error-schema
Jun 16, 2025
Merged

feat(openapi): support UndefinedError in commonSchemas for spec generation#655
dinwwwh merged 2 commits into
mainfrom
feat/openapi/common-undefined-error-schema

Conversation

@dinwwwh
Copy link
Copy Markdown
Member

@dinwwwh dinwwwh commented Jun 16, 2025

UndefinedError is used for undefined errors, which is very useful when using Type-Safe Error Handling.

Summary by CodeRabbit

  • New Features

    • Introduced support for a reusable "UndefinedError" schema in OpenAPI specifications, enabling consistent and type-safe error handling across endpoints.
  • Documentation

    • Updated documentation to explain the "UndefinedError" schema, including expanded notes and clearer formatting.
  • Tests

    • Enhanced test coverage to validate referencing of the "UndefinedError" schema in error responses.

…ation

`UndefinedError` is used for undefined errors, which is very useful when using Type-Safe Error Handling.
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 16, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
orpc ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 16, 2025 8:31am

@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jun 16, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 16, 2025

Walkthrough

A new UndefinedError schema was introduced and integrated into the OpenAPI generator and its documentation. The generator now supports referencing this error schema in error responses, centralizing its definition for reuse. Multiple playgrounds and documentation were updated to include this schema in their OpenAPI configuration.

Changes

File(s) Change Summary
apps/content/docs/openapi/openapi-specification.md Updated documentation to explain and exemplify the new UndefinedError schema and its usage.
packages/openapi/src/openapi-generator.ts Added support for UndefinedError schema in OpenAPI generator; refactored error response handling to use refs.
packages/openapi/src/openapi-generator.test.ts Enhanced tests to use new UndefinedError2 schema and updated error response tests to use schema references.
playgrounds/.../api/[...rest].ts, playgrounds/.../main.ts, playgrounds/.../route.ts,
playgrounds/.../reference.service.ts, playgrounds/.../server/routes/api/[...].ts,
playgrounds/.../routes/api/[...rest].ts, playgrounds/.../routes/api/[...rest]/+server.ts,
playgrounds/.../routes/api/$.ts
Added UndefinedError entry to commonSchemas in OpenAPI configuration.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant PlaygroundApp
    participant OpenAPIGenerator
    participant OpenAPIDocument

    User->>PlaygroundApp: Configure OpenAPI with commonSchemas (including UndefinedError)
    PlaygroundApp->>OpenAPIGenerator: Generate OpenAPI spec
    OpenAPIGenerator->>OpenAPIDocument: Add UndefinedError schema to components
    OpenAPIGenerator->>OpenAPIDocument: Reference UndefinedError in error responses
    OpenAPIDocument-->>User: Returns OpenAPI spec with centralized error schema
Loading

Poem

In the warren of code, a new schema appears,
"UndefinedError" hops in, dispelling old fears.
Now error responses are tidy and neat,
With references shared, documentation’s complete.
The playgrounds all cheer, their schemas aligned—
A bunny’s delight, with errors defined!
🐇✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between de3292e and 2c7be96.

📒 Files selected for processing (2)
  • apps/content/docs/openapi/openapi-specification.md (1 hunks)
  • packages/openapi/src/openapi-generator.ts (10 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/content/docs/openapi/openapi-specification.md
  • packages/openapi/src/openapi-generator.ts
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: publish-commit
  • GitHub Check: lint
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Summary of Changes

Hello @unnoq, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request enhances the OpenAPI generator by allowing the standard UndefinedError schema, commonly used in type-safe error handling, to be defined and referenced via the commonSchemas configuration. This results in a cleaner and more maintainable generated OpenAPI specification by leveraging schema components and references.

Highlights

  • Feature: UndefinedError in commonSchemas: Added support for defining the standard UndefinedError schema within the commonSchemas option of the OpenAPI generator. This allows users to register the UndefinedError schema once and have it referenced throughout the generated spec, improving readability and reducing duplication.
  • OpenAPI Spec Generation: Modified the internal logic to resolve the UndefinedError schema from commonSchemas and use a $ref to it in the generated error responses for procedures, replacing the previous approach of inlining the schema.
  • Documentation Update: Updated the OpenAPI specification documentation to include an example of how to add UndefinedError to the commonSchemas configuration.
  • Test Coverage: Added a new test case specifically for defining UndefinedError in commonSchemas and updated existing tests to verify that the generated spec correctly uses a $ref when UndefinedError is defined this way.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configureGemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

The code changes introduce support for UndefinedError in common schemas for OpenAPI specification generation. This allows for better handling of undefined errors, especially when using type-safe error handling. The changes include modifications to the OpenAPI generator to process and include the UndefinedError schema in the generated specification, as well as updates to tests and playground examples to reflect this new functionality.

Comment on lines +148 to +150
- The `strategy` option determines which schema definition to use when input and output types differ (defaults to `input`). This is needed because we cannot use the same `$ref` for both input and output in this case.

- `UndefinedError` is used for undefined errors, which is very useful when using [Type-Safe Error Handling](/docs/error-handling#type‐safe-error-handling)
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.

medium

It would be helpful to include a brief description of what UndefinedError represents in the context of the OpenAPI specification.

Suggested change
- The `strategy` option determines which schema definition to use when input and output types differ (defaults to `input`). This is needed because we cannot use the same `$ref` for both input and output in this case.
- `UndefinedError` is used for undefined errors, which is very useful when using [Type-Safe Error Handling](/docs/error-handling#type‐safe-error-handling)
- `UndefinedError` is used for undefined errors, which indicates a fallback error schema when specific error types are not defined. It is very useful when using [Type-Safe Error Handling](/docs/error-handling#type‐safe-error-handling)

@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 16, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

📢 Thoughts on this report? Let us know!

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Jun 16, 2025

More templates

@orpc/arktype

npm i https://pkg.pr.new/@orpc/arktype@655

@orpc/client

npm i https://pkg.pr.new/@orpc/client@655

@orpc/contract

npm i https://pkg.pr.new/@orpc/contract@655

@orpc/hey-api

npm i https://pkg.pr.new/@orpc/hey-api@655

@orpc/nest

npm i https://pkg.pr.new/@orpc/nest@655

@orpc/openapi

npm i https://pkg.pr.new/@orpc/openapi@655

@orpc/openapi-client

npm i https://pkg.pr.new/@orpc/openapi-client@655

@orpc/react

npm i https://pkg.pr.new/@orpc/react@655

@orpc/react-query

npm i https://pkg.pr.new/@orpc/react-query@655

@orpc/server

npm i https://pkg.pr.new/@orpc/server@655

@orpc/shared

npm i https://pkg.pr.new/@orpc/shared@655

@orpc/solid-query

npm i https://pkg.pr.new/@orpc/solid-query@655

@orpc/standard-server

npm i https://pkg.pr.new/@orpc/standard-server@655

@orpc/standard-server-aws-lambda

npm i https://pkg.pr.new/@orpc/standard-server-aws-lambda@655

@orpc/standard-server-fetch

npm i https://pkg.pr.new/@orpc/standard-server-fetch@655

@orpc/standard-server-node

npm i https://pkg.pr.new/@orpc/standard-server-node@655

@orpc/standard-server-peer

npm i https://pkg.pr.new/@orpc/standard-server-peer@655

@orpc/svelte-query

npm i https://pkg.pr.new/@orpc/svelte-query@655

@orpc/tanstack-query

npm i https://pkg.pr.new/@orpc/tanstack-query@655

@orpc/valibot

npm i https://pkg.pr.new/@orpc/valibot@655

@orpc/vue-colada

npm i https://pkg.pr.new/@orpc/vue-colada@655

@orpc/vue-query

npm i https://pkg.pr.new/@orpc/vue-query@655

@orpc/zod

npm i https://pkg.pr.new/@orpc/zod@655

commit: 2c7be96

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (6)
playgrounds/next/src/app/api/[[...rest]]/route.ts (1)

28-37: Same comment as in Contract-First playground

See earlier note about validating generator support and deduplicating the commonSchemas definition.

playgrounds/astro/src/pages/api/[...rest].ts (1)

29-38: Same comment as in Contract-First playground

See earlier note about validating generator support and deduplicating the commonSchemas definition.

playgrounds/svelte-kit/src/routes/api/[...rest]/+server.ts (1)

29-38: Same comment as in Contract-First playground

See earlier note about validating generator support and deduplicating the commonSchemas definition.

playgrounds/nuxt/server/routes/api/[...].ts (1)

27-36: Same comment as in Contract-First playground

See earlier note about validating generator support and deduplicating the commonSchemas definition.

playgrounds/nest/src/reference/reference.service.ts (1)

38-38: Same remark as in tanstack-start.
See previous comment about defining a shared constant to avoid string-literal drift.

playgrounds/solid-start/src/routes/api/[...rest].ts (1)

37-37: Same remark as in tanstack-start.
See previous comment about defining a shared constant to avoid string-literal drift.

🧹 Nitpick comments (6)
playgrounds/contract-first/src/main.ts (1)

30-39: UndefinedError schema entry added – looks good but validate generator support

The new entry aligns with the pattern { error: 'UndefinedError' } introduced in the OpenAPI generator.
Two quick follow-ups:

  1. Make sure every consuming project is running the version of @orpc/openapi that actually understands the error shorthand; otherwise generation will silently drop the component.
  2. This identical commonSchemas block now appears in 8+ playgrounds. Consider exporting a shared constant (e.g. playgrounds/shared/commonSchemas.ts) to avoid copy-paste drift.
playgrounds/tanstack-start/src/routes/api/$.ts (1)

38-38: Consider centralising the UndefinedError identifier.

'UndefinedError' is now hard-coded in several playgrounds. A single exported constant (e.g. UNDEFINED_ERROR_CODE = 'UndefinedError') shared across packages would prevent typos and make future refactors trivial.

Are there any other files that still embed this literal that could be switched to the constant?

apps/content/docs/openapi/openapi-specification.md (1)

139-151: Docs look good – tiny formatting nit.

The bullet list mixes “sentence” items (ending with periods) and “phrase” items (no period). Aligning them improves readability.

-`UndefinedError` is used for undefined errors, which is very useful when using [Type-Safe Error Handling](/docs/error-handling#type‐safe-error-handling)
+`UndefinedError` is used for undefined errors, which is very useful when using [Type-Safe Error Handling](/docs/error-handling#type‐safe-error-handling).
packages/openapi/src/openapi-generator.test.ts (2)

1085-1088: Schema name / payload string mismatch might cause confusion.

The schema is registered as UndefinedError2, yet the payload string remains 'UndefinedError'.
While technically harmless, aligning the string with the schema name (or vice-versa) avoids head-scratching for future maintainers who grep for UndefinedError2 expecting to see it inside the schema body.

-UndefinedError2: {
-  error: 'UndefinedError',
+UndefinedError2: {
+  error: 'UndefinedError2',

or rename the component back to UndefinedError.


1174-1215: Repeated error-object expectations – consider extracting a helper.

The same inline object describing the undefined error shape is duplicated several times in this test file. Extracting a reusable matcher, e.g.:

const undefinedErrorRef = { $ref: '#/components/schemas/UndefinedError2' };

or a const undefinedErrorShape = expect.objectContaining({ … }) would reduce duplication and ease future updates.

packages/openapi/src/openapi-generator.ts (1)

58-61: Narrow the “UndefinedError” discriminator type

{ error: 'UndefinedError' } currently allows any extra keys.
Consider tightening the type so that only the error literal —and nothing else—can be supplied.
Example:

commonSchemas?: Record<string,
  | { schema: AnySchema; strategy?: SchemaConvertOptions['strategy'] }
  | { error: 'UndefinedError' } & Record<never, never>   // forbid additional fields
>

This prevents silent mis-configuration (e.g. { error: 'UndefinedError', typo: true }).

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b589620 and de3292e.

📒 Files selected for processing (11)
  • apps/content/docs/openapi/openapi-specification.md (1 hunks)
  • packages/openapi/src/openapi-generator.test.ts (5 hunks)
  • packages/openapi/src/openapi-generator.ts (10 hunks)
  • playgrounds/astro/src/pages/api/[...rest].ts (1 hunks)
  • playgrounds/contract-first/src/main.ts (1 hunks)
  • playgrounds/nest/src/reference/reference.service.ts (1 hunks)
  • playgrounds/next/src/app/api/[[...rest]]/route.ts (1 hunks)
  • playgrounds/nuxt/server/routes/api/[...].ts (1 hunks)
  • playgrounds/solid-start/src/routes/api/[...rest].ts (1 hunks)
  • playgrounds/svelte-kit/src/routes/api/[...rest]/+server.ts (1 hunks)
  • playgrounds/tanstack-start/src/routes/api/$.ts (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: publish-commit
🔇 Additional comments (2)
packages/openapi/src/openapi-generator.test.ts (1)

1260-1274:

Details

✅ Verification successful

Ensure all new $ref targets exist in components.schemas.

The test adds $ref: '#/components/schemas/UndefinedError2'; the earlier block registers the component, so the reference should resolve. If more tests start using a different playground name (e.g. UndefinedError without the 2 suffix), they will break. A quick grep ensures no stray references slipped in.


🏁 Script executed:

#!/bin/bash
# Verify there is no unresolved UndefinedError schema reference.
rg --no-heading -n '$ref: .+#/components/schemas/UndefinedError(?!2)' packages/openapi/src | head

Length of output: 394


🏁 Script executed:

#!/bin/bash
# Re-verify there is no $ref to UndefinedError without the '2' suffix using PCRE2
rg --no-heading -n --pcre2 "\$ref:.*#/components/schemas/UndefinedError(?!2)" packages/openapi/src | head

Length of output: 106


All new $ref targets are defined and no stray references found.
I ran an rg --pcre2 "\$ref:.*#/components/schemas/UndefinedError(?!2)" check against packages/openapi/src and confirmed there are no occurrences of #/components/schemas/UndefinedError without the 2 suffix. No further action needed.

packages/openapi/src/openapi-generator.ts (1)

510-553: Undefined error added to all error responses – deliberate?

undefinedErrorSchema is appended to every status’ oneOf.
If the intent is to expose it only for unexpected/5xx errors, confine it:

- oneOf: [ ...schemas, undefinedErrorSchema ]
+ oneOf: +status.startsWith('5') ? [...schemas, undefinedErrorSchema] : schemas

Otherwise API consumers may believe a 400 can legitimately carry an
“undefined” error shape.

Comment thread packages/openapi/src/openapi-generator.ts
Comment thread packages/openapi/src/openapi-generator.ts
@dinwwwh dinwwwh merged commit 93fa264 into main Jun 16, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant