refactor(core-trpc): make the tRPC context router-agnostic

Ports the type-safety/ergonomics half of the upstream cycle-break: core-trpc
no longer imports AppRouter from @repo/core-api (an illegal
core -> core-composition boundary edge). The runtime context and both
providers are now AnyTRPCRouter-generic; consumers inject their router type
via useTRPC<TRouter>().

The clean-slate tree is already cycle-free (no kept feature consumes
core-trpc), so this is purely the architecture/boundary improvement. The
per-feature app-slice types the upstream commit added for the demo features
are intentionally skipped: no kept feature consumes useTRPC yet.

Also covers the router-agnostic useTRPC delegation: the refactor turned
useTRPC into a wrapper function whose body was unexercised, dropping
client.ts below the coverage floor — client.test.ts stubs the context
factory and asserts the delegation, restoring client.ts to 100%.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016j8z4VHjedXDTjEDNg7qHK
This commit is contained in:
2026-07-13 06:09:10 +02:00
parent 361b28da99
commit c2841cf352
7 changed files with 42 additions and 12 deletions

View File

@@ -4,7 +4,7 @@ import { useState } from "react";
import { QueryClientProvider } from "@tanstack/react-query";
import { createTRPCClient, httpBatchLink } from "@trpc/client";
import superjson from "superjson";
import type { AppRouter } from "@repo/core-api";
import type { AnyTRPCRouter } from "@trpc/server";
import { TRPCProvider } from "../client";
import { getQueryClient } from "../query-client";
@@ -17,7 +17,9 @@ export function TanstackTrpcProvider({
}) {
const [queryClient] = useState(() => getQueryClient());
const [trpcClient] = useState(() =>
createTRPCClient<AppRouter>({
// Router-agnostic on purpose: procedure typing comes from useTRPC<TRouter>
// at the call sites, not from the wire-level client.
createTRPCClient<AnyTRPCRouter>({
links: [httpBatchLink({ url: trpcUrl, transformer: superjson })],
}),
);