diff --git a/packages/plugins/tanstack-query/src/generator.ts b/packages/plugins/tanstack-query/src/generator.ts index 4f901da6c..aed43b643 100644 --- a/packages/plugins/tanstack-query/src/generator.ts +++ b/packages/plugins/tanstack-query/src/generator.ts @@ -117,7 +117,10 @@ function generateQueryHook( const capOperation = upperCaseFirst(operation); const argsType = overrideInputType ?? `Prisma.${model}${capOperation}Args`; - const inputType = makeQueryArgsType(target, argsType); + let inputType = makeQueryArgsType(target, argsType); + if (target === 'angular') { + inputType = `${inputType} | (() => ${inputType})`; + } const infinite = generateMode.includes('Infinite'); const suspense = generateMode.includes('Suspense'); @@ -673,7 +676,7 @@ function makeBaseImports(target: TargetFramework, version: TanStackVersion) { } case 'angular': { return [ - `import type { CreateMutationOptions, CreateQueryOptions, CreateInfiniteQueryOptions, InfiniteData } from '@tanstack/angular-query-v5';`, + `import type { CreateMutationOptions, CreateQueryOptions, CreateInfiniteQueryOptions, InfiniteData } from '@tanstack/angular-query-experimental';`, `import { getHooksContext } from '${runtimeImportBase}/${target}';`, ...shared, ]; diff --git a/packages/plugins/tanstack-query/src/runtime-v5/angular.ts b/packages/plugins/tanstack-query/src/runtime-v5/angular.ts index 87f0881cd..c5a67c44f 100644 --- a/packages/plugins/tanstack-query/src/runtime-v5/angular.ts +++ b/packages/plugins/tanstack-query/src/runtime-v5/angular.ts @@ -8,8 +8,6 @@ import { type CreateMutationOptions, type CreateInfiniteQueryOptions, type InfiniteData, - CreateInfiniteQueryResult, - QueryKey, } from '@tanstack/angular-query-v5'; import type { ModelMeta } from '@zenstackhq/runtime/cross'; import { inject, InjectionToken } from '@angular/core'; @@ -29,6 +27,9 @@ import { export { APIContext as RequestHandlerContext } from '../runtime/common'; +type AnyFn = (...a: unknown[]) => unknown; +const isFn = (v: unknown): v is AnyFn => typeof v === 'function'; + export const AngularQueryContextKey = new InjectionToken('zenstack-angular-query-context'); /** @@ -74,19 +75,21 @@ export function useModelQuery( options?: Omit, 'queryKey'> & ExtraQueryOptions, fetch?: FetchFn ) { - const reqUrl = makeUrl(url, args); - const queryKey = getQueryKey(model, url, args, { - infinite: false, - optimisticUpdate: options?.optimisticUpdate !== false, - }); - return { - queryKey, - ...injectQuery(() => ({ + const query = injectQuery(() => { + const resolvedArgs = isFn(args) ? args() : args; + + const reqUrl = makeUrl(url, resolvedArgs); + const queryKey = getQueryKey(model, url, resolvedArgs, { + infinite: false, + optimisticUpdate: options?.optimisticUpdate !== false, + }); + return { queryKey, queryFn: ({ signal }) => fetcher(reqUrl, { signal }, fetch, false), ...options, - })), - }; + }; + }); + return query; } /** @@ -108,19 +111,22 @@ export function useInfiniteModelQuery( 'queryKey' | 'initialPageParam' >, fetch?: FetchFn -): CreateInfiniteQueryResult, TError> & { queryKey: QueryKey } { - const queryKey = getQueryKey(model, url, args, { infinite: true, optimisticUpdate: false }); - return { - queryKey, - ...injectInfiniteQuery(() => ({ +) { + const query = injectInfiniteQuery(() => { + const resolvedArgs = isFn(args) ? args() : args; + + const queryKey = getQueryKey(model, url, resolvedArgs, { infinite: true, optimisticUpdate: false }); + + return { queryKey, queryFn: ({ pageParam, signal }) => { - return fetcher(makeUrl(url, pageParam ?? args), { signal }, fetch, false); + return fetcher(makeUrl(url, pageParam ?? resolvedArgs), { signal }, fetch, false); }, - initialPageParam: args, + initialPageParam: resolvedArgs, ...options, - })), - }; + }; + }); + return query; } /**