Skip to content

Commit c5074bd

Browse files
refactor(angular-query): change query functions to accept an options object instead of an injector
change query functions to accept an options object instead of an injector so that it matches angular APIs such as effect and allows adding more options in the future. BREAKING CHANGE: The injector option has been replaced with an options object. The injector can now be provided with the options object. Closes #8711
1 parent 0511c82 commit c5074bd

17 files changed

+99
-69
lines changed

examples/angular/devtools-panel/src/app/components/lazy-load-devtools-panel-example.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default class LazyLoadDevtoolsPanelExampleComponent {
4545
this.devtools = import(
4646
'@tanstack/angular-query-devtools-experimental'
4747
).then(({ injectDevtoolsPanel }) =>
48-
injectDevtoolsPanel(this.devToolsOptions, this.injector),
48+
injectDevtoolsPanel(this.devToolsOptions, { injector: this.injector }),
4949
)
5050
}
5151
}

packages/angular-query-devtools-experimental/src/inject-devtools-panel.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ import {
1212
import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools'
1313
import {
1414
QueryClient,
15-
onlineManager,
15+
onlineManager
1616
} from '@tanstack/angular-query-experimental'
1717
import { isPlatformBrowser } from '@angular/common'
18+
import type {
19+
WithOptionalInjector
20+
} from '@tanstack/angular-query-experimental'
1821
import type { ElementRef } from '@angular/core'
1922
import type { DevtoolsErrorType } from '@tanstack/query-devtools'
2023

@@ -26,19 +29,19 @@ import type { DevtoolsErrorType } from '@tanstack/query-devtools'
2629
*
2730
* Consider `withDevtools` instead if you don't need this.
2831
* @param optionsFn - A function that returns devtools panel options.
29-
* @param injector - The Angular injector to use.
32+
* @param options - Additional configuration
3033
* @returns DevtoolsPanelRef
3134
* @see https://tanstack.com/query/v5/docs/framework/angular/devtools
3235
*/
3336
export function injectDevtoolsPanel(
3437
optionsFn: () => DevtoolsPanelOptions,
35-
injector?: Injector,
38+
options?: WithOptionalInjector,
3639
): DevtoolsPanelRef {
37-
!injector && assertInInjectionContext(injectDevtoolsPanel)
38-
const currentInjector = injector ?? inject(Injector)
40+
!options?.injector && assertInInjectionContext(injectDevtoolsPanel)
41+
const currentInjector = options?.injector ?? inject(Injector)
3942

4043
return runInInjectionContext(currentInjector, () => {
41-
const options = computed(optionsFn)
44+
const queryOptions = computed(optionsFn)
4245
let devtools: TanstackQueryDevtoolsPanel | null = null
4346

4447
const isBrowser = isPlatformBrowser(inject(PLATFORM_ID))
@@ -64,7 +67,7 @@ export function injectDevtoolsPanel(
6467
shadowDOMTarget,
6568
onClose,
6669
hostElement,
67-
} = options()
70+
} = queryOptions()
6871

6972
untracked(() => {
7073
if (!client) throw new Error('No QueryClient found')

packages/angular-query-experimental/src/__tests__/inject-infinite-query.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ describe('injectInfiniteQuery', () => {
8787
initialPageParam: 0,
8888
getNextPageParam: () => 12,
8989
}),
90-
TestBed.inject(Injector),
90+
{
91+
injector: TestBed.inject(Injector),
92+
},
9193
)
9294

9395
expect(query.status()).toBe('pending')

packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,12 @@ describe('injectIsFetching', () => {
6060

6161
test('can be used outside injection context when passing an injector', () => {
6262
expect(
63-
injectIsFetching(undefined, TestBed.inject(Injector)),
63+
injectIsFetching(
64+
undefined,
65+
{
66+
injector: TestBed.inject(Injector),
67+
},
68+
),
6469
).not.toThrow()
6570
})
6671
})

packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,12 @@ describe('injectIsMutating', () => {
6060

6161
test('can be used outside injection context when passing an injector', () => {
6262
expect(
63-
injectIsMutating(undefined, TestBed.inject(Injector)),
63+
injectIsMutating(
64+
undefined,
65+
{
66+
injector: TestBed.inject(Injector),
67+
},
68+
),
6469
).not.toThrow()
6570
})
6671
})

packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,9 @@ describe('injectMutation', () => {
509509
mutationKey: ['injectionContextError'],
510510
mutationFn: () => Promise.resolve(),
511511
}),
512-
TestBed.inject(Injector),
512+
{
513+
injector: TestBed.inject(Injector),
514+
},
513515
)
514516
}).not.toThrow()
515517
})

packages/angular-query-experimental/src/__tests__/inject-query.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,9 @@ describe('injectQuery', () => {
638638
queryKey: ['manualInjector'],
639639
queryFn: simpleFetcher,
640640
}),
641-
TestBed.inject(Injector),
641+
{
642+
injector: TestBed.inject(Injector),
643+
},
642644
)
643645

644646
expect(query.status()).toBe('pending')

packages/angular-query-experimental/src/inject-infinite-query.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { InfiniteQueryObserver } from '@tanstack/query-core'
22
import { createBaseQuery } from './create-base-query'
33
import { assertInjector } from './util/assert-injector/assert-injector'
4-
import type { Injector } from '@angular/core'
54
import type {
65
DefaultError,
76
InfiniteData,
@@ -11,7 +10,7 @@ import type {
1110
import type {
1211
CreateInfiniteQueryOptions,
1312
CreateInfiniteQueryResult,
14-
DefinedCreateInfiniteQueryResult,
13+
DefinedCreateInfiniteQueryResult, WithOptionalInjector,
1514
} from './types'
1615
import type {
1716
DefinedInitialDataInfiniteOptions,
@@ -22,7 +21,7 @@ import type {
2221
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
2322
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
2423
* @param optionsFn - A function that returns infinite query options.
25-
* @param injector - The Angular injector to use.
24+
* @param options - Additional configuration.
2625
* @returns The infinite query result.
2726
* @public
2827
*/
@@ -40,14 +39,14 @@ export function injectInfiniteQuery<
4039
TQueryKey,
4140
TPageParam
4241
>,
43-
injector?: Injector,
42+
options?: WithOptionalInjector,
4443
): DefinedCreateInfiniteQueryResult<TData, TError>
4544

4645
/**
4746
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
4847
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
4948
* @param optionsFn - A function that returns infinite query options.
50-
* @param injector - The Angular injector to use.
49+
* @param options - Additional configuration.
5150
* @returns The infinite query result.
5251
* @public
5352
*/
@@ -65,14 +64,14 @@ export function injectInfiniteQuery<
6564
TQueryKey,
6665
TPageParam
6766
>,
68-
injector?: Injector,
67+
options?: WithOptionalInjector,
6968
): CreateInfiniteQueryResult<TData, TError>
7069

7170
/**
7271
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
7372
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
7473
* @param optionsFn - A function that returns infinite query options.
75-
* @param injector - The Angular injector to use.
74+
* @param options - Additional configuration.
7675
* @returns The infinite query result.
7776
* @public
7877
*/
@@ -91,22 +90,22 @@ export function injectInfiniteQuery<
9190
TQueryKey,
9291
TPageParam
9392
>,
94-
injector?: Injector,
93+
options?: WithOptionalInjector,
9594
): CreateInfiniteQueryResult<TData, TError>
9695

9796
/**
9897
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
9998
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
10099
* @param optionsFn - A function that returns infinite query options.
101-
* @param injector - The Angular injector to use.
100+
* @param options - Additional configuration.
102101
* @returns The infinite query result.
103102
* @public
104103
*/
105104
export function injectInfiniteQuery(
106105
optionsFn: () => CreateInfiniteQueryOptions,
107-
injector?: Injector,
106+
options?: WithOptionalInjector,
108107
) {
109-
return assertInjector(injectInfiniteQuery, injector, () =>
108+
return assertInjector(injectInfiniteQuery, options?.injector, () =>
110109
createBaseQuery(optionsFn, InfiniteQueryObserver as typeof QueryObserver),
111110
)
112111
}

packages/angular-query-experimental/src/inject-is-fetching.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@ import { DestroyRef, NgZone, inject, signal } from '@angular/core'
22
import { QueryClient, notifyManager } from '@tanstack/query-core'
33
import { assertInjector } from './util/assert-injector/assert-injector'
44
import type { QueryFilters } from '@tanstack/query-core'
5-
import type { Injector, Signal } from '@angular/core'
5+
import type { Signal } from '@angular/core'
6+
import type { WithOptionalInjector } from "./types";
67

78
/**
89
* Injects a signal that tracks the number of queries that your application is loading or
910
* fetching in the background.
1011
*
1112
* Can be used for app-wide loading indicators
1213
* @param filters - The filters to apply to the query.
13-
* @param injector - The Angular injector to use.
14+
* @param options - Additional configuration
1415
* @returns signal with number of loading or fetching queries.
1516
* @public
1617
*/
1718
export function injectIsFetching(
1819
filters?: QueryFilters,
19-
injector?: Injector,
20+
options?: WithOptionalInjector,
2021
): Signal<number> {
21-
return assertInjector(injectIsFetching, injector, () => {
22+
return assertInjector(injectIsFetching, options?.injector, () => {
2223
const destroyRef = inject(DestroyRef)
2324
const ngZone = inject(NgZone)
2425
const queryClient = inject(QueryClient)

packages/angular-query-experimental/src/inject-is-mutating.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@ import { DestroyRef, NgZone, inject, signal } from '@angular/core'
22
import { QueryClient, notifyManager } from '@tanstack/query-core'
33
import { assertInjector } from './util/assert-injector/assert-injector'
44
import type { MutationFilters } from '@tanstack/query-core'
5-
import type { Injector, Signal } from '@angular/core'
5+
import type { Signal } from '@angular/core'
6+
import type { WithOptionalInjector } from "./types";
67

78
/**
89
* Injects a signal that tracks the number of mutations that your application is fetching.
910
*
1011
* Can be used for app-wide loading indicators
1112
* @param filters - The filters to apply to the query.
12-
* @param injector - The Angular injector to use.
13+
* @param options - Additional configuration
1314
* @returns signal with number of fetching mutations.
1415
* @public
1516
*/
1617
export function injectIsMutating(
1718
filters?: MutationFilters,
18-
injector?: Injector,
19+
options?: WithOptionalInjector,
1920
): Signal<number> {
20-
return assertInjector(injectIsMutating, injector, () => {
21+
return assertInjector(injectIsMutating, options?.injector, () => {
2122
const destroyRef = inject(DestroyRef)
2223
const ngZone = inject(NgZone)
2324
const queryClient = inject(QueryClient)

0 commit comments

Comments
 (0)