@trpc/tanstack-react-query
Version:
TanStack React Query Integration for tRPC
656 lines • 39.2 kB
text/typescript
import { DataTag, DefinedInitialDataInfiniteOptions, DefinedInitialDataOptions, FetchQueryOptions, GetNextPageParamFunction, InfiniteData, QueryClient, QueryFilters, SkipToken, UndefinedInitialDataInfiniteOptions, UndefinedInitialDataOptions, UnusedSkipTokenInfiniteOptions, UnusedSkipTokenOptions, UseMutationOptions } from "@tanstack/react-query";
import { TRPCClient, TRPCClientErrorLike, TRPCRequestOptions, TRPCUntypedClient } from "@trpc/client";
import { AnyTRPCProcedure, AnyTRPCRootTypes, AnyTRPCRouter, TRPCProcedureType, TRPCRouterRecord, inferProcedureErrorShape, inferProcedureInput, inferRouterContext, inferTransformedProcedureOutput } from "@trpc/server";
import * as React from "react";
import { DistributiveOmit, MaybePromise, coerceAsyncIterableToArray, inferAsyncIterableYield } from "@trpc/server/unstable-core-do-not-import";
import { TRPCConnectionState } from "@trpc/client/unstable-internals";
import { Unsubscribable } from "@trpc/server/observable";
//#region src/internals/types.d.ts
/**
* Turn a set of optional properties into required
* @internal
*/
type WithRequired<TObj, TKey extends keyof TObj> = TObj & { [P in TKey]-?: TObj[P]; };
/**
* @internal
*/
type ResolverDef = {
input: any;
output: any;
transformer: boolean;
errorShape: any;
featureFlags: FeatureFlags;
};
/**
* @remark `void` is here due to https://github.com/trpc/trpc/pull/4374
*/
type CursorInput = {
cursor?: any;
};
type OptionalCursorInput = CursorInput | void;
/**
* @internal
*/
type ExtractCursorType<TInput> = TInput extends CursorInput ? TInput['cursor'] : unknown;
/**
* @internal
*/
type TRPCInfiniteData<TInput, TOutput> = InfiniteData<TOutput, NonNullable<ExtractCursorType<TInput>> | null>;
/**
* @public
*/
interface TRPCReactRequestOptions extends Omit<TRPCRequestOptions, 'signal'> {
/**
* Opt out of SSR for this query by passing `ssr: false`
*/
ssr?: boolean;
/**
* Opt out or into aborting request on unmount
*/
abortOnUnmount?: boolean;
}
/**
* @public
*/
interface TRPCQueryBaseOptions {
/**
* tRPC-related options
*/
trpc?: TRPCReactRequestOptions;
}
/**
* @public
*/
interface TRPCQueryOptionsResult {
trpc: {
path: string;
};
}
/**
* @public
*/
type QueryType = 'any' | 'infinite' | 'query';
/**
* @public
*/
type TRPCQueryKeyWithoutPrefix = [path: string[], opts?: {
input?: unknown;
type?: Exclude<QueryType, 'any'>;
}];
/**
* @public
*/
type TRPCQueryKeyWithPrefix = [prefix: string[], ...TRPCQueryKeyWithoutPrefix];
type TRPCQueryKey<TPrefixEnabled extends boolean = false> = TPrefixEnabled extends true ? TRPCQueryKeyWithPrefix : TRPCQueryKeyWithoutPrefix;
type AnyTRPCQueryKey = TRPCQueryKeyWithoutPrefix | TRPCQueryKeyWithPrefix;
/**
* @public
*/
type TRPCMutationKeyWithPrefix = [prefix: string[], ...TRPCMutationKeyWithoutPrefix];
/**
* @public
*/
type TRPCMutationKeyWithoutPrefix = [path: string[]];
type AnyTRPCMutationKey = TRPCMutationKeyWithoutPrefix | TRPCMutationKeyWithPrefix;
/**
* @public
*/
type TRPCMutationKey<TPrefixEnabled extends boolean = false> = TPrefixEnabled extends true ? TRPCMutationKeyWithPrefix : TRPCMutationKeyWithoutPrefix;
/**
* Feature flags for configuring tRPC behavior
* @public
*/
type FeatureFlags = {
keyPrefix: boolean;
};
/**
* @internal
*/
type ofFeatureFlags<T extends FeatureFlags> = T;
/**
* @internal
*/
type KeyPrefixOptions<TFeatureFlags extends FeatureFlags> = TFeatureFlags['keyPrefix'] extends true ? {
keyPrefix: string;
} : {
/**
* In order to use a query key prefix, you have to initialize the context with the `keyPrefix`
*/
keyPrefix?: never;
};
/**
* Default feature flags with query key prefix disabled
* @public
*/
type DefaultFeatureFlags = ofFeatureFlags<{
keyPrefix: false;
}>;
//#endregion
//#region src/internals/infiniteQueryOptions.d.ts
type ReservedOptions$2 = 'queryKey' | 'queryFn' | 'queryHashFn' | 'queryHash' | 'initialPageParam';
interface UndefinedTRPCInfiniteQueryOptionsIn<TInput, TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TRPCInfiniteData<TInput, TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>, NonNullable<ExtractCursorType<TInput>> | null>, ReservedOptions$2>, TRPCQueryBaseOptions {
initialCursor?: NonNullable<ExtractCursorType<TInput>> | null;
}
interface UndefinedTRPCInfiniteQueryOptionsOut<TInput, TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<UndefinedInitialDataInfiniteOptions<TQueryFnData, TError, TRPCInfiniteData<TInput, TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>, NonNullable<ExtractCursorType<TInput>> | null>, 'initialPageParam'>, TRPCQueryOptionsResult {
queryKey: DataTag<TRPCQueryKey<TFeatureFlags['keyPrefix']>, TRPCInfiniteData<TInput, TData>, TError>;
initialPageParam: NonNullable<ExtractCursorType<TInput>> | null;
}
interface DefinedTRPCInfiniteQueryOptionsIn<TInput, TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TRPCInfiniteData<TInput, TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>, NonNullable<ExtractCursorType<TInput>> | null>, ReservedOptions$2>, TRPCQueryBaseOptions {
initialCursor?: NonNullable<ExtractCursorType<TInput>> | null;
}
interface DefinedTRPCInfiniteQueryOptionsOut<TInput, TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<DefinedInitialDataInfiniteOptions<TQueryFnData, TError, TRPCInfiniteData<TInput, TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>, NonNullable<ExtractCursorType<TInput>> | null>, 'initialPageParam'>, TRPCQueryOptionsResult {
queryKey: DataTag<TRPCQueryKey<TFeatureFlags['keyPrefix']>, TRPCInfiniteData<TInput, TData>, TError>;
initialPageParam: NonNullable<ExtractCursorType<TInput>> | null;
}
interface UnusedSkipTokenTRPCInfiniteQueryOptionsIn<TInput, TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TRPCInfiniteData<TInput, TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>, NonNullable<ExtractCursorType<TInput>> | null>, ReservedOptions$2>, TRPCQueryBaseOptions {
initialCursor?: NonNullable<ExtractCursorType<TInput>> | null;
}
interface UnusedSkipTokenTRPCInfiniteQueryOptionsOut<TInput, TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<UnusedSkipTokenInfiniteOptions<TQueryFnData, TError, TRPCInfiniteData<TInput, TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>, NonNullable<ExtractCursorType<TInput>> | null>, 'initialPageParam'>, TRPCQueryOptionsResult {
queryKey: DataTag<TRPCQueryKey<TFeatureFlags['keyPrefix']>, TRPCInfiniteData<TInput, TData>, TError>;
initialPageParam: NonNullable<ExtractCursorType<TInput>> | null;
}
interface TRPCInfiniteQueryOptions<TDef extends ResolverDef> {
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(input: TDef['input'] | SkipToken, opts: DefinedTRPCInfiniteQueryOptionsIn<TDef['input'], TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TDef['featureFlags']>): DefinedTRPCInfiniteQueryOptionsOut<TDef['input'], TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TDef['featureFlags']>;
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(input: TDef['input'], opts: UnusedSkipTokenTRPCInfiniteQueryOptionsIn<TDef['input'], TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TDef['featureFlags']>): UnusedSkipTokenTRPCInfiniteQueryOptionsOut<TDef['input'], TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TDef['featureFlags']>;
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(input: TDef['input'] | SkipToken, opts: UndefinedTRPCInfiniteQueryOptionsIn<TDef['input'], TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TDef['featureFlags']>): UndefinedTRPCInfiniteQueryOptionsOut<TDef['input'], TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TDef['featureFlags']>;
}
//#endregion
//#region src/internals/queryOptions.d.ts
type ReservedOptions$1 = 'queryKey' | 'queryFn' | 'queryHashFn' | 'queryHash';
interface UndefinedTRPCQueryOptionsIn<TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<UndefinedInitialDataOptions<coerceAsyncIterableToArray<TQueryFnData>, TError, coerceAsyncIterableToArray<TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>>, ReservedOptions$1>, TRPCQueryBaseOptions {}
interface UndefinedTRPCQueryOptionsOut<TQueryFnData, TOutput, TError, TFeatureFlags extends FeatureFlags> extends UndefinedInitialDataOptions<coerceAsyncIterableToArray<TQueryFnData>, TError, coerceAsyncIterableToArray<TOutput>, TRPCQueryKey<TFeatureFlags['keyPrefix']>>, TRPCQueryOptionsResult {
queryKey: DataTag<TRPCQueryKey<TFeatureFlags['keyPrefix']>, coerceAsyncIterableToArray<TOutput>, TError>;
}
interface DefinedTRPCQueryOptionsIn<TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<DefinedInitialDataOptions<coerceAsyncIterableToArray<NoInfer<TQueryFnData>>, TError, coerceAsyncIterableToArray<TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>>, ReservedOptions$1>, TRPCQueryBaseOptions {}
interface DefinedTRPCQueryOptionsOut<TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DefinedInitialDataOptions<coerceAsyncIterableToArray<TQueryFnData>, TError, coerceAsyncIterableToArray<TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>>, TRPCQueryOptionsResult {
queryKey: DataTag<TRPCQueryKey<TFeatureFlags['keyPrefix']>, coerceAsyncIterableToArray<TData>, TError>;
}
interface UnusedSkipTokenTRPCQueryOptionsIn<TQueryFnData, TData, TError, TFeatureFlags extends FeatureFlags> extends DistributiveOmit<UnusedSkipTokenOptions<coerceAsyncIterableToArray<TQueryFnData>, TError, coerceAsyncIterableToArray<TData>, TRPCQueryKey<TFeatureFlags['keyPrefix']>>, ReservedOptions$1>, TRPCQueryBaseOptions {}
interface UnusedSkipTokenTRPCQueryOptionsOut<TQueryFnData, TOutput, TError, TFeatureFlags extends FeatureFlags> extends UnusedSkipTokenOptions<coerceAsyncIterableToArray<TQueryFnData>, TError, coerceAsyncIterableToArray<TOutput>, TRPCQueryKey<TFeatureFlags['keyPrefix']>>, TRPCQueryOptionsResult {
queryKey: DataTag<TRPCQueryKey<TFeatureFlags['keyPrefix']>, coerceAsyncIterableToArray<TOutput>, TError>;
}
interface TRPCQueryOptions<TDef extends ResolverDef, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> {
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(input: TDef['input'] | SkipToken, opts: DefinedTRPCQueryOptionsIn<TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TFeatureFlags>): DefinedTRPCQueryOptionsOut<TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TFeatureFlags>;
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(input: TDef['input'], opts?: UnusedSkipTokenTRPCQueryOptionsIn<TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TFeatureFlags>): UnusedSkipTokenTRPCQueryOptionsOut<TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TFeatureFlags>;
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(input: TDef['input'] | SkipToken, opts?: UndefinedTRPCQueryOptionsIn<TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TFeatureFlags>): UndefinedTRPCQueryOptionsOut<TQueryFnData, TData, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>, TFeatureFlags>;
}
//#endregion
//#region src/internals/handles.d.ts
declare const handleDef: unique symbol;
type ErrorOf<TDef extends ResolverDef> = TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>;
type InfiniteHandleInput<TInput> = TInput extends object ? Omit<TInput, 'cursor' | 'direction'> : TInput;
/**
* A plain tuple typed with the procedure's input. TanStack Router's serializability check
* rejects `unknown` inputs and `DataTag`-ged keys, so handles in `beforeLoad` need this shape.
*/
type HandleQueryKey<TDef extends ResolverDef, TInput, TType extends 'query' | 'infinite'> = TDef['featureFlags']['keyPrefix'] extends true ? [prefix: string[], path: string[], opts?: {
input?: TInput;
type?: TType;
}] : [path: string[], opts?: {
input?: TInput;
type?: TType;
}];
/**
* A serializable reference to a query started on the server (or in a loader).
* Pass it to a client component and read it with `trpc.unstable_$fromHandle(handle)`.
*/
interface unstable_TRPCQueryHandle<TDef extends ResolverDef = ResolverDef> {
/**
* Type-only: never present at runtime. Required, so only the handle verbs
* create handles.
*/
readonly [handleDef]: TDef & {
kind: 'query';
};
readonly queryKey: HandleQueryKey<TDef, TDef['input'], 'query'>;
/** The input the query was started with */
readonly input: TDef['input'];
}
/**
* A handle from `unstable_$ensure()` or `unstable_$fetch()`: it also carries the data
* the query had then. `trpc.unstable_$fromHandle(handle)` uses it as `initialData`,
* so `useQuery` has `data` from the first render. Data in the cache wins over it.
*/
interface unstable_TRPCQueryHandleWithData<TDef extends ResolverDef = ResolverDef> extends unstable_TRPCQueryHandle<TDef> {
readonly data: coerceAsyncIterableToArray<TDef['output']>;
/** When `data` was fetched, as a timestamp, so its staleness carries over */
readonly dataUpdatedAt: number;
}
/**
* A serializable reference to an infinite query started on the server (or in a loader).
* Read it with `trpc.unstable_$fromHandle(handle, { getNextPageParam })`.
*/
interface unstable_TRPCInfiniteQueryHandle<TDef extends ResolverDef = ResolverDef> {
/**
* Type-only: never present at runtime. Required, so only the handle verbs
* create handles.
*/
readonly [handleDef]: TDef & {
kind: 'infinite';
};
readonly queryKey: HandleQueryKey<TDef, InfiniteHandleInput<TDef['input']>, 'infinite'>;
/** The input the query was started with, without `cursor` and `direction` */
readonly input: InfiniteHandleInput<TDef['input']>;
readonly initialCursor?: NonNullable<ExtractCursorType<TDef['input']>> | null;
}
/**
* An infinite handle from `unstable_$ensureInfinite()` or `unstable_$fetchInfinite()`:
* it also carries the loaded `pages` and `pageParams`.
*/
interface unstable_TRPCInfiniteQueryHandleWithData<TDef extends ResolverDef = ResolverDef> extends unstable_TRPCInfiniteQueryHandle<TDef> {
readonly data: TRPCInfiniteData<TDef['input'], TDef['output']>;
/** When `data` was fetched, as a timestamp, so its staleness carries over */
readonly dataUpdatedAt: number;
}
type unstable_AnyTRPCHandle = unstable_TRPCQueryHandle<any> | unstable_TRPCInfiniteQueryHandle<any>;
/** Options for starting a query that returns a handle */
interface unstable_TRPCPrefetchOptions extends Pick<FetchQueryOptions, 'staleTime' | 'retry' | 'retryDelay' | 'gcTime' | 'meta'>, TRPCQueryBaseOptions {}
type HandleGetNextPageParam<TDef extends ResolverDef> = GetNextPageParamFunction<NonNullable<ExtractCursorType<TDef['input']>> | null, TDef['output']>;
type unstable_TRPCPrefetchInfiniteOptions<TDef extends ResolverDef> = unstable_TRPCPrefetchOptions & {
initialCursor?: NonNullable<ExtractCursorType<TDef['input']>> | null;
} & ({
pages?: never;
/**
* Without it, refetching a cached query with more than one page
* fails on the second page.
*/
getNextPageParam?: HandleGetNextPageParam<TDef>;
} | {
/** Number of pages to load up front */
pages: number;
getNextPageParam: HandleGetNextPageParam<TDef>;
});
/** Verbs added to query procedures */
interface DecorateQueryHandleVerbs<TDef extends ResolverDef> {
/**
* Start the query without waiting and return a serializable handle for it.
* Never throws: errors surface where the handle is read.
*
* Same as `void queryClient.prefetchQuery(trpc.<path>.queryOptions(input, opts))`.
* On `useTRPC()`, call it during render: like TanStack's `usePrefetchQuery`, it only
* starts a query the cache has no state for.
* @see https://trpc.io/docs/client/tanstack-react-query/handles
*/
unstable_$prefetch: (...args: undefined extends TDef['input'] ? [input?: TDef['input'], opts?: unstable_TRPCPrefetchOptions] : [input: TDef['input'], opts?: unstable_TRPCPrefetchOptions]) => unstable_TRPCQueryHandle<TDef>;
/**
* Start the query and wait until the cache has data for it. The handle carries that data.
* Rejects if that request fails.
*
* Same as `await queryClient.ensureQueryData({ ...trpc.<path>.queryOptions(input, opts), revalidateIfStale: true })`.
* Not available on `useTRPC()`.
* @see https://trpc.io/docs/client/tanstack-react-query/handles
*/
unstable_$ensure: (...args: undefined extends TDef['input'] ? [input?: TDef['input'], opts?: unstable_TRPCPrefetchOptions] : [input: TDef['input'], opts?: unstable_TRPCPrefetchOptions]) => Promise<unstable_TRPCQueryHandleWithData<TDef>>;
/**
* Like `unstable_$ensure`, but stale data in the cache is refetched before it resolves.
* Rejects if that request fails.
*
* Same as `await queryClient.fetchQuery(trpc.<path>.queryOptions(input, opts))`.
* Not available on `useTRPC()`.
* @see https://trpc.io/docs/client/tanstack-react-query/handles#fetch
*/
unstable_$fetch: (...args: undefined extends TDef['input'] ? [input?: TDef['input'], opts?: unstable_TRPCPrefetchOptions] : [input: TDef['input'], opts?: unstable_TRPCPrefetchOptions]) => Promise<unstable_TRPCQueryHandleWithData<TDef>>;
}
/** Verbs added to query procedures with a `cursor` input */
interface DecorateInfiniteQueryHandleVerbs<TDef extends ResolverDef> {
/**
* Like `unstable_$prefetch`, for an infinite query. Loads the first page unless `pages` is set.
*
* Same as `void queryClient.prefetchInfiniteQuery(trpc.<path>.infiniteQueryOptions(input, opts))`.
* On `useTRPC()`, call it during render, like `unstable_$prefetch`.
* @see https://trpc.io/docs/client/tanstack-react-query/handles#infinite-queries
*/
unstable_$prefetchInfinite: (input: TDef['input'], opts?: unstable_TRPCPrefetchInfiniteOptions<TDef>) => unstable_TRPCInfiniteQueryHandle<TDef>;
/**
* Like `unstable_$ensure`, for an infinite query. The handle carries the loaded pages.
*
* Same as `await queryClient.ensureInfiniteQueryData({ ...trpc.<path>.infiniteQueryOptions(input, opts), revalidateIfStale: true })`.
* Not available on `useTRPC()`.
* @see https://trpc.io/docs/client/tanstack-react-query/handles#infinite-queries
*/
unstable_$ensureInfinite: (input: TDef['input'], opts?: unstable_TRPCPrefetchInfiniteOptions<TDef>) => Promise<unstable_TRPCInfiniteQueryHandleWithData<TDef>>;
/**
* Like `unstable_$fetch`, for an infinite query. The handle carries the loaded pages.
*
* Same as `await queryClient.fetchInfiniteQuery(trpc.<path>.infiniteQueryOptions(input, opts))`.
* Not available on `useTRPC()`.
* @see https://trpc.io/docs/client/tanstack-react-query/handles#infinite-queries
*/
unstable_$fetchInfinite: (input: TDef['input'], opts?: unstable_TRPCPrefetchInfiniteOptions<TDef>) => Promise<unstable_TRPCInfiniteQueryHandleWithData<TDef>>;
}
type WithoutInitialData<TOptions> = Omit<TOptions, 'initialData' | 'initialDataUpdatedAt'>;
/** Readers added to every router level of the options proxy */
interface DecorateHandleReaders<TFeatureFlags extends FeatureFlags> {
/**
* Options for a handle: the same options `trpc.<path>.queryOptions(input)` or
* `trpc.<path>.infiniteQueryOptions(input, opts)` return for the handle's procedure and input.
* Pass them to `useQuery`, `useSuspenseQuery`, `useSuspenseInfiniteQuery`, etc.
*
* If the handle carries data, from `unstable_$ensure` or `unstable_$fetch`, it becomes
* `initialData`, so `useQuery` has `data` from the first render. Data in the cache wins.
* @see https://trpc.io/docs/client/tanstack-react-query/handles#reading-a-handle
*/
unstable_$fromHandle: {
<TDef extends ResolverDef, TData = TDef['output']>(handle: unstable_TRPCQueryHandleWithData<TDef>, opts?: WithoutInitialData<UnusedSkipTokenTRPCQueryOptionsIn<NoInfer<TDef['output']>, TData, ErrorOf<TDef>, TFeatureFlags>>): DefinedTRPCQueryOptionsOut<TDef['output'], TData, ErrorOf<TDef>, TFeatureFlags>;
<TDef extends ResolverDef, TData = TDef['output']>(handle: unstable_TRPCQueryHandle<TDef>, opts?: UnusedSkipTokenTRPCQueryOptionsIn<NoInfer<TDef['output']>, TData, ErrorOf<TDef>, TFeatureFlags>): UnusedSkipTokenTRPCQueryOptionsOut<TDef['output'], TData, ErrorOf<TDef>, TFeatureFlags>;
<TDef extends ResolverDef, TData = TDef['output']>(handle: unstable_TRPCInfiniteQueryHandleWithData<TDef>, opts: WithoutInitialData<UnusedSkipTokenTRPCInfiniteQueryOptionsIn<TDef['input'], NoInfer<TDef['output']>, TData, ErrorOf<TDef>, TFeatureFlags>>): DefinedTRPCInfiniteQueryOptionsOut<TDef['input'], TDef['output'], TData, ErrorOf<TDef>, TFeatureFlags>;
<TDef extends ResolverDef, TData = TDef['output']>(handle: unstable_TRPCInfiniteQueryHandle<TDef>, opts: UnusedSkipTokenTRPCInfiniteQueryOptionsIn<TDef['input'], NoInfer<TDef['output']>, TData, ErrorOf<TDef>, TFeatureFlags>): UnusedSkipTokenTRPCInfiniteQueryOptionsOut<TDef['input'], TDef['output'], TData, ErrorOf<TDef>, TFeatureFlags>;
};
}
type unstable_inferQueryHandle<TProcedure extends DecorateQueryHandleVerbs<any>> = ReturnType<TProcedure['unstable_$prefetch']>;
type unstable_inferQueryHandleWithData<TProcedure extends DecorateQueryHandleVerbs<any>> = Awaited<ReturnType<TProcedure['unstable_$ensure']>>;
type unstable_inferInfiniteQueryHandle<TProcedure extends DecorateInfiniteQueryHandleVerbs<any>> = ReturnType<TProcedure['unstable_$prefetchInfinite']>;
type unstable_inferInfiniteQueryHandleWithData<TProcedure extends DecorateInfiniteQueryHandleVerbs<any>> = Awaited<ReturnType<TProcedure['unstable_$ensureInfinite']>>;
//#endregion
//#region src/internals/mutationOptions.d.ts
type ReservedOptions = 'mutationKey' | 'mutationFn';
type TRPCMutationOptionsIn<TInput, TError, TOutput, TContext, TFeatureFlags extends FeatureFlags> = DistributiveOmit<UseMutationOptions<TOutput, TError, TInput, TContext>, ReservedOptions> & TRPCQueryBaseOptions & KeyPrefixOptions<TFeatureFlags>;
interface TRPCMutationOptionsOut<TInput, TError, TOutput, TContext, TFeatureFlags extends FeatureFlags> extends UseMutationOptions<TOutput, TError, TInput, TContext>, TRPCQueryOptionsResult {
mutationKey: TRPCMutationKey<TFeatureFlags['keyPrefix']>;
}
interface TRPCMutationOptions<TDef extends ResolverDef, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> {
<TContext = unknown>(opts?: TRPCMutationOptionsIn<TDef['input'], TRPCClientErrorLike<TDef>, TDef['output'], TContext, TFeatureFlags>): TRPCMutationOptionsOut<TDef['input'], TRPCClientErrorLike<TDef>, TDef['output'], TContext, TFeatureFlags>;
}
/**
* @internal
*/
interface MutationOptionsOverride {
onSuccess: (opts: {
/**
* Calls the original function that was defined in the query's `onSuccess` option
*/
originalFn: () => MaybePromise<unknown>;
queryClient: QueryClient;
/**
* Meta data passed in from the `useMutation()` hook
*/
meta: Record<string, unknown>;
}) => MaybePromise<unknown>;
}
//#endregion
//#region src/internals/subscriptionOptions.d.ts
interface BaseTRPCSubscriptionOptionsIn<TOutput, TError> {
enabled?: boolean;
onStarted?: () => void;
onData?: (data: inferAsyncIterableYield<TOutput>) => void;
onError?: (err: TError) => void;
onConnectionStateChange?: (state: TRPCConnectionState<TError>) => void;
}
interface UnusedSkipTokenTRPCSubscriptionOptionsIn<TOutput, TError> {
onStarted?: () => void;
onData?: (data: inferAsyncIterableYield<TOutput>) => void;
onError?: (err: TError) => void;
onConnectionStateChange?: (state: TRPCConnectionState<TError>) => void;
}
interface TRPCSubscriptionOptionsOut<TOutput, TError, TFeatureFlags extends FeatureFlags> extends UnusedSkipTokenTRPCSubscriptionOptionsIn<TOutput, TError>, TRPCQueryOptionsResult {
enabled: boolean;
queryKey: TRPCQueryKey<TFeatureFlags['keyPrefix']>;
subscribe: (innerOpts: UnusedSkipTokenTRPCSubscriptionOptionsIn<TOutput, TError>) => Unsubscribable;
}
interface TRPCSubscriptionOptions<TDef extends ResolverDef, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> {
(input: TDef['input'], opts?: UnusedSkipTokenTRPCSubscriptionOptionsIn<inferAsyncIterableYield<TDef['output']>, TRPCClientErrorLike<TDef>>): TRPCSubscriptionOptionsOut<inferAsyncIterableYield<TDef['output']>, TRPCClientErrorLike<TDef>, TFeatureFlags>;
(input: TDef['input'] | SkipToken, opts?: BaseTRPCSubscriptionOptionsIn<inferAsyncIterableYield<TDef['output']>, TRPCClientErrorLike<TDef>>): TRPCSubscriptionOptionsOut<inferAsyncIterableYield<TDef['output']>, TRPCClientErrorLike<TDef>, TFeatureFlags>;
}
type TRPCSubscriptionStatus = 'idle' | 'connecting' | 'pending' | 'error';
interface TRPCSubscriptionBaseResult<TOutput, TError> {
status: TRPCSubscriptionStatus;
data: undefined | TOutput;
error: null | TError;
/**
* Reset the subscription
*/
reset: () => void;
}
interface TRPCSubscriptionIdleResult<TOutput> extends TRPCSubscriptionBaseResult<TOutput, null> {
status: 'idle';
data: undefined;
error: null;
}
interface TRPCSubscriptionConnectingResult<TOutput, TError> extends TRPCSubscriptionBaseResult<TOutput, TError> {
status: 'connecting';
data: undefined | TOutput;
error: TError | null;
}
interface TRPCSubscriptionPendingResult<TOutput> extends TRPCSubscriptionBaseResult<TOutput, undefined> {
status: 'pending';
data: TOutput | undefined;
error: null;
}
interface TRPCSubscriptionErrorResult<TOutput, TError> extends TRPCSubscriptionBaseResult<TOutput, TError> {
status: 'error';
data: TOutput | undefined;
error: TError;
}
type TRPCSubscriptionResult<TOutput, TError> = TRPCSubscriptionIdleResult<TOutput> | TRPCSubscriptionConnectingResult<TOutput, TError> | TRPCSubscriptionErrorResult<TOutput, TError> | TRPCSubscriptionPendingResult<TOutput>;
declare function useSubscription<TOutput, TError>(opts: TRPCSubscriptionOptionsOut<TOutput, TError, any>): TRPCSubscriptionResult<TOutput, TError>;
//#endregion
//#region src/internals/createOptionsProxy.d.ts
interface DecorateRouterKeyable<TFeatureFlags extends FeatureFlags> {
/**
* Calculate the TanStack Query Key for any path, could be used to invalidate every procedure beneath this path
*
* @see https://tanstack.com/query/latest/docs/framework/react/guides/query-keys
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryKey
*/
pathKey: () => TRPCQueryKey<TFeatureFlags['keyPrefix']>;
/**
* Calculate a TanStack Query Filter for any path, could be used to manipulate every procedure beneath this path
*
* @see https://tanstack.com/query/latest/docs/framework/react/guides/filters
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryFilter
*/
pathFilter: (filters?: QueryFilters<TRPCQueryKey<TFeatureFlags['keyPrefix']>>) => WithRequired<QueryFilters<TRPCQueryKey<TFeatureFlags['keyPrefix']>>, 'queryKey'>;
}
interface TypeHelper<TDef extends ResolverDef> {
/**
* @internal prefer using inferInput and inferOutput to access types
*/
'~types': {
input: TDef['input'];
output: TDef['output'];
errorShape: TDef['errorShape'];
};
}
type inferInput<TProcedure extends DecorateInfiniteQueryProcedure<any> | DecorateQueryProcedure<any> | DecorateMutationProcedure<any>> = TProcedure['~types']['input'];
type inferOutput<TProcedure extends DecorateInfiniteQueryProcedure<any> | DecorateQueryProcedure<any> | DecorateMutationProcedure<any>> = TProcedure['~types']['output'];
interface DecorateInfiniteQueryProcedure<TDef extends ResolverDef> extends TypeHelper<TDef>, DecorateInfiniteQueryHandleVerbs<TDef> {
/**
* Create a set of type-safe infinite query options that can be passed to `useInfiniteQuery`, `prefetchInfiniteQuery` etc.
*
* @see https://tanstack.com/query/latest/docs/framework/react/reference/infiniteQueryOptions#infinitequeryoptions
* @see https://trpc.io/docs/client/tanstack-react-query/usage#infiniteQueryOptions
*/
infiniteQueryOptions: TRPCInfiniteQueryOptions<TDef>;
/**
* Calculate the TanStack Query Key for a Infinite Query Procedure
*
* @see https://tanstack.com/query/latest/docs/framework/react/guides/query-keys
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryKey
*/
infiniteQueryKey: (input?: Partial<TDef['input']>) => DataTag<TRPCQueryKey<TDef['featureFlags']['keyPrefix']>, TRPCInfiniteData<TDef['input'], TDef['output']>, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>>;
/**
* Calculate a TanStack Query Filter for a Infinite Query Procedure
*
* @see https://tanstack.com/query/latest/docs/framework/react/guides/filters
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryFilter
*/
infiniteQueryFilter: (input?: Partial<TDef['input']>, filters?: QueryFilters<DataTag<TRPCQueryKey<TDef['featureFlags']['keyPrefix']>, TRPCInfiniteData<TDef['input'], TDef['output']>, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>>>) => WithRequired<QueryFilters<DataTag<TRPCQueryKey<TDef['featureFlags']['keyPrefix']>, TRPCInfiniteData<TDef['input'], TDef['output']>, TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>>>, 'queryKey'>;
}
interface DecorateQueryProcedure<TDef extends ResolverDef> extends TypeHelper<TDef>, DecorateRouterKeyable<TDef['featureFlags']>, DecorateQueryHandleVerbs<TDef> {
/**
* Create a set of type-safe query options that can be passed to `useQuery`, `prefetchQuery` etc.
*
* @see https://tanstack.com/query/latest/docs/framework/react/reference/queryOptions#queryoptions
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryOptions
*/
queryOptions: TRPCQueryOptions<TDef>;
/**
* Calculate the TanStack Query Key for a Query Procedure
*
* @see https://tanstack.com/query/latest/docs/framework/react/guides/query-keys
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryKey
*/
queryKey: (input?: Partial<TDef['input']>) => DataTag<TRPCQueryKey<TDef['featureFlags']['keyPrefix']>, TDef['output'], TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>>;
/**
* Calculate a TanStack Query Filter for a Query Procedure
*
* @see https://tanstack.com/query/latest/docs/framework/react/guides/filters
* @see https://trpc.io/docs/client/tanstack-react-query/usage#queryFilter
*/
queryFilter: (input?: Partial<TDef['input']>, filters?: QueryFilters<DataTag<TRPCQueryKey<TDef['featureFlags']['keyPrefix']>, TDef['output'], TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>>>) => WithRequired<QueryFilters<DataTag<TRPCQueryKey<TDef['featureFlags']['keyPrefix']>, TDef['output'], TRPCClientErrorLike<{
transformer: TDef['transformer'];
errorShape: TDef['errorShape'];
}>>>, 'queryKey'>;
}
interface DecorateMutationProcedure<TDef extends ResolverDef> extends TypeHelper<TDef> {
/**
* Create a set of type-safe mutation options that can be passed to `useMutation`
*
* @see https://trpc.io/docs/client/tanstack-react-query/usage#mutationOptions
*/
mutationOptions: TRPCMutationOptions<TDef>;
/**
* Calculate the TanStack Mutation Key for a Mutation Procedure
*
* @see https://trpc.io/docs/client/tanstack-react-query/usage#mutationKey
*/
mutationKey: () => TRPCMutationKey<TDef['featureFlags']['keyPrefix']>;
}
interface DecorateSubscriptionProcedure<TDef extends ResolverDef> extends TypeHelper<TDef> {
/**
* Create a set of type-safe subscription options that can be passed to `useSubscription`
*
* @see https://trpc.io/docs/client/tanstack-react-query/usage#subscriptionOptions
*/
subscriptionOptions: TRPCSubscriptionOptions<TDef>;
}
type DecorateProcedure<TType extends TRPCProcedureType, TDef extends ResolverDef> = TType extends 'query' ? DecorateQueryProcedure<TDef> & (TDef['input'] extends OptionalCursorInput ? DecorateInfiniteQueryProcedure<TDef> : Record<string, never>) : TType extends 'mutation' ? DecorateMutationProcedure<TDef> : TType extends 'subscription' ? DecorateSubscriptionProcedure<TDef> : never;
/**
* @internal
*/
type DecoratedRouterRecord<TRoot extends AnyTRPCRootTypes, TRecord extends TRPCRouterRecord, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> = { [TKey in keyof TRecord]: TRecord[TKey] extends (infer $Value) ? $Value extends TRPCRouterRecord ? DecoratedRouterRecord<TRoot, $Value, TFeatureFlags> & DecorateRouterKeyable<TFeatureFlags> & DecorateHandleReaders<TFeatureFlags> : $Value extends AnyTRPCProcedure ? DecorateProcedure<$Value['_def']['type'], {
input: inferProcedureInput<$Value>;
output: inferTransformedProcedureOutput<TRoot, $Value>;
transformer: TRoot['transformer'];
errorShape: inferProcedureErrorShape<TRoot, $Value>;
featureFlags: TFeatureFlags;
}> : never : never; };
type TRPCOptionsProxy<TRouter extends AnyTRPCRouter, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> = DecoratedRouterRecord<TRouter['_def']['_config']['$types'], TRouter['_def']['record'], TFeatureFlags> & DecorateRouterKeyable<TFeatureFlags> & DecorateHandleReaders<TFeatureFlags>;
type TRPCOptionsProxyOptionsBase<TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> = {
queryClient: QueryClient | (() => QueryClient);
overrides?: {
mutations?: MutationOptionsOverride;
};
} & KeyPrefixOptions<TFeatureFlags>;
interface TRPCOptionsProxyOptionsInternal<TRouter extends AnyTRPCRouter> {
router: TRouter;
ctx: inferRouterContext<TRouter> | (() => MaybePromise<inferRouterContext<TRouter>>);
}
interface TRPCOptionsProxyOptionsExternal<TRouter extends AnyTRPCRouter> {
client: TRPCUntypedClient<TRouter> | TRPCClient<TRouter>;
}
type TRPCOptionsProxyOptions<TRouter extends AnyTRPCRouter, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> = TRPCOptionsProxyOptionsBase<TFeatureFlags> & (TRPCOptionsProxyOptionsInternal<TRouter> | TRPCOptionsProxyOptionsExternal<TRouter>);
/**
* Create a typed proxy from your router types. Can also be used on the server.
*
* @see https://trpc.io/docs/client/tanstack-react-query/setup#3c-set-up-without-react-context
* @see https://trpc.io/docs/client/tanstack-react-query/server-components#5-create-a-trpc-caller-for-server-components
*/
declare function createTRPCOptionsProxy<TRouter extends AnyTRPCRouter, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags>(opts: TRPCOptionsProxyOptions<TRouter, TFeatureFlags>): TRPCOptionsProxy<TRouter, TFeatureFlags>;
//#endregion
//#region src/internals/Context.d.ts
type TRPCProviderType<TRouter extends AnyTRPCRouter, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> = React.FC<{
children: React.ReactNode;
queryClient: QueryClient;
trpcClient: TRPCClient<TRouter>;
} & KeyPrefixOptions<TFeatureFlags>>;
interface CreateTRPCContextResult<TRouter extends AnyTRPCRouter, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags> {
TRPCProvider: TRPCProviderType<TRouter, TFeatureFlags>;
useTRPC: () => TRPCOptionsProxy<TRouter, TFeatureFlags>;
useTRPCClient: () => TRPCClient<TRouter>;
}
/**
* Create a set of type-safe provider-consumers
*
* @see https://trpc.io/docs/client/tanstack-react-query/setup#3a-set-up-the-trpc-context-provider
*/
declare function createTRPCContext<TRouter extends AnyTRPCRouter, TFeatureFlags extends FeatureFlags = DefaultFeatureFlags>(): CreateTRPCContextResult<TRouter, TFeatureFlags>;
//#endregion
//#region src/internals/HydrateClient.d.ts
interface unstable_HydrateClientProps {
children?: React.ReactNode;
}
/**
* Create a `HydrateClient` server component for the request's `QueryClient`.
* It sends the queries started so far in this request to the browser,
* pending ones as promises that stream in as they settle. A query an earlier
* `HydrateClient` already sent is skipped, so nesting them is fine.
*
* React Server Components only: the package resolves to the server build
* through the `react-server` export condition.
*
* @see https://trpc.io/docs/client/tanstack-react-query/handles#hydrate-client
*/
declare function unstable_createHydrateClient(_queryClient: QueryClient | (() => QueryClient)): React.FC<unstable_HydrateClientProps>;
/**
* `unstable_createHydrateClient` for the `react-server` export condition.
* @internal
*/
declare function createHydrateClientReactServer(queryClient: QueryClient | (() => QueryClient)): React.FC<unstable_HydrateClientProps>;
//#endregion
export { TRPCQueryOptionsResult as $, unstable_inferInfiniteQueryHandle as A, FeatureFlags as B, unstable_AnyTRPCHandle as C, unstable_TRPCPrefetchOptions as D, unstable_TRPCPrefetchInfiniteOptions as E, TRPCInfiniteQueryOptions as F, TRPCInfiniteData as G, OptionalCursorInput as H, AnyTRPCMutationKey as I, TRPCMutationKeyWithoutPrefix as J, TRPCMutationKey as K, AnyTRPCQueryKey as L, unstable_inferQueryHandle as M, unstable_inferQueryHandleWithData as N, unstable_TRPCQueryHandle as O, TRPCQueryOptions as P, TRPCQueryKeyWithoutPrefix as Q, DefaultFeatureFlags as R, TRPCMutationOptions as S, unstable_TRPCInfiniteQueryHandleWithData as T, QueryType as U, KeyPrefixOptions as V, ResolverDef as W, TRPCQueryKey as X, TRPCQueryBaseOptions as Y, TRPCQueryKeyWithPrefix as Z, TRPCSubscriptionOptions as _, DecorateMutationProcedure as a, TRPCSubscriptionStatus as b, DecorateRouterKeyable as c, createTRPCOptionsProxy as d, TRPCReactRequestOptions as et, inferInput as f, TRPCSubscriptionIdleResult as g, TRPCSubscriptionErrorResult as h, createTRPCContext as i, unstable_inferInfiniteQueryHandleWithData as j, unstable_TRPCQueryHandleWithData as k, DecorateSubscriptionProcedure as l, TRPCSubscriptionConnectingResult as m, unstable_HydrateClientProps as n, ofFeatureFlags as nt, DecorateProcedure as o, inferOutput as p, TRPCMutationKeyWithPrefix as q, unstable_createHydrateClient as r, DecorateQueryProcedure as s, createHydrateClientReactServer as t, WithRequired as tt, TRPCOptionsProxy as u, TRPCSubscriptionPendingResult as v, unstable_TRPCInfiniteQueryHandle as w, useSubscription as x, TRPCSubscriptionResult as y, ExtractCursorType as z };
//# sourceMappingURL=index-Bc1hJ5pK.d.cts.map