import type { TRPCClientErrorLike, TRPCRequestOptions as _TRPCRequestOptions } from '@trpc/client' import { type TRPCSubscriptionObserver } from '@trpc/client/dist/internals/TRPCClient' 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, KeyOfRes, PickFrom, _Transform } from 'nuxt/dist/app/composables/asyncData' 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 DecorateProcedure< TProcedure extends AnyProcedure, TRouter extends AnyRouter, > = TProcedure extends AnyQueryProcedure ? { useQuery: < TData = inferTransformedProcedureOutput, Transform extends _Transform = _Transform, PickKeys extends KeyOfRes = KeyOfRes, >( input: inferProcedureInput, opts?: AsyncDataOptions & { trpc?: TRPCRequestOptions }, ) => AsyncData, PickKeys>, TRPCClientErrorLike>, 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; }