Skip to content

Commit ed35652

Browse files
dominicbachmannautofix-ci[bot]arnoud-dv
authored
fix(angular-query): align function signatures to have an options parameter accepting an object with injector property (#8776)
* 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. Closes #8711 * ci: apply automated fixes * fix build error * revert changes to deprecated injectQueryClient * Rename optionsFn as we now also have an options parameter * Revert changes to injectQueries as there's a PR in progress for that * Add types for options --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Arnoud de Vries <[email protected]>
1 parent 7236237 commit ed35652

16 files changed

+181
-85
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ export default class LazyLoadDevtoolsPanelExampleComponent {
5151
this.devtools.set(
5252
import('@tanstack/angular-query-devtools-experimental').then(
5353
({ injectDevtoolsPanel }) =>
54-
injectDevtoolsPanel(this.devToolsOptions, this.injector),
54+
injectDevtoolsPanel(this.devToolsOptions, {
55+
injector: this.injector,
56+
}),
5557
),
5658
)
5759
}

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

+17-8
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,40 @@ import { isPlatformBrowser } from '@angular/common'
1818
import type { ElementRef } from '@angular/core'
1919
import type { DevtoolsErrorType } from '@tanstack/query-devtools'
2020

21+
export interface InjectDevtoolsPanelOptions {
22+
/**
23+
* The `Injector` in which to create the devtools panel.
24+
*
25+
* If this is not provided, the current injection context will be used instead (via `inject`).
26+
*/
27+
injector?: Injector
28+
}
29+
2130
/**
2231
* Inject a TanStack Query devtools panel and render it in the DOM.
2332
*
2433
* Devtools panel allows programmatic control over the devtools, for example if you want to render
2534
* the devtools as part of your own devtools.
2635
*
2736
* Consider `withDevtools` instead if you don't need this.
28-
* @param optionsFn - A function that returns devtools panel options.
29-
* @param injector - The Angular injector to use.
37+
* @param injectDevtoolsPanelFn - A function that returns devtools panel options.
38+
* @param options - Additional configuration
3039
* @returns DevtoolsPanelRef
3140
* @see https://tanstack.com/query/v5/docs/framework/angular/devtools
3241
*/
3342
export function injectDevtoolsPanel(
34-
optionsFn: () => DevtoolsPanelOptions,
35-
injector?: Injector,
43+
injectDevtoolsPanelFn: () => DevtoolsPanelOptions,
44+
options?: InjectDevtoolsPanelOptions,
3645
): DevtoolsPanelRef {
37-
!injector && assertInInjectionContext(injectDevtoolsPanel)
38-
const currentInjector = injector ?? inject(Injector)
46+
!options?.injector && assertInInjectionContext(injectDevtoolsPanel)
47+
const currentInjector = options?.injector ?? inject(Injector)
3948

4049
return runInInjectionContext(currentInjector, () => {
4150
const destroyRef = inject(DestroyRef)
4251
const isBrowser = isPlatformBrowser(inject(PLATFORM_ID))
4352
const injectedClient = inject(QueryClient, { optional: true })
4453

45-
const options = computed(optionsFn)
54+
const queryOptions = computed(injectDevtoolsPanelFn)
4655
let devtools: TanstackQueryDevtoolsPanel | null = null
4756

4857
const destroy = () => {
@@ -63,7 +72,7 @@ export function injectDevtoolsPanel(
6372
shadowDOMTarget,
6473
onClose,
6574
hostElement,
66-
} = options()
75+
} = queryOptions()
6776

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

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

+3-1
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

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ 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(undefined, {
64+
injector: TestBed.inject(Injector),
65+
}),
6466
).not.toThrow()
6567
})
6668
})

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ 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(undefined, {
64+
injector: TestBed.inject(Injector),
65+
}),
6466
).not.toThrow()
6567
})
6668
})

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,9 @@ describe('injectMutation', () => {
466466
mutationKey: ['injectionContextError'],
467467
mutationFn: () => Promise.resolve(),
468468
}),
469-
TestBed.inject(Injector),
469+
{
470+
injector: TestBed.inject(Injector),
471+
},
470472
)
471473
}).not.toThrow()
472474
})

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,9 @@ describe('injectQuery', () => {
551551
queryKey: ['manualInjector'],
552552
queryFn: simpleFetcher,
553553
}),
554-
TestBed.inject(Injector),
554+
{
555+
injector: TestBed.inject(Injector),
556+
},
555557
)
556558

557559
expect(query.status()).toBe('pending')
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,
@@ -17,12 +16,22 @@ import type {
1716
DefinedInitialDataInfiniteOptions,
1817
UndefinedInitialDataInfiniteOptions,
1918
} from './infinite-query-options'
19+
import type { Injector } from '@angular/core'
20+
21+
export interface InjectInfiniteQueryOptions {
22+
/**
23+
* The `Injector` in which to create the infinite query.
24+
*
25+
* If this is not provided, the current injection context will be used instead (via `inject`).
26+
*/
27+
injector?: Injector
28+
}
2029

2130
/**
2231
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
2332
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
24-
* @param optionsFn - A function that returns infinite query options.
25-
* @param injector - The Angular injector to use.
33+
* @param injectInfiniteQueryFn - A function that returns infinite query options.
34+
* @param options - Additional configuration.
2635
* @returns The infinite query result.
2736
* @public
2837
*/
@@ -33,21 +42,21 @@ export function injectInfiniteQuery<
3342
TQueryKey extends QueryKey = QueryKey,
3443
TPageParam = unknown,
3544
>(
36-
optionsFn: () => DefinedInitialDataInfiniteOptions<
45+
injectInfiniteQueryFn: () => DefinedInitialDataInfiniteOptions<
3746
TQueryFnData,
3847
TError,
3948
TData,
4049
TQueryKey,
4150
TPageParam
4251
>,
43-
injector?: Injector,
52+
options?: InjectInfiniteQueryOptions,
4453
): DefinedCreateInfiniteQueryResult<TData, TError>
4554

4655
/**
4756
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
4857
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
49-
* @param optionsFn - A function that returns infinite query options.
50-
* @param injector - The Angular injector to use.
58+
* @param injectInfiniteQueryFn - A function that returns infinite query options.
59+
* @param options - Additional configuration.
5160
* @returns The infinite query result.
5261
* @public
5362
*/
@@ -58,21 +67,21 @@ export function injectInfiniteQuery<
5867
TQueryKey extends QueryKey = QueryKey,
5968
TPageParam = unknown,
6069
>(
61-
optionsFn: () => UndefinedInitialDataInfiniteOptions<
70+
injectInfiniteQueryFn: () => UndefinedInitialDataInfiniteOptions<
6271
TQueryFnData,
6372
TError,
6473
TData,
6574
TQueryKey,
6675
TPageParam
6776
>,
68-
injector?: Injector,
77+
options?: InjectInfiniteQueryOptions,
6978
): CreateInfiniteQueryResult<TData, TError>
7079

7180
/**
7281
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
7382
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
74-
* @param optionsFn - A function that returns infinite query options.
75-
* @param injector - The Angular injector to use.
83+
* @param injectInfiniteQueryFn - A function that returns infinite query options.
84+
* @param options - Additional configuration.
7685
* @returns The infinite query result.
7786
* @public
7887
*/
@@ -83,30 +92,37 @@ export function injectInfiniteQuery<
8392
TQueryKey extends QueryKey = QueryKey,
8493
TPageParam = unknown,
8594
>(
86-
optionsFn: () => CreateInfiniteQueryOptions<
95+
injectInfiniteQueryFn: () => CreateInfiniteQueryOptions<
8796
TQueryFnData,
8897
TError,
8998
TData,
9099
TQueryFnData,
91100
TQueryKey,
92101
TPageParam
93102
>,
94-
injector?: Injector,
103+
options?: InjectInfiniteQueryOptions,
95104
): CreateInfiniteQueryResult<TData, TError>
96105

97106
/**
98107
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
99108
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
100-
* @param optionsFn - A function that returns infinite query options.
101-
* @param injector - The Angular injector to use.
109+
* @param injectInfiniteQueryFn - A function that returns infinite query options.
110+
* @param options - Additional configuration.
102111
* @returns The infinite query result.
103112
* @public
104113
*/
105114
export function injectInfiniteQuery(
106-
optionsFn: () => CreateInfiniteQueryOptions,
107-
injector?: Injector,
115+
injectInfiniteQueryFn: () => CreateInfiniteQueryOptions,
116+
options?: InjectInfiniteQueryOptions,
108117
) {
109-
return assertInjector(injectInfiniteQuery, injector, () =>
110-
createBaseQuery(optionsFn, InfiniteQueryObserver as typeof QueryObserver),
118+
return assertInjector(injectInfiniteQuery, options?.injector, () =>
119+
createBaseQuery(
120+
injectInfiniteQueryFn,
121+
InfiniteQueryObserver as typeof QueryObserver,
122+
),
111123
)
112124
}
125+
126+
export interface InjectInfiniteQueryOptions {
127+
injector?: Injector
128+
}

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

+12-3
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,30 @@ import { assertInjector } from './util/assert-injector/assert-injector'
44
import type { QueryFilters } from '@tanstack/query-core'
55
import type { Injector, Signal } from '@angular/core'
66

7+
export interface InjectIsFetchingOptions {
8+
/**
9+
* The `Injector` in which to create the isFetching signal.
10+
*
11+
* If this is not provided, the current injection context will be used instead (via `inject`).
12+
*/
13+
injector?: Injector
14+
}
15+
716
/**
817
* Injects a signal that tracks the number of queries that your application is loading or
918
* fetching in the background.
1019
*
1120
* Can be used for app-wide loading indicators
1221
* @param filters - The filters to apply to the query.
13-
* @param injector - The Angular injector to use.
22+
* @param options - Additional configuration
1423
* @returns signal with number of loading or fetching queries.
1524
* @public
1625
*/
1726
export function injectIsFetching(
1827
filters?: QueryFilters,
19-
injector?: Injector,
28+
options?: InjectIsFetchingOptions,
2029
): Signal<number> {
21-
return assertInjector(injectIsFetching, injector, () => {
30+
return assertInjector(injectIsFetching, options?.injector, () => {
2231
const destroyRef = inject(DestroyRef)
2332
const ngZone = inject(NgZone)
2433
const queryClient = inject(QueryClient)

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

+12-3
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,29 @@ import { assertInjector } from './util/assert-injector/assert-injector'
44
import type { MutationFilters } from '@tanstack/query-core'
55
import type { Injector, Signal } from '@angular/core'
66

7+
export interface InjectIsMutatingOptions {
8+
/**
9+
* The `Injector` in which to create the isMutating signal.
10+
*
11+
* If this is not provided, the current injection context will be used instead (via `inject`).
12+
*/
13+
injector?: Injector
14+
}
15+
716
/**
817
* Injects a signal that tracks the number of mutations that your application is fetching.
918
*
1019
* Can be used for app-wide loading indicators
1120
* @param filters - The filters to apply to the query.
12-
* @param injector - The Angular injector to use.
21+
* @param options - Additional configuration
1322
* @returns signal with number of fetching mutations.
1423
* @public
1524
*/
1625
export function injectIsMutating(
1726
filters?: MutationFilters,
18-
injector?: Injector,
27+
options?: InjectIsMutatingOptions,
1928
): Signal<number> {
20-
return assertInjector(injectIsMutating, injector, () => {
29+
return assertInjector(injectIsMutating, options?.injector, () => {
2130
const destroyRef = inject(DestroyRef)
2231
const ngZone = inject(NgZone)
2332
const queryClient = inject(QueryClient)

packages/angular-query-experimental/src/inject-mutation-state.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ type MutationStateOptions<TResult = MutationState> = {
1818
select?: (mutation: Mutation) => TResult
1919
}
2020

21+
/**
22+
*
23+
* @param mutationCache
24+
* @param options
25+
*/
2126
function getResult<TResult = MutationState>(
2227
mutationCache: MutationCache,
2328
options: MutationStateOptions<TResult>,
@@ -34,18 +39,23 @@ function getResult<TResult = MutationState>(
3439
* @public
3540
*/
3641
export interface InjectMutationStateOptions {
42+
/**
43+
* The `Injector` in which to create the mutation state signal.
44+
*
45+
* If this is not provided, the current injection context will be used instead (via `inject`).
46+
*/
3747
injector?: Injector
3848
}
3949

4050
/**
4151
* Injects a signal that tracks the state of all mutations.
42-
* @param mutationStateOptionsFn - A function that returns mutation state options.
52+
* @param injectMutationStateFn - A function that returns mutation state options.
4353
* @param options - The Angular injector to use.
4454
* @returns The signal that tracks the state of all mutations.
4555
* @public
4656
*/
4757
export function injectMutationState<TResult = MutationState>(
48-
mutationStateOptionsFn: () => MutationStateOptions<TResult> = () => ({}),
58+
injectMutationStateFn: () => MutationStateOptions<TResult> = () => ({}),
4959
options?: InjectMutationStateOptions,
5060
): Signal<Array<TResult>> {
5161
return assertInjector(injectMutationState, options?.injector, () => {
@@ -61,7 +71,7 @@ export function injectMutationState<TResult = MutationState>(
6171
*/
6272
const resultFromOptionsSignal = computed(() => {
6373
return [
64-
getResult(mutationCache, mutationStateOptionsFn()),
74+
getResult(mutationCache, injectMutationStateFn()),
6575
performance.now(),
6676
] as const
6777
})
@@ -91,7 +101,7 @@ export function injectMutationState<TResult = MutationState>(
91101
const [lastResult] = effectiveResultSignal()
92102
const nextResult = replaceEqualDeep(
93103
lastResult,
94-
getResult(mutationCache, mutationStateOptionsFn()),
104+
getResult(mutationCache, injectMutationStateFn()),
95105
)
96106
if (lastResult !== nextResult) {
97107
ngZone.run(() => {

0 commit comments

Comments
 (0)