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
21 lines
826 B
TypeScript
21 lines
826 B
TypeScript
"use client";
|
|
|
|
import { createTRPCContext } from "@trpc/tanstack-react-query";
|
|
import type { TRPCOptionsProxy } from "@trpc/tanstack-react-query";
|
|
import type { AnyTRPCRouter } from "@trpc/server";
|
|
|
|
// core-trpc must not depend on @repo/core-api (core → core-composition is an
|
|
// illegal boundary edge and creates a package cycle through the features).
|
|
// The runtime context is router-agnostic; consumers inject their router type
|
|
// as a generic: features pass their app-slice type (e.g. `BlogAppSlice`),
|
|
// apps may pass the full AppRouter.
|
|
const context = createTRPCContext<AnyTRPCRouter>();
|
|
|
|
export const TRPCProvider = context.TRPCProvider;
|
|
|
|
export function useTRPC<
|
|
TRouter extends AnyTRPCRouter = AnyTRPCRouter,
|
|
>(): TRPCOptionsProxy<TRouter> {
|
|
return context.useTRPC() as unknown as TRPCOptionsProxy<TRouter>;
|
|
}
|