import type { CreateTRPCClientOptions, Resolver, TRPCClient, } from '@trpc/client'; import { getUntypedClient, TRPCUntypedClient } from '@trpc/client'; import type { inferProcedureOutput } from '@trpc/server'; import type { AnyClientTypes, AnyProcedure, AnyQueryProcedure, AnyRootTypes, AnyRouter, inferProcedureInput, inferTransformedProcedureOutput, ProtectedIntersection, RouterRecord, } from '@trpc/server/unstable-core-do-not-import'; import { createRecursiveProxy } from '@trpc/server/unstable-core-do-not-import'; /** * @internal */ export type UseProcedureRecord< TRoot extends AnyRootTypes, TRecord extends RouterRecord, > = { [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value ? $Value extends AnyQueryProcedure ? Resolver<{ input: inferProcedureInput<$Value>; output: inferTransformedProcedureOutput; errorShape: TRoot['errorShape']; transformer: TRoot['transformer']; }> : $Value extends RouterRecord ? UseProcedureRecord : never : never; }; export function createUseProxy( client: TRPCUntypedClient | TRPCClient, ) { const untypedClient: TRPCUntypedClient = client instanceof TRPCUntypedClient ? client : getUntypedClient(client); return createRecursiveProxy< UseProcedureRecord< TRouter['_def']['_config']['$types'], TRouter['_def']['record'] > >((opts) => { const path = opts.path.join('.'); return untypedClient.query(path, ...opts.args); }); } type NextAppRouterUse = { []>( cb: ( t: UseProcedureRecord< TRouter['_def']['_config']['$types'], TRouter['_def']['record'] >, ) => [...TData], ): { [TKey in keyof TData]: Awaited; }; >( cb: ( t: UseProcedureRecord< TRouter['_def']['_config']['$types'], TRouter['_def']['record'] >, ) => TData, ): Awaited; }; type CreateTRPCNextAppRouterBase = { use: NextAppRouterUse; }; export type CreateTRPCNextAppRouter = ProtectedIntersection< CreateTRPCNextAppRouterBase, UseProcedureRecord< TRouter['_def']['_config']['$types'], TRouter['_def']['record'] > >; /** * @internal */ export interface CreateTRPCNextAppRouterOptions { config: () => CreateTRPCClientOptions; } /** * @internal */ export function generateCacheTag(procedurePath: string, input: any) { return input ? `${procedurePath}?input=${JSON.stringify(input)}` : procedurePath; } export function isFormData(value: unknown): value is FormData { if (typeof FormData === 'undefined') { // FormData is not supported return false; } return value instanceof FormData; } /** * @internal */ export interface ActionHandlerDef { input?: any; output?: any; errorShape: any; } // ts-prune-ignore-next /** * @internal */ export type inferActionDef< TRoot extends AnyClientTypes, TProc extends AnyProcedure, > = { input: inferProcedureInput; output: inferProcedureOutput; errorShape: TRoot['errorShape']; };