Swagger UI was the only page, loaded from a CDN with no way to configure it, disable it or choose another.
Ui.swagger(), Ui.redoc() and Ui.scalar() are now the three, each carrying the options its own documentation names — 8, 10 and 11 of them, plus customCss and cdn for all three. What is not named still passes through option(name, value), nested objects included, so a bundle's whole option set stays reachable without this extension tracking it. Ui.none() serves no page at all.
The page is rendered once at boot and the document is encoded once per revision, so a request to any of the three routes hands out bytes rather than building them — the spec used to be serialized again on every single request.
Breaking:/openapi/swagger is now /openapi/docs, whichever page is chosen. The old page also named SwaggerUIStandalonePreset, which lives in a bundle it never loaded, and BaseLayout never needed it.
Builds on #25 — merge that one first, and this diff collapses to its own commit.
Swagger UI was the only page, loaded from a CDN with no way to configure it, disable it or choose another.
`Ui.swagger()`, `Ui.redoc()` and `Ui.scalar()` are now the three, each carrying the options its own documentation names — 8, 10 and 11 of them, plus `customCss` and `cdn` for all three. What is not named still passes through `option(name, value)`, nested objects included, so a bundle's whole option set stays reachable without this extension tracking it. `Ui.none()` serves no page at all.
```java
new OpenApiExtension("/openapi", "My API", "1.0.0")
.ui(Ui.scalar().theme(Ui.Scalar.Theme.DEEP_SPACE).layout(Ui.Scalar.Layout.CLASSIC).darkMode(true))
```
The page is rendered once at boot and the document is encoded once per revision, so a request to any of the three routes hands out bytes rather than building them — the spec used to be serialized again on every single request.
**Breaking:** `/openapi/swagger` is now `/openapi/docs`, whichever page is chosen. The old page also named `SwaggerUIStandalonePreset`, which lives in a bundle it never loaded, and `BaseLayout` never needed it.
Builds on #25 — merge that one first, and this diff collapses to its own commit.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
A schema's pattern is precise and unreadable. When the constraint declares a
message, that message now goes in the property's description too, after
whatever the property already said, so the document carries both the rule a
machine checks and the sentence a person reads.
Only @Pattern does this. Every other constraint has a keyword that already
reads: required, maxLength, format: email. Repeating those as prose would be
noise.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Swagger UI, Redoc or Scalar, each configured with its own options under the
names its own documentation gives them, or no page at all. What a UI does not
name still passes through, so a bundle's whole option set stays reachable
without this extension tracking it.
The page is rendered once at boot and the document is encoded once per
revision, so a request to any of the three routes hands out bytes rather than
building them: the spec used to be serialized again on every single request.
/openapi/swagger becomes /openapi/docs, because the path names what is served
and not which bundle happens to serve it. That page also named a preset that
lives in a bundle it never loaded, and BaseLayout never needed it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Relism
merged commit 26083021ac into master2026-09-24 12:06:46 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Swagger UI was the only page, loaded from a CDN with no way to configure it, disable it or choose another.
Ui.swagger(),Ui.redoc()andUi.scalar()are now the three, each carrying the options its own documentation names — 8, 10 and 11 of them, pluscustomCssandcdnfor all three. What is not named still passes throughoption(name, value), nested objects included, so a bundle's whole option set stays reachable without this extension tracking it.Ui.none()serves no page at all.The page is rendered once at boot and the document is encoded once per revision, so a request to any of the three routes hands out bytes rather than building them — the spec used to be serialized again on every single request.
Breaking:
/openapi/swaggeris now/openapi/docs, whichever page is chosen. The old page also namedSwaggerUIStandalonePreset, which lives in a bundle it never loaded, andBaseLayoutnever needed it.Builds on #25 — merge that one first, and this diff collapses to its own commit.
🤖 Generated with Claude Code