import { describe, expect, it } from "@effect/vitest";import { buildDocsUpstream, isDocsPath } from "./docs";// The docs proxy claims `/docs` and forwards it to Mintlify. Two things must// hold: the path matcher catches the docs tree without swallowing the app-owned// `/api/docs` (Swagger) or unrelated `/docs`-prefixed words, and the rewritten// upstream request points at Mintlify with the path preserved and the session// cookie stripped.describe("isDocsPath", () => { const docs = ["/docs", "/docs/", "/docs/quickstart", "/docs/guides/auth"]; for (const pathname of docs) { it(`proxies ${pathname} to Mintlify`, () => { expect(isDocsPath(pathname)).toBe(true); }); } // `/api/docs` is the app-owned Swagger UI — it must reach the Effect handler, // not Mintlify. `/docsmith` guards against a bare `startsWith("/docs")` that // would capture unrelated words. const notDocs = ["/api/docs", "/docsmith", "/", "/home", "/login", "/mcp"]; for (const pathname of notDocs) { it(`leaves ${pathname} alone`, () => { expect(isDocsPath(pathname)).toBe(false); }); }});describe("buildDocsUpstream", () => { const upstreamFor = (url: string, headers?: HeadersInit) => buildDocsUpstream(new Request(url, { headers })); it("swaps the origin to Mintlify over https while preserving path + query", () => { const upstream = new URL(upstreamFor("https://executor.sh/docs/guides/auth?theme=dark").url); expect(upstream.hostname).toBe("executor.mintlify.dev"); expect(upstream.protocol).toBe("https:"); expect(upstream.pathname).toBe("/docs/guides/auth"); expect(upstream.search).toBe("?theme=dark"); }); it("forwards the public host so Mintlify can build canonical links", () => { const upstream = upstreamFor("https://executor.sh/docs"); expect(upstream.headers.get("x-forwarded-host")).toBe("executor.sh"); expect(upstream.headers.get("x-forwarded-proto")).toBe("https"); }); it("strips the cookie so the session never leaks to the docs origin", () => { const upstream = upstreamFor("https://executor.sh/docs", { cookie: "wos-session=secret", }); expect(upstream.headers.has("cookie")).toBe(false); });});
import { describe, expect, it } from "@effect/vitest";
import { buildDocsUpstream, isDocsPath } from "./docs";
// The docs proxy claims `/docs` and forwards it to Mintlify. Two things must
// hold: the path matcher catches the docs tree without swallowing the app-owned
// `/api/docs` (Swagger) or unrelated `/docs`-prefixed words, and the rewritten
// upstream request points at Mintlify with the path preserved and the session
// cookie stripped.
describe("isDocsPath", () => {
const docs = ["/docs", "/docs/", "/docs/quickstart", "/docs/guides/auth"];
for (const pathname of docs) {
it(`proxies ${pathname} to Mintlify`, () => {
expect(isDocsPath(pathname)).toBe(true);
});
}
// `/api/docs` is the app-owned Swagger UI — it must reach the Effect handler,
// not Mintlify. `/docsmith` guards against a bare `startsWith("/docs")` that
// would capture unrelated words.
const notDocs = ["/api/docs", "/docsmith", "/", "/home", "/login", "/mcp"];
for (const pathname of notDocs) {
it(`leaves ${pathname} alone`, () => {
expect(isDocsPath(pathname)).toBe(false);
});
}
});
describe("buildDocsUpstream", () => {
const upstreamFor = (url: string, headers?: HeadersInit) =>
buildDocsUpstream(new Request(url, { headers }));
it("swaps the origin to Mintlify over https while preserving path + query", () => {
const upstream = new URL(upstreamFor("https://executor.sh/docs/guides/auth?theme=dark").url);
expect(upstream.hostname).toBe("executor.mintlify.dev");
expect(upstream.protocol).toBe("https:");
expect(upstream.pathname).toBe("/docs/guides/auth");
expect(upstream.search).toBe("?theme=dark");
});
it("forwards the public host so Mintlify can build canonical links", () => {
const upstream = upstreamFor("https://executor.sh/docs");
expect(upstream.headers.get("x-forwarded-host")).toBe("executor.sh");
expect(upstream.headers.get("x-forwarded-proto")).toBe("https");
});
it("strips the cookie so the session never leaks to the docs origin", () => {
const upstream = upstreamFor("https://executor.sh/docs", {
cookie: "wos-session=secret",
});
expect(upstream.headers.has("cookie")).toBe(false);
});
});