Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/angular/basic/src/app/app.config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { provideHttpClient, withFetch } from '@angular/common/http'
import { ApplicationConfig } from '@angular/core'
import {
QueryClient,
provideAngularQuery,
} from '@tanstack/angular-query-experimental'
import type { ApplicationConfig } from '@angular/core'

export const appConfig: ApplicationConfig = {
providers: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ export class AngularQueryDevtools
/*
* It is intentional that there are no default values on inputs.
* Core devtools will set defaults when values are undefined.
* */
*
* Signal inputs are not used to remain compatible with previous Angular versions.
*/

/**
* Add this attribute if you want the dev tools to default to being open
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { QueryClient } from '@tanstack/query-core'
import { TestBed } from '@angular/core/testing'
import { describe, expect, test, vi } from 'vitest'
import { By } from '@angular/platform-browser'
import { JsonPipe } from '@angular/common'
import { injectMutation } from '../inject-mutation'
import { injectMutationState } from '../inject-mutation-state'
import { provideAngularQuery } from '../providers'
Expand Down Expand Up @@ -139,7 +138,6 @@ describe('injectMutationState', () => {
}
`,
standalone: true,
imports: [JsonPipe],
})
class FakeComponent {
name = input.required<string>()
Expand Down
4 changes: 2 additions & 2 deletions packages/angular-query-experimental/src/create-base-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export function createBaseQuery<
TQueryData,
TQueryKey extends QueryKey,
>(
options: (
optionsFn: (
client: QueryClient,
) => CreateBaseQueryOptions<
TQueryFnData,
Expand All @@ -57,7 +57,7 @@ export function createBaseQuery<
*/
const defaultedOptionsSignal = computed(() => {
const defaultedOptions = queryClient.defaultQueryOptions(
options(queryClient),
optionsFn(queryClient),
)
defaultedOptions._optimisticResults = 'optimistic'
return defaultedOptions
Expand Down
6 changes: 1 addition & 5 deletions packages/angular-query-experimental/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,5 @@ export * from './inject-mutation'
export * from './inject-mutation-state'
export * from './inject-queries'
export * from './inject-query'
export {
injectQueryClient,
provideQueryClient,
QUERY_CLIENT,
} from './inject-query-client'
export { injectQueryClient, provideQueryClient } from './inject-query-client'
export { provideAngularQuery } from './providers'
24 changes: 24 additions & 0 deletions packages/angular-query-experimental/src/infinite-query-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ export type DefinedInitialDataInfiniteOptions<
| (() => NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>)
}

/**
* Allows to share and re-use infinite query options in a type-safe way.
*
* The `queryKey` will be tagged with the type from `queryFn`.
* @param options - The infinite query options to tag with the type from `queryFn`.
* @returns The tagged infinite query options.
* @public
*/
export function infiniteQueryOptions<
TQueryFnData,
TError = DefaultError,
Expand All @@ -65,6 +73,14 @@ export function infiniteQueryOptions<
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>>
}

/**
* Allows to share and re-use infinite query options in a type-safe way.
*
* The `queryKey` will be tagged with the type from `queryFn`.
* @param options - The infinite query options to tag with the type from `queryFn`.
* @returns The tagged infinite query options.
* @public
*/
export function infiniteQueryOptions<
TQueryFnData,
TError = DefaultError,
Expand All @@ -89,6 +105,14 @@ export function infiniteQueryOptions<
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>>
}

/**
* Allows to share and re-use infinite query options in a type-safe way.
*
* The `queryKey` will be tagged with the type from `queryFn`.
* @param options - The infinite query options to tag with the type from `queryFn`.
* @returns The tagged infinite query options.
* @public
*/
export function infiniteQueryOptions(options: unknown) {
return options
}
42 changes: 37 additions & 5 deletions packages/angular-query-experimental/src/inject-infinite-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,22 @@ import type {
UndefinedInitialDataInfiniteOptions,
} from './infinite-query-options'

/**
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
* @param optionsFn - A function that returns infinite query options.
* @param injector - The Angular injector to use.
* @returns The infinite query result.
* @public
*/
export function injectInfiniteQuery<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
>(
options: (
optionsFn: (
client: QueryClient,
) => UndefinedInitialDataInfiniteOptions<
TQueryFnData,
Expand All @@ -39,14 +47,22 @@ export function injectInfiniteQuery<
injector?: Injector,
): CreateInfiniteQueryResult<TData, TError>

/**
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
* @param optionsFn - A function that returns infinite query options.
* @param injector - The Angular injector to use.
* @returns The infinite query result.
* @public
*/
export function injectInfiniteQuery<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
>(
options: (
optionsFn: (
client: QueryClient,
) => DefinedInitialDataInfiniteOptions<
TQueryFnData,
Expand All @@ -58,14 +74,22 @@ export function injectInfiniteQuery<
injector?: Injector,
): DefinedCreateInfiniteQueryResult<TData, TError>

/**
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
* @param optionsFn - A function that returns infinite query options.
* @param injector - The Angular injector to use.
* @returns The infinite query result.
* @public
*/
export function injectInfiniteQuery<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
>(
options: (
optionsFn: (
client: QueryClient,
) => CreateInfiniteQueryOptions<
TQueryFnData,
Expand All @@ -78,14 +102,22 @@ export function injectInfiniteQuery<
injector?: Injector,
): CreateInfiniteQueryResult<TData, TError>

/**
* Injects an infinite query: a declarative dependency on an asynchronous source of data that is tied to a unique key.
* Infinite queries can additively "load more" data onto an existing set of data or "infinite scroll"
* @param optionsFn - A function that returns infinite query options.
* @param injector - The Angular injector to use.
* @returns The infinite query result.
* @public
*/
export function injectInfiniteQuery(
options: (client: QueryClient) => CreateInfiniteQueryOptions,
optionsFn: (client: QueryClient) => CreateInfiniteQueryOptions,
injector?: Injector,
) {
return assertInjector(injectInfiniteQuery, injector, () => {
const queryClient = injectQueryClient()
return createBaseQuery(
options,
optionsFn,
InfiniteQueryObserver as typeof QueryObserver,
queryClient,
)
Expand Down
10 changes: 10 additions & 0 deletions packages/angular-query-experimental/src/inject-is-fetching.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ import { assertInjector } from './util/assert-injector/assert-injector'
import { injectQueryClient } from './inject-query-client'
import type { Injector, Signal } from '@angular/core'

/**
* Injects a signal that tracks the number of queries that your application is loading or
* fetching in the background.
*
* Can be used for app-wide loading indicators
* @param filters - The filters to apply to the query.
* @param injector - The Angular injector to use.
* @returns signal with number of loading or fetching queries.
* @public
*/
export function injectIsFetching(
filters?: QueryFilters,
injector?: Injector,
Expand Down
9 changes: 9 additions & 0 deletions packages/angular-query-experimental/src/inject-is-mutating.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ import { assertInjector } from './util/assert-injector/assert-injector'
import { injectQueryClient } from './inject-query-client'
import type { Injector, Signal } from '@angular/core'

/**
* Injects a signal that tracks the number of mutations that your application is fetching.
*
* Can be used for app-wide loading indicators
* @param filters - The filters to apply to the query.
* @param injector - The Angular injector to use.
* @returns signal with number of fetching mutations.
* @public
*/
export function injectIsMutating(
filters?: MutationFilters,
injector?: Injector,
Expand Down
10 changes: 10 additions & 0 deletions packages/angular-query-experimental/src/inject-mutation-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,20 @@ function getResult<TResult = MutationState>(
)
}

/**
* @public
*/
export interface InjectMutationStateOptions {
injector?: Injector
}

/**
* Injects a signal that tracks the state of all mutations.
* @param mutationStateOptionsFn - A function that returns mutation state options.
* @param options - The Angular injector to use.
* @returns The signal that tracks the state of all mutations.
* @public
*/
export function injectMutationState<TResult = MutationState>(
mutationStateOptionsFn: () => MutationStateOptions<TResult> = () => ({}),
options?: InjectMutationStateOptions,
Expand Down
15 changes: 12 additions & 3 deletions packages/angular-query-experimental/src/inject-mutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,22 @@ import type {
CreateMutationResult,
} from './types'

/**
* Injects a mutation: an imperative function that can be invoked which typically performs server side effects.
*
* Unlike queries, mutations are not run automatically.
* @param optionsFn - A function that returns mutation options.
* @param injector - The Angular injector to use.
* @returns The mutation.
* @public
*/
export function injectMutation<
TData = unknown,
TError = DefaultError,
TVariables = void,
TContext = unknown,
>(
options: (
optionsFn: (
client: QueryClient,
) => CreateMutationOptions<TData, TError, TVariables, TContext>,
injector?: Injector,
Expand All @@ -50,7 +59,7 @@ export function injectMutation<
TError,
TVariables,
TContext
>(queryClient, options(queryClient))
>(queryClient, optionsFn(queryClient))
const mutate: CreateMutateFunction<
TData,
TError,
Expand All @@ -61,7 +70,7 @@ export function injectMutation<
}

effect(() => {
observer.setOptions(options(queryClient))
observer.setOptions(optionsFn(queryClient))
})

const result = signal(observer.getCurrentResult())
Expand Down
5 changes: 5 additions & 0 deletions packages/angular-query-experimental/src/inject-queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ type GetResults<T> =

/**
* QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
* @public
*/
export type QueriesOptions<
T extends Array<any>,
Expand Down Expand Up @@ -161,6 +162,7 @@ export type QueriesOptions<

/**
* QueriesResults reducer recursively maps type param to results
* @public
*/
export type QueriesResults<
T extends Array<any>,
Expand Down Expand Up @@ -196,6 +198,9 @@ export type QueriesResults<
: // Fallback
Array<QueryObserverResult>

/**
* @public
*/
export function injectQueries<
T extends Array<any>,
TCombinedResult = QueriesResults<T>,
Expand Down
24 changes: 21 additions & 3 deletions packages/angular-query-experimental/src/inject-query-client.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
import { createNoopInjectionToken } from './util/create-injection-token/create-injection-token'
import type { QueryClient } from '@tanstack/query-core'

const [injectQueryClient, provideQueryClient, QUERY_CLIENT] =
createNoopInjectionToken<QueryClient>('QueryClientToken')
const tokens = createNoopInjectionToken<QueryClient>('QueryClientToken')

export { injectQueryClient, provideQueryClient, QUERY_CLIENT }
/**
* Injects the `QueryClient` instance into the component or service.
*
* **Example**
* ```ts
* const queryClient = injectQueryClient();
* ```
* @returns The `QueryClient` instance.
* @public
*/
export const injectQueryClient = tokens[0]

/**
* Usually {@link provideAngularQuery} is used once to set up TanStack Query and the
* {@link https://tanstack.com/query/latest/docs/reference/QueryClient|QueryClient}
* for the entire application. You can use `provideQueryClient` to provide a
* different `QueryClient` instance for a part of the application.
* @public
*/
export const provideQueryClient = tokens[1]
Loading