Static Site Generation
Prefetch tRPC queries in getStaticProps with createTRPCOptionsProxy and dehydrate, and stop the client from refetching them
On this page
To build a page's data into static HTML, prefetch its queries in getStaticProps. It works like prefetching in getServerSideProps, except that it runs at build time, or when Next.js revalidates the page, so there's no request.
This page builds on the Pages Router setup.
Fetch data in getStaticProps
Make a query client and a tRPC proxy that calls your router directly, prefetch the queries, and return the cache as trpcState. There's no request to build the context from, so pass one that doesn't need it.
This example uses superjson, so the post's createdAt reaches the page as a Date. It needs the matching _app from Using a data transformer.
import { function dehydrate(client: QueryClient, options?: DehydrateOptions): DehydratedStatedehydrate, function useQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[]>(options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: QueryClient): DefinedUseQueryResult<TData, TError> (+2 overloads)useQuery } from '@tanstack/react-query';
import { function createTRPCOptionsProxy<TRouter extends AnyRouter, TFeatureFlags extends FeatureFlags = {
keyPrefix: false;
}>(opts: TRPCOptionsProxyOptions<TRouter, TFeatureFlags>): TRPCOptionsProxy<TRouter, TFeatureFlags>
createTRPCOptionsProxy } from '@trpc/tanstack-react-query';
import type {
type GetStaticPaths<Params extends ParsedUrlQuery = ParsedUrlQuery> = (context: GetStaticPathsContext) => Promise<GetStaticPathsResult<Params>> | GetStaticPathsResult<Params>GetStaticPaths,
type GetStaticPropsContext<Params extends ParsedUrlQuery = ParsedUrlQuery, Preview extends PreviewData = PreviewData> = {
params?: Params;
preview?: boolean;
previewData?: Preview;
draftMode?: boolean;
locale?: string;
locales?: string[];
defaultLocale?: string;
revalidateReason?: "on-demand" | "build" | "stale";
}
GetStaticPropsContext,
type InferGetStaticPropsType<T extends (args: any) => any> = Extract<Awaited<ReturnType<T>>, {
props: any;
}>["props"]
InferGetStaticPropsType,
} from 'next';
import { const prisma: {
post: {
findMany: (opts: {
select: {
id: true;
};
}) => Promise<{
id: string;
}[]>;
};
}
prisma } from '../../server/context';
import class superjsonsuperjson from 'superjson';
import { const appRouter: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>
appRouter } from '../../server/routers/_app';
import { function makeQueryClient(): QueryClientmakeQueryClient } from '../../utils/query-client';
import { const useTRPC: () => TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>
useTRPC } from '../../utils/trpc';
export async function function getStaticProps(context: GetStaticPropsContext<{
id: string;
}>): Promise<{
props: {
trpcState: SuperJSONResult;
id: string;
};
revalidate: number;
}>
getStaticProps(
context: GetStaticPropsContext<{
id: string;
}>
context: type GetStaticPropsContext<Params extends ParsedUrlQuery = ParsedUrlQuery, Preview extends PreviewData = PreviewData> = {
params?: Params;
preview?: boolean;
previewData?: Preview;
draftMode?: boolean;
locale?: string;
locales?: string[];
defaultLocale?: string;
revalidateReason?: "on-demand" | "build" | "stale";
}
GetStaticPropsContext<{ id: stringid: string }>,
) {
const const id: stringid = context: GetStaticPropsContext<{
id: string;
}>
context.params?: {
id: string;
} | undefined
params?.id: string | undefinedid as string;
const const queryClient: QueryClientqueryClient = function makeQueryClient(): QueryClientmakeQueryClient();
const const trpc: TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>
trpc = createTRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>(opts: TRPCOptionsProxyOptions<...>): TRPCOptionsProxy<...>
createTRPCOptionsProxy({
TRPCOptionsProxyOptionsInternal<BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: true; }, DecorateCreateRouterOptions<{ post: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: true; }, DecorateCreateRouterOptions<...>>; }>>>.router: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>
router: const appRouter: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>
appRouter,
TRPCOptionsProxyOptionsInternal<BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: true; }, DecorateCreateRouterOptions<{ post: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: true; }, DecorateCreateRouterOptions<...>>; }>>>.ctx: object | (() => MaybePromise<object>)ctx: {},
queryClient: QueryClient | (() => QueryClient)queryClient,
});
await const queryClient: QueryClientqueryClient.QueryClient.prefetchQuery<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCQueryKeyWithoutPrefix>(options: FetchQueryOptions<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCQueryKeyWithoutPrefix, never>): Promise<void>
prefetchQuery(const trpc: TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>
trpc.post: DecoratedRouterRecord<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>, {
...;
}> & DecorateRouterKeyable<...> & DecorateHandleReaders<...>
post.byId: DecorateQueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
transformer: true;
errorShape: DefaultErrorShape;
featureFlags: {
keyPrefix: false;
};
}> & Record<string, never>
byId.DecorateQueryProcedure<{ input: { id: string; }; output: { id: string; title: string; text: string; createdAt: Date; }; transformer: true; errorShape: DefaultErrorShape; featureFlags: { ...; }; }>.queryOptions: TRPCQueryOptions
<{
id: string;
title: string;
text: string;
createdAt: Date;
}, {
id: string;
title: string;
text: string;
createdAt: Date;
}>(input: {
id: string;
}, opts?: UnusedSkipTokenTRPCQueryOptionsIn<{
id: string;
title: string;
text: string;
createdAt: Date;
}, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>, {
keyPrefix: false;
}> | undefined) => UnusedSkipTokenTRPCQueryOptionsOut<{
id: string;
title: string;
text: string;
createdAt: Date;
}, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<...>, {
keyPrefix: false;
}> (+2 overloads)
queryOptions({ id: stringid }));
return {
props: {
trpcState: SuperJSONResult;
id: string;
}
props: {
trpcState: SuperJSONResulttrpcState: class superjsonsuperjson.SuperJSON.serialize: (object: SuperJSONValue) => SuperJSONResultserialize(function dehydrate(client: QueryClient, options?: DehydrateOptions): DehydratedStatedehydrate(const queryClient: QueryClientqueryClient)),
id: stringid,
},
revalidate: numberrevalidate: 1,
};
}
export const const getStaticPaths: GetStaticPathsgetStaticPaths: type GetStaticPaths<Params extends ParsedUrlQuery = ParsedUrlQuery> = (context: GetStaticPathsContext) => Promise<GetStaticPathsResult<Params>> | GetStaticPathsResult<Params>GetStaticPaths = async () => {
const const posts: {
id: string;
}[]
posts = await const prisma: {
post: {
findMany: (opts: {
select: {
id: true;
};
}) => Promise<{
id: string;
}[]>;
};
}
prisma.post: {
findMany: (opts: {
select: {
id: true;
};
}) => Promise<{
id: string;
}[]>;
}
post.findMany: (opts: {
select: {
id: true;
};
}) => Promise<{
id: string;
}[]>
findMany({
select: {
id: true;
}
select: {
id: trueid: true,
},
});
return {
paths: (string | {
params: ParsedUrlQuery;
locale?: string;
})[]
paths: const posts: {
id: string;
}[]
posts.Array<{ id: string; }>.map<{
params: {
id: string;
};
}>(callbackfn: (value: {
id: string;
}, index: number, array: {
id: string;
}[]) => {
params: {
id: string;
};
}, thisArg?: any): {
params: {
id: string;
};
}[]
map((post: {
id: string;
}
post) => ({
params: {
id: string;
}
params: {
id: stringid: post: {
id: string;
}
post.id: stringid,
},
})),
// https://nextjs.org/docs/pages/api-reference/functions/get-static-paths#fallback-blocking
fallback: GetStaticPathsFallbackfallback: 'blocking',
};
};
export default function function PostViewPage(props: InferGetStaticPropsType<typeof getStaticProps>): JSX.ElementPostViewPage(
props: {
trpcState: SuperJSONResult;
id: string;
}
props: type InferGetStaticPropsType<T extends (args: any) => any> = Extract<Awaited<ReturnType<T>>, {
props: any;
}>["props"]
InferGetStaticPropsType<typeof function getStaticProps(context: GetStaticPropsContext<{
id: string;
}>): Promise<{
props: {
trpcState: SuperJSONResult;
id: string;
};
revalidate: number;
}>
getStaticProps>,
) {
const const trpc: TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>
trpc = function useTRPC(): TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>
useTRPC();
const const postQuery: UseQueryResult<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>>
postQuery = useQuery<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCQueryKeyWithoutPrefix>(options: UndefinedInitialDataOptions<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCQueryKeyWithoutPrefix>, queryClient?: QueryClient): UseQueryResult<...> (+2 overloads)
useQuery(const trpc: TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
post: BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>;
}>>, {
...;
}>
trpc.post: DecoratedRouterRecord<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: true;
}, DecorateCreateRouterOptions<{
byId: QueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
meta: object;
errorShape: DefaultErrorShape;
}>;
}>, {
...;
}> & DecorateRouterKeyable<...> & DecorateHandleReaders<...>
post.byId: DecorateQueryProcedure<{
input: {
id: string;
};
output: {
id: string;
title: string;
text: string;
createdAt: Date;
};
transformer: true;
errorShape: DefaultErrorShape;
featureFlags: {
keyPrefix: false;
};
}> & Record<string, never>
byId.DecorateQueryProcedure<{ input: { id: string; }; output: { id: string; title: string; text: string; createdAt: Date; }; transformer: true; errorShape: DefaultErrorShape; featureFlags: { ...; }; }>.queryOptions: TRPCQueryOptions
<{
id: string;
title: string;
text: string;
createdAt: Date;
}, {
id: string;
title: string;
text: string;
createdAt: Date;
}>(input: {
id: string;
}, opts?: UnusedSkipTokenTRPCQueryOptionsIn<{
id: string;
title: string;
text: string;
createdAt: Date;
}, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>, {
keyPrefix: false;
}> | undefined) => UnusedSkipTokenTRPCQueryOptionsOut<{
id: string;
title: string;
text: string;
createdAt: Date;
}, {
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<...>, {
keyPrefix: false;
}> (+2 overloads)
queryOptions({ id: stringid: props: {
trpcState: SuperJSONResult;
id: string;
}
props.id: stringid }));
switch (const postQuery: UseQueryResult<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>>
postQuery.status: "pending" | "error" | "success"status) {
case 'pending':
return <JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>p>Loading...</JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>p>;
case 'error':
return <JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>p>Error: {const postQuery: QueryObserverRefetchErrorResult<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>> | QueryObserverLoadingErrorResult<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>>
postQuery.error: TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>
error.TRPCClientErrorBase<DefaultErrorShape>.message: stringmessage}</JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>p>;
case 'success': {
const const post: {
id: string;
title: string;
text: string;
createdAt: Date;
}
post = const postQuery: QueryObserverSuccessResult<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>> | QueryObserverPlaceholderResult<{
id: string;
title: string;
text: string;
createdAt: Date;
}, TRPCClientErrorLike<{
transformer: true;
errorShape: DefaultErrorShape;
}>>
postQuery.data: {
id: string;
title: string;
text: string;
createdAt: Date;
}
data;
return (
<JSX.IntrinsicElements.article: DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>article>
<JSX.IntrinsicElements.h1: DetailedHTMLProps<HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>h1>{const post: {
id: string;
title: string;
text: string;
createdAt: Date;
}
post.title: stringtitle}</JSX.IntrinsicElements.h1: DetailedHTMLProps<HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>h1>
<JSX.IntrinsicElements.em: DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>em>Created {const post: {
id: string;
title: string;
text: string;
createdAt: Date;
}
post.createdAt: DatecreatedAt.Date.toLocaleDateString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string (+2 overloads)toLocaleDateString('en-us')}</JSX.IntrinsicElements.em: DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>em>
<JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>p>{const post: {
id: string;
title: string;
text: string;
createdAt: Date;
}
post.text: stringtext}</JSX.IntrinsicElements.p: DetailedHTMLProps<HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>p>
</JSX.IntrinsicElements.article: DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>article>
);
}
}
}Stop the client from refetching
TanStack React Query refetches stale data on the client when a component mounts, when the window regains focus, and when the network reconnects. If you only want the data from getStaticProps, for instance because your API is rate-limited, turn that off.
Per query:
import { function useQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends QueryKey = readonly unknown[]>(options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>, queryClient?: QueryClient): DefinedUseQueryResult<TData, TError> (+2 overloads)useQuery } from '@tanstack/react-query';
import { const useTRPC: () => TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
example: QueryProcedure<{
input: void;
output: string;
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>, {
keyPrefix: false;
}>
useTRPC } from './utils/trpc';
function function Example(): voidExample() {
const const trpc: TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
example: QueryProcedure<{
input: void;
output: string;
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>, {
keyPrefix: false;
}>
trpc = function useTRPC(): TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
example: QueryProcedure<{
input: void;
output: string;
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>, {
keyPrefix: false;
}>
useTRPC();
const const exampleQuery: UseQueryResult<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>>
exampleQuery = useQuery<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, string, TRPCQueryKeyWithoutPrefix>(options: UndefinedInitialDataOptions<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, string, TRPCQueryKeyWithoutPrefix>, queryClient?: QueryClient): UseQueryResult<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>> (+2 overloads)
useQuery(
const trpc: TRPCOptionsProxy<BuiltRouter<{
ctx: object;
meta: object;
errorShape: DefaultErrorShape;
transformer: false;
}, DecorateCreateRouterOptions<{
example: QueryProcedure<{
input: void;
output: string;
meta: object;
errorShape: DefaultErrorShape;
}>;
}>>, {
keyPrefix: false;
}>
trpc.example: DecorateQueryProcedure<{
input: void;
output: string;
transformer: false;
errorShape: DefaultErrorShape;
featureFlags: {
keyPrefix: false;
};
}> & DecorateInfiniteQueryProcedure<{
input: void;
output: string;
transformer: false;
errorShape: DefaultErrorShape;
featureFlags: {
keyPrefix: false;
};
}>
example.DecorateQueryProcedure<{ input: void; output: string; transformer: false; errorShape: DefaultErrorShape; featureFlags: { keyPrefix: false; }; }>.queryOptions: TRPCQueryOptions
<string, string>(input: void, opts?: UnusedSkipTokenTRPCQueryOptionsIn<string, string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, {
keyPrefix: false;
}> | undefined) => UnusedSkipTokenTRPCQueryOptionsOut<string, string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, {
keyPrefix: false;
}> (+2 overloads)
queryOptions(var undefinedundefined, {
refetchOnMount?: boolean | "always" | ((query: Query<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, string, TRPCQueryKeyWithoutPrefix>) => boolean | "always") | undefined
refetchOnMount: false,
refetchOnWindowFocus?: boolean | "always" | ((query: Query<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, string, TRPCQueryKeyWithoutPrefix>) => boolean | "always") | undefined
refetchOnWindowFocus: false,
refetchOnReconnect?: boolean | "always" | ((query: Query<string, TRPCClientErrorLike<{
transformer: false;
errorShape: DefaultErrorShape;
}>, string, TRPCQueryKeyWithoutPrefix>) => boolean | "always") | undefined
refetchOnReconnect: false,
}),
);
}Or for every query, in the query client:
import { class QueryClientQueryClient } from '@tanstack/react-query';
export function function makeQueryClient(): QueryClientmakeQueryClient() {
return new new QueryClient(config?: QueryClientConfig): QueryClientQueryClient({
QueryClientConfig.defaultOptions?: DefaultOptions<Error> | undefineddefaultOptions: {
DefaultOptions<Error>.queries?: OmitKeyof<QueryObserverOptions<unknown, Error, unknown, unknown, readonly unknown[], never>, "suspense" | "queryKey", "strictly"> | undefinedqueries: {
refetchOnMount?: boolean | "always" | ((query: Query<unknown, Error, unknown, readonly unknown[]>) => boolean | "always") | undefinedrefetchOnMount: false,
refetchOnWindowFocus?: boolean | "always" | ((query: Query<unknown, Error, unknown, readonly unknown[]>) => boolean | "always") | undefinedrefetchOnWindowFocus: false,
refetchOnReconnect?: boolean | "always" | ((query: Query<unknown, Error, unknown, readonly unknown[]>) => boolean | "always") | undefinedrefetchOnReconnect: false,
},
},
});
}Be careful with the second one if your app mixes static and dynamic queries.