feat(ext-openapi): pick the page that reads the document #26

Merged
Relism merged 2 commits from feat/openapi/documentation-page into master 2026-09-24 12:06:46 +00:00
Owner

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.

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

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)
Relism added 2 commits 2026-09-24 12:04:08 +00:00
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 master 2026-09-24 12:06:46 +00:00
Relism deleted branch feat/openapi/documentation-page 2026-09-24 12:06:46 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Relism/Flash5#26