Skip to content

Commit c374642

Browse files
committed
avoid accessing context during prefetch
1 parent 44567cc commit c374642

File tree

5 files changed

+30
-42
lines changed

5 files changed

+30
-42
lines changed

packages/plugins/tanstack-query/src/generator.ts

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -223,12 +223,12 @@ function generateQueryHook(
223223
});
224224

225225
func.addStatements([
226-
makeGetContext(target),
226+
`const endpoint = options?.endpoint ?? DEFAULT_QUERY_ENDPOINT;`,
227227
`return ${mode}${
228228
infinite ? 'Infinite' : ''
229229
}ModelQuery<TQueryFnData, TData, TError>(queryClient, '${model}', \`\${endpoint}/${lowerCaseFirst(
230230
model
231-
)}/${operation}\`, args, options, fetch);`,
231+
)}/${operation}\`, args, options, options?.fetch);`,
232232
]);
233233
}
234234
}
@@ -710,18 +710,17 @@ function makeBaseImports(target: TargetFramework, version: TanStackVersion, gene
710710
const runtimeImportBase = makeRuntimeImportBase(version);
711711
const shared = [
712712
`import { useModelQuery, useInfiniteModelQuery, useModelMutation } from '${runtimeImportBase}/${target}';`,
713-
`import type { PickEnumerable, CheckSelect, QueryError, ExtraQueryOptions, ExtraMutationOptions } from '${runtimeImportBase}';`,
713+
`import { type PickEnumerable, type CheckSelect, type QueryError, type ExtraQueryOptions, type ExtraMutationOptions, DEFAULT_QUERY_ENDPOINT } from '${runtimeImportBase}';`,
714714
`import type { PolicyCrudKind } from '${RUNTIME_PACKAGE}'`,
715715
`import metadata from './__model_meta';`,
716716
`type DefaultError = QueryError;`,
717717
];
718718

719719
if (version === 'v5' && generatePrefetch) {
720720
shared.push(
721-
`import { fetchModelQuery, prefetchModelQuery, fetchInfiniteModelQuery, prefetchInfiniteModelQuery } from '${runtimeImportBase}/${target}';`
722-
);
723-
shared.push(
724-
`import type { QueryClient, FetchQueryOptions, FetchInfiniteQueryOptions } from '@tanstack/${target}-query';`
721+
`import { fetchModelQuery, prefetchModelQuery, fetchInfiniteModelQuery, prefetchInfiniteModelQuery } from '${runtimeImportBase}/${target}';`,
722+
`import type { QueryClient, FetchQueryOptions, FetchInfiniteQueryOptions } from '@tanstack/${target}-query';`,
723+
`import type { ExtraPrefetchOptions } from '${runtimeImportBase}';`
725724
);
726725
}
727726

@@ -746,7 +745,7 @@ function makeBaseImports(target: TargetFramework, version: TanStackVersion, gene
746745
`import type { UseMutationOptions, UseQueryOptions, UseInfiniteQueryOptions, InfiniteData } from '@tanstack/vue-query';`,
747746
`import { getHooksContext } from '${runtimeImportBase}/${target}';`,
748747
`import type { MaybeRef, MaybeRefOrGetter, ComputedRef, UnwrapRef } from 'vue';`,
749-
...(generatePrefetch ? [`import { type MaybeRefDeep } from '${runtimeImportBase}/${target}';`] : []),
748+
`import { toValue } from 'vue';`,
750749
...shared,
751750
];
752751
}
@@ -826,33 +825,16 @@ function makeQueryOptions(
826825
return result;
827826
}
828827

829-
function makePrefetchQueryOptions(target: string, returnType: string, dataType: string, infinite: boolean) {
830-
let result = match(target)
831-
.with('react', () =>
832-
infinite
833-
? `Omit<FetchInfiniteQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey' | 'initialPageParam'>`
834-
: `Omit<FetchQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey'>`
835-
)
836-
.with('vue', () =>
837-
infinite
838-
? `MaybeRefDeep<Omit<FetchInfiniteQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey' | 'initialPageParam'>>`
839-
: `MaybeRefDeep<Omit<FetchQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey'>>`
840-
)
841-
.with('svelte', () =>
842-
infinite
843-
? `Omit<FetchInfiniteQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey' | 'initialPageParam'>`
844-
: `Omit<FetchQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey'>`
845-
)
846-
.otherwise(() => {
847-
throw new PluginError(name, `Unsupported target: ${target}`);
848-
});
849-
828+
function makePrefetchQueryOptions(_target: string, returnType: string, dataType: string, infinite: boolean) {
829+
let extraOptions = 'ExtraPrefetchOptions';
850830
if (!infinite) {
851831
// non-infinite queries support extra options like optimistic updates
852-
result = `(${result} & ExtraQueryOptions)`;
832+
extraOptions += ' & ExtraQueryOptions';
853833
}
854834

855-
return result;
835+
return infinite
836+
? `Omit<FetchInfiniteQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey' | 'initialPageParam'> & ${extraOptions}`
837+
: `Omit<FetchQueryOptions<${returnType}, TError, ${dataType}>, 'queryKey'> & ${extraOptions}`;
856838
}
857839

858840
function makeMutationOptions(target: string, returnType: string, argsType: string) {

packages/plugins/tanstack-query/src/runtime-v5/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
export {
2+
DEFAULT_QUERY_ENDPOINT,
23
getQueryKey,
34
type ExtraMutationOptions,
5+
type ExtraPrefetchOptions,
46
type ExtraQueryOptions,
57
type FetchFn,
68
type QueryError,

packages/plugins/tanstack-query/src/runtime-v5/vue.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export { APIContext as RequestHandlerContext } from '../runtime/common';
3535

3636
export const VueQueryContextKey = 'zenstack-vue-query-context';
3737

38-
// from "@tanstack/vue-query"
38+
// #region from "@tanstack/vue-query"
3939
export type MaybeRefDeep<T> = MaybeRef<
4040
T extends Function
4141
? T
@@ -45,6 +45,7 @@ export type MaybeRefDeep<T> = MaybeRef<
4545
}
4646
: T
4747
>;
48+
// #endregion
4849

4950
/**
5051
* Provide context for the generated TanStack Query hooks.
@@ -119,7 +120,7 @@ export function prefetchModelQuery<TQueryFnData, TData, TError>(
119120
model: string,
120121
url: string,
121122
args?: MaybeRef<unknown>,
122-
options?: MaybeRefDeep<Omit<FetchQueryOptions<TQueryFnData, TError, TData>, 'queryKey'> & ExtraQueryOptions>,
123+
options?: Omit<FetchQueryOptions<TQueryFnData, TError, TData>, 'queryKey'> & ExtraQueryOptions,
123124
fetch?: FetchFn
124125
) {
125126
const optValue = toValue(options);
@@ -133,7 +134,7 @@ export function prefetchModelQuery<TQueryFnData, TData, TError>(
133134
return fetcher<TQueryFnData, false>(makeUrl(url, _args), undefined, fetch, false);
134135
},
135136
...optValue,
136-
});
137+
} as MaybeRefDeep<FetchQueryOptions<TQueryFnData, TError, TData>>);
137138
}
138139

139140
/**
@@ -151,7 +152,7 @@ export function fetchModelQuery<TQueryFnData, TData, TError>(
151152
model: string,
152153
url: string,
153154
args?: MaybeRef<unknown>,
154-
options?: MaybeRefDeep<Omit<FetchQueryOptions<TQueryFnData, TError, TData>, 'queryKey'> & ExtraQueryOptions>,
155+
options?: Omit<FetchQueryOptions<TQueryFnData, TError, TData>, 'queryKey'> & ExtraQueryOptions,
155156
fetch?: FetchFn
156157
) {
157158
const optValue = toValue(options);
@@ -165,7 +166,7 @@ export function fetchModelQuery<TQueryFnData, TData, TError>(
165166
return fetcher<TQueryFnData, false>(makeUrl(url, _args), undefined, fetch, false);
166167
},
167168
...optValue,
168-
});
169+
} as MaybeRefDeep<FetchQueryOptions<TQueryFnData, TError, TData>>);
169170
}
170171

171172
/**
@@ -221,9 +222,7 @@ export function prefetchInfiniteModelQuery<TQueryFnData, TData, TError>(
221222
model: string,
222223
url: string,
223224
args?: MaybeRef<unknown>,
224-
options?: MaybeRefDeep<
225-
Omit<FetchInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey' | 'initialPageParam'>
226-
>,
225+
options?: Omit<FetchInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey' | 'initialPageParam'>,
227226
fetch?: FetchFn
228227
) {
229228
const optValue = toValue(options);
@@ -254,9 +253,7 @@ export function fetchInfiniteModelQuery<TQueryFnData, TData, TError>(
254253
model: string,
255254
url: string,
256255
args?: MaybeRef<unknown>,
257-
options?: MaybeRefDeep<
258-
Omit<FetchInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey' | 'initialPageParam'>
259-
>,
256+
options?: Omit<FetchInfiniteQueryOptions<TQueryFnData, TError, TData>, 'queryKey' | 'initialPageParam'>,
260257
fetch?: FetchFn
261258
) {
262259
const optValue = toValue(options);

packages/plugins/tanstack-query/src/runtime/common.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ export type ExtraQueryOptions = {
110110
optimisticUpdate?: boolean;
111111
};
112112

113+
/**
114+
* Extra prefetch options.
115+
*/
116+
export type ExtraPrefetchOptions = Pick<APIContext, 'endpoint' | 'fetch'>;
117+
113118
/**
114119
* Context type for configuring the hooks.
115120
*/

packages/plugins/tanstack-query/src/runtime/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
export {
2+
DEFAULT_QUERY_ENDPOINT,
23
getQueryKey,
34
type ExtraMutationOptions,
5+
type ExtraPrefetchOptions,
46
type ExtraQueryOptions,
57
type FetchFn,
68
type QueryError,

0 commit comments

Comments
 (0)