feat: add subscription types

This commit is contained in:
Robert Soriano
2022-10-31 10:06:41 -07:00
parent 3bfd3585b3
commit d5d211d2a8
3 changed files with 35 additions and 10 deletions

View File

@@ -28,7 +28,6 @@ const { data: todos, pending, error, refresh } = await $client.todo.getTodos.que
trpc: { trpc: {
abortOnUnmount: true, abortOnUnmount: true,
}, },
immediate: true,
}) })
</script> </script>

View File

@@ -80,7 +80,7 @@ export function createTRPCNuxtProxyClient<TRouter extends AnyRouter>(opts: Creat
const decoratedClient = createFlatProxy((key) => { const decoratedClient = createFlatProxy((key) => {
return createNuxtProxyDecoration(key, client) return createNuxtProxyDecoration(key, client)
}) as DecoratedProcedureRecord<TRouter['_def']['record']> }) as DecoratedProcedureRecord<TRouter['_def']['record'], TRouter>
return decoratedClient return decoratedClient
} }

View File

@@ -1,13 +1,17 @@
import type { TRPCClientErrorLike, TRPCRequestOptions } from '@trpc/client' import type { TRPCClientErrorLike, TRPCRequestOptions } from '@trpc/client'
import type { TRPCSubscriptionObserver } from '@trpc/client/dist/internals/TRPCClient'
import type { import type {
AnyMutationProcedure, AnyMutationProcedure,
AnyProcedure, AnyProcedure,
AnyQueryProcedure, AnyQueryProcedure,
AnyRouter, AnyRouter,
AnySubscriptionProcedure,
ProcedureArgs,
ProcedureRouterRecord, ProcedureRouterRecord,
inferProcedureInput, inferProcedureInput,
inferProcedureOutput, inferProcedureOutput,
} from '@trpc/server' } from '@trpc/server'
import type { Unsubscribable, inferObservableValue } from '@trpc/server/observable'
import type { import type {
AsyncData, AsyncData,
AsyncDataOptions, AsyncDataOptions,
@@ -16,17 +20,34 @@ import type {
_Transform, _Transform,
} from 'nuxt/dist/app/composables/asyncData' } 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 // https://github.com/trpc/trpc/blob/next/packages/react-query/src/createTRPCReact.tsx
interface TRPCOptions extends TRPCRequestOptions { interface TRPCOptions extends TRPCRequestOptions {
abortOnUnmount?: boolean abortOnUnmount?: boolean
} }
/** type SubscriptionResolver<
* @internal TProcedure extends AnyProcedure,
*/ TRouter extends AnyRouter,
export type DecorateProcedure<TProcedure extends AnyProcedure> = TProcedure extends AnyQueryProcedure > = (
...args: [
input: ProcedureArgs<TProcedure['_def']>[0],
opts: ProcedureArgs<TProcedure['_def']>[1] &
Partial<
TRPCSubscriptionObserver<
inferObservableValue<inferProcedureOutput<TProcedure>>,
TRPCClientErrorLike<TRouter>
>
>,
]
) => Unsubscribable
type DecorateProcedure<
TProcedure extends AnyProcedure,
TRouter extends AnyRouter,
> = TProcedure extends AnyQueryProcedure
? { ? {
query: < query: <
TData = inferProcedureOutput<TProcedure>, TData = inferProcedureOutput<TProcedure>,
@@ -45,15 +66,20 @@ export type DecorateProcedure<TProcedure extends AnyProcedure> = TProcedure exte
input: inferProcedureInput<TProcedure>, input: inferProcedureInput<TProcedure>,
opts?: AsyncDataOptions<TData, Transform, PickKeys> & { trpc: TRPCOptions }, opts?: AsyncDataOptions<TData, Transform, PickKeys> & { trpc: TRPCOptions },
) => AsyncData<PickFrom<ReturnType<Transform>, PickKeys>, TRPCClientErrorLike<TProcedure>> ) => AsyncData<PickFrom<ReturnType<Transform>, PickKeys>, TRPCClientErrorLike<TProcedure>>
} : TProcedure extends AnySubscriptionProcedure ? {
subscribe: SubscriptionResolver<TProcedure, TRouter>
} : never } : never
/** /**
* @internal * @internal
*/ */
export type DecoratedProcedureRecord<TProcedures extends ProcedureRouterRecord> = { export type DecoratedProcedureRecord<
TProcedures extends ProcedureRouterRecord,
TRouter extends AnyRouter,
> = {
[TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter [TKey in keyof TProcedures]: TProcedures[TKey] extends AnyRouter
? DecoratedProcedureRecord<TProcedures[TKey]['_def']['record']> ? DecoratedProcedureRecord<TProcedures[TKey]['_def']['record'], TRouter>
: TProcedures[TKey] extends AnyProcedure : TProcedures[TKey] extends AnyProcedure
? DecorateProcedure<TProcedures[TKey]> ? DecorateProcedure<TProcedures[TKey], TRouter>
: never; : never;
} }