79 lines · 3.7 KB · TypeScript
RawDownload
// Cloud-specific: now that the gate renders the REAL shell during SSR (no// skeleton), the integrations landing page's connect card is part of the very// first painted HTML — including its `npx add-mcp <url>` install command. That// URL is built from the server connection's origin, and the SPA only learns// `window.location.origin` after it mounts; the SSR default is the desktop/CLI// fallback `http://127.0.0.1:4000`. If SSR rendered with that default, the// command would paint `127.0.0.1:4000` and then flip to the real host at// hydration — a visible flash of the wrong URL on the first thing the user is// told to copy.//// The gate now threads the request origin to the render, so the command is// SSR'd against the REAL host from the first byte. These scenarios pin that on// the raw document (pre-JS), where a flash would be observable, against the// real WorkOS emulator session.import { expect } from "@effect/vitest";import { Effect } from "effect"; import { scenario } from "../src/scenario";import { Api, Target } from "../src/services"; /** A document navigation request — what the SSR gate keys on. */const documentRequest = (url: URL, cookie: string) =>  Effect.promise(() =>    fetch(url, { redirect: "manual", headers: { accept: "text/html", cookie } }),  ); /** * The install command is rendered inside a <pre> (shiki's grammar isn't loaded * during SSR, so the code block falls back to plain text). Stripping tags * reassembles the literal command even if hydration would later tokenize it * into colored spans. */const installEndpointFromHtml = (html: string): string | null => {  const text = html.replace(/<[^>]+>/g, " ");  return /add-mcp\s+(https?:\/\/\S+\/mcp)/.exec(text)?.[1] ?? null;}; scenario(  "Connect card · the install command SSRs against the real host, never the 127.0.0.1 default",  {},  Effect.gen(function* () {    // Gate: the REST API plane is mounted on this target.    yield* Api;    const target = yield* Target;    const expectedOrigin = new URL(target.baseUrl).origin;     const identity = yield* target.newIdentity();    const response = yield* documentRequest(      new URL("/", target.baseUrl),      identity.headers!.cookie!,    );    expect(response.status, "the authenticated landing page is served").toBe(200);     const html = yield* Effect.promise(() => response.text());    // The card is part of the first paint (the whole point of deleting the    // skeleton) — if it weren't SSR'd, there'd be no flash to fix and this    // guard would be vacuous, so assert it's actually there.    const endpoint = installEndpointFromHtml(html);    expect(endpoint, "the connect card's install command is in the SSR'd HTML").not.toBeNull();     // The fix: the command's origin is the host that served the document, not    // the client-side fallback the SPA would otherwise paint before mounting.    expect(new URL(endpoint!).origin, "the install URL uses the real serving origin").toBe(      expectedOrigin,    );    expect(endpoint!, "…and not the desktop/CLI default that used to flash").not.toContain(      "127.0.0.1:4000",    );    // It's still the org-scoped path the user actually needs. Since #974    // ("Org-slug console URLs across cloud, self-host, and cloudflare hosts"),    // the install card prints the org's URL SLUG (e.g. /org-user-xxx/mcp), not    // the legacy WorkOS org_<id> form — mount.ts's classifyMcpPath still    // accepts either shape, but the slug form is what ships, so accept both    // rather than pinning on the retired id-only shape.    expect(endpoint!, "the install URL stays org-scoped").toMatch(      /\/(?:org_[^/]+|[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\/mcp$/,    );  }),);