Skip to content

Commit 59eca0d

Browse files
authored
feat(query-client): support for passing custom QueryClient instance via function (#208)
1 parent 4560f4c commit 59eca0d

File tree

3 files changed

+61
-5
lines changed

3 files changed

+61
-5
lines changed

README.md

+18-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,25 @@ export class TodosService {
5959
#queryClient = injectQueryClient();
6060
}
6161
```
62+
or provide `QueryClient` [instance](https://tanstack.com/query/v5/docs/reference/QueryClient) manually
6263

63-
> The function should run inside an injection context
64+
```ts
65+
import { provideQueryClient } from '@ngneat/query';
66+
import { QueryClient } from '@tanstack/query-core';
67+
68+
provideQueryClient(() => new QueryClient())
69+
```
70+
71+
and then use with
72+
73+
```ts
74+
import { injectQueryClient } from '@ngneat/query';
75+
76+
...
77+
#queryClient = injectQueryClient();
78+
```
79+
80+
> Functions should run inside an injection context
6481
6582
### Query
6683

query/src/lib/query-client.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,13 @@ const QueryClientService = new InjectionToken<QueryClient>(
6060
);
6161

6262
/** @public */
63-
export function provideQueryClient(queryClient: QueryClient): Provider {
63+
export function provideQueryClient(queryClientOrFactory: _QueryClient | (() => _QueryClient)): Provider {
6464
return {
6565
provide: QueryClientToken,
66-
useValue: queryClient,
66+
useFactory:
67+
typeof queryClientOrFactory === 'function'
68+
? queryClientOrFactory
69+
: () => queryClientOrFactory,
6770
};
6871
}
6972

query/src/tests/query-client.spec.ts

+38-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { TestBed, fakeAsync, flush, tick } from '@angular/core/testing';
2-
import { InfiniteData } from '@tanstack/query-core';
2+
import { InfiniteData, QueryClient as _QueryClient } from '@tanstack/query-core';
33
import { expectTypeOf } from 'expect-type';
4-
import { QueryClient, injectQueryClient } from '../lib/query-client';
4+
import { QueryClient, injectQueryClient, provideQueryClient } from '../lib/query-client';
55
import {
66
Posts,
77
PostsService,
@@ -135,3 +135,39 @@ describe('QueryClient', () => {
135135
>();
136136
});
137137
});
138+
139+
140+
describe('Custom QueryClient', () => {
141+
let queryClient: QueryClient;
142+
let customQueryClientInstance: _QueryClient;
143+
144+
it('should use custom query client', fakeAsync(() => {
145+
customQueryClientInstance = new _QueryClient();
146+
TestBed.configureTestingModule({
147+
providers: [provideQueryClient(customQueryClientInstance)],
148+
});
149+
TestBed.runInInjectionContext(() => {
150+
queryClient = injectQueryClient();
151+
});
152+
153+
expect(queryClient).toBe(customQueryClientInstance);
154+
}));
155+
156+
it('should use custom query client provided from function', fakeAsync(() => {
157+
TestBed.configureTestingModule({
158+
providers: [
159+
provideQueryClient(() => {
160+
customQueryClientInstance = new _QueryClient();
161+
return customQueryClientInstance;
162+
}),
163+
],
164+
});
165+
TestBed.runInInjectionContext(() => {
166+
queryClient = injectQueryClient();
167+
});
168+
169+
expect(queryClient).toBe(customQueryClientInstance);
170+
}));
171+
172+
});
173+

0 commit comments

Comments
 (0)