import { assert, describe, it } from "@effect/vitest"
import { Effect, type Layer } from "effect"
import { HttpRouter } from "effect/unstable/http"
import { HttpApi, HttpApiScalar, HttpApiSwagger, OpenApi } from "effect/unstable/httpapi"
describe("HttpApiScalar", () => {
it.effect("escapes OpenAPI metadata in its HTML contexts", () =>
Effect.gen(function*() {
const title = `Docs "title" ${injectedTag}`
const Api = HttpApi.make("Docs")
.annotate(OpenApi.Title, title)
.annotate(OpenApi.Description, description)
const html = yield* render(HttpApiScalar.layerCdn(Api))
assert.ok(html.includes(`
Docs "title" </title><script>`))
const escapedDescription =
`"quoted" 'single' </script ><script id="script-data-injected">`
assert.ok(html.includes(``))
assert.ok(html.includes(``))
assert.ok(!html.includes(``))
assert.deepStrictEqual(extractSpec(html), OpenApi.fromApi(Api))
}))
it.effect("encodes CDN versions before interpolating the script source", () =>
Effect.gen(function*() {
const version = `1.2.3">${injectedTag}`)
const html = yield* render(HttpApiSwagger.layer(Api))
assert.ok(!html.includes(``))
assert.deepStrictEqual(extractSwaggerSpec(html), OpenApi.fromApi(Api))
}))
})
const render = (layer: Layer.Layer) =>
Effect.acquireUseRelease(
Effect.sync(() => HttpRouter.toWebHandler(layer, { disableLogger: true })),
({ handler }) =>
Effect.flatMap(
Effect.promise(() => handler(new Request("http://test/docs"))),
(response) => Effect.promise(() => response.text())
),
({ dispose }) => Effect.promise(dispose)
)
function extractSpec(html: string): unknown {
const marker = " content: "
const start = html.indexOf(marker)
assert.notStrictEqual(start, -1)
const end = html.indexOf("\n })", start)
assert.notStrictEqual(end, -1)
return JSON.parse(html.slice(start + marker.length, end))
}
function extractSwaggerSpec(html: string): unknown {
const marker = ` ", start)
assert.notStrictEqual(end, -1)
return JSON.parse(html.slice(start + marker.length, end))
}