EdgeAIG's picture
download
raw
2.29 kB
/**
* Swagger documentation UI for declarative `HttpApi` contracts.
*
* This module mounts a browser-based Swagger UI route on an `HttpRouter`. The
* page renders the OpenAPI document derived from the supplied `HttpApi`, so a
* running application can expose interactive API documentation without writing a
* separate OpenAPI file.
*
* @since 4.0.0
*/
import * as Effect from "../../Effect.ts"
import type * as Layer from "../../Layer.ts"
import * as HttpRouter from "../http/HttpRouter.ts"
import * as HttpServerResponse from "../http/HttpServerResponse.ts"
import type * as HttpApi from "./HttpApi.ts"
import type * as HttpApiGroup from "./HttpApiGroup.ts"
import * as Html from "./internal/html.ts"
import * as internal from "./internal/httpApiSwagger.ts"
import * as OpenApi from "./OpenApi.ts"
const makeHandler = <Id extends string, Groups extends HttpApiGroup.Any>(options: {
readonly api: HttpApi.HttpApi<Id, Groups>
}) => {
const spec = OpenApi.fromApi(options.api)
const response = HttpServerResponse.html(`<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>${Html.escape(spec.info.title)} Documentation</title>
<style>${internal.css}</style>
</head>
<body>
<div id="swagger-ui"></div>
<script id="swagger-spec" type="application/json">
${Html.escapeJson(spec)}
</script>
<script>
${internal.javascript}
window.onload = () => {
window.ui = SwaggerUIBundle({
spec: JSON.parse(document.getElementById("swagger-spec").textContent),
dom_id: "#swagger-ui",
});
};
</script>
</body>
</html>`)
return Effect.succeed(response)
}
/**
* Mounts Swagger UI for an `HttpApi` at the configured path, defaulting to
* `/docs`, using the OpenAPI specification generated from the API.
*
* @category layers
* @since 4.0.0
*/
export const layer = <Id extends string, Groups extends HttpApiGroup.Any>(
api: HttpApi.HttpApi<Id, Groups>,
options?: {
readonly path?: `/${string}` | undefined
}
): Layer.Layer<never, never, HttpRouter.HttpRouter> =>
HttpRouter.use(Effect.fnUntraced(function*(router) {
const handler = makeHandler({ api })
yield* router.add("GET", options?.path ?? "/docs", handler)
}))

Xet Storage Details

Size:
2.29 kB
·
Xet hash:
6735ae5318eef69010da2259e3450560c290cd918d0c231f0b9614986d1b1bdb

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.