@@ -57,7 +57,7 @@ export function getHooksContext() {
5757 * @param args The request args object, URL-encoded and appended as "?q=" parameter
5858 * @param options The svelte-query options object
5959 * @param fetch The fetch function to use for sending the HTTP request
60- * @returns useQuery hook
60+ * @returns createQuery hook
6161 */
6262export function useModelQuery < TQueryFnData , TData , TError > (
6363 model : string ,
@@ -94,14 +94,65 @@ export function useModelQuery<TQueryFnData, TData, TError>(
9494 return createQuery < TQueryFnData , TError , TData > ( mergedOpt ) ;
9595}
9696
97+ /**
98+ * Creates a svelte-query prefetch query.
99+ *
100+ * @param model The name of the model under query.
101+ * @param url The request URL.
102+ * @param args The request args object, URL-encoded and appended as "?q=" parameter
103+ * @param options The svelte-query options object
104+ * @param fetch The fetch function to use for sending the HTTP request
105+ * @returns createPrefetchQuery hook
106+ */
107+ export function usePrefetchModelQuery < TQueryFnData , TData , TError > (
108+ model : string ,
109+ url : string ,
110+ args ?: unknown ,
111+ options ?: StoreOrVal < Omit < CreateQueryOptions < TQueryFnData , TError , TData > , 'queryKey' > > & ExtraQueryOptions ,
112+ fetch ?: FetchFn
113+ ) {
114+ const reqUrl = makeUrl ( url , args ) ;
115+ const queryKey = getQueryKey ( model , url , args , {
116+ infinite : false ,
117+ optimisticUpdate : options ?. optimisticUpdate !== false ,
118+ } ) ;
119+ const queryFn = ( ) => fetcher < TQueryFnData , false > ( reqUrl , undefined , fetch , false ) ;
120+
121+ let mergedOpt : any ;
122+ if ( isStore ( options ) ) {
123+ // options is store
124+ mergedOpt = derived ( [ options ] , ( [ $opt ] ) => {
125+ return {
126+ queryKey,
127+ queryFn,
128+ ...( $opt as object ) ,
129+ } ;
130+ } ) ;
131+ } else {
132+ // options is value
133+ mergedOpt = {
134+ queryKey,
135+ queryFn,
136+ ...options ,
137+ } ;
138+ }
139+
140+ // Todo : When createPrefetchQuery is available in svelte-query, use it
141+ const queryClient = useQueryClient ( ) ;
142+
143+ return queryClient . prefetchQuery ( mergedOpt ) ;
144+ // return createPrefetchQuery<TQueryFnData, TError, TData>(mergedOpt);
145+ }
146+
97147/**
98148 * Creates a svelte-query infinite query.
99149 *
100150 * @param model The name of the model under query.
101151 * @param url The request URL.
102152 * @param args The initial request args object, URL-encoded and appended as "?q=" parameter
103153 * @param options The svelte-query infinite query options object
104- * @returns useQuery hook
154+ * @param fetch The fetch function to use for sending the HTTP request
155+ * @returns createInfiniteQuery hook
105156 */
106157export function useInfiniteModelQuery < TQueryFnData , TData , TError > (
107158 model : string ,
@@ -143,6 +194,61 @@ export function useInfiniteModelQuery<TQueryFnData, TData, TError>(
143194 return createInfiniteQuery < TQueryFnData , TError , InfiniteData < TData > > ( mergedOpt ) ;
144195}
145196
197+ /**
198+ * Creates a svelte-query prefetch infinite query.
199+ *
200+ * @param model The name of the model under query.
201+ * @param url The request URL.
202+ * @param args The initial request args object, URL-encoded and appended as "?q=" parameter
203+ * @param options The svelte-query infinite query options object
204+ * @param fetch The fetch function to use for sending the HTTP request
205+ * @returns createPrefetchInfiniteQuery hook
206+ */
207+ export function usePrefetchInfiniteModelQuery < TQueryFnData , TData , TError > (
208+ model : string ,
209+ url : string ,
210+ args : unknown ,
211+ options : StoreOrVal <
212+ Omit < CreateInfiniteQueryOptions < TQueryFnData , TError , InfiniteData < TData > > , 'queryKey' | 'initialPageParam' >
213+ > ,
214+ fetch ?: FetchFn
215+ ) {
216+ const queryKey = getQueryKey ( model , url , args , { infinite : true , optimisticUpdate : false } ) ;
217+ const queryFn = ( { pageParam } : { pageParam : unknown } ) =>
218+ fetcher < TQueryFnData , false > ( makeUrl ( url , pageParam ?? args ) , undefined , fetch , false ) ;
219+
220+ let mergedOpt : StoreOrVal < any > ;
221+ if (
222+ isStore <
223+ Omit < CreateInfiniteQueryOptions < TQueryFnData , TError , InfiniteData < TData > > , 'queryKey' | 'initialPageParam' >
224+ > ( options )
225+ ) {
226+ // options is store
227+ mergedOpt = derived ( [ options ] , ( [ $opt ] ) => {
228+ return {
229+ queryKey,
230+ queryFn,
231+ initialPageParam : args ,
232+ ...$opt ,
233+ } ;
234+ } ) ;
235+ } else {
236+ // options is value
237+ mergedOpt = {
238+ queryKey,
239+ queryFn,
240+ initialPageParam : args ,
241+ ...options ,
242+ } ;
243+ }
244+
245+ // Todo : When createPrefetchInfiniteQuery is available in svelte-query, use it
246+ const queryClient = useQueryClient ( ) ;
247+
248+ return queryClient . prefetchInfiniteQuery ( mergedOpt ) ;
249+ // return createPrefetchInfiniteQuery<TQueryFnData, TError, InfiniteData<TData>>(mergedOpt);
250+ }
251+
146252function isStore < T > ( opt : unknown ) : opt is Readable < T > {
147253 return typeof ( opt as any ) ?. subscribe === 'function' ;
148254}
@@ -155,7 +261,9 @@ function isStore<T>(opt: unknown): opt is Readable<T> {
155261 * @param modelMeta The model metadata.
156262 * @param url The request URL.
157263 * @param options The svelte-query options.
158- * @returns useMutation hooks
264+ * @param fetch The fetch function to use for sending the HTTP request
265+ * @param checkReadBack Whether to check for read back errors and return undefined if found.
266+ * @returns createMutation hook
159267 */
160268export function useModelMutation <
161269 TArgs ,
0 commit comments