import type { TRPCClientErrorLike, TRPCRequestOptions as _TRPCRequestOptions } from '@trpc/client' import { type TRPCSubscriptionObserver } from '@trpc/client/dist/internals/TRPCUntypedClient' import type { AnyMutationProcedure, AnyProcedure, AnyQueryProcedure, AnyRouter, ProcedureRouterRecord, inferProcedureInput, inferProcedureOutput, ProcedureArgs, AnySubscriptionProcedure } from '@trpc/server' import { type inferObservableValue, type Unsubscribable } from '@trpc/server/observable' import { inferTransformedProcedureOutput } from '@trpc/server/shared' import type { AsyncData, AsyncDataOptions, KeysOf, PickFrom, } from 'nuxt/dist/app/composables/asyncData' import type { Ref } from 'vue' interface TRPCRequestOptions extends _TRPCRequestOptions { abortOnUnmount?: boolean } type Resolver = ( ...args: ProcedureArgs ) => Promise>; type SubscriptionResolver< TProcedure extends AnyProcedure, TRouter extends AnyRouter, > = ( ...args: [ input: ProcedureArgs[0], opts: ProcedureArgs[1] & Partial< TRPCSubscriptionObserver< inferObservableValue>, TRPCClientErrorLike > >, ] ) => Unsubscribable type MaybeRef = T | Ref type DecorateProcedure< TProcedure extends AnyProcedure, TRouter extends AnyRouter, > = TProcedure extends AnyQueryProcedure ? { useQuery: < ResT = inferTransformedProcedureOutput, DataE = TRPCClientErrorLike, DataT = ResT, PickKeys extends KeysOf = KeysOf, >( input: MaybeRef>, opts?: AsyncDataOptions & { trpc?: TRPCRequestOptions /** * The custom unique key to use. * @see https://nuxt.com/docs/api/composables/use-async-data#params */ queryKey?: string }, ) => AsyncData | null, DataE>, query: Resolver } : TProcedure extends AnyMutationProcedure ? { mutate: Resolver } : TProcedure extends AnySubscriptionProcedure ? { subscribe: SubscriptionResolver } : never /** * @internal */ export type DecoratedProcedureRecord< TProcedures extends ProcedureRouterRecord, TRouter extends AnyRouter, > = { [TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter ? DecoratedProcedureRecord : TProcedures[TKey] extends AnyProcedure ? DecorateProcedure : never; }