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)) }