import { createTRPCClient, httpBatchLink } from "@trpc/client"; import superjson from "superjson"; import type { AnyTRPCRouter } from "@trpc/server"; // Returns a tRPC client whose fetch is a stub honouring the provided mocks. // Mocks are keyed by procedure path ("blog.articleBySlug") returning the // raw response body. export function createMockTrpcClient( mocks: Record = {}, ) { const fetchStub: typeof fetch = async (input) => { const url = typeof input === "string" ? input : (input as Request).url; const path = new URL(url, "http://mock").pathname.replace(/^\/api\/trpc\//, ""); const result = mocks[path]; if (result === undefined) { return new Response(JSON.stringify([{ error: { code: -32603, message: `No mock for ${path}` } }]), { status: 200 }); } return new Response(JSON.stringify([{ result: { data: superjson.serialize(result) } }]), { status: 200 }); }; // httpBatchLink requires a conditional TransformerOptions that // depends on whether the router uses a transformer; making this generic-friendly // without parameterizing twice requires here. // eslint-disable-next-line @typescript-eslint/no-explicit-any const link = httpBatchLink({ url: "http://mock/api/trpc", transformer: superjson, fetch: fetchStub, }); return createTRPCClient({ links: [link] }); }