diff --git a/playground/pages/index.vue b/playground/pages/index.vue index 83f7331..f156c47 100644 --- a/playground/pages/index.vue +++ b/playground/pages/index.vue @@ -28,7 +28,6 @@ const { data: todos, pending, error, refresh } = await $client.todo.getTodos.que trpc: { abortOnUnmount: true, }, - immediate: true, }) diff --git a/src/client/index.ts b/src/client/index.ts index a14402a..122ac16 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -80,7 +80,7 @@ export function createTRPCNuxtProxyClient(opts: Creat const decoratedClient = createFlatProxy((key) => { return createNuxtProxyDecoration(key, client) - }) as DecoratedProcedureRecord + }) as DecoratedProcedureRecord return decoratedClient } diff --git a/src/client/types.ts b/src/client/types.ts index d8e7225..e49f8c5 100644 --- a/src/client/types.ts +++ b/src/client/types.ts @@ -1,13 +1,17 @@ import type { TRPCClientErrorLike, TRPCRequestOptions } from '@trpc/client' +import type { TRPCSubscriptionObserver } from '@trpc/client/dist/internals/TRPCClient' import type { AnyMutationProcedure, AnyProcedure, AnyQueryProcedure, AnyRouter, + AnySubscriptionProcedure, + ProcedureArgs, ProcedureRouterRecord, inferProcedureInput, inferProcedureOutput, } from '@trpc/server' +import type { Unsubscribable, inferObservableValue } from '@trpc/server/observable' import type { AsyncData, AsyncDataOptions, @@ -16,17 +20,34 @@ import type { _Transform, } from 'nuxt/dist/app/composables/asyncData' -// Inspired by trpc/react-query client types +// Modified @trpc/client and @trpc/react-query types +// https://github.com/trpc/trpc/blob/next/packages/client/src/createTRPCClientProxy.ts // https://github.com/trpc/trpc/blob/next/packages/react-query/src/createTRPCReact.tsx interface TRPCOptions extends TRPCRequestOptions { abortOnUnmount?: boolean } -/** - * @internal - */ -export type DecorateProcedure = TProcedure extends AnyQueryProcedure +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 ? { query: < TData = inferProcedureOutput, @@ -45,15 +66,20 @@ export type DecorateProcedure = TProcedure exte input: inferProcedureInput, opts?: AsyncDataOptions & { trpc: TRPCOptions }, ) => AsyncData, PickKeys>, TRPCClientErrorLike> + } : TProcedure extends AnySubscriptionProcedure ? { + subscribe: SubscriptionResolver } : never /** * @internal */ -export type DecoratedProcedureRecord = { +export type DecoratedProcedureRecord< + TProcedures extends ProcedureRouterRecord, + TRouter extends AnyRouter, +> = { [TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter - ? DecoratedProcedureRecord + ? DecoratedProcedureRecord : TProcedures[TKey] extends AnyProcedure - ? DecorateProcedure + ? DecorateProcedure : never; }